Li4gTWV0YWZ1bmN0aW9ucy9JbnZvY2F0aW9uLy9hcHBseSB8MTAKCmFwcGx5Cj09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHRlbXBsYXRlPCAKICAgICAgICAgIHR5cGVuYW1lIEYKICAgICAgICA+CiAgICBzdHJ1Y3QgYXBwbHkwCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKICAgIHRlbXBsYXRlPCAKICAgICAgICAgIHR5cGVuYW1lIEYsIHR5cGVuYW1lIEExCiAgICAgICAgPgogICAgc3RydWN0IGFwcGx5MQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKICAgIAogICAgfC4uLnwKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgRiwgdHlwZW5hbWUgQTEsXCB8Li4ufCB0eXBlbmFtZSBBbgogICAgICAgID4KICAgIHN0cnVjdCBhcHBseVwgKm4qCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZTwgCiAgICAgICAgICB0eXBlbmFtZSBGCiAgICAgICAgLCB0eXBlbmFtZSBBMSA9IHx1bnNwZWNpZmllZHwKICAgICAgICB8Li4ufAogICAgICAgICwgdHlwZW5hbWUgQW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IGFwcGx5CiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKSW52b2tlcyBhIHxNZXRhZnVuY3Rpb24gQ2xhc3N8IG9yIGEgfExhbWJkYSBFeHByZXNzaW9ufCBgYEZgYCB3aXRoIGFyZ3VtZW50cyBgYEExYGAsLi4uIGBgQW5gYC4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvYXBwbHkuaHBwPgoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYEZgYCAgICAgICAgIHwgfExhbWJkYSBFeHByZXNzaW9ufCAgICAgICAgICAgICAgIHwgQW4gZXhwcmVzc2lvbiB0byBpbnZva2UuICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB8QTEuLi5BbnwgICAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW52b2NhdGlvbiBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSB8TGFtYmRhIEV4cHJlc3Npb258IGBgZmBgIGFuZCBhcmJpdHJhcnkgdHlwZXMgYGBhMWBgLC4uLiBgYGFuYGA6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgYXBwbHlcICpuKlw8ZixhMSxcIHwuLi58XCBhXCAqbipcPjo6dHlwZSB0OwogICAgdHlwZWRlZiBhcHBseTxmLGExLFwgfC4uLnxcIGFcICpuKlw+Ojp0eXBlIHQ7Cgo6UmV0dXJuIHR5cGU6CiAgICBBbnkgdHlwZS4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIGBgdHlwZWRlZiBhcHBseV93cmFwYGBcICpuKlwgYGA8IGxhbWJkYTxmPjo6dHlwZSxhMSwuLi4gYW4+Ojp0eXBlIHQ7YGAuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdGVtcGxhdGU8IHR5cGVuYW1lIE4xLCB0eXBlbmFtZSBOMiA+IHN0cnVjdCBpbnRfcGx1cwogICAgICAgIDogaW50XzwoIE4xOjp2YWx1ZSArIE4yOjp2YWx1ZSApPgogICAgewogICAgfTsKICAgIAogICAgdHlwZWRlZiBhcHBseTwgaW50X3BsdXM8XzEsXzI+LCBpbnRfPDI+LCBpbnRfPDM+ID46OnR5cGUgcjE7CiAgICB0eXBlZGVmIGFwcGx5PCBxdW90ZVwgYGAyYGBcIDxpbnRfcGx1cz4sIGludF88Mj4sIGludF88Mz4gPjo6dHlwZSByMjsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggcjE6OnZhbHVlLCA9PSwgNSApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggcjI6OnZhbHVlLCA9PSwgNSApOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8TWV0YWZ1bmN0aW9uc3wsIHxhcHBseV93cmFwfCwgfGxhbWJkYXwsIHxxdW90ZXwsIHxiaW5kfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK