Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZW1vdmVfaWYgfDcwCgpyZW1vdmVfaWYKPT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBQcmVkCiAgICAgICAgLCB0eXBlbmFtZSBJbiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgcmVtb3ZlX2lmCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGEgbmV3IHNlcXVlbmNlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHxiZWdpbi9lbmQ8U2VxdWVuY2U+fCByYW5nZSAKZXhjZXB0IHRob3NlIHRoYXQgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGBgUHJlZGBgLgoKLi4gUmV0dXJucyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIHNlcXVlbmNlIHdpdGggYWxsIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlIHByZWRpY2F0ZSAKICAgYGBQcmVkYGAgcmVtb3ZlZC4KCnx0cmFuc2Zvcm1hdGlvbiBhbGdvcml0aG0gZGlzY2xhaW1lcnwKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9yZW1vdmVfaWYuaHBwPgoKCk1vZGVsIG9mCi0tLS0tLS0tCgp8UmV2ZXJzaWJsZSBBbGdvcml0aG18CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBBbiBvcmlnaW5hbCBzZXF1ZW5jZS4gICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFByZWRgYCAgICAgIHwgVW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCAgICAgICAgIHwgQSByZW1vdmFsIGNvbmRpdGlvbi4gICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBJbmBgICAgICAgICB8IHxJbnNlcnRlcnwgICAgICAgICAgICAgICAgICAgICAgICB8IEFuIGluc2VydGVyLiAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgp8U2VtYW50aWNzIGRpc2NsYWltZXIuLi58IHxSZXZlcnNpYmxlIEFsZ29yaXRobXwuCgpGb3IgYW55IHxGb3J3YXJkIFNlcXVlbmNlfCBgYHNgYCwgYW5kIGFuIHxJbnNlcnRlcnwgYGBpbmBgLCBhbmQgYW4gdW5hcnkgCnxMYW1iZGEgRXhwcmVzc2lvbnwgYGBwcmVkYGA6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgcmVtb3ZlX2lmPHMscHJlZCxpbj46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgbGFtYmRhPHByZWQ+Ojp0eXBlIHA7CiAgICAgICAgdHlwZWRlZiBsYW1iZGE8aW46Om9wZXJhdGlvbj46OnR5cGUgb3A7CiAgICAgICAgCiAgICAgICAgdHlwZWRlZiBmb2xkPAogICAgICAgICAgICAgIHMKICAgICAgICAgICAgLCBpbjo6c3RhdGUKICAgICAgICAgICAgLCBldmFsX2lmPAogICAgICAgICAgICAgICAgICBhcHBseV93cmFwXCBgYDFgYFw8cCxfMj4KICAgICAgICAgICAgICAgICwgaWRlbnRpdHk8XzE+CiAgICAgICAgICAgICAgICAsIGFwcGx5X3dyYXBcIGBgMmBgXDxvcCxfMSxfMj4KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgPjo6dHlwZSByOwoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBQZXJmb3JtcyBleGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWVgYCBhcHBsaWNhdGlvbnMgb2YgYGBwcmVkYGAsIGFuZCBhdCAKbW9zdCBgYHNpemU8cz46OnZhbHVlYGAgaW5zZXJ0aW9ucy4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3JfYzxpbnQsMSw0LDUsMiw3LDUsMyw1Pjo6dHlwZSBudW1iZXJzOwogICAgdHlwZWRlZiByZW1vdmVfaWY8IG51bWJlcnMsIGdyZWF0ZXI8XyxpbnRfPDQ+ID4gPjo6dHlwZSByZXN1bHQ7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBlcXVhbDwgcmVzdWx0LHZlY3Rvcl9jPGludCwxLDQsMiwzPixlcXVhbF90bzxfLF8+ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxUcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zfCwgfFJldmVyc2libGUgQWxnb3JpdGhtfCwgfHJldmVyc2VfcmVtb3ZlX2lmfCwgfHJlbW92ZXwsIHxjb3B5X2lmfCwgfHJlcGxhY2VfaWZ8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=