Li4gLi4gQWxnb3JpdGhtcy9JdGVyYXRpb24gQWxnb3JpdGhtcwoKLi4gVU5GSU5JU0hFRDogRXhwcmVzc2lvbiBzZW1hbnRpY3MgYW5kIGV2ZXJ5dGhpbmcgdGhhdCBmb2xsb3dzCgoKaXRlcl9mb2xkX2lmCj09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgU3RhdGUKICAgICAgICAsIHR5cGVuYW1lIEZvcndhcmRPcAogICAgICAgICwgdHlwZW5hbWUgRm9yd2FyZFByZWQKICAgICAgICAsIHR5cGVuYW1lIEJhY2t3YXJkT3AgPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgLCB0eXBlbmFtZSBCYWNrd2FyZFByZWQgPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IGl0ZXJfZm9sZF9pZgogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWNjZXNzaXZlIGFwcGxpY2F0aW9uIG9mIGJpbmFyeSBgYEZvcndhcmRPcGBgIHRvIHRoZSByZXN1bHQgCm9mIHRoZSBwcmV2aW91cyBgYEZvcndhcmRPcGBgIGludm9jYXRpb24gKGBgU3RhdGVgYCBpZiBpdCdzIHRoZSBmaXJzdCBjYWxsKSBhbmQgZWFjaCAKaXRlcmF0b3IgaW4gdGhlIHNlcXVlbmNlIHJhbmdlIGRldGVybWluZWQgYnkgYGBGb3J3YXJkUHJlZGBgIHByZWRpY2F0ZS4gSWYgYGBCYWNrd2FyZE9wYGAKaXMgcHJvdmlkZWQsIGl0J3Mgc2ltaWxhcmx5IGFwcGxpZWQgb24gYmFja3dhcmQgdHJhdmVyc2FsIHRvIHRoZSByZXN1bHQgb2YgdGhlIApwcmV2aW91cyBgYEJhY2t3YXJkT3BgYCBpbnZvY2F0aW9uICh0aGUgbGFzdCByZXN1bHQgcmV0dXJuZWQgYnkgYGBGb3J3YXJkT3BgIGlmIGl0J3MgCnRoZSBmaXJzdCBjYWxsKSBhbmQgZWFjaCBpdGVyYXRvciBpbiB0aGUgc2VxdWVuY2UgcmFuZ2UgZGV0ZXJtaW5lZCBieSAKYGBCYWNrd2FyZFByZWRgYCBwcmVkaWNhdGUuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2l0ZXJfZm9sZF9pZi5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgICAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIGl0ZXJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgU3RhdGVgYCAgICAgICAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIGZpcnN0IGBgQmFja3dhcmRPcGBgfAp8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAvIGBgRm9yd2FyZE9wYGAgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgRm9yd2FyZE9wYGAgICAgIHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGZvcndhcmQgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmF2ZXJzYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgRm9yd2FyZFByZWRgYCAgIHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgZm9yd2FyZCB0cmF2ZXJzYWwgcHJlZGljYXRlLiAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgQmFja3dhcmRPcGBgICAgIHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGJhY2t3YXJkICAgICAgfAp8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmF2ZXJzYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgQmFja3dhcmRQcmVkYGAgIHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgYmFja3dhcmQgdHJhdmVyc2FsIHByZWRpY2F0ZS4gICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgYGBvcGBgLCBhbmQgYW4gCmFyYml0cmFyeSB0eXBlIGBgc3RhdGVgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBpdGVyX2ZvbGQ8U2VxdWVuY2UsVCxPcD46OnR5cGUgdDsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUgCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICB0eXBlZGVmIGxhbWJkYTxPcD46OnR5cGUgb3A7CiAgICAgICAgdHlwZWRlZiBiZWdpbjxTZXF1ZW5jZT46OnR5cGUgaTE7CiAgICAgICAgdHlwZWRlZiBhcHBseTxvcCxULGkxPjo6dHlwZSB0MTsKICAgICAgICB0eXBlZGVmIGkxOjpuZXh0IGkyOwogICAgICAgIHR5cGVkZWYgYXBwbHk8b3AsdDEsaTI+Ojp0eXBlIHQyOwogICAgICAgIC4uLgogICAgICAgIHR5cGVkZWYgYXBwbHk8b3AsVCxpbj46OnR5cGUgdG47IAogICAgICAgIHR5cGVkZWYgaW46Om5leHQgbGFzdDsgCiAgICAgICAgdHlwZWRlZiB0biB0CiAgICAgICAgCiAgICB3aGVyZSBgYG4gPT0gc2l6ZTxTZXF1ZW5jZT46OnZhbHVlYGAgYW5kIGBgbGFzdGBgIGlzIGlkZW50aWNhbCB0byBgYGVuZDxTZXF1ZW5jZT46OnR5cGVgYDsgCiAgICAgICAgCiAgICBFcXVpdmFsZW50IHRvIGBgdHlwZWRlZiBUIHQ7YGAgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LiAKCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpMaW5lYXIuIEV4YWN0bHkgYGBzaXplPFNlcXVlbmNlPjo6dmFsdWVgYCBhcHBsaWNhdGlvbnMgb2YgYGBGb3J3YXJkT3BgYC4gCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgbGlzdF9jPGludCw1LC0xLDAsNywyLDAsLTUsND4gbnVtYmVyczsKICAgIHR5cGVkZWYgaXRlcl9mb2xkPAogICAgICAgICAgbnVtYmVycwogICAgICAgICwgYmVnaW48bnVtYmVycz46OnR5cGUKICAgICAgICAsIGlmXzwgbGVzczwgZGVyZWY8XzE+LCBkZXJlZjxfMj4gPixfMixfMSA+CiAgICAgICAgPjo6dHlwZSBtYXhfZWxlbWVudF9pdGVyOwogICAgCiAgICBCT09TVF9TVEFUSUNfQVNTRVJUKG1heF9lbGVtZW50X2l0ZXI6OnR5cGU6OnZhbHVlID09IDcpOwoKCgpTZWUgYWxzbwotLS0tLS0tLQoKQWxnb3JpdGhtcywgYGBpdGVyX2ZvbGRfYmFja3dhcmRgYCwgYGBmb2xkYGAsIGBgZm9sZF9iYWNrd2FyZGBgLCBgYGNvcHlgYCwgYGBjb3B5X2JhY2t3YXJkYGAKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==