Li4gQWxnb3JpdGhtcy9JdGVyYXRpb24gQWxnb3JpdGhtcy8vYWNjdW11bGF0ZSB8MTAKCmFjY3VtdWxhdGUKPT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgU3RhdGUKICAgICAgICAsIHR5cGVuYW1lIEZvcndhcmRPcAogICAgICAgID4KICAgIHN0cnVjdCBhY2N1bXVsYXRlCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWNjZXNzaXZlIGFwcGxpY2F0aW9uIG9mIGJpbmFyeSBgYEZvcndhcmRPcGBgIHRvIHRoZSAKcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBgYEZvcndhcmRPcGBgIGludm9jYXRpb24gKGBgU3RhdGVgYCBpZiBpdCdzIHRoZSBmaXJzdCBjYWxsKSAKYW5kIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlIGluIHRoZSByYW5nZSB8YmVnaW4vZW5kPFNlcXVlbmNlPnwgaW4gb3JkZXIuIAp8Tm90ZTp8IGBgYWNjdW11bGF0ZWBgIGlzIGEgc3lub255bSBmb3IgfGZvbGR8IHwtLSBlbmQgbm90ZXwKCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvYWNjdW11bGF0ZS5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICB8IEEgc2VxdWVuY2UgdG8gaXRlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgU3RhdGVgYCAgICAgfCBBbnkgdHlwZSAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgZmlyc3QgYGBGb3J3YXJkT3BgYCAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgRm9yd2FyZE9wYGAgfCBCaW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCAgICB8IFRoZSBvcGVyYXRpb24gdG8gYmUgZXhlY3V0ZWQgb24gZm9yd2FyZCAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYXZlcnNhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgYGBvcGBgLCBhbmQgYXJiaXRyYXJ5IHR5cGUgYGBzdGF0ZWBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGFjY3VtdWxhdGU8cyxzdGF0ZSxvcD46OnR5cGUgdDsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0bwogICAgICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgdHlwZWRlZiBmb2xkPHMsc3RhdGUsb3A+Ojp0eXBlIHQ7IAoKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkxpbmVhci4gRXhhY3RseSBgYHNpemU8cz46OnZhbHVlYGAgYXBwbGljYXRpb25zIG9mIGBgb3BgYC4gCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yPGxvbmcsZmxvYXQsc2hvcnQsZG91YmxlLGZsb2F0LGxvbmcsbG9uZyBkb3VibGU+IHR5cGVzOwogICAgdHlwZWRlZiBhY2N1bXVsYXRlPAogICAgICAgICAgdHlwZXMKICAgICAgICAsIGludF88MD4KICAgICAgICAsIGlmXzwgaXNfZmxvYXQ8XzI+LG5leHQ8XzE+LF8xID4KICAgICAgICA+Ojp0eXBlIG51bWJlcl9vZl9mbG9hdHM7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIG51bWJlcl9vZl9mbG9hdHM6OnZhbHVlLCA9PSwgNCApOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8QWxnb3JpdGhtc3wsIHxmb2xkfCwgfHJldmVyc2VfZm9sZHwsIHxpdGVyX2ZvbGR8LCB8cmV2ZXJzZV9pdGVyX2ZvbGR8LCB8Y29weXwsIHxjb3B5X2lmfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK