LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSB0YWJsZXMuaAovLwovLyAKLy8KLy8gQ3JlYXRlZCBieTogSGVsZW5hIFNoaWgKLy8KLy8gTW9kaWZpY2F0aW9uIEhpc3Rvcnk6Ci8vCi8vICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgovLyAgMi81Lzk3ICAgICAgYWxpdSAgICAgICAgQWRkZWQgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHRvIEVudHJ5UGFpciwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mSW50LCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlLCBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZS4gIFRoZXNlIGFyZSB1c2VkIGJ5IFRhYmxlQ29sbGF0aW9uCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbiBhbmQgc3RyZWFtT3V0IG1ldGhvZHMuCi8vICAzLzUvOTcgICAgICBhbGl1ICAgICAgICBNYWRlIFZlY3Rvck9mUG9pbnRlcnNUb1BhdHRlcm5FbnRyeTo6YXQoKSBpbmxpbmUuCi8vICA1LzA3Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpc0JvZ3VzKCkuCi8vICA2LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBWZWN0b3JPZlBvaW50ZXIgZm9yIHF1ZXVlLXVwIGV4dGVuc2lvbiBsaXN0IGluCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBNZXJnZUNvbGxhdGlvbi4KLy8gIDgvMTgvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLiAgTm90ZS4gQWxsIHRoZSBWZWN0b3JPZlhYWAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGlzIGFib3V0IHRoZSBzYW1lLiAgVGhlIGludGVybmFsIEFQSSBkb2NzIHdpbGwgYmUKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHRvIG9ubHkgdGhlIGZpcnN0IHZlcnNpb24gYW5kIGFkZGl0aW9uYWwgZGVzY3JpcHRpb24KLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYWRkZWQgd2hlcmUgbmVjZXNzYXJ5LgovLyAgOC8wNC85OCAgICAgICAgZXJtICAgICAgICAgICAgQWRkZWQgZndkIG1lbWJlciB0byBFbnRyeVBhaXIuCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBUQUJMRVNfSAojZGVmaW5lIFRBQkxFU19ICgoKI2luY2x1ZGUgImZpbGVzdHJtLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgoKCi8qKgogKiBFbnRyeVBhaXIgaXMgdXNlZCBmb3IgY29udHJhY3RpbmcgY2hhcmFjdGVycy4gIEVhY2ggZW50cnkgcGFpciBjb250YWlucyB0aGUgY29udHJhY3RpbmcgCiAqIGNoYXJhY3RlciBzdHJpbmcgYW5kIGl0cyBjb2xsYXRpb24gb3JkZXIuCiAqLwpjbGFzcyBFbnRyeVBhaXIKewpwdWJsaWM6CiAgICAvKioKICAgICAqIENvbnN0cnVjdG9yCiAgICAgKi8KICAgIEVudHJ5UGFpcigpOwogICAgRW50cnlQYWlyKGNvbnN0IFVuaWNvZGVTdHJpbmcgJm5hbWUsIGludDMyX3QgYVZhbHVlLCBib29sX3QgYUZ3ZCA9IFRSVUUpOwoKICAgIFVuaWNvZGVTdHJpbmcgZW50cnlOYW1lOyAgICAgICAgLy8gQ29udHJhY3RpbmcgY2hhcmFjdGVycwogICAgaW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAvLyBDb2xsYXRpb24gb3JkZXIKICAgIGJvb2xfdCBmd2Q7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiB0aGlzIHBhaXIgaXMgZm9yIHRoZSBmb3J3YXJkIGRpcmVjdGlvbgoKICAgIC8qKgogICAgICogVGhlIHN0cmVhbUluIGFuZCBzdHJlYW1PdXQgbWV0aG9kcyByZWFkIGFuZCB3cml0ZSBvYmplY3RzIG9mIHRoaXMKICAgICAqIGNsYXNzIGFzIGJpbmFyeSwgcGxhdGZvcm0tZGVwZW5kZW50IGRhdGEgaW4gdGhlIGlvc3RyZWFtLiAgVGhlIHN0cmVhbQogICAgICogbXVzdCBiZSBpbiBpb3M6OmJpbmFyeSBtb2RlIGZvciB0aGlzIHRvIHdvcmsuICBUaGVzZSBtZXRob2RzIGFyZSBub3QKICAgICAqIGludGVuZGVkIGZvciBnZW5lcmFsIHB1YmxpYyB1c2U7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbXByb3ZlCiAgICAgKiBwZXJmb3JtYW5jZSBieSBzdG9yaW5nIGNlcnRhaW4gb2JqZWN0cyBpbiBiaW5hcnkgZmlsZXMuCiAgICAgKi8KICAgIHZvaWQgc3RyZWFtT3V0KEZpbGVTdHJlYW0qIG9zKSBjb25zdDsKICAgIHZvaWQgc3RyZWFtSW4oRmlsZVN0cmVhbSogaXMpOwp9OwoKCi8qKgogKiBWZWN0b3JPZkludCBpcyBhIGR5bmFtaWMgYXJyYXkgb2YgMzItYml0IGludGVnZXJzLiAgCiAqIElkZWFsbHkgd2Ugd291bGQgdXNlIHRlbXBsYXRlcyBmb3IgdGhpcywgYnV0IHRoZXkncmUgbm90IHN1cHBvcnRlZAogKiBvbiBhbGwgb2YgdGhlIHBsYXRmb3JtcyB3ZSBuZWVkIHRvIHN1cHBvcnQuCiAqLwpjbGFzcyBWZWN0b3JPZkludCB7CgogICAgcHVibGljOgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjaHVuayBzaXplIGJ5IHdoaWNoIHRoZSBhcnJheSBpcyBncm93bi4KICAgICAgICAgKiBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSBpbiB0aGUgQVBJCiAgICAgICAgICovCiAgICAgICAgZW51bSBFR3Jvd3RoUmF0ZSB7IEdST1dUSF9SQVRFID0gNCB9OwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSB2ZWN0b3IgdGhhdCBjb250YWlucyBlbGVtZW50cyBvZiBpbnRlZ2Vycy4KICAgICAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgdmVjdG9yIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JPZkludChpbnQzMl90IGluaXRpYWxTaXplID0gMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JPZkludChjb25zdCBWZWN0b3JPZkludCYgIHRoYXQpOwogICAgICAgIC8qKgogICAgICAgICAqIERlc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflZlY3Rvck9mSW50KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3QgVmVjdG9yT2ZJbnQmICAgICAgb3BlcmF0b3I9KGNvbnN0IFZlY3Rvck9mSW50JiAgICB0aGF0KTsKICAgICAgICAKCiAgICAgICAgLyoqCiAgICAgICAgICogRXF1YWxpdHkgb3BlcmF0b3JzLgogICAgICAgICAqLwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yT2ZJbnQmIHRoYXQpOwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgVmVjdG9yT2ZJbnQmIHRoYXQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGEgcmVhZC1vbmx5IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIFRoaXMgZG9lcyBub3QgZG8gcmFuZ2UtY2hlY2tpbmc7IGFuIGludmFsaWQgaW5kZXggbWF5IGNhdXNlIGEgY3Jhc2guCiAgICAgICAgICogQHJldHVybiB0aGUgYWNjZXNzZWQgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBhdChpbnQzMl90ICBpbmRleCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYSBub24tY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogVGhpcyBkb2VzIHJhbmdlLWNoZWNraW5nOyBhY2Nlc3MgdG8gZWxlbWVudHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlCiAgICAgICAgICogYXJyYXkgd2lsbCBjYXVzZSB0aGUgYXJyYXkgdG8gZ3Jvdy4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90JiAgICAgICAgICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KTsKICAgICAgICBpbnQzMl90JiAgICAgICAgICAgICAgICBhdChpbnQzMl90ICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byBhIGRpZmZlcmVudCB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBhdFB1dCggIGludDMyX3QgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCYgIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiBJbnNlcnRzIGEgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgc2xpZGluZyB0aGUgcmVzdCBvZgogICAgICAgICAqIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgb3ZlciB0byBtYWtlIHJvb20uCiAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBhdEluc2VydCggICBpbnQzMl90ICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QmICB2YWx1ZSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIHNpemUodm9pZCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyB2ZWN0b3IuIElmIHRoZSBuZXcgc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlIAogICAgICAgICAqIGN1cnJlbnQgc2l6ZSwgbmV3IDxjb2RlPjA8L2NvZGU+IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIAogICAgICAgICAqIHRoZSB2ZWN0b3IuIElmIHRoZSBuZXcgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSwgYWxsIAogICAgICAgICAqIGNvbXBvbmVudHMgYXQgaW5kZXggPGNvZGU+bmV3U2l6ZTwvY29kZT4gYW5kIGdyZWF0ZXIgYXJlIGRpc2NhcmRlZC4KICAgICAgICAgKiBJZiA8Y29kZT5uZXdTaXplPC9jb2RlPiBpcyBuZWdhdGl2ZSBpdCBpcyB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgemVyby4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSAgIG5ld1NpemUgICB0aGUgbmV3IHNpemUgb2YgdGhpcyB2ZWN0b3IuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZShpbnQzMl90IG5ld1NpemUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLgogICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgdmVjdG9yIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgIGlzQm9ndXModm9pZCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBzdHJlYW1JbiBhbmQgc3RyZWFtT3V0IG1ldGhvZHMgcmVhZCBhbmQgd3JpdGUgb2JqZWN0cyBvZiB0aGlzCiAgICAgICAgICogY2xhc3MgYXMgYmluYXJ5LCBwbGF0Zm9ybS1kZXBlbmRlbnQgZGF0YSBpbiB0aGUgaW9zdHJlYW0uICBUaGUgc3RyZWFtCiAgICAgICAgICogbXVzdCBiZSBpbiBpb3M6OmJpbmFyeSBtb2RlIGZvciB0aGlzIHRvIHdvcmsuICBUaGVzZSBtZXRob2RzIGFyZSBub3QKICAgICAgICAgKiBpbnRlbmRlZCBmb3IgZ2VuZXJhbCBwdWJsaWMgdXNlOyB0aGV5IGFyZSB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gaW1wcm92ZQogICAgICAgICAqIHBlcmZvcm1hbmNlIGJ5IHN0b3JpbmcgY2VydGFpbiBvYmplY3RzIGluIGJpbmFyeSBmaWxlcy4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzdHJlYW1PdXQoRmlsZVN0cmVhbSogb3MpIGNvbnN0OwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluKEZpbGVTdHJlYW0qIGlzKTsKCiAgICBwcml2YXRlOgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2l6ZXMgdGhlIHZlY3RvciBpZiBuZWNlc3Nhcnkgd2hlbiBjb21wYXJlZCB0byBhIG5ldyBzaXplLgogICAgICAgICAqIEBwYXJhbSBuZXdTaXplIHRoZSBuZXcgc2l6ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplKGludDMyX3QgIG5ld1NpemUpOwogICAgCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGZTaXplOwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBmQ2FwYWNpdHk7CiAgICAgICAgaW50MzJfdCogICAgICAgICAgICAgICAgICAgIGZFbGVtZW50czsKICAgICAgICBib29sX3QgICAgICAgICAgICAgICAgICAgICAgZkJvZ3VzOwp9OwoKLyoqCiAqIFZlY3Rvck9mUG9pbnRlciBpcyBhIGR5bmFtaWMgYXJyYXkgb2Ygdm9pZCogcG9pbnRlcnMuICAKICogIDxQPgogKiAgVGhpcyBpcyBhIHZlY3RvciBjbGFzcyB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBwb2ludGVyIHR5cGVzIGFuZCB3aGljaCBpbXBsZW1lbnRzCiAqICBvd25pbmcgc2VtYW50aWNzLiAgVGhhdCBpcywgb25jZSBhIHZhbHVlIGlzIHBsYWNlZCBhbiBlbGVtZW50IG9mIHRoZSB2ZWN0b3IsIHRoZSB2ZWN0b3IgaXMKICogIGNvbnNpZGVyZWQgdG8gb3duIGl0IGFuZCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0LiAgVGhpcyB3aWxsIGhhcHBlbiBib3RoIHdoZW4gdGhlCiAqICBlbGVtZW50IGlzIGNoYW5nZWQgdXNpbmcgYXRQdXQoKSBvciB0aHJvdWdoIGFuIFBvaW50ZXJUbyoqKiosIGFuZCB3aGVuIHRoZSB2ZWN0b3IgaXRzZWxmIGlzCiAqICBkaXNwb3NlZC4gIAogKiAgPFA+CiAqICBXQVJOSU5HOiAgVGhlIGNhbGxlciBtdXN0IGJlIGNhcmVmdWwgdG8gYXZvaWQgaG9sZGluZyBvbnRvIGFueSBkYW5nbGluZyByZWZlcmVuY2VzCiAqICBhZnRlciB0aGUgdmVjdG9yIGlzIGRpc3Bvc2VkLCBhbmQgdGhlIGNhbGxlciBtdXN0IGFsc28gYmUgY2FyZWZ1bCBub3QgdG8gcHV0IHRoZSBzYW1lCiAqICB2YWx1ZSBpbnRvIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBpbiB0aGUgdmVjdG9yICh1bmxlc3MgdGhlIHZhbHVlIGlzIE5VTEwpLgogKiAgPFA+CiAqICBBcyB3aXRoIFZlY3Rvck9mKioqPiwgdGhlIHZlY3RvciBncm93cyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUgYWxsIGVsZW1lbnRzLCB0aGUKICogIHNpemUgaXMgb25lIHBsdXMgdGhlIGluZGV4IG9mIHRoZSBoaWdoZXN0IGVsZW1lbnQgdGhhdCdzIGJlZW4gc2V0LCBhbmQgYW55IGVsZW1lbnRzIGJlbG93CiAqICB0aGUgaGlnaGVzdCBlbGVtZW50IHRoYXQgYXJlbid0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYXJlIGluaXRpYWxpemVkIHRvIE5VTEwuCiAqLwpjbGFzcyBWZWN0b3JPZlBvaW50ZXIgewogICAgcHVibGljOgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjaHVuayBzaXplIGJ5IHdoaWNoIHRoZSBhcnJheSBpcyBncm93bi4KICAgICAgICAgKiBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSBpbiB0aGUgQVBJCiAgICAgICAgICovCiAgICAgICAgZW51bSBFR3Jvd3RoUmF0ZSB7IEdST1dUSF9SQVRFID0gNCB9OwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSB2ZWN0b3IgdGhhdCBjb250YWlucyBlbGVtZW50cyBvZiBwb2ludGVycyB0byBvYmplY3RzLgogICAgICAgICAqIEBwYXJhbSBpbml0aWFsU2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSB2ZWN0b3Igb2JqZWN0LgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JPZlBvaW50ZXIoaW50MzJfdCBpbml0aWFsU2l6ZSA9IDApOwogICAgICAgIC8qKgogICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUG9pbnRlcihjb25zdCBWZWN0b3JPZlBvaW50ZXImICB0aGF0KTsKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VmVjdG9yT2ZQb2ludGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvci4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBWZWN0b3JPZlBvaW50ZXImICAgICAgb3BlcmF0b3I9KGNvbnN0IFZlY3Rvck9mUG9pbnRlciYgICAgdGhhdCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEVxdWFsaXR5IG9wZXJhdG9ycy4KICAgICAgICAgKi8KICAgICAgICBib29sX3QgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I9PShjb25zdCBWZWN0b3JPZlBvaW50ZXImIHRoYXQpOwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IFZlY3Rvck9mUG9pbnRlciYgdGhhdCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYSByZWFkLW9ubHkgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogVGhpcyBkb2VzIG5vdCBkbyByYW5nZS1jaGVja2luZzsgYW4gaW52YWxpZCBpbmRleCBtYXkgY2F1c2UgYSBjcmFzaC4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBhY2Nlc3NlZCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgYXQoaW50MzJfdCAgaW5kZXgpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIFRoaXMgZG9lcyByYW5nZS1jaGVja2luZzsgYWNjZXNzIHRvIGVsZW1lbnRzIGJleW9uZCB0aGUgZW5kIG9mIHRoZQogICAgICAgICAqIGFycmF5IHdpbGwgY2F1c2UgdGhlIGFycmF5IHRvIGdyb3cuCiAgICAgICAgICovCiAgICAgICAgdm9pZComICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwogICAgICAgIHZvaWQqJiAgICAgICAgICAgICAgICAgICAgICBhdChpbnQzMl90ICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byBhIGRpZmZlcmVudCB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZComICAgIHZhbHVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHNsaWRpbmcgdGhlIHJlc3Qgb2YKICAgICAgICAgKiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IG92ZXIgdG8gbWFrZSByb29tLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGF0SW5zZXJ0KCAgIGludDMyX3QgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiYgICAgdmFsdWUpOwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBzaXplKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLgogICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgdmVjdG9yIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgICAgICBpc0JvZ3VzKHZvaWQpIGNvbnN0OwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzaXplcyB0aGUgdmVjdG9yIGlmIG5lY2Vzc2FyeSB3aGVuIGNvbXBhcmVkIHRvIGEgbmV3IHNpemUuCiAgICAgICAgICogQHBhcmFtIG5ld1NpemUgdGhlIG5ldyBzaXplLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICByZXNpemUoaW50MzJfdCAgbmV3U2l6ZSk7CiAgICAKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgZlNpemU7CiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGZDYXBhY2l0eTsKICAgICAgICB2b2lkKiogICAgICAgICAgICAgICAgICAgICAgZkVsZW1lbnRzOwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgICAgICBmQm9ndXM7Cn07CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIFJ1bGVCYXNlZENvbGxhdG9yIG9iamVjdC4KLy8gIFN1cHBvc2Ugd2UgaGF2ZSB0aGUgcnVsZSwgd2hlcmUgJ28tdW1sYXV0JyBpcyB0aGUgdW5pY29kZSBjaGFyIDB4MDBGNi4KLy8gICJhLCBBIDwgYiwgQiA8IGMsIEMsIGNoLCBjSCwgQ2gsIENIIDwgZCwgRCAuLi4gPCBvLCBPOyAnby11bWxhdXQnL0UsICdPLXVtbGF1dCcvRSAuLi4iLgovLyAgV2hhdCB0aGUgcnVsZSBzYXlzIGlzLCBzb3J0cyAnY2gnbGlnYXR1cmVzIGFuZCAnYycgb25seSB3aXRoIHRlcnRpYXJ5IGRpZmZlcmVuY2UgYW5kCi8vICBzb3J0cyAnby11bWxhdXQnIGFzIGlmIGl0J3MgYWx3YXlzIGV4cGFuZGVkIHdpdGggJ2UnLgovLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlKSAgICAgICAgIChWZWN0b3JPZlBUb0V4cGFuZFRhYmxlKQovLyBtYXBwaW5nIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3RpbmcgbGlzdCAgICAgICAgICAgICAgICAgIGV4cGFuZGluZyBsaXN0Ci8vIChjb250YWlucyBhbGwgdW5pY29kZSBjaGFyCi8vICBlbnRyaWVzKQovLyAgICAgICAgICAgICAgICAgICAoVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQpICooUFRvQ29udHJhY3RFbGVtZW50KSAgICAgIChQVG9FeHBhbmRUYWJsZSkKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fXyAgICAgICAgX19fX19fX19fX19fXyAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX18KLy8gICBfX19fX19fXyAgICAgICAgICAgICAgICAgICB8PT09PT0+fF8qX3wtLS0tLT58J2MnICB8dignYycpIHwgICB8PT0+fHYoJ28nKXx2KCd1bWxhdXQnKXx2KCdlJyl8Ci8vICB8X1x1MDAwMV98LS0+IHYoJ1x1MDAwMScpICAgfCAgICAgIHxfOl98ICAgICAgfC0tLS0tLS0tLS0tLS18ICAgfCAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAovLyAgfF9cdTAwMDJffC0tPiB2KCdcdTAwMDInKSAgIHwgICAgICB8XzpffCAgICAgIHwnY2gnIHx2KCdjaCcpfCAgIHwgICB8ICAgICAgICAgICAgIDogICAgICAgICAgIHwKLy8gIHxfX19fOl9fX3wgICAgICAgICAgICAgICAgICB8ICAgICAgfF86X3wgICAgICB8LS0tLS0tLS0tLS0tLXwgICB8ICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci8vICB8X19fXzpfX198ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCdjSCcgfHYoJ2NIJyl8ICAgfCAgIHwgICAgICAgICAgICAgOiAgICAgICAgICAgfAovLyAgfF9fJ2EnX19ffC0tPiB2KCdhJykgICAgICAgIHwgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tfCAgIHwgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLy8gIHxfXydiJ19fX3wtLT4gdignYicpICAgICAgICB8ICAgICAgICAgICAgICAgICB8J0NoJyB8dignQ2gnKXwgICB8ICAgfCAgICAgICAgICAgICA6ICAgICAgICAgICB8Ci8vICB8X19fXzpfX198ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS18ICAgfCAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAovLyAgfF9fX186X19ffCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwnQ0gnIHx2KCdDSCcpfCAgIHwgICB8ICAgICAgICAgICAgIDogICAgICAgICAgIHwKLy8gIHxfXydjaCdfX3wtLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICB8ICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci8vICB8X19fXzpfX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgICAgICAgICAgOiAgICAgICAgICAgfAovLyAgfG8tdW1sYXV0fC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICB8X19fX19fX19fX19fX19fX19fX19fX19fX3wKLy8gIHxfX19fOl9fX3wKLy8KLy8KLy8gTm90ZWQgYnkgSGVsZW5hIFNoaWggb24gNi8yMy85NyB3aXRoIHBlbmRpbmcgZGVzaWduIGNoYW5nZXMgKHNsaW1taW5nIGNvbGxhdGlvbikuCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTsKCi8qKiAKICogUFRvRXhwYW5kVGFibGUgaXMgYSBzbWFydC1wb2ludGVyIHRvIGEgVmVjdG9yT2ZJbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlCiAqIHRoZSBjb2xsYXRpb24gb3JkZXJzIHRoYXQgYXJlIHRoZSByZXN1bHQgb2YgYW4gZXhwYW5zaW9uLgogKiA8UD4KICogWW91IGNhbiB1c2UgdGhpcyBvYmplY3QgYXMgaWYgaXQgd2VyZSBhIHBvaW50ZXIgdG8gYSBWZWN0b3JPZkludCwgZS5nLgogKiA8cHJlPgogKiBQVG9FeHBhbmRUYWJsZSBmb28gPSAuLi4uOwogKiBmb28tPmF0SW5zZXJ0KC4uLi4pOwogKiA8L3ByZT4KICovCmNsYXNzIFBUb0V4cGFuZFRhYmxlIHsKICAgIHB1YmxpYzoKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5QVG9FeHBhbmRUYWJsZSgpOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3JzCiAgICAgICAgICogVGhlIGV4cGFuZCB0YWJsZSB0aGF0IHRoaXMgb2JqZWN0IGFscmVhZHkgcG9pbnRzIHRvIChpZiBhbnkpIGlzIGRlbGV0ZWQuCiAgICAgICAgICovCiAgICAgICAgY29uc3QgUFRvRXhwYW5kVGFibGUmICAgICAgICAgICAgICAgb3BlcmF0b3I9KFZlY3Rvck9mSW50KiAgbmV3VmFsdWUpOwogICAgICAgIGNvbnN0IFBUb0V4cGFuZFRhYmxlJiAgICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBQVG9FeHBhbmRUYWJsZSYgcG9pbnRlclRvTmV3VmFsdWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBQb2ludGVyIG9wZXJhdG9yIG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgVmVjdG9yT2ZJbnQqKCkgY29uc3Q7CgogICAgcHJpdmF0ZToKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUb0V4cGFuZFRhYmxlKFZlY3Rvck9mSW50KiYgICAgdmFsdWUpOwogICAgICAgIC8qKgogICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRvRXhwYW5kVGFibGUoY29uc3QgUFRvRXhwYW5kVGFibGUmICAgIHRoYXQpOwoKICAgICAgICBWZWN0b3JPZkludComICAgICAgICAgICAgICAgICAgICAgICBmVmFsdWU7CgogICAgICAgIGZyaWVuZCBjbGFzcyBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlOwp9OwoKLyoqCiAqICBWZWN0b3JPZlBvaW50ZXIgaXMgYSBkeW5hbWljIGFycmF5IG9mIFBUb0V4cGFuZFRhYmxlIG9iamVjdHMKICogIHdoaWNoIGluIHR1cm4gcG9pbnQgdG8gdGhlIGFycmF5IG9mIGNvbGxhdGlvbiBvcmRlcnMgZm9yIGVhY2ggZXhwYW5kaW5nIGNoYXJhY3Rlci4KICogIDxQPgogKiAgVGhpcyBpcyBhIHZlY3RvciBjbGFzcyB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBwb2ludGVyIHR5cGVzIGFuZCB3aGljaCBpbXBsZW1lbnRzCiAqICBvd25pbmcgc2VtYW50aWNzLiAgVGhhdCBpcywgb25jZSBhIHZhbHVlIGlzIHBsYWNlZCBhbiBlbGVtZW50IG9mIHRoZSB2ZWN0b3IsIHRoZSB2ZWN0b3IgaXMKICogIGNvbnNpZGVyZWQgdG8gb3duIGl0IGFuZCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0LiAgVGhpcyB3aWxsIGhhcHBlbiBib3RoIHdoZW4gdGhlCiAqICBlbGVtZW50IGlzIGNoYW5nZWQgdXNpbmcgYXRQdXQoKSBvciB0aHJvdWdoIGFuIFBvaW50ZXJUbyoqKiosIGFuZCB3aGVuIHRoZSB2ZWN0b3IgaXRzZWxmIGlzCiAqICBkaXNwb3NlZC4gIAogKiAgPFA+CiAqICBXQVJOSU5HOiAgVGhlIGNhbGxlciBtdXN0IGJlIGNhcmVmdWwgdG8gYXZvaWQgaG9sZGluZyBvbnRvIGFueSBkYW5nbGluZyByZWZlcmVuY2VzCiAqICBhZnRlciB0aGUgdmVjdG9yIGlzIGRpc3Bvc2VkLCBhbmQgdGhlIGNhbGxlciBtdXN0IGFsc28gYmUgY2FyZWZ1bCBub3QgdG8gcHV0IHRoZSBzYW1lCiAqICB2YWx1ZSBpbnRvIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBpbiB0aGUgdmVjdG9yICh1bmxlc3MgdGhlIHZhbHVlIGlzIE5VTEwpLgogKiAgPFA+CiAqICBBcyB3aXRoIFZlY3Rvck9mKioqPiwgdGhlIHZlY3RvciBncm93cyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUgYWxsIGVsZW1lbnRzLCB0aGUKICogIHNpemUgaXMgb25lIHBsdXMgdGhlIGluZGV4IG9mIHRoZSBoaWdoZXN0IGVsZW1lbnQgdGhhdCdzIGJlZW4gc2V0LCBhbmQgYW55IGVsZW1lbnRzIGJlbG93CiAqICB0aGUgaGlnaGVzdCBlbGVtZW50IHRoYXQgYXJlbid0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgYXJlIGluaXRpYWxpemVkIHRvIE5VTEwuCiAqLwpjbGFzcyBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlIHsKICAgIHB1YmxpYzoKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNodW5rIHNpemUgYnkgd2hpY2ggdGhlIGFycmF5IGlzIGdyb3duLgogICAgICAgICAqIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIGluIHRoZSBBUEkKICAgICAgICAgKi8KICAgICAgICBlbnVtIEVHcm93dGhSYXRlIHsgR1JPV1RIX1JBVEUgPSA0IH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHZlY3RvciB0aGF0IGNvbnRhaW5zIGVsZW1lbnRzIG9mIFBUb0V4cGFuZFRhYmxlLgogICAgICAgICAqIEBwYXJhbSBpbml0aWFsU2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSB2ZWN0b3Igb2JqZWN0LgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZShpbnQzMl90ICBpbml0aWFsU2l6ZSA9IDApOwogICAgICAgIC8qKgogICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlKGNvbnN0IFZlY3Rvck9mUFRvRXhwYW5kVGFibGUmICAgIHRoYXQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgflZlY3Rvck9mUFRvRXhwYW5kVGFibGUoKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvci4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlJiAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFZlY3Rvck9mUFRvRXhwYW5kVGFibGUmIHRoYXQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gYSBtb2RpZmlhYmxlIHNtYXJ0LXBvaW50ZXIgdG8gdGhlIGV4cGFuc2lvbiB0YWJsZQogICAgICAgICAqIGF0IHRoZSBnaXZlbiBpbmRleC4gIEFzc2lnbmluZyB0byB0aGlzIHNtYXJ0IHBvaW50ZXIgd2lsbCB3b3JrLCBlLmcuCiAgICAgICAgICogIFZlY3Rvck9mUFRvRXhwYW5kVGFibGUgZm9vID0gLi4uLjsKICAgICAgICAgKiAgZm9vWzVdID0gbmV3IFZlY3Rvck9mSW50IC4uLjsKICAgICAgICAgKiBUaGlzIGRvZXMgcmFuZ2UtY2hlY2tpbmc7IGFjY2VzcyB0byBlbGVtZW50cyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgKiBhcnJheSB3aWxsIGNhdXNlIHRoZSBhcnJheSB0byBncm93LgogICAgICAgICAqLwogICAgICAgIFBUb0V4cGFuZFRhYmxlICAgICAgYXQoaW50MzJfdCAgaW5kZXgpOwogICAgICAgIFBUb0V4cGFuZFRhYmxlICAgICAgb3BlcmF0b3JbXShpbnQzMl90ICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRhYmxlIGF0IHRoZSBnaXZlbiBpbmRleC4KICAgICAgICAgKiBUaGUgcG9pbnRlciBpdHNlbGYgY2Fubm90IGJlIG1vZGlmaWVkLCBidXQgdGhlIGVsZW1lbnRzIGl0IHBvaW50cyB0byBtYXk6CiAgICAgICAgICogPHByZT4KICAgICAgICAgKiAgY29uc3QgVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZSBmb28gPSAuLi4uOwogICAgICAgICAqICBmb29bNV0gPSAuLi4uOyAgICAgIC8vIE5PVCBBTExPV0VECiAgICAgICAgICogIGZvb1s1XVswXSA9IDEyMzQ1OyAgLy8gb2sKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGRvIHJhbmdlLWNoZWNraW5nOyBhbiBpbnZhbGlkIGluZGV4IG1heSBjYXVzZSBhIGNyYXNoLgogICAgICAgICAqIEByZXR1cm4gdGhlIGFjY2Vzc2VkIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgVmVjdG9yT2ZJbnQqICAgICAgICBhdChpbnQzMl90ICBpbmRleCkgY29uc3Q7CiAgICAgICAgVmVjdG9yT2ZJbnQqICAgICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIGEgZGlmZmVyZW50IHZhbHVlLgogICAgICAgICAqIElmIHRoZXJlIHdhcyBhcmVhZHkgYW4gb2JqZWN0IHN0b3JlZCBhdCB0aGlzIGluZGV4LCBpdCBpcyBkZWxldGVkLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mSW50KiAgICB2YWx1ZSk7CgogICAgICAgIC8qKgogICAgICAgICAqICJPcnBoYW4iIHRoZSBwb2ludGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguICBUaGUgYXJyYXkgd2lsbCBubwogICAgICAgICAqIGxvbmdlciBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QsIGFuZCB0aGUgY2FsbGVyIGlzCiAgICAgICAgICogbm93IHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyBpdHMgc3RvcmFnZS4KICAgICAgICAgKi8KICAgICAgICBWZWN0b3JPZkludCogICAgICAgIG9ycGhhbkF0KGludDMyX3QgICAgaW5kZXgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHZlY3Rvci4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNpemUodm9pZCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHZlY3RvciBvYmplY3QgaXMgdmFsaWQuCiAgICAgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgYm9vbF90ICAgICAgICAgICAgICBpc0JvZ3VzKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogVGhlIHN0cmVhbUluIGFuZCBzdHJlYW1PdXQgbWV0aG9kcyByZWFkIGFuZCB3cml0ZSBvYmplY3RzIG9mIHRoaXMKICAgICAqIGNsYXNzIGFzIGJpbmFyeSwgcGxhdGZvcm0tZGVwZW5kZW50IGRhdGEgaW4gdGhlIGlvc3RyZWFtLiAgVGhlIHN0cmVhbQogICAgICogbXVzdCBiZSBpbiBpb3M6OmJpbmFyeSBtb2RlIGZvciB0aGlzIHRvIHdvcmsuICBUaGVzZSBtZXRob2RzIGFyZSBub3QKICAgICAqIGludGVuZGVkIGZvciBnZW5lcmFsIHB1YmxpYyB1c2U7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbXByb3ZlCiAgICAgKiBwZXJmb3JtYW5jZSBieSBzdG9yaW5nIGNlcnRhaW4gb2JqZWN0cyBpbiBiaW5hcnkgZmlsZXMuCiAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbU91dChGaWxlU3RyZWFtKiBvcykgY29uc3Q7CiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1JbihGaWxlU3RyZWFtKiBpcyk7CgogICAgcHJpdmF0ZToKICAgICAgICAvKioKICAgICAgICAgKiBSZXNpemVzIHRoZSB2ZWN0b3IgaWYgbmVjZXNzYXJ5IHdoZW4gY29tcGFyZWQgdG8gYSBuZXcgc2l6ZS4KICAgICAgICAgKiBAcGFyYW0gbmV3U2l6ZSB0aGUgbmV3IHNpemUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICByZXNpemUoaW50MzJfdCAgICAgIG5ld1NpemUpOwoKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGZTaXplOwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgZkNhcGFjaXR5OwogICAgICAgIFZlY3Rvck9mSW50KiogICAgICAgZkVsZW1lbnRzOwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgZkJvZ3VzOwp9OwoKY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ7CgovKiogCiAqIFBUb0NvbnRyYWN0RWxlbWVudCBpcyBhIHNtYXJ0LXBvaW50ZXIgdG8gYW4gYXJyYXkgdGhhdCBpcyB1c2VkIHRvIHN0b3JlCiAqIHRoZSBjb250cmFjdGluZy1jaGFyYWN0ZXIgc3RyaW5ncyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBVbmljb2RlIGNoYXJhY3Rlci4KICogPFA+CiAqIFlvdSBjYW4gdXNlIHRoaXMgb2JqZWN0IGFzIGlmIGl0IHdlcmUgYSBwb2ludGVyIHRvIGFuIEVudHJ5UGFpciBhcnJheSwgZS5nLgogKiA8cHJlPgogKiBQVG9Db250cmFjdEVsZW1lbnQgZm9vID0gLi4uLjsKICogZm9vLT5lbnRyeU5hbWUgPSAuLi4uOwogKiA8L3ByZT4KICovCmNsYXNzIFBUb0NvbnRyYWN0RWxlbWVudCB7CiAgICBwdWJsaWM6CiAgICAgICAgLyoqCiAgICAgICAgICogRGVzdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UFRvQ29udHJhY3RFbGVtZW50KCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvcnMKICAgICAgICAgKiBUaGUgRW50cnlQYWlyIHRoYXQgdGhpcyBvYmplY3QgYWxyZWFkeSBwb2ludHMgdG8gKGlmIGFueSkgaXMgZGVsZXRlZC4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBQVG9Db250cmFjdEVsZW1lbnQmICAgICAgICAgICAgICAgb3BlcmF0b3I9KEVudHJ5UGFpciogICAgbmV3VmFsdWUpOwogICAgICAgIGNvbnN0IFBUb0NvbnRyYWN0RWxlbWVudCYgICAgICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgUFRvQ29udHJhY3RFbGVtZW50JiBwb2ludGVyVG9OZXdWYWx1ZSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFBvaW50ZXIgb3BlcmF0b3Igb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBFbnRyeVBhaXIqKCkgY29uc3Q7CgogICAgcHJpdmF0ZToKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUb0NvbnRyYWN0RWxlbWVudChFbnRyeVBhaXIqJiAgdmFsdWUpOwogICAgICAgIC8qKgogICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRvQ29udHJhY3RFbGVtZW50KGNvbnN0IFBUb0NvbnRyYWN0RWxlbWVudCYgICAgdGhhdCk7CgogICAgICAgIEVudHJ5UGFpciomICAgICAgICAgICAgICAgICAgICAgZlZhbHVlOwoKICAgICAgICBmcmllbmQgY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ7Cn07CgovKioKICogIFRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNvbnRyYWN0aW5nIGNoYXJhY3RlciBlbnRyaWVzLgogKiAgPFA+CiAqICBUaGlzIGlzIGEgdmVjdG9yIGNsYXNzIHRoYXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIHBvaW50ZXIgdHlwZXMgYW5kIHdoaWNoIGltcGxlbWVudHMKICogIG93bmluZyBzZW1hbnRpY3MuICBUaGF0IGlzLCBvbmNlIGEgdmFsdWUgaXMgcGxhY2VkIGFuIGVsZW1lbnQgb2YgdGhlIHZlY3RvciwgdGhlIHZlY3RvciBpcwogKiAgY29uc2lkZXJlZCB0byBvd24gaXQgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQuICBUaGlzIHdpbGwgaGFwcGVuIGJvdGggd2hlbiB0aGUKICogIGVsZW1lbnQgaXMgY2hhbmdlZCB1c2luZyBhdFB1dCgpIG9yIHRocm91Z2ggYW4gUG9pbnRlclRvKioqKiwgYW5kIHdoZW4gdGhlIHZlY3RvciBpdHNlbGYgaXMKICogIGRpc3Bvc2VkLiAgCiAqICA8UD4KICogIFdBUk5JTkc6ICBUaGUgY2FsbGVyIG11c3QgYmUgY2FyZWZ1bCB0byBhdm9pZCBob2xkaW5nIG9udG8gYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMKICogIGFmdGVyIHRoZSB2ZWN0b3IgaXMgZGlzcG9zZWQsIGFuZCB0aGUgY2FsbGVyIG11c3QgYWxzbyBiZSBjYXJlZnVsIG5vdCB0byBwdXQgdGhlIHNhbWUKICogIHZhbHVlIGludG8gbW9yZSB0aGFuIG9uZSBlbGVtZW50IGluIHRoZSB2ZWN0b3IgKHVubGVzcyB0aGUgdmFsdWUgaXMgTlVMTCkuCiAqICA8UD4KICogIEFzIHdpdGggVmVjdG9yT2YqKio+LCB0aGUgdmVjdG9yIGdyb3dzIGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSBhbGwgZWxlbWVudHMsIHRoZQogKiAgc2l6ZSBpcyBvbmUgcGx1cyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgZWxlbWVudCB0aGF0J3MgYmVlbiBzZXQsIGFuZCBhbnkgZWxlbWVudHMgYmVsb3cKICogIHRoZSBoaWdoZXN0IGVsZW1lbnQgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSBpbml0aWFsaXplZCBhcmUgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KICovCmNsYXNzIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50IHsKICAgIHB1YmxpYzoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY2h1bmsgc2l6ZSBieSB3aGljaCB0aGUgYXJyYXkgaXMgZ3Jvd24uCiAgICAgICAgICogVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaW4gdGhlIEFQSQogICAgICAgICAqLwogICAgICAgIGVudW0gRUdyb3d0aFJhdGUgeyBHUk9XVEhfUkFURSA9IDQgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgdmVjdG9yIHRoYXQgY29udGFpbnMgZWxlbWVudHMgb2YgUFRvQ29udHJhY3RFbGVtZW50LgogICAgICAgICAqIEBwYXJhbSBpbml0aWFsU2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSB2ZWN0b3Igb2JqZWN0LgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQoaW50MzJfdCAgaW5pdGlhbFNpemUgPSAwKTsKICAgICAgICAvKioKICAgICAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQoY29uc3QgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQmICAgIHRoYXQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgflZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3QgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQmICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQmIHRoYXQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gYSBtb2RpZmlhYmxlIHNtYXJ0LXBvaW50ZXIgdG8gdGhlIEVudHJ5UGFpcgogICAgICAgICAqIGF0IHRoZSBnaXZlbiBpbmRleC4gIEFzc2lnbmluZyB0byB0aGlzIHNtYXJ0IHBvaW50ZXIgd2lsbCB3b3JrLCBlLmcuCiAgICAgICAgICogPHByZT4KICAgICAgICAgKiAgUFRvQ29udHJhY3RFbGVtZW50IGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLjsKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgcmFuZ2UtY2hlY2tpbmc7IGFjY2VzcyB0byBlbGVtZW50cyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgKiBhcnJheSB3aWxsIGNhdXNlIHRoZSBhcnJheSB0byBncm93LgogICAgICAgICAqLwogICAgICAgIFBUb0NvbnRyYWN0RWxlbWVudCAgb3BlcmF0b3JbXShpbnQzMl90ICBpbmRleCk7CiAgICAgICAgUFRvQ29udHJhY3RFbGVtZW50ICBhdChpbnQzMl90ICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIEVudHJ5UGFpciBhdCB0aGUgZ2l2ZW4gaW5kZXguCiAgICAgICAgICogVGhlIHBvaW50ZXIgaXRzZWxmIGNhbm5vdCBiZSBtb2RpZmllZCwgYnV0IHRoZSBlbGVtZW50cyBpdCBwb2ludHMgdG8gbWF5OgogICAgICAgICAqIDxwcmU+CiAgICAgICAgICogIGNvbnN0IFZlY3Rvck9mUFRvRXhwYW5kVGFibGUgZm9vID0gLi4uLjsKICAgICAgICAgKiAgZm9vWzVdID0gLi4uLjsgICAgICAgICAgICAgIC8vIE5PVCBBTExPV0VECiAgICAgICAgICogIGZvb1s1XS0+ZW50cnlOYW1lID0gLi4uLjsgICAvLyBvawogICAgICAgICAqIDwvcHJlPgogICAgICAgICAqIFRoaXMgZG9lcyBub3QgZG8gcmFuZ2UtY2hlY2tpbmc7IGFuIGludmFsaWQgaW5kZXggbWF5IGNhdXNlIGEgY3Jhc2guCiAgICAgICAgICogQHJldHVybiB0aGUgYWNjZXNzZWQgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBFbnRyeVBhaXIqICAgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpIGNvbnN0OwogICAgICAgIEVudHJ5UGFpciogICAgICAgICAgYXQoaW50MzJfdCAgaW5kZXgpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gYSBkaWZmZXJlbnQgdmFsdWUuCiAgICAgICAgICogSWYgdGhlcmUgd2FzIGFyZWFkeSBhbiBvYmplY3Qgc3RvcmVkIGF0IHRoaXMgaW5kZXgsIGl0IGlzIGRlbGV0ZWQuCiAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBhdFB1dCggIGludDMyX3QgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnlQYWlyKiAgICAgIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiBJbnNlcnRzIGEgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgc2xpZGluZyB0aGUgcmVzdCBvZgogICAgICAgICAqIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgb3ZlciB0byBtYWtlIHJvb20uCiAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGF0SW5zZXJ0KCAgIGludDMyX3QgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnlQYWlyKiAgdmFsdWUpOwogICAgICAgIC8qKgogICAgICAgICAqICJPcnBoYW4iIHRoZSBwb2ludGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguICBUaGUgYXJyYXkgd2lsbCBubwogICAgICAgICAqIGxvbmdlciBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QsIGFuZCB0aGUgY2FsbGVyIGlzCiAgICAgICAgICogbm93IHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyBpdHMgc3RvcmFnZS4KICAgICAgICAgKi8KICAgICAgICBFbnRyeVBhaXIqICAgICAgICAgIG9ycGhhbkF0KGludDMyX3QgICAgaW5kZXgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHZlY3Rvci4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNpemUodm9pZCkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHZlY3RvciBvYmplY3QgaXMgdmFsaWQuCiAgICAgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgYm9vbF90ICAgICAgICAgICAgICBpc0JvZ3VzKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHJlYWQgYW5kIHdyaXRlIG9iamVjdHMgb2YgdGhpcwogICAgICAgICAqIGNsYXNzIGFzIGJpbmFyeSwgcGxhdGZvcm0tZGVwZW5kZW50IGRhdGEgaW4gdGhlIGlvc3RyZWFtLiAgVGhlIHN0cmVhbQogICAgICAgICAqIG11c3QgYmUgaW4gaW9zOjpiaW5hcnkgbW9kZSBmb3IgdGhpcyB0byB3b3JrLiAgVGhlc2UgbWV0aG9kcyBhcmUgbm90CiAgICAgICAgICogaW50ZW5kZWQgZm9yIGdlbmVyYWwgcHVibGljIHVzZTsgdGhleSBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGltcHJvdmUKICAgICAgICAgKiBwZXJmb3JtYW5jZSBieSBzdG9yaW5nIGNlcnRhaW4gb2JqZWN0cyBpbiBiaW5hcnkgZmlsZXMuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1PdXQoRmlsZVN0cmVhbSogb3MpIGNvbnN0OwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtSW4oRmlsZVN0cmVhbSogaXMpOwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzaXplcyB0aGUgdmVjdG9yIGlmIG5lY2Vzc2FyeSB3aGVuIGNvbXBhcmVkIHRvIGEgbmV3IHNpemUuCiAgICAgICAgICogQHBhcmFtIG5ld1NpemUgdGhlIG5ldyBzaXplLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcmVzaXplKGludDMyX3QgICAgICBuZXdTaXplKTsKCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBmU2l6ZTsKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGZDYXBhY2l0eTsKICAgICAgICBFbnRyeVBhaXIqKiAgICAgICAgIGZFbGVtZW50czsKICAgICAgICBib29sX3QgICAgICAgICAgICAgIGZCb2d1czsKfTsKCmNsYXNzIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZTsKCi8qKgogKiBQb2ludGVyIHRvIGVhY2ggY29udHJhY2luZyBlbGVtZW50IGxpc3QuCiAqLwpjbGFzcyBQVG9Db250cmFjdFRhYmxlIHsKICAgIHB1YmxpYzoKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5QVG9Db250cmFjdFRhYmxlKCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvcnMuCiAgICAgICAgICogPFA+CiAgICAgICAgICogVGhlIGNvbnRyYWN0aW5nIGVsZW1lbnQgbGlzdCAoaWYgYW55KSB0aGF0IHRoaXMgb2JqZWN0IGFscmVhZHkgcG9pbnRzIHRvCiAgICAgICAgICogaXMgZGVsZXRlZC4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBQVG9Db250cmFjdFRhYmxlJiAgICAgICAgICAgICBvcGVyYXRvcj0oVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQqICAgbmV3VmFsdWUpOwogICAgICAgIGNvbnN0IFBUb0NvbnRyYWN0VGFibGUmICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBQVG9Db250cmFjdFRhYmxlJiAgIHBvaW50ZXJUb05ld1ZhbHVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUG9pbnRlciBvcGVyYXRvciBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KigpIGNvbnN0OwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVG9Db250cmFjdFRhYmxlKFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiYgICB2YWx1ZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVG9Db250cmFjdFRhYmxlKGNvbnN0IFBUb0NvbnRyYWN0VGFibGUmICAgIHRoYXQpOwoKICAgICAgICBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudComICAgICAgICAgICAgICAgICAgICAgICAgZlZhbHVlOwoKICAgICAgICBmcmllbmQgY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlOwp9OwoKLyoqCiAqIFRoZSB2ZWN0b3IgdGhhdCBjb250YWlucyBhbGwgY29udHJhY3RpbmcgbGlzdCB0YWJsZXMuCiAqICA8UD4KICogIFRoaXMgaXMgYSB2ZWN0b3IgY2xhc3MgdGhhdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggcG9pbnRlciB0eXBlcyBhbmQgd2hpY2ggaW1wbGVtZW50cwogKiAgb3duaW5nIHNlbWFudGljcy4gIFRoYXQgaXMsIG9uY2UgYSB2YWx1ZSBpcyBwbGFjZWQgYW4gZWxlbWVudCBvZiB0aGUgdmVjdG9yLCB0aGUgdmVjdG9yIGlzCiAqICBjb25zaWRlcmVkIHRvIG93biBpdCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdC4gIFRoaXMgd2lsbCBoYXBwZW4gYm90aCB3aGVuIHRoZQogKiAgZWxlbWVudCBpcyBjaGFuZ2VkIHVzaW5nIGF0UHV0KCkgb3IgdGhyb3VnaCBhbiBQb2ludGVyVG8qKioqLCBhbmQgd2hlbiB0aGUgdmVjdG9yIGl0c2VsZiBpcwogKiAgZGlzcG9zZWQuICAKICogIDxQPgogKiAgV0FSTklORzogIFRoZSBjYWxsZXIgbXVzdCBiZSBjYXJlZnVsIHRvIGF2b2lkIGhvbGRpbmcgb250byBhbnkgZGFuZ2xpbmcgcmVmZXJlbmNlcwogKiAgYWZ0ZXIgdGhlIHZlY3RvciBpcyBkaXNwb3NlZCwgYW5kIHRoZSBjYWxsZXIgbXVzdCBhbHNvIGJlIGNhcmVmdWwgbm90IHRvIHB1dCB0aGUgc2FtZQogKiAgdmFsdWUgaW50byBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaW4gdGhlIHZlY3RvciAodW5sZXNzIHRoZSB2YWx1ZSBpcyBOVUxMKS4KICogIDxQPgogKiAgQXMgd2l0aCBWZWN0b3JPZioqKj4sIHRoZSB2ZWN0b3IgZ3Jvd3MgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIGFsbCBlbGVtZW50cywgdGhlCiAqICBzaXplIGlzIG9uZSBwbHVzIHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCBlbGVtZW50IHRoYXQncyBiZWVuIHNldCwgYW5kIGFueSBlbGVtZW50cyBiZWxvdwogKiAgdGhlIGhpZ2hlc3QgZWxlbWVudCB0aGF0IGFyZW4ndCBleHBsaWNpdGx5IGluaXRpYWxpemVkIGFyZSBpbml0aWFsaXplZCB0byBOVUxMLgogKi8KY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlIHsKICAgIHB1YmxpYzoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY2h1bmsgc2l6ZSBieSB3aGljaCB0aGUgYXJyYXkgaXMgZ3Jvd24uCiAgICAgICAgICogVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaW4gdGhlIEFQSQogICAgICAgICAqLwogICAgICAgIGVudW0gRUdyb3d0aFJhdGUgeyBHUk9XVEhfUkFURSA9IDQgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgdmVjdG9yIHRoYXQgY29udGFpbnMgZWxlbWVudHMgb2YgUFRvQ29udHJhY3RUYWJsZS4KICAgICAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgdmVjdG9yIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZShpbnQzMl90ICAgIGluaXRpYWxTaXplID0gMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZShjb25zdCBWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGUmICAgIHRoYXQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5WZWN0b3JPZlBUb0NvbnRyYWN0VGFibGUoKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWdubWVudCBvcGVyYXRvci4KICAgICAgICAgKi8KICAgICAgICBjb25zdCBWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGUmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZSYgICB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgbW9kaWZpYWJsZSBzbWFydC1wb2ludGVyIHRvIHRoZSBjb250cmFjdGlvbiB0YWJsZQogICAgICAgICAqIGF0IHRoZSBnaXZlbiBpbmRleC4gIEFzc2lnbmluZyB0byB0aGlzIHNtYXJ0IHBvaW50ZXIgd2lsbCB3b3JrLCBlLmcuCiAgICAgICAgICogPHByZT4KICAgICAgICAgKiAgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlIGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLjsKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgcmFuZ2UtY2hlY2tpbmc7IGFjY2VzcyB0byBlbGVtZW50cyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgKiBhcnJheSB3aWxsIGNhdXNlIHRoZSBhcnJheSB0byBncm93LgogICAgICAgICAqLwogICAgICAgIFBUb0NvbnRyYWN0VGFibGUgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwogICAgICAgIFBUb0NvbnRyYWN0VGFibGUgICAgICAgIGF0KGludDMyX3QgIGluZGV4KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29udHJhY3Rpb24gdGFibGUgYXQgdGhlIGdpdmVuIGluZGV4LgogICAgICAgICAqIFRoZSBwb2ludGVyIGl0c2VsZiBjYW5ub3QgYmUgbW9kaWZpZWQsIGJ1dCB0aGUgZWxlbWVudHMgaXQgcG9pbnRzIHRvIG1heToKICAgICAgICAgKiA8cHJlPgogICAgICAgICAqICBjb25zdCBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlIGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLi47ICAgICAgICAgICAgICAvLyBOT1QgQUxMT1dFRAogICAgICAgICAqICBmb29bNV1bMF0gPSAuLi4uOyAgICAgICAgICAgLy8gb2sKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGRvIHJhbmdlLWNoZWNraW5nOyBhbiBpbnZhbGlkIGluZGV4IG1heSBjYXVzZSBhIGNyYXNoLgogICAgICAgICAqIEByZXR1cm4gdGhlIGFjY2Vzc2VkIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQqICAgICBvcGVyYXRvcltdKGludDMyX3QgIGluZGV4KSBjb25zdDsKICAgICAgICBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCogICAgIGF0KGludDMyX3QgIGluZGV4KSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIGEgZGlmZmVyZW50IHZhbHVlLgogICAgICAgICAqIElmIHRoZXJlIHdhcyBhcmVhZHkgYW4gb2JqZWN0IHN0b3JlZCBhdCB0aGlzIGluZGV4LCBpdCBpcyBkZWxldGVkLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiB2YWx1ZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogIk9ycGhhbiIgdGhlIHBvaW50ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gIFRoZSBhcnJheSB3aWxsIG5vCiAgICAgICAgICogbG9uZ2VyIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCwgYW5kIHRoZSBjYWxsZXIgaXMKICAgICAgICAgKiBub3cgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIGl0cyBzdG9yYWdlLgogICAgICAgICAqLwogICAgICAgIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiAgICAgb3JwaGFuQXQoaW50MzJfdCAgICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2l6ZSh2b2lkKSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgdmVjdG9yIG9iamVjdCBpcyB2YWxpZC4KICAgICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHZlY3RvciBvYmplY3QgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBib29sX3QgICAgICAgICAgICAgIGlzQm9ndXModm9pZCkgY29uc3Q7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHN0cmVhbUluIGFuZCBzdHJlYW1PdXQgbWV0aG9kcyByZWFkIGFuZCB3cml0ZSBvYmplY3RzIG9mIHRoaXMKICAgICAgICAgKiBjbGFzcyBhcyBiaW5hcnksIHBsYXRmb3JtLWRlcGVuZGVudCBkYXRhIGluIHRoZSBpb3N0cmVhbS4gIFRoZSBzdHJlYW0KICAgICAgICAgKiBtdXN0IGJlIGluIGlvczo6YmluYXJ5IG1vZGUgZm9yIHRoaXMgdG8gd29yay4gIFRoZXNlIG1ldGhvZHMgYXJlIG5vdAogICAgICAgICAqIGludGVuZGVkIGZvciBnZW5lcmFsIHB1YmxpYyB1c2U7IHRoZXkgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbXByb3ZlCiAgICAgICAgICogcGVyZm9ybWFuY2UgYnkgc3RvcmluZyBjZXJ0YWluIG9iamVjdHMgaW4gYmluYXJ5IGZpbGVzLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtT3V0KEZpbGVTdHJlYW0qIG9zKSBjb25zdDsKICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbUluKEZpbGVTdHJlYW0qIGlzKTsKCiAgICBwcml2YXRlOgogICAgICAgIC8qKgogICAgICAgICAqIFJlc2l6ZXMgdGhlIHZlY3RvciBpZiBuZWNlc3Nhcnkgd2hlbiBjb21wYXJlZCB0byBhIG5ldyBzaXplLgogICAgICAgICAqIEBwYXJhbSBuZXdTaXplIHRoZSBuZXcgc2l6ZS4KICAgICAgICAgKi8KICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlc2l6ZShpbnQzMl90ICAgICAgbmV3U2l6ZSk7CgogICAgICAgIGludDMyX3QgICAgICAgICAgICAgZlNpemU7CiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBmQ2FwYWNpdHk7CiAgICAgICAgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQqKiAgICAgICAgZkVsZW1lbnRzOwogICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgZkJvZ3VzOwp9OwoKY2xhc3MgUGF0dGVybkVudHJ5OwpjbGFzcyBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnk7CgovKioKICogIFByb3h5IGNsYXNzIGZvciBhY2Nlc3NpbmcgZWxlbWVudHMgb2YgYSBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkKICogIDxQPgogKiAgVGhpcyBjbGFzcyBpcyBhIHNpbXBsZSBwcm94eSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIG93bmluZyBzZW1hbnRpY3MgZm9yIHRoZQogKiAgb3BlcmF0b3JbXSBhbmQgYXQoKSBmdW5jdGlvbnMgb24gVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5LiAgSXQgZW5hYmxlcwogKiAgZXhwcmVzc2lvbnMgbGlrZSAidlszXSA9IHNvbWVOZXdWYWx1ZSIuICBPbmUgbmV2ZXIgY3JlYXRlcyBhIFBvaW50ZXJUb1BhdHRlcm5FbnRyeQogKiAgZGlyZWN0bHksIGFuZCBvbmUgbmV2ZXIgZGVjbGFyZXMgdmFyaWFibGVzIG9mIHRoaXMgdHlwZS4gIEl0IGp1c3QgZXhpc3RzIHRvCiAqICBpbXBsZW1lbnQgdGhlIEFQSSBvZiBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkuCiAqLwoKY2xhc3MgUG9pbnRlclRvUGF0dGVybkVudHJ5IHsKICAgIHB1YmxpYzoKICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5Qb2ludGVyVG9QYXR0ZXJuRW50cnkoKTsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBBc3NpZ25tZW50IG9wZXJhdG9ycwogICAgICAgICAqIFRoZSBQYXR0ZXJuRW50cnkgdGhhdCB0aGlzIG9iamVjdCBhbHJlYWR5IHBvaW50cyB0byAoaWYgYW55KSBpcyBkZWxldGVkLgogICAgICAgICAqLwogICAgICAgIGNvbnN0IFBvaW50ZXJUb1BhdHRlcm5FbnRyeSYgICAgICAgIG9wZXJhdG9yPShQYXR0ZXJuRW50cnkqIG5ld1ZhbHVlKTsKICAgICAgICBjb25zdCBQb2ludGVyVG9QYXR0ZXJuRW50cnkmICAgICAgICBvcGVyYXRvcj0oY29uc3QgUG9pbnRlclRvUGF0dGVybkVudHJ5JiAgcG9pbnRlclRvTmV3VmFsdWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBQb2ludGVyIG9wZXJhdG9yIG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgUGF0dGVybkVudHJ5KigpIGNvbnN0OwoKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyVG9QYXR0ZXJuRW50cnkoUGF0dGVybkVudHJ5KiYgICAgdmFsdWUpOwogICAgICAgIC8qKgogICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclRvUGF0dGVybkVudHJ5KGNvbnN0IFBvaW50ZXJUb1BhdHRlcm5FbnRyeSYgIHRoYXQpOwoKICAgICAgICBQYXR0ZXJuRW50cnkqJiAgICAgICAgICAgICAgICAgICAgICBmVmFsdWU7CgogICAgICAgIGZyaWVuZCBjbGFzcyBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnk7Cn07CgovKioKICogIFNpbXBsZSBvd25pbmctdmVjdG9yIGNsYXNzCiAqICBUaGlzIGlzIGEgdmVjdG9yIGNsYXNzIHRoYXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIHBvaW50ZXIgdHlwZXMgYW5kIHdoaWNoIGltcGxlbWVudHMKICogIG93bmluZyBzZW1hbnRpY3MuICBUaGF0IGlzLCBvbmNlIGEgdmFsdWUgaXMgcGxhY2VkIGFuIGVsZW1lbnQgb2YgdGhlIHZlY3RvciwgdGhlIHZlY3RvciBpcwogKiAgY29uc2lkZXJlZCB0byBvd24gaXQgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQuICBUaGlzIHdpbGwgaGFwcGVuIGJvdGggd2hlbiB0aGUKICogIGVsZW1lbnQgaXMgY2hhbmdlZCB1c2luZyBhdFB1dCgpIG9yIHRocm91Z2ggYW4gUG9pbnRlclRvKioqKiwgYW5kIHdoZW4gdGhlIHZlY3RvciBpdHNlbGYgaXMKICogIGRpc3Bvc2VkLiAgCiAqICA8UD4KICogIFdBUk5JTkc6ICBUaGUgY2FsbGVyIG11c3QgYmUgY2FyZWZ1bCB0byBhdm9pZCBob2xkaW5nIG9udG8gYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMKICogIGFmdGVyIHRoZSB2ZWN0b3IgaXMgZGlzcG9zZWQsIGFuZCB0aGUgY2FsbGVyIG11c3QgYWxzbyBiZSBjYXJlZnVsIG5vdCB0byBwdXQgdGhlIHNhbWUKICogIHZhbHVlIGludG8gbW9yZSB0aGFuIG9uZSBlbGVtZW50IGluIHRoZSB2ZWN0b3IgKHVubGVzcyB0aGUgdmFsdWUgaXMgTlVMTCkuCiAqICA8UD4KICogIEFzIHdpdGggVmVjdG9yT2YqKio+LCB0aGUgdmVjdG9yIGdyb3dzIGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSBhbGwgZWxlbWVudHMsIHRoZQogKiAgc2l6ZSBpcyBvbmUgcGx1cyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgZWxlbWVudCB0aGF0J3MgYmVlbiBzZXQsIGFuZCBhbnkgZWxlbWVudHMgYmVsb3cKICogIHRoZSBoaWdoZXN0IGVsZW1lbnQgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSBpbml0aWFsaXplZCBhcmUgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KICovCgpjbGFzcyBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkgewogICAgcHVibGljOgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjaHVuayBzaXplIGJ5IHdoaWNoIHRoZSBhcnJheSBpcyBncm93bi4KICAgICAgICAgKiBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSBpbiB0aGUgQVBJCiAgICAgICAgICovCiAgICAgICAgZW51bSBFR3Jvd3RoUmF0ZSB7IEdST1dUSF9SQVRFID0gNCB9OwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSB2ZWN0b3IgdGhhdCBjb250YWlucyBlbGVtZW50cyBvZiBQb2ludGVyVG9QYXR0ZXJuRW50cnkuCiAgICAgICAgICogQHBhcmFtIGluaXRpYWxTaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHZlY3RvciBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5KGludDMyX3QgIGluaXRpYWxTaXplID0gMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnkoY29uc3QgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5JiB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzdHJ1Y3Rvci4KICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgICAgICovCiAgICAgICAgY29uc3QgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5JiBvcGVyYXRvcj0oY29uc3QgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5JiB0aGF0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIGEgbW9kaWZpYWJsZSBzbWFydC1wb2ludGVyIHRvIHRoZSBjb250cmFjdGlvbiB0YWJsZQogICAgICAgICAqIGF0IHRoZSBnaXZlbiBpbmRleC4gIEFzc2lnbmluZyB0byB0aGlzIHNtYXJ0IHBvaW50ZXIgd2lsbCB3b3JrLCBlLmcuCiAgICAgICAgICogPHByZT4KICAgICAgICAgKiAgVmVjdG9yT2ZQb2ludGVyc1RvUGF0dGVybkVudHJ5IGZvbyA9IC4uLi47CiAgICAgICAgICogIGZvb1s1XSA9IC4uLjsKICAgICAgICAgKiA8L3ByZT4KICAgICAgICAgKiBUaGlzIGRvZXMgcmFuZ2UtY2hlY2tpbmc7IGFjY2VzcyB0byBlbGVtZW50cyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgKiBhcnJheSB3aWxsIGNhdXNlIHRoZSBhcnJheSB0byBncm93LgogICAgICAgICAqLwogICAgICAgIFBvaW50ZXJUb1BhdHRlcm5FbnRyeSAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpOwogICAgICAgIGlubGluZSBQb2ludGVyVG9QYXR0ZXJuRW50cnkgICAgICAgIGF0KGludDMyX3QgIGluZGV4KSB7IHJldHVybiAoKnRoaXMpW2luZGV4XTsgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBFbnRyeVBhaXIgYXQgdGhlIGdpdmVuIGluZGV4LgogICAgICAgICAqIFRoZSBwb2ludGVyIGl0c2VsZiBjYW5ub3QgYmUgbW9kaWZpZWQsIGJ1dCB0aGUgZWxlbWVudHMgaXQgcG9pbnRzIHRvIG1heToKICAgICAgICAgKiA8cHJlPgogICAgICAgICAqICBjb25zdCBWZWN0b3JPZlBvaW50ZXJzVG9QYXR0ZXJuRW50cnlmb28gPSAuLi4uOwogICAgICAgICAqICBmb29bNV0gPSAuLi4uOyAgICAgICAgICAgICAgLy8gTk9UIEFMTE9XRUQKICAgICAgICAgKiAgZm9vWzVdLT5nZXRTdHJlbmd0aCgpOyAgICAgIC8vIG9rCiAgICAgICAgICogPC9wcmU+CiAgICAgICAgICogVGhpcyBkb2VzIG5vdCBkbyByYW5nZS1jaGVja2luZzsgYW4gaW52YWxpZCBpbmRleCBtYXkgY2F1c2UgYSBjcmFzaC4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBhY2Nlc3NlZCBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIFBhdHRlcm5FbnRyeSogICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oaW50MzJfdCAgaW5kZXgpIGNvbnN0OwogICAgICAgIGlubGluZSBQYXR0ZXJuRW50cnkqICAgICAgICAgICAgICAgIGF0KGludDMyX3QgIGluZGV4KSBjb25zdCB7IHJldHVybiAoKnRoaXMpW2luZGV4XTsgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gYSBkaWZmZXJlbnQgdmFsdWUuCiAgICAgICAgICogSWYgdGhlcmUgd2FzIGFyZWFkeSBhbiBvYmplY3Qgc3RvcmVkIGF0IHRoaXMgaW5kZXgsIGl0IGlzIGRlbGV0ZWQuCiAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRQdXQoICBpbnQzMl90ICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm5FbnRyeSogICB2YWx1ZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIHNsaWRpbmcgdGhlIHJlc3Qgb2YKICAgICAgICAgKiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IG92ZXIgdG8gbWFrZSByb29tLgogICAgICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRJbnNlcnQoICAgaW50MzJfdCAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybkVudHJ5KiAgIHZhbHVlKTsKICAgICAgICAvKioKICAgICAgICAgKiAiT3JwaGFuIiB0aGUgcG9pbnRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiAgVGhlIGFycmF5IHdpbGwgbm8KICAgICAgICAgKiBsb25nZXIgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LCBhbmQgdGhlIGNhbGxlciBpcwogICAgICAgICAqIG5vdyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgaXRzIHN0b3JhZ2UuCiAgICAgICAgICovCiAgICAgICAgUGF0dGVybkVudHJ5KiAgICAgICAgICAgICAgICAgICAgICAgb3JwaGFuQXQoaW50MzJfdCAgICBpbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgdmVjdG9yLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyKHZvaWQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHZlY3Rvci4KICAgICAgICAgKi8KICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKHZvaWQpIGNvbnN0OwoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGV4aXN0cyBpbiB0aGUgdmVjdG9yLCByZXR1cm4gaXRzIGluZGV4LgogICAgICAgICAqIElmIG5vdCwgcmV0dXJuIC0xLgogICAgICAgICAqLwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2YoY29uc3QgUGF0dGVybkVudHJ5KiB2YWx1ZSkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJhbmNlIG9mIHZhbHVlIGluIHRoZSB2ZWN0b3IsCiAgICAgICAgICogb3IgLTEgaWYgdGhlIHZlY3RvciBkb2Vzbid0IGNvbnRhaW4gdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4T2YoY29uc3QgUGF0dGVybkVudHJ5KiB2YWx1ZSkgY29uc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHZlY3RvciBvYmplY3QgaXMgdmFsaWQuCiAgICAgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB2ZWN0b3Igb2JqZWN0IGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgYm9vbF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCb2d1cyh2b2lkKSBjb25zdDsKICAgIHByaXZhdGU6CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzaXplcyB0aGUgdmVjdG9yIGlmIG5lY2Vzc2FyeSB3aGVuIGNvbXBhcmVkIHRvIGEgbmV3IHNpemUuCiAgICAgICAgICogQHBhcmFtIG5ld1NpemUgdGhlIG5ldyBzaXplLgogICAgICAgICAqLwogICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZShpbnQzMl90ICAgICAgbmV3U2l6ZSk7CgogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZTaXplOwogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDYXBhY2l0eTsKICAgICAgICBQYXR0ZXJuRW50cnkqKiAgICAgICAgICAgICAgICAgICAgICBmRWxlbWVudHM7CiAgICAgICAgYm9vbF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJvZ3VzOwp9OwoKaW5saW5lCkVudHJ5UGFpcjo6RW50cnlQYWlyKCkKICA6IGVudHJ5TmFtZSgpLCB2YWx1ZSgweGZmZmZmZmZmKSwgZndkKFRSVUUpCnsKfQoKaW5saW5lCkVudHJ5UGFpcjo6RW50cnlQYWlyKGNvbnN0IFVuaWNvZGVTdHJpbmcgJm5hbWUsIGludDMyX3QgYVZhbHVlLCBib29sX3QgYUZ3ZCkKICA6IGVudHJ5TmFtZShuYW1lKSwgdmFsdWUoYVZhbHVlKSwgZndkKGFGd2QpCnsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBWZWN0b3JPZkludAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKaW5saW5lIGludDMyX3QKVmVjdG9yT2ZJbnQ6Om9wZXJhdG9yW10oaW50MzJfdCBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKCmlubGluZSBpbnQzMl90ClZlY3Rvck9mSW50OjphdChpbnQzMl90IGluZGV4KSBjb25zdAp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBpbnQzMl90JgpWZWN0b3JPZkludDo6YXQoaW50MzJfdCBpbmRleCkKewogICAgcmV0dXJuICgqdGhpcylbaW5kZXhdOwp9CgppbmxpbmUgaW50MzJfdApWZWN0b3JPZkludDo6c2l6ZSgpIGNvbnN0CnsKICAgIHJldHVybiBmU2l6ZTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBWZWN0b3JPZlBvaW50ZXIKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZSB2b2lkKgpWZWN0b3JPZlBvaW50ZXI6Om9wZXJhdG9yW10oaW50MzJfdCBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKCmlubGluZSB2b2lkKgpWZWN0b3JPZlBvaW50ZXI6OmF0KGludDMyX3QgaW5kZXgpIGNvbnN0CnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIHZvaWQqJgpWZWN0b3JPZlBvaW50ZXI6OmF0KGludDMyX3QgaW5kZXgpCnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIGludDMyX3QKVmVjdG9yT2ZQb2ludGVyOjpzaXplKCkgY29uc3QKewogICAgcmV0dXJuIGZTaXplOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE1FVEhPRFMgT04gUFRvRXhwYW5kVGFibGUKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZQpQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3IgVmVjdG9yT2ZJbnQqKCkgY29uc3QKewogICAgcmV0dXJuIGZWYWx1ZTsKfQoKaW5saW5lClBUb0V4cGFuZFRhYmxlOjpQVG9FeHBhbmRUYWJsZShWZWN0b3JPZkludComICAgIHZhbHVlKQo6IGZWYWx1ZSh2YWx1ZSkKewp9CgppbmxpbmUKUFRvRXhwYW5kVGFibGU6OlBUb0V4cGFuZFRhYmxlKGNvbnN0IFBUb0V4cGFuZFRhYmxlJiAgICB0aGF0KQo6IGZWYWx1ZSh0aGF0LmZWYWx1ZSkKewp9CgppbmxpbmUKUFRvRXhwYW5kVGFibGU6On5QVG9FeHBhbmRUYWJsZSgpCnsKfQoKaW5saW5lIGNvbnN0IFBUb0V4cGFuZFRhYmxlJgpQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3I9KFZlY3Rvck9mSW50KiAgbmV3VmFsdWUpCnsKICAgIGRlbGV0ZSBmVmFsdWU7CiAgICBmVmFsdWUgPSBuZXdWYWx1ZTsKICAgIHJldHVybiAqdGhpczsKfQoKaW5saW5lIGNvbnN0IFBUb0V4cGFuZFRhYmxlJgpQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3I9KGNvbnN0IFBUb0V4cGFuZFRhYmxlJiBwb2ludGVyVG9OZXdWYWx1ZSkKewogICAgZGVsZXRlIGZWYWx1ZTsKICAgIGZWYWx1ZSA9IChWZWN0b3JPZkludCopKHBvaW50ZXJUb05ld1ZhbHVlKTsKICAgIHJldHVybiAqdGhpczsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmlubGluZSBWZWN0b3JPZkludCoKVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTo6b3BlcmF0b3JbXShpbnQzMl90ICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKaW5saW5lIFZlY3Rvck9mSW50KgpWZWN0b3JPZlBUb0V4cGFuZFRhYmxlOjphdChpbnQzMl90ICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuICgqdGhpcylbaW5kZXhdOwp9CgppbmxpbmUgUFRvRXhwYW5kVGFibGUKVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTo6YXQoaW50MzJfdCAgaW5kZXgpCnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIGludDMyX3QKVmVjdG9yT2ZQVG9FeHBhbmRUYWJsZTo6c2l6ZSgpIGNvbnN0CnsKICAgIHJldHVybiBmU2l6ZTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTUVUSE9EUyBPTiBQVG9Db250cmFjdEVsZW1lbnQKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZQpQVG9Db250cmFjdEVsZW1lbnQ6Om9wZXJhdG9yIEVudHJ5UGFpciooKSBjb25zdAp7CiAgICByZXR1cm4gZlZhbHVlOwp9CgppbmxpbmUKUFRvQ29udHJhY3RFbGVtZW50OjpQVG9Db250cmFjdEVsZW1lbnQoRW50cnlQYWlyKiYgIHZhbHVlKQo6IGZWYWx1ZSh2YWx1ZSkKewp9CgppbmxpbmUKUFRvQ29udHJhY3RFbGVtZW50OjpQVG9Db250cmFjdEVsZW1lbnQoY29uc3QgUFRvQ29udHJhY3RFbGVtZW50JiAgICB0aGF0KQo6IGZWYWx1ZSh0aGF0LmZWYWx1ZSkKewp9CgppbmxpbmUKUFRvQ29udHJhY3RFbGVtZW50Ojp+UFRvQ29udHJhY3RFbGVtZW50KCkKewp9CgppbmxpbmUgY29uc3QgUFRvQ29udHJhY3RFbGVtZW50JgpQVG9Db250cmFjdEVsZW1lbnQ6Om9wZXJhdG9yPShFbnRyeVBhaXIqICAgIG5ld1ZhbHVlKQp7CiAgICBkZWxldGUgZlZhbHVlOwogICAgZlZhbHVlID0gbmV3VmFsdWU7CiAgICByZXR1cm4gKnRoaXM7Cn0KCmlubGluZSBjb25zdCBQVG9Db250cmFjdEVsZW1lbnQmClBUb0NvbnRyYWN0RWxlbWVudDo6b3BlcmF0b3I9KGNvbnN0IFBUb0NvbnRyYWN0RWxlbWVudCYgcG9pbnRlclRvTmV3VmFsdWUpCnsKICAgIGRlbGV0ZSBmVmFsdWU7CiAgICBmVmFsdWUgPSAoRW50cnlQYWlyKikocG9pbnRlclRvTmV3VmFsdWUpOwogICAgcmV0dXJuICp0aGlzOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNRVRIT0RTIE9OIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgppbmxpbmUgRW50cnlQYWlyKgpWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudDo6b3BlcmF0b3JbXShpbnQzMl90ICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKaW5saW5lIEVudHJ5UGFpcioKVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ6OmF0KGludDMyX3QgIGluZGV4KSBjb25zdAp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBQVG9Db250cmFjdEVsZW1lbnQKVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ6OmF0KGludDMyX3QgIGluZGV4KQp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBpbnQzMl90ClZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50OjpzaXplKCkgY29uc3QKewogICAgcmV0dXJuIGZTaXplOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNRVRIT0RTIE9OIFBUb0NvbnRyYWN0VGFibGUKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlubGluZQpQVG9Db250cmFjdFRhYmxlOjpvcGVyYXRvciBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCooKSBjb25zdAp7CiAgICByZXR1cm4gZlZhbHVlOwp9CgppbmxpbmUKUFRvQ29udHJhY3RUYWJsZTo6UFRvQ29udHJhY3RUYWJsZShWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudComIHZhbHVlKQo6IGZWYWx1ZSh2YWx1ZSkKewp9CgppbmxpbmUKUFRvQ29udHJhY3RUYWJsZTo6UFRvQ29udHJhY3RUYWJsZShjb25zdCBQVG9Db250cmFjdFRhYmxlJiAgdGhhdCkKOiBmVmFsdWUodGhhdC5mVmFsdWUpCnsKfQoKaW5saW5lClBUb0NvbnRyYWN0VGFibGU6On5QVG9Db250cmFjdFRhYmxlKCkKewp9CgppbmxpbmUgY29uc3QgUFRvQ29udHJhY3RUYWJsZSYKUFRvQ29udHJhY3RUYWJsZTo6b3BlcmF0b3I9KFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KiBuZXdWYWx1ZSkKewogICAgZGVsZXRlIGZWYWx1ZTsKICAgIGZWYWx1ZSA9IG5ld1ZhbHVlOwogICAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgY29uc3QgUFRvQ29udHJhY3RUYWJsZSYKUFRvQ29udHJhY3RUYWJsZTo6b3BlcmF0b3I9KGNvbnN0IFBUb0NvbnRyYWN0VGFibGUmIHBvaW50ZXJUb05ld1ZhbHVlKQp7CiAgICBkZWxldGUgZlZhbHVlOwogICAgZlZhbHVlID0gKFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KikocG9pbnRlclRvTmV3VmFsdWUpOwogICAgcmV0dXJuICp0aGlzOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNRVRIT0RTIE9OIFZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKaW5saW5lIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KgpWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGU6Om9wZXJhdG9yW10oaW50MzJfdCAgICBpbmRleCkgY29uc3QKewogICAgcmV0dXJuIChpbmRleCA8IGZDYXBhY2l0eSkgPyBmRWxlbWVudHNbaW5kZXhdIDogMDsKfQoKaW5saW5lIFZlY3Rvck9mUFRvQ29udHJhY3RFbGVtZW50KgpWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGU6OmF0KGludDMyX3QgICAgaW5kZXgpIGNvbnN0CnsKICAgIHJldHVybiAoKnRoaXMpW2luZGV4XTsKfQoKaW5saW5lIFBUb0NvbnRyYWN0VGFibGUKVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlOjphdChpbnQzMl90ICAgIGluZGV4KQp7CiAgICByZXR1cm4gKCp0aGlzKVtpbmRleF07Cn0KCmlubGluZSBpbnQzMl90ClZlY3Rvck9mUFRvQ29udHJhY3RUYWJsZTo6c2l6ZSgpIGNvbnN0CnsKICAgIHJldHVybiBmU2l6ZTsKfQoKI2VuZGlmCg==