Li4gU2VxdWVuY2VzL0ludHJpbnNpYyBNZXRhZnVuY3Rpb25zLy9hdAoKYXQKPT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICAsIHR5cGVuYW1lIE4KICAgICAgICA+CiAgICBzdHJ1Y3QgYXQKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBBc3NvY1NlcQogICAgICAgICwgdHlwZW5hbWUgS2V5CiAgICAgICAgLCB0eXBlbmFtZSBEZWZhdWx0ID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCBhdAogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKYGBhdGBgIGlzIGFuIHxvdmVybG9hZGVkIG5hbWV8OgoKKiBgYGF0PFNlcXVlbmNlLE4+YGAgcmV0dXJucyB0aGUgYGBOYGAtdGggZWxlbWVudCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIAogIHxGb3J3YXJkIFNlcXVlbmNlfCBgYFNlcXVlbmNlYGAuCgoqIGBgYXQ8QXNzb2NTZXEsS2V5LERlZmF1bHQ+YGAgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggYGBLZXlgYCAKICBpbiB0aGUgfEFzc29jaWF0aXZlIFNlcXVlbmNlfCBgYEFzc29jU2VxYGAsIG9yIGBgRGVmYXVsdGBgIGlmIG5vIHN1Y2ggZWxlbWVudAogIGV4aXN0cy4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvYXQuaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8VGFnIERpc3BhdGNoZWQgTWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFNlcXVlbmNlYGAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgICAgICB8IEEgc2VxdWVuY2UgdG8gYmUgZXhhbWluZWQuICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgQXNzb2NTZXFgYCAgfCB8QXNzb2NpYXRpdmUgU2VxdWVuY2V8ICAgIHwgQSBzZXF1ZW5jZSB0byBiZSBleGFtaW5lZC4gICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBOYGAgICAgICAgICB8IHxJbnRlZ3JhbCBDb25zdGFudHwgICAgICAgfCBBbiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXF1ZW5jZSAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3BlY2lmeWluZyB0aGUgZWxlbWVudCB0byBiZSByZXRyaWV2ZWQuICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBLZXlgYCAgICAgICB8IEFueSB0eXBlICAgICAgICAgICAgICAgICAgfCBBIGtleSBmb3IgdGhlIGVsZW1lbnQgdG8gYmUgcmV0cmlldmVkLiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYERlZmF1bHRgYCAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICB8IEEgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGVsZW1lbnQgaXMgICB8CnwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBub3QgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKLi4gY29tcG91bmQ6OgogICAgOmNsYXNzOiBleHByZXNzaW9uLXNlbWFudGljcwoKICAgIEZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhbmQgfEludGVncmFsIENvbnN0YW50fCBgYG5gYDoKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgYXQ8cyxuPjo6dHlwZSB0OyAKCiAgICA6UmV0dXJuIHR5cGU6CiAgICAgICAgQSB0eXBlLgoKICAgIDpQcmVjb25kaXRpb246CiAgICAgICAgYGAwIDw9IG46OnZhbHVlIDwgc2l6ZTxzPjo6dmFsdWVgYC4KCiAgICA6U2VtYW50aWNzOgogICAgICAgIEVxdWl2YWxlbnQgdG8gCiAgICAgICAgCiAgICAgICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgICAgICAgIAogICAgICAgICAgIHR5cGVkZWYgZGVyZWY8IGFkdmFuY2U8IGJlZ2luPHM+Ojp0eXBlLG4gPjo6dHlwZSA+Ojp0eXBlIHQ7CgoKLi4gY29tcG91bmQ6OgogICAgOmNsYXNzOiBleHByZXNzaW9uLXNlbWFudGljcwoKICAgIEZvciBhbnkgfEFzc29jaWF0aXZlIFNlcXVlbmNlfCBgYHNgYCwgYW5kIGFyYml0cmFyeSB0eXBlcyBgYGtleWBgIGFuZCBgYHhgYDoKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgYXQ8cyxrZXkseD46OnR5cGUgdDsgCgogICAgOlJldHVybiB0eXBlOgogICAgICAgIEEgdHlwZS4KCiAgICA6U2VtYW50aWNzOgogICAgICAgIElmIGBgaGFzX2tleTxzLGtleT46OnZhbHVlID09IHRydWVgYCwgYGB0YGAgaXMgdGhlIHZhbHVlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGBga2V5YGA7CiAgICAgICAgb3RoZXJ3aXNlIGBgdGBgIGlzIGlkZW50aWNhbCB0byBgYHhgYC4KCgogICAgLi4gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBhdDxzLGtleT46OnR5cGUgdDsgCiAgICAKICAgIDpSZXR1cm4gdHlwZToKICAgICAgICBBIHR5cGUuCgogICAgOlNlbWFudGljczoKICAgICAgICBFcXVpdmFsZW50IHRvCgogICAgICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgICAgICAgICAKICAgICAgICAgICB0eXBlZGVmIGF0PHMsa2V5LHZvaWRcXz46OnR5cGUgdDsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFNlcXVlbmNlIGFyY2hldHlwZSAgICAgICAgICAgIHwgQ29tcGxleGl0eSAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgfEZvcndhcmQgU2VxdWVuY2V8ICAgICAgICAgICAgfCBMaW5lYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB8UmFuZG9tIEFjY2VzcyBTZXF1ZW5jZXwgICAgICB8IEFtb3J0aXplZCBjb25zdGFudCB0aW1lLiAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IHxBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwgICAgICAgIHwgQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiByYW5nZV9jPGxvbmcsMTAsNTA+IHJhbmdlOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGF0PCByYW5nZSwgaW50XzwwPiA+Ojp2YWx1ZSksID09LCAxMCApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGF0PCByYW5nZSwgaW50XzwxMD4gPjo6dmFsdWUpLCA9PSwgMjAgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChhdDwgcmFuZ2UsIGludF88NDA+ID46OnZhbHVlKSwgPT0sIDUwICk7CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgc2V0PCBpbnQgY29uc3QsbG9uZyosZG91YmxlID4gczsKCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgYXQ8cyxjaGFyPjo6dHlwZSwgdm9pZFxfID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgYXQ8cyxpbnQ+Ojp0eXBlLCBpbnQgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEZvcndhcmQgU2VxdWVuY2V8LCB8UmFuZG9tIEFjY2VzcyBTZXF1ZW5jZXwsIHxBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwsIHxhdF9jfCwgfGZyb250fCwgfGJhY2t8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=