Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy91bmlxdWUgfDgwCgp1bmlxdWUKPT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcQogICAgICAgICwgdHlwZW5hbWUgUHJlZAogICAgICAgICwgdHlwZW5hbWUgSW4gPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgPgogICAgc3RydWN0IHVuaXF1ZQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyBhIHNlcXVlbmNlIG9mIHRoZSBpbml0aWFsIGVsZW1lbnRzIG9mIGV2ZXJ5IHN1YnJhbmdlIG9mIHRoZQpvcmlnaW5hbCBzZXF1ZW5jZSBgYFNlcWBgIHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgdGhlIHNhbWUuIAoKfHRyYW5zZm9ybWF0aW9uIGFsZ29yaXRobSBkaXNjbGFpbWVyfAoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3VuaXF1ZS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgICAgICB8IEFuIG9yaWdpbmFsIHNlcXVlbmNlLiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgUHJlZGBgICAgICAgfCBCaW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCAgICAgICAgfCBBbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEluYGAgICAgICAgIHwgfEluc2VydGVyfCAgICAgICAgICAgICAgICAgICAgICAgIHwgQW4gaW5zZXJ0ZXIuICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxTZW1hbnRpY3MgZGlzY2xhaW1lci4uLnwgfFJldmVyc2libGUgQWxnb3JpdGhtfC4KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhIGJpbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgcHJlZGBgLCAKYW5kIGFuIHxJbnNlcnRlcnwgYGBpbmBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHVuaXF1ZTxzLHByZWQsaW4+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSB0eXBlLgoKOlNlbWFudGljczoKICAgIElmIGBgc2l6ZTxzPjo6dmFsdWUgPD0gMWBgLCB0aGVuIGVxdWl2YWxlbnQgdG8KCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIGNvcHk8cyxpbj46OnR5cGUgcjsKICAgIAogICAgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8KCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgbGFtYmRhPHByZWQ+Ojp0eXBlIHA7CiAgICAgICAgdHlwZWRlZiBsYW1iZGE8aW46Om9wZXJhdGlvbj46OnR5cGUgaW5fb3A7CiAgICAgICAgdHlwZWRlZiBhcHBseV93cmFwXCBgYDJgYFw8CiAgICAgICAgICAgICAgaW5fb3AKICAgICAgICAgICAgLCBpbjo6c3RhdGUKICAgICAgICAgICAgLCBmcm9udDx0eXBlcz46OnR5cGUgCiAgICAgICAgICAgID46OnR5cGUgaW5fc3RhdGU7CgogICAgICAgIHR5cGVkZWYgZm9sZDwKICAgICAgICAgICAgICBzCiAgICAgICAgICAgICwgcGFpcjwgaW5fc3RhdGUsIGZyb250PHM+Ojp0eXBlID4KICAgICAgICAgICAgLCBldmFsX2lmPCAKICAgICAgICAgICAgICAgICAgYXBwbHlfd3JhcFwgYGAyYGBcPHAsIHNlY29uZDxfMT4sIF8yPgogICAgICAgICAgICAgICAgLCBpZGVudGl0eTwgZmlyc3Q8XzE+ID4KICAgICAgICAgICAgICAgICwgYXBwbHlfd3JhcFwgYGAyYGBcPGluX29wLCBmaXJzdDxfMT4sIF8yPgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICA+Ojp0eXBlOjpmaXJzdCByOwoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBQZXJmb3JtcyBleGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWUgLSAxYGAgYXBwbGljYXRpb25zIG9mIGBgcHJlZGBgLCBhbmQgYXQgCm1vc3QgYGBzaXplPHM+Ojp2YWx1ZWBgIGluc2VydGlvbnMuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yPGludCxmbG9hdCxmbG9hdCxjaGFyLGludCxpbnQsaW50LGRvdWJsZT4gdHlwZXM7CiAgICB0eXBlZGVmIHZlY3RvcjxpbnQsZmxvYXQsY2hhcixpbnQsZG91YmxlPiBleHBlY3RlZDsKICAgIHR5cGVkZWYgdW5pcXVlPCB0eXBlcywgaXNfc2FtZTxfMSxfMj4gPjo6dHlwZSByZXN1bHQ7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDwgcmVzdWx0LGV4cGVjdGVkID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxUcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zfCwgfFJldmVyc2libGUgQWxnb3JpdGhtfCwgfHJldmVyc2VfdW5pcXVlfCwgfHJlbW92ZXwsIHxjb3B5X2lmfCwgfHJlcGxhY2VfaWZ8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=