LyogY2FjaGUgLmMgLSBhIExSVSBjYWNoZQ0KICoNCiAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4NCiAqDQogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4NCiAqDQogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZA0KICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcw0KICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCiAqDQogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCiAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQNCiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCiAqDQogKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQogKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KICovDQoNCiNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCINCiNpbmNsdWRlICJjYWNoZS5oIg0KI2luY2x1ZGUgPGxpbWl0cy5oPg0KDQovKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLw0KcHlzcWxpdGVfTm9kZSogcHlzcWxpdGVfbmV3X25vZGUoUHlPYmplY3QqIGtleSwgUHlPYmplY3QqIGRhdGEpDQp7DQogICAgcHlzcWxpdGVfTm9kZSogbm9kZTsNCg0KICAgIG5vZGUgPSAocHlzcWxpdGVfTm9kZSopIChweXNxbGl0ZV9Ob2RlVHlwZS50cF9hbGxvYygmcHlzcWxpdGVfTm9kZVR5cGUsIDApKTsNCiAgICBpZiAoIW5vZGUpIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQogICAgUHlfSU5DUkVGKGtleSk7DQogICAgbm9kZS0+a2V5ID0ga2V5Ow0KDQogICAgUHlfSU5DUkVGKGRhdGEpOw0KICAgIG5vZGUtPmRhdGEgPSBkYXRhOw0KDQogICAgbm9kZS0+cHJldiA9IE5VTEw7DQogICAgbm9kZS0+bmV4dCA9IE5VTEw7DQoNCiAgICByZXR1cm4gbm9kZTsNCn0NCg0Kdm9pZCBweXNxbGl0ZV9ub2RlX2RlYWxsb2MocHlzcWxpdGVfTm9kZSogc2VsZikNCnsNCiAgICBQeV9ERUNSRUYoc2VsZi0+a2V5KTsNCiAgICBQeV9ERUNSRUYoc2VsZi0+ZGF0YSk7DQoNCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7DQp9DQoNCmludCBweXNxbGl0ZV9jYWNoZV9pbml0KHB5c3FsaXRlX0NhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykNCnsNCiAgICBQeU9iamVjdCogZmFjdG9yeTsNCiAgICBpbnQgc2l6ZSA9IDEwOw0KDQogICAgc2VsZi0+ZmFjdG9yeSA9IE5VTEw7DQoNCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aSIsICZmYWN0b3J5LCAmc2l6ZSkpIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIC8qIG1pbmltdW0gY2FjaGUgc2l6ZSBpcyA1IGVudHJpZXMgKi8NCiAgICBpZiAoc2l6ZSA8IDUpIHsNCiAgICAgICAgc2l6ZSA9IDU7DQogICAgfQ0KICAgIHNlbGYtPnNpemUgPSBzaXplOw0KICAgIHNlbGYtPmZpcnN0ID0gTlVMTDsNCiAgICBzZWxmLT5sYXN0ID0gTlVMTDsNCg0KICAgIHNlbGYtPm1hcHBpbmcgPSBQeURpY3RfTmV3KCk7DQogICAgaWYgKCFzZWxmLT5tYXBwaW5nKSB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBQeV9JTkNSRUYoZmFjdG9yeSk7DQogICAgc2VsZi0+ZmFjdG9yeSA9IGZhY3Rvcnk7DQoNCiAgICBzZWxmLT5kZWNyZWZfZmFjdG9yeSA9IDE7DQoNCiAgICByZXR1cm4gMDsNCn0NCg0Kdm9pZCBweXNxbGl0ZV9jYWNoZV9kZWFsbG9jKHB5c3FsaXRlX0NhY2hlKiBzZWxmKQ0Kew0KICAgIHB5c3FsaXRlX05vZGUqIG5vZGU7DQogICAgcHlzcWxpdGVfTm9kZSogZGVsZXRlX25vZGU7DQoNCiAgICBpZiAoIXNlbGYtPmZhY3RvcnkpIHsNCiAgICAgICAgLyogY29uc3RydWN0b3IgZmFpbGVkLCBqdXN0IGdldCBvdXQgb2YgaGVyZSAqLw0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgLyogaXRlcmF0ZSBvdmVyIGFsbCBub2RlcyBhbmQgZGVhbGxvY2F0ZSB0aGVtICovDQogICAgbm9kZSA9IHNlbGYtPmZpcnN0Ow0KICAgIHdoaWxlIChub2RlKSB7DQogICAgICAgIGRlbGV0ZV9ub2RlID0gbm9kZTsNCiAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7DQogICAgICAgIFB5X0RFQ1JFRihkZWxldGVfbm9kZSk7DQogICAgfQ0KDQogICAgaWYgKHNlbGYtPmRlY3JlZl9mYWN0b3J5KSB7DQogICAgICAgIFB5X0RFQ1JFRihzZWxmLT5mYWN0b3J5KTsNCiAgICB9DQogICAgUHlfREVDUkVGKHNlbGYtPm1hcHBpbmcpOw0KDQogICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOw0KfQ0KDQpQeU9iamVjdCogcHlzcWxpdGVfY2FjaGVfZ2V0KHB5c3FsaXRlX0NhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncykNCnsNCiAgICBQeU9iamVjdCoga2V5ID0gYXJnczsNCiAgICBweXNxbGl0ZV9Ob2RlKiBub2RlOw0KICAgIHB5c3FsaXRlX05vZGUqIHB0cjsNCiAgICBQeU9iamVjdCogZGF0YTsNCg0KICAgIG5vZGUgPSAocHlzcWxpdGVfTm9kZSopUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWFwcGluZywga2V5KTsNCiAgICBpZiAobm9kZSkgew0KICAgICAgICAvKiBhbiBlbnRyeSBmb3IgdGhpcyBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNhY2hlICovDQoNCiAgICAgICAgLyogaW5jcmVhc2UgdXNhZ2UgY291bnRlciBvZiB0aGUgbm9kZSBmb3VuZCAqLw0KICAgICAgICBpZiAobm9kZS0+Y291bnQgPCBMT05HX01BWCkgew0KICAgICAgICAgICAgbm9kZS0+Y291bnQrKzsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIGlmIG5lY2Vzc2FyeSwgcmVvcmRlciBlbnRyaWVzIGluIHRoZSBjYWNoZSBieSBzd2FwcGluZyBwb3NpdGlvbnMgKi8NCiAgICAgICAgaWYgKG5vZGUtPnByZXYgJiYgbm9kZS0+Y291bnQgPiBub2RlLT5wcmV2LT5jb3VudCkgew0KICAgICAgICAgICAgcHRyID0gbm9kZS0+cHJldjsNCg0KICAgICAgICAgICAgd2hpbGUgKHB0ci0+cHJldiAmJiBub2RlLT5jb3VudCA+IHB0ci0+cHJldi0+Y291bnQpIHsNCiAgICAgICAgICAgICAgICBwdHIgPSBwdHItPnByZXY7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChub2RlLT5uZXh0KSB7DQogICAgICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlLT5wcmV2Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5vZGUtPnByZXYpIHsNCiAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwdHItPnByZXYpIHsNCiAgICAgICAgICAgICAgICBwdHItPnByZXYtPm5leHQgPSBub2RlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBzZWxmLT5maXJzdCA9IG5vZGU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIG5vZGUtPm5leHQgPSBwdHI7DQogICAgICAgICAgICBub2RlLT5wcmV2ID0gcHRyLT5wcmV2Ow0KICAgICAgICAgICAgaWYgKCFub2RlLT5wcmV2KSB7DQogICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcHRyLT5wcmV2ID0gbm9kZTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIC8qIFRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGlzIGtleSBpbiB0aGUgY2FjaGUsIHlldC4gV2UnbGwgaW5zZXJ0IGEgbmV3DQogICAgICAgICAqIGVudHJ5IGluIHRoZSBjYWNoZSwgYW5kIG1ha2Ugc3BhY2UgaWYgbmVjZXNzYXJ5IGJ5IHRocm93aW5nIHRoZQ0KICAgICAgICAgKiBsZWFzdCB1c2VkIGl0ZW0gb3V0IG9mIHRoZSBjYWNoZS4gKi8NCg0KICAgICAgICBpZiAoUHlEaWN0X1NpemUoc2VsZi0+bWFwcGluZykgPT0gc2VsZi0+c2l6ZSkgew0KICAgICAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsNCiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi0+bGFzdDsNCg0KICAgICAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5tYXBwaW5nLCBzZWxmLT5sYXN0LT5rZXkpICE9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKG5vZGUtPnByZXYpIHsNCiAgICAgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IE5VTEw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlLT5wcmV2Ow0KICAgICAgICAgICAgICAgIG5vZGUtPnByZXYgPSBOVUxMOw0KDQogICAgICAgICAgICAgICAgUHlfREVDUkVGKG5vZGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZGF0YSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5mYWN0b3J5LCAiTyIsIGtleSk7DQoNCiAgICAgICAgaWYgKCFkYXRhKSB7DQogICAgICAgICAgICByZXR1cm4gTlVMTDsNCiAgICAgICAgfQ0KDQogICAgICAgIG5vZGUgPSBweXNxbGl0ZV9uZXdfbm9kZShrZXksIGRhdGEpOw0KICAgICAgICBpZiAoIW5vZGUpIHsNCiAgICAgICAgICAgIHJldHVybiBOVUxMOw0KICAgICAgICB9DQogICAgICAgIG5vZGUtPnByZXYgPSBzZWxmLT5sYXN0Ow0KDQogICAgICAgIFB5X0RFQ1JFRihkYXRhKTsNCg0KICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+bWFwcGluZywga2V5LCAoUHlPYmplY3QqKW5vZGUpICE9IDApIHsNCiAgICAgICAgICAgIFB5X0RFQ1JFRihub2RlKTsNCiAgICAgICAgICAgIHJldHVybiBOVUxMOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsNCiAgICAgICAgICAgIHNlbGYtPmxhc3QtPm5leHQgPSBub2RlOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOw0KICAgICAgICB9DQogICAgICAgIHNlbGYtPmxhc3QgPSBub2RlOw0KICAgIH0NCg0KICAgIFB5X0lOQ1JFRihub2RlLT5kYXRhKTsNCiAgICByZXR1cm4gbm9kZS0+ZGF0YTsNCn0NCg0KUHlPYmplY3QqIHB5c3FsaXRlX2NhY2hlX2Rpc3BsYXkocHlzcWxpdGVfQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQ0Kew0KICAgIHB5c3FsaXRlX05vZGUqIHB0cjsNCiAgICBQeU9iamVjdCogcHJldmtleTsNCiAgICBQeU9iamVjdCogbmV4dGtleTsNCiAgICBQeU9iamVjdCogZm10X2FyZ3M7DQogICAgUHlPYmplY3QqIHRlbXBsYXRlOw0KICAgIFB5T2JqZWN0KiBkaXNwbGF5X3N0cjsNCg0KICAgIHB0ciA9IHNlbGYtPmZpcnN0Ow0KDQogICAgd2hpbGUgKHB0cikgew0KICAgICAgICBpZiAocHRyLT5wcmV2KSB7DQogICAgICAgICAgICBwcmV2a2V5ID0gcHRyLT5wcmV2LT5rZXk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBwcmV2a2V5ID0gUHlfTm9uZTsNCiAgICAgICAgfQ0KICAgICAgICBQeV9JTkNSRUYocHJldmtleSk7DQoNCiAgICAgICAgaWYgKHB0ci0+bmV4dCkgew0KICAgICAgICAgICAgbmV4dGtleSA9IHB0ci0+bmV4dC0+a2V5Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbmV4dGtleSA9IFB5X05vbmU7DQogICAgICAgIH0NCiAgICAgICAgUHlfSU5DUkVGKG5leHRrZXkpOw0KDQogICAgICAgIGZtdF9hcmdzID0gUHlfQnVpbGRWYWx1ZSgiT09PIiwgcHJldmtleSwgcHRyLT5rZXksIG5leHRrZXkpOw0KICAgICAgICBpZiAoIWZtdF9hcmdzKSB7DQogICAgICAgICAgICByZXR1cm4gTlVMTDsNCiAgICAgICAgfQ0KICAgICAgICB0ZW1wbGF0ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiVzIDwtICVzIC0+JXNcbiIpOw0KICAgICAgICBpZiAoIXRlbXBsYXRlKSB7DQogICAgICAgICAgICBQeV9ERUNSRUYoZm10X2FyZ3MpOw0KICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgICAgIH0NCiAgICAgICAgZGlzcGxheV9zdHIgPSBQeVN0cmluZ19Gb3JtYXQodGVtcGxhdGUsIGZtdF9hcmdzKTsNCiAgICAgICAgUHlfREVDUkVGKHRlbXBsYXRlKTsNCiAgICAgICAgUHlfREVDUkVGKGZtdF9hcmdzKTsNCiAgICAgICAgaWYgKCFkaXNwbGF5X3N0cikgew0KICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgICAgIH0NCiAgICAgICAgUHlPYmplY3RfUHJpbnQoZGlzcGxheV9zdHIsIHN0ZG91dCwgUHlfUFJJTlRfUkFXKTsNCiAgICAgICAgUHlfREVDUkVGKGRpc3BsYXlfc3RyKTsNCg0KICAgICAgICBQeV9ERUNSRUYocHJldmtleSk7DQogICAgICAgIFB5X0RFQ1JFRihuZXh0a2V5KTsNCg0KICAgICAgICBwdHIgPSBwdHItPm5leHQ7DQogICAgfQ0KDQogICAgUHlfSU5DUkVGKFB5X05vbmUpOw0KICAgIHJldHVybiBQeV9Ob25lOw0KfQ0KDQpzdGF0aWMgUHlNZXRob2REZWYgY2FjaGVfbWV0aG9kc1tdID0gew0KICAgIHsiZ2V0IiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX2NhY2hlX2dldCwgTUVUSF9PLA0KICAgICAgICBQeURvY19TVFIoIkdldHMgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUgb3IgY2FsbHMgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gcHJvZHVjZSBvbmUuIil9LA0KICAgIHsiZGlzcGxheSIsIChQeUNGdW5jdGlvbilweXNxbGl0ZV9jYWNoZV9kaXNwbGF5LCBNRVRIX05PQVJHUywNCiAgICAgICAgUHlEb2NfU1RSKCJGb3IgZGVidWdnaW5nIG9ubHkuIil9LA0KICAgIHtOVUxMLCBOVUxMfQ0KfTsNCg0KUHlUeXBlT2JqZWN0IHB5c3FsaXRlX05vZGVUeXBlID0gew0KICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkNCiAgICAgICAgTU9EVUxFX05BTUUgIk5vZGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLw0KICAgICAgICBzaXplb2YocHlzcWxpdGVfTm9kZSksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8NCiAgICAgICAgKGRlc3RydWN0b3IpcHlzcWxpdGVfbm9kZV9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovDQogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLw0KICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLw0KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovDQp9Ow0KDQpQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ2FjaGVUeXBlID0gew0KICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkNCiAgICAgICAgTU9EVUxFX05BTUUgIi5DYWNoZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLw0KICAgICAgICBzaXplb2YocHlzcWxpdGVfQ2FjaGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8NCiAgICAgICAgKGRlc3RydWN0b3IpcHlzcWxpdGVfY2FjaGVfZGVhbGxvYywgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovDQogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovDQogICAgICAgIGNhY2hlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLw0KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLw0KICAgICAgICAoaW5pdHByb2MpcHlzcWxpdGVfY2FjaGVfaW5pdCwgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLw0KICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovDQp9Ow0KDQpleHRlcm4gaW50IHB5c3FsaXRlX2NhY2hlX3NldHVwX3R5cGVzKHZvaWQpDQp7DQogICAgaW50IHJjOw0KDQogICAgcHlzcWxpdGVfTm9kZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7DQogICAgcHlzcWxpdGVfQ2FjaGVUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3Ow0KDQogICAgcmMgPSBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX05vZGVUeXBlKTsNCiAgICBpZiAocmMgPCAwKSB7DQogICAgICAgIHJldHVybiByYzsNCiAgICB9DQoNCiAgICByYyA9IFB5VHlwZV9SZWFkeSgmcHlzcWxpdGVfQ2FjaGVUeXBlKTsNCiAgICByZXR1cm4gcmM7DQp9DQo=