LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBDT1BZUklHSFQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgVGFsaWdlbnQsIEluYy4sICAxOTk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgIDE5OTYtMTk5OSAgICAgICAgICAgICAgICoKKiAgIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvZ3JhbS1Qcm9wZXJ0eSBvZiBJQk0gLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICoKKiAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlICAgICAgICAgICAgICoKKiAgIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZpbGUgbG9jaWQuaAoqCiogQ3JlYXRlZCBieTogSGVsZW5hIFNoaWgKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMDIvMTEvOTcgICAgYWxpdSAgICAgICAgQ2hhbmdlZCBnTG9jUGF0aCB0byBmZ0xvY1BhdGggYW5kIGFkZGVkIG1ldGhvZHMgdG8KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBhbmQgc2V0IGl0LgoqICAgMDQvMDIvOTcgICAgYWxpdSAgICAgICAgTWFkZSBvcGVyYXRvciE9IGlubGluZTsgZml4ZWQgcmV0dXJuIHZhbHVlIG9mIGdldE5hbWUoKS4KKiAgIDA0LzE1Lzk3ICAgIGFsaXUgICAgICAgIENsZWFudXAgZm9yIEFJWC9XaW4zMi4KKiAgIDA0LzI0Lzk3ICAgIGFsaXUgICAgICAgIE51bWVyb3VzIGNoYW5nZXMgcGVyIGNvZGUgcmV2aWV3LgoqICAgIDA4LzE4Lzk4ICAgIHN0ZXBoZW4gICAgICAgIEFkZGVkIHRva2VuaXplU3RyaW5nKCksY2hhbmdlZCBnZXREaXNwbGF5TmFtZSgpCiogICAgMDkvMDgvOTggICAgc3RlcGhlbiAgICAgICAgTW92ZWQgZGVmaW5pdGlvbiBvZiBrRW1wdHlTdHJpbmcgZm9yIE1hYyBQb3J0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIExPQ0lEX0gKI2RlZmluZSBMT0NJRF9ICgoKI2luY2x1ZGUgInVuaXN0ci5oIgoKLyoqICAgIAogKgogKiBBIDxjb2RlPkxvY2FsZTwvY29kZT4gb2JqZWN0IHJlcHJlc2VudHMgYSBzcGVjaWZpYyBnZW9ncmFwaGljYWwsIHBvbGl0aWNhbCwKICogb3IgY3VsdHVyYWwgcmVnaW9uLiBBbiBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyBhIDxjb2RlPkxvY2FsZTwvY29kZT4gdG8gcGVyZm9ybQogKiBpdHMgdGFzayBpcyBjYWxsZWQgPGVtPmxvY2FsZS1zZW5zaXRpdmU8L2VtPiBhbmQgdXNlcyB0aGUgPGNvZGU+TG9jYWxlPC9jb2RlPgogKiB0byB0YWlsb3IgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyLiBGb3IgZXhhbXBsZSwgZGlzcGxheWluZyBhIG51bWJlcgogKiBpcyBhIGxvY2FsZS1zZW5zaXRpdmUgb3BlcmF0aW9uLS10aGUgbnVtYmVyIHNob3VsZCBiZSBmb3JtYXR0ZWQKICogYWNjb3JkaW5nIHRvIHRoZSBjdXN0b21zL2NvbnZlbnRpb25zIG9mIHRoZSB1c2VyJ3MgbmF0aXZlIGNvdW50cnksCiAqIHJlZ2lvbiwgb3IgY3VsdHVyZS4KICoKICogPFA+CiAqIFlvdSBjcmVhdGUgYSA8Y29kZT5Mb2NhbGU8L2NvZGU+IG9iamVjdCB1c2luZyBvbmUgb2YgdGhlIHRocmVlIGNvbnN0cnVjdG9ycyBpbgogKiB0aGlzIGNsYXNzOgogKiA8YmxvY2txdW90ZT4KICogPHByZT4KICogLiAgICAgIExvY2FsZSggY29uc3QgICBVbmljb2RlU3RyaW5nJiAgbmV3TGFuZ3VhZ2UpOwogKiAuCiAqIC4gICAgICBMb2NhbGUoIGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIGxhbmd1YWdlLCAKICogLiAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgY291bnRyeSk7CiAqIC4KICogLiAgICAgIExvY2FsZSggY29uc3QgICBVbmljb2RlU3RyaW5nJiAgbGFuZ3VhZ2UsIAogKiAuICAgICAgICAgICAgICBjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBjb3VudHJ5LCAKICogLiAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgdmFyaWFudCk7CiAqIDwvcHJlPgogKiA8L2Jsb2NrcXVvdGU+CiAqIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3JzIGlzIGEgdmFsaWQgPFNUUk9ORz5JU08KICogTGFuZ3VhZ2UgQ29kZS48L1NUUk9ORz4gVGhlc2UgY29kZXMgYXJlIHRoZSBsb3dlci1jYXNlIHR3by1sZXR0ZXIKICogY29kZXMgYXMgZGVmaW5lZCBieSBJU08tNjM5LgogKiBZb3UgY2FuIGZpbmQgYSBmdWxsIGxpc3Qgb2YgdGhlc2UgY29kZXMgYXQgYSBudW1iZXIgb2Ygc2l0ZXMsIHN1Y2ggYXM6CiAqIDxCUj48YSBocmVmID0iaHR0cDovL3d3dy5pY3MudWNpLmVkdS9wdWIvaWV0Zi9odHRwL3JlbGF0ZWQvaXNvNjM5LnR4dCI+CiAqIDxjb2RlPmh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvaHR0cC9yZWxhdGVkL2lzbzYzOS50eHQ8L2NvZGU+PC9hPgogKgogKiA8UD4KICogVGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3JzIGlzIGEgdmFsaWQgPFNUUk9ORz5JU08gQ291bnRyeQogKiBDb2RlLjwvU1RST05HPiBUaGVzZSBjb2RlcyBhcmUgdGhlIHVwcGVyLWNhc2UgdHdvLWxldHRlciBjb2RlcwogKiBhcyBkZWZpbmVkIGJ5IElTTy0zMTY2LgogKiBZb3UgY2FuIGZpbmQgYSBmdWxsIGxpc3Qgb2YgdGhlc2UgY29kZXMgYXQgYSBudW1iZXIgb2Ygc2l0ZXMsIHN1Y2ggYXM6CiAqIDxCUj48YSBocmVmPSJodHRwOi8vd3d3LmNoZW1pZS5mdS1iZXJsaW4uZGUvZGl2ZXJzZS9kb2MvSVNPXzMxNjYuaHRtbCI+CiAqIDxjb2RlPmh0dHA6Ly93d3cuY2hlbWllLmZ1LWJlcmxpbi5kZS9kaXZlcnNlL2RvYy9JU09fMzE2Ni5odG1sPC9jb2RlPjwvYT4KICoKICogPFA+CiAqIFRoZSB0aGlyZCBjb25zdHJ1Y3RvciByZXF1aXJlcyBhIHRoaXJkIGFyZ3VtZW50LS10aGUgPFNUUk9ORz5WYXJpYW50LjwvU1RST05HPgogKiBUaGUgVmFyaWFudCBjb2RlcyBhcmUgdmVuZG9yIGFuZCBicm93c2VyLXNwZWNpZmljLgogKiBGb3IgZXhhbXBsZSwgdXNlIFdJTiBmb3IgV2luZG93cywgTUFDIGZvciBNYWNpbnRvc2gsIGFuZCBQT1NJWCBmb3IgUE9TSVguCiAqIFdoZXJlIHRoZXJlIGFyZSB0d28gdmFyaWFudHMsIHNlcGFyYXRlIHRoZW0gd2l0aCBhbiB1bmRlcnNjb3JlLCBhbmQKICogcHV0IHRoZSBtb3N0IGltcG9ydGFudCBvbmUgZmlyc3QuIEZvcgogKiBleGFtcGxlLCBhIFRyYWRpdGlvbmFsIFNwYW5pc2ggY29sbGF0aW9uIG1pZ2h0IGJlIHJlZmVyZW5jZWQsIHdpdGgKICogIkVTIiwgIkVTIiwgIlRyYWRpdGlvbmFsX1dJTiIuCiAqCiAqIDxQPgogKiBCZWNhdXNlIGEgPGNvZGU+TG9jYWxlPC9jb2RlPiBvYmplY3QgaXMganVzdCBhbiBpZGVudGlmaWVyIGZvciBhIHJlZ2lvbiwKICogbm8gdmFsaWRpdHkgY2hlY2sgaXMgcGVyZm9ybWVkIHdoZW4geW91IGNvbnN0cnVjdCBhIDxjb2RlPkxvY2FsZTwvY29kZT4uCiAqIElmIHlvdSB3YW50IHRvIHNlZSB3aGV0aGVyIHBhcnRpY3VsYXIgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgZm9yIHRoZQogKiA8Y29kZT5Mb2NhbGU8L2NvZGU+IHlvdSBjb25zdHJ1Y3QsIHlvdSBtdXN0IHF1ZXJ5IHRob3NlIHJlc291cmNlcy4gRm9yCiAqIGV4YW1wbGUsIGFzayB0aGUgPGNvZGU+TnVtYmVyRm9ybWF0PC9jb2RlPiBmb3IgdGhlIGxvY2FsZXMgaXQgc3VwcG9ydHMKICogdXNpbmcgaXRzIDxjb2RlPmdldEF2YWlsYWJsZUxvY2FsZXM8L2NvZGU+IG1ldGhvZC4KICogPEJSPjxTVFJPTkc+Tm90ZTo8L1NUUk9ORz4gV2hlbiB5b3UgYXNrIGZvciBhIHJlc291cmNlIGZvciBhIHBhcnRpY3VsYXIKICogbG9jYWxlLCB5b3UgZ2V0IGJhY2sgdGhlIGJlc3QgYXZhaWxhYmxlIG1hdGNoLCBub3QgbmVjZXNzYXJpbHkKICogcHJlY2lzZWx5IHdoYXQgeW91IGFza2VkIGZvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2sgYXQKICogPGEgaHJlZj0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmh0bWwiPjxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPjwvYT4uCiAqCiAqIDxQPgogKiBUaGUgPGNvZGU+TG9jYWxlPC9jb2RlPiBjbGFzcyBwcm92aWRlcyBhIG51bWJlciBvZiBjb252ZW5pZW50IGNvbnN0YW50cwogKiB0aGF0IHlvdSBjYW4gdXNlIHRvIGNyZWF0ZSA8Y29kZT5Mb2NhbGU8L2NvZGU+IG9iamVjdHMgZm9yIGNvbW1vbmx5IHVzZWQKICogbG9jYWxlcy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGEgPGNvZGU+TG9jYWxlPC9jb2RlPiBvYmplY3QKICogZm9yIHRoZSBVbml0ZWQgU3RhdGVzOgogKiA8YmxvY2txdW90ZT4KICogPHByZT4KICogLiAgICAgIExvY2FsZTo6VVMKICogPC9wcmU+CiAqIDwvYmxvY2txdW90ZT4KICoKICogPFA+CiAqIE9uY2UgeW91J3ZlIGNyZWF0ZWQgYSA8Y29kZT5Mb2NhbGU8L2NvZGU+IHlvdSBjYW4gcXVlcnkgaXQgZm9yIGluZm9ybWF0aW9uIGFib3V0CiAqIGl0c2VsZi4gVXNlIDxjb2RlPmdldENvdW50cnk8L2NvZGU+IHRvIGdldCB0aGUgSVNPIENvdW50cnkgQ29kZSBhbmQKICogPGNvZGU+Z2V0TGFuZ3VhZ2U8L2NvZGU+IHRvIGdldCB0aGUgSVNPIExhbmd1YWdlIENvZGUuIFlvdSBjYW4KICogdXNlIDxjb2RlPmdldERpc3BsYXlDb3VudHJ5PC9jb2RlPiB0byBnZXQgdGhlCiAqIG5hbWUgb2YgdGhlIGNvdW50cnkgc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcgdG8gdGhlIHVzZXIuIFNpbWlsYXJseSwKICogeW91IGNhbiB1c2UgPGNvZGU+Z2V0RGlzcGxheUxhbmd1YWdlPC9jb2RlPiB0byBnZXQgdGhlIG5hbWUgb2YKICogdGhlIGxhbmd1YWdlIHN1aXRhYmxlIGZvciBkaXNwbGF5aW5nIHRvIHRoZSB1c2VyLiBJbnRlcmVzdGluZ2x5LAogKiB0aGUgPGNvZGU+Z2V0RGlzcGxheVhYWDwvY29kZT4gbWV0aG9kcyBhcmUgdGhlbXNlbHZlcyBsb2NhbGUtc2Vuc2l0aXZlCiAqIGFuZCBoYXZlIHR3byB2ZXJzaW9uczogb25lIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBsb2NhbGUgYW5kIG9uZQogKiB0aGF0IHRha2VzIGEgbG9jYWxlIGFzIGFuIGFyZ3VtZW50IGFuZCBkaXNwbGF5cyB0aGUgbmFtZSBvciBjb3VudHJ5IGluCiAqIGEgbGFuZ3VhZ2UgYXBwcm9wcmlhdGUgdG8gdGhhdCBsb2NhbGUuCiAqCiAqIDxQPgogKiBUaGUgVElGQyBwcm92aWRlcyBhIG51bWJlciBvZiBjbGFzc2VzIHRoYXQgcGVyZm9ybSBsb2NhbGUtc2Vuc2l0aXZlCiAqIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCB0aGUgPGNvZGU+TnVtYmVyRm9ybWF0PC9jb2RlPiBjbGFzcyBmb3JtYXRzCiAqIG51bWJlcnMsIGN1cnJlbmN5LCBvciBwZXJjZW50YWdlcyBpbiBhIGxvY2FsZS1zZW5zaXRpdmUgbWFubmVyLiBDbGFzc2VzCiAqIHN1Y2ggYXMgPGNvZGU+TnVtYmVyRm9ybWF0PC9jb2RlPiBoYXZlIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMKICogZm9yIGNyZWF0aW5nIGEgZGVmYXVsdCBvYmplY3Qgb2YgdGhhdCB0eXBlLiBGb3IgZXhhbXBsZSwgdGhlCiAqIDxjb2RlPk51bWJlckZvcm1hdDwvY29kZT4gY2xhc3MgcHJvdmlkZXMgdGhlc2UgdGhyZWUgY29udmVuaWVuY2UgbWV0aG9kcwogKiBmb3IgY3JlYXRpbmcgYSBkZWZhdWx0IDxjb2RlPk51bWJlckZvcm1hdDwvY29kZT4gb2JqZWN0OgogKiA8YmxvY2txdW90ZT4KICogPHByZT4KICogLiAgICBVRXJyb3JDb2RlIHN1Y2Nlc3MgPSBaRVJPX0VSUk9SOwogKiAuICAgIExvY2FsZSBteUxvY2FsZTsKICogLiAgICBOdW1iZXJGb3JtYXQgKm5mOwogKiAuCiAqIC4gICAgbmYgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZUluc3RhbmNlKCBzdWNjZXNzICk7ICAgICAgICAgIGRlbGV0ZSBuZjsKICogLiAgICBuZiA9IE51bWJlckZvcm1hdDo6Y3JlYXRlQ3VycmVuY3lJbnN0YW5jZSggc3VjY2VzcyApOyAgZGVsZXRlIG5mOwogKiAuICAgIG5mID0gTnVtYmVyRm9ybWF0OjpjcmVhdGVQZXJjZW50SW5zdGFuY2UoIHN1Y2Nlc3MgKTsgICBkZWxldGUgbmY7CiAqIDwvcHJlPgogKiA8L2Jsb2NrcXVvdGU+CiAqIEVhY2ggb2YgdGhlc2UgbWV0aG9kcyBoYXMgdHdvIHZhcmlhbnRzOyBvbmUgd2l0aCBhbiBleHBsaWNpdCBsb2NhbGUKICogYW5kIG9uZSB3aXRob3V0OyB0aGUgbGF0dGVyIHVzaW5nIHRoZSBkZWZhdWx0IGxvY2FsZS4KICogPGJsb2NrcXVvdGU+CiAqIDxwcmU+CiAqIC4gICAgbmYgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZUluc3RhbmNlKCBteUxvY2FsZSwgc3VjY2VzcyApOyAgICAgICAgICBkZWxldGUgbmY7CiAqIC4gICAgbmYgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZUN1cnJlbmN5SW5zdGFuY2UoIG15TG9jYWxlLCBzdWNjZXNzICk7ICBkZWxldGUgbmY7CiAqIC4gICAgbmYgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZVBlcmNlbnRJbnN0YW5jZSggbXlMb2NhbGUsIHN1Y2Nlc3MgKTsgICBkZWxldGUgbmY7CiAqIDwvcHJlPgogKiA8L2Jsb2NrcXVvdGU+CiAqIEEgPGNvZGU+TG9jYWxlPC9jb2RlPiBpcyB0aGUgbWVjaGFuaXNtIGZvciBpZGVudGlmeWluZyB0aGUga2luZCBvZiBvYmplY3QKICogKDxjb2RlPk51bWJlckZvcm1hdDwvY29kZT4pIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LiBUaGUgbG9jYWxlIGlzCiAqIDxTVFJPTkc+anVzdDwvU1RST05HPiBhIG1lY2hhbmlzbSBmb3IgaWRlbnRpZnlpbmcgb2JqZWN0cywKICogPFNUUk9ORz5ub3Q8L1NUUk9ORz4gYSBjb250YWluZXIgZm9yIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuCiAqCiAqIDxQPgogKiBFYWNoIGNsYXNzIHRoYXQgcGVyZm9ybXMgbG9jYWxlLXNlbnNpdGl2ZSBvcGVyYXRpb25zIGFsbG93cyB5b3UKICogdG8gZ2V0IGFsbCB0aGUgYXZhaWxhYmxlIG9iamVjdHMgb2YgdGhhdCB0eXBlLiBZb3UgY2FuIHNpZnQKICogdGhyb3VnaCB0aGVzZSBvYmplY3RzIGJ5IGxhbmd1YWdlLCBjb3VudHJ5LCBvciB2YXJpYW50LAogKiBhbmQgdXNlIHRoZSBkaXNwbGF5IG5hbWVzIHRvIHByZXNlbnQgYSBtZW51IHRvIHRoZSB1c2VyLgogKiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYSBtZW51IG9mIGFsbCB0aGUgY29sbGF0aW9uIG9iamVjdHMKICogc3VpdGFibGUgZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2UuIFN1Y2ggY2xhc3NlcyBpbXBsZW1lbnQgdGhlc2UKICogdGhyZWUgY2xhc3MgbWV0aG9kczoKICogPGJsb2NrcXVvdGU+CiAqIDxwcmU+CiAqIC4gICAgICBzdGF0aWMgTG9jYWxlKiBnZXRBdmFpbGFibGVMb2NhbGVzKGludDMyX3QmIG51bUxvY2FsZXMpCiAqIC4gICAgICBzdGF0aWMgVW5pY29kZVN0cmluZyYgZ2V0RGlzcGxheU5hbWUoY29uc3QgTG9jYWxlJiAgb2JqZWN0TG9jYWxlLAogKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2FsZSYgIGRpc3BsYXlMb2NhbGUsCiAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgZGlzcGxheU5hbWUpCiAqIC4gICAgICBzdGF0aWMgVW5pY29kZVN0cmluZyYgZ2V0RGlzcGxheU5hbWUoY29uc3QgTG9jYWxlJiAgb2JqZWN0TG9jYWxlLAogKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmIGRpc3BsYXlOYW1lKQogKiA8L3ByZT4KICogPC9ibG9ja3F1b3RlPgogKi8KdHlwZWRlZiBzdHJ1Y3QgVUxvY2FsZSBVTG9jYWxlOwoKI2RlZmluZSBMQU5HX0NBUEFDSVRZIDMKI2RlZmluZSBDT1VOVFJZX0NBUEFDSVRZIDMKI2RlZmluZSBGVUxMTkFNRV9DQVBBQ0lUWSA1MAoKY2xhc3MgVV9DT01NT05fQVBJIExvY2FsZSAKewpwdWJsaWM6CiAgICAvKioKICAgICAqIFVzZWZ1bCBjb25zdGFudHMgZm9yIGxhbmd1YWdlLgogICAgICovCiAgICBzdGF0aWMgY29uc3QgTG9jYWxlIEVOR0xJU0g7CiAgICBzdGF0aWMgY29uc3QgTG9jYWxlIEZSRU5DSDsKICAgIHN0YXRpYyBjb25zdCBMb2NhbGUgR0VSTUFOOwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBJVEFMSUFOOwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBKQVBBTkVTRTsKICAgIHN0YXRpYyBjb25zdCBMb2NhbGUgS09SRUFOOwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBDSElORVNFOwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBTSU1QTElGSUVEX0NISU5FU0U7CiAgICBzdGF0aWMgY29uc3QgTG9jYWxlIFRSQURJVElPTkFMX0NISU5FU0U7CgogICAgLyoqCiAgICAgKiBVc2VmdWwgY29uc3RhbnRzIGZvciBjb3VudHJ5LgogICAgICovCiAgICBzdGF0aWMgY29uc3QgTG9jYWxlIEZSQU5DRTsKICAgIHN0YXRpYyBjb25zdCBMb2NhbGUgR0VSTUFOWTsKICAgIHN0YXRpYyBjb25zdCBMb2NhbGUgSVRBTFk7CiAgICBzdGF0aWMgY29uc3QgTG9jYWxlIEpBUEFOOwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBLT1JFQTsKICAgIHN0YXRpYyBjb25zdCBMb2NhbGUgQ0hJTkE7ICAgICAgLy8gQWxpYXMgZm9yIFBSQwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBQUkM7ICAgICAgICAvLyBQZW9wbGVzIFJlcHVibGljIG9mIENoaW5hCiAgICBzdGF0aWMgY29uc3QgTG9jYWxlIFRBSVdBTjsgICAgIC8vIFJlcHVibGljIG9mIENoaW5hCiAgICBzdGF0aWMgY29uc3QgTG9jYWxlIFVLOwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBVUzsKICAgIHN0YXRpYyBjb25zdCBMb2NhbGUgQ0FOQURBOwogICAgc3RhdGljIGNvbnN0IExvY2FsZSBDQU5BREFfRlJFTkNIOwoKICAgLyoqCiAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSBsb2NhbGUuIEl0J3Mgb25seSB1c2VkIHdoZW4gYSBmaWxsLWluIHBhcmFtZXRlciBpcwogICAgKiBuZWVkZWQuCiAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgpOyAKCiAgICAvKioKICAgICAqIENvbnN0cnVjdCBhIGxvY2FsZSBmcm9tIGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50LgogICAgICoKICAgICAqIEBwYXJhbSBsYW5ndWFnZSBMb3dlcmNhc2UgdHdvLWxldHRlciBJU08tNjM5IGNvZGUuCiAgICAgKiBAcGFyYW0gY291bnRyeSAgVXBwZXJjYXNlIHR3by1sZXR0ZXIgSVNPLTMxNjYgY29kZS4gKG9wdGlvbmFsKQogICAgICogQHBhcmFtIHZhcmlhbnQgIFVwcGVyY2FzZSB2ZW5kb3IgYW5kIGJyb3dzZXIgc3BlY2lmaWMgY29kZS4gU2VlIGNsYXNzCiAgICAgKiAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uIChvcHRpb25hbCkKICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSggY29uc3QgICBVbmljb2RlU3RyaW5nJiAgbGFuZ3VhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgY291bnRyeSAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgdmFyaWFudCApOwoKICAgICAgICAgICAgICAgIExvY2FsZSggY29uc3QgICBVbmljb2RlU3RyaW5nJiAgbGFuZ3VhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgY291bnRyeSApOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBMb2NhbGUoIGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIGxhbmd1YWdlKTsKCgoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZXMgYSBMb2NhbGUgb2JqZWN0IGZyb20gYW5vdGhlciBMb2NhbGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSBvdGhlciBUaGUgTG9jYWxlIG9iamVjdCBiZWluZyBjb3BpZWQgaW4uCiAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoY29uc3QgICAgTG9jYWxlJiBvdGhlcik7CgoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvcgogICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxvY2FsZSgpIDsKICAgICAgICAgICAgICAgICAgCiAgICAvKioKICAgICAqIFJlcGxhY2VzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgKnRoaXMgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSBvdGhlciBUaGUgTG9jYWxlIG9iamVjdCBiZWluZyBjb3BpZWQgaW4uCiAgICAgKiBAcmV0dXJuICAgICAgKnRoaXMKICAgICAqLwogICAgTG9jYWxlJiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBMb2NhbGUmIG90aGVyKTsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiB0d28gbG9jYWxlIGtleXMgYXJlIHRoZSBzYW1lLgogICAgICoKICAgICAqIEBwYXJhbSBvdGhlciBUaGUgbG9jYWxlIGtleSBvYmplY3QgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGlzLgogICAgICogQHJldHVybiAgICAgIFRydWUgaWYgdGhlIHR3byBsb2NhbGUga2V5cyBhcmUgdGhlIHNhbWUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgICAgICAgICAgICAgYm9vbF90ICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgICAgTG9jYWxlJiAgICAgb3RoZXIpIGNvbnN0OyAgIAoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIHR3byBsb2NhbGUga2V5cyBhcmUgbm90IHRoZSBzYW1lLgogICAgICoKICAgICAqIEBwYXJhbSBvdGhlciBUaGUgbG9jYWxlIGtleSBvYmplY3QgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGlzLgogICAgICogQHJldHVybiAgICAgIFRydWUgaWYgdGhlIHR3byBsb2NhbGUga2V5cyBhcmUgbm90IHRoZSBzYW1lLCBmYWxzZQogICAgICogICAgICAgICAgICAgIG90aGVyd2lzZS4KICAgICAqLwogICAgICAgICAgICAgICAgYm9vbF90ICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgICAgTG9jYWxlJiAgICAgb3RoZXIpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ29tbW9uIG1ldGhvZHMgb2YgZ2V0dGluZyB0aGUgY3VycmVudCBkZWZhdWx0IExvY2FsZS4gVXNlZCBmb3IgdGhlCiAgICAgKiBwcmVzZW50YXRpb246IG1lbnVzLCBkaWFsb2dzLCBldGMuIEdlbmVyYWxseSBzZXQgb25jZSB3aGVuIHlvdXIgYXBwbGV0IG9yCiAgICAgKiBhcHBsaWNhdGlvbiBpcyBpbml0aWFsaXplZCwgdGhlbiBuZXZlciByZXNldC4gKElmIHlvdSBkbyByZXNldCB0aGUKICAgICAqIGRlZmF1bHQgbG9jYWxlLCB5b3UgcHJvYmFibHkgd2FudCB0byByZWxvYWQgeW91ciBHVUksIHNvIHRoYXQgdGhlIGNoYW5nZQogICAgICogaXMgcmVmbGVjdGVkIGluIHlvdXIgaW50ZXJmYWNlLikKICAgICAqCiAgICAgKiBNb3JlIGFkdmFuY2VkIHByb2dyYW1zIHdpbGwgYWxsb3cgdXNlcnMgdG8gdXNlIGRpZmZlcmVudCBsb2NhbGVzIGZvcgogICAgICogZGlmZmVyZW50IGZpZWxkcywgZS5nLiBpbiBhIHNwcmVhZHNoZWV0LgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGUgaW5pdGlhbCBzZXR0aW5nIHdpbGwgbWF0Y2ggdGhlIGhvc3Qgc3lzdGVtLgogICAgICovCiAgICBzdGF0aWMgIExvY2FsZSYgICAgICAgICAgICAgZ2V0RGVmYXVsdCh2b2lkKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIGRlZmF1bHQuIE5vcm1hbGx5IHNldCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYXBwbGV0IG9yCiAgICAgKiBhcHBsaWNhdGlvbiwgdGhlbiBuZXZlciByZXNldC4gc2V0RGVmYXVsdCBkb2VzIE5PVCByZXNldCB0aGUgaG9zdCBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIG5ld0xvY2FsZSBMb2NhbGUgdG8gc2V0IHRvLgogICAgICovCiAgICBzdGF0aWMgICAgICB2b2lkICAgICAgICAgICAgc2V0RGVmYXVsdChjb25zdCAgICBMb2NhbGUmICAgICBuZXdMb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBGaWxscyBpbiAibGFuZyIgd2l0aCB0aGUgbG9jYWxlJ3MgdHdvLWxldHRlciBJU08tNjM5IGxhbmd1YWdlIGNvZGUuCiAgICAgKiBAcGFyYW0gbGFuZyAgUmVjZWl2ZXMgdGhlIGxhbmd1YWdlIGNvZGUuCiAgICAgKiBAcmV0dXJuICAgICAgQSByZWZlcmVuY2UgdG8gImxhbmciLgogICAgICovCiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiAgZ2V0TGFuZ3VhZ2UoICAgICAgICBVbmljb2RlU3RyaW5nJiAgbGFuZykgY29uc3Q7CiAgICAvKioKICAgICAqIEZpbGxzIGluICJjbnRyeSIgd2l0aCB0aGUgbG9jYWxlJ3MgdHdvLWxldHRlciBJU08tMzE2NiBjb3VudHJ5IGNvZGUuCiAgICAgKiBAcGFyYW0gY250cnkgUmVjZWl2ZXMgdGhlIGNvdW50cnkgY29kZS4KICAgICAqIEByZXR1cm4gICAgICBBIHJlZmVyZW5jZSB0byAiY250cnkiLgogICAgICovCiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiAgZ2V0Q291bnRyeSggICAgICAgICBVbmljb2RlU3RyaW5nJiAgY250cnkpIGNvbnN0OwogICAgLyoqCiAgICAgKiBGaWxscyBpbiAidmFyIiB3aXRoIHRoZSBsb2NhbGUncyB2YXJpYW50IGNvZGUuCiAgICAgKiBAcGFyYW0gdmFyICAgUmVjZWl2ZXMgdGhlIHZhcmlhbnQgY29kZS4KICAgICAqIEByZXR1cm4gICAgICBBIHJlZmVyZW5jZSB0byAidmFyIi4KICAgICAqLwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldFZhcmlhbnQoICAgICAgICAgVW5pY29kZVN0cmluZyYgIHZhcikgY29uc3Q7CgogICAgLyoqCiAgICAgKiBGaWxscyBpbiAibmFtZSIgdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBlbnRpcmUgbG9jYWxlLCB3aXRoIHRoZSBsYW5ndWFnZSwKICAgICAqIGNvdW50cnkgYW5kIHZhcmlhbnQgc2VwYXJhdGVkIGJ5IHVuZGVyYmFycy4gSWYgYSBmaWVsZCBpcyBtaXNzaW5nLCBhdAogICAgICogbW9zdCBvbmUgdW5kZXJiYXIgd2lsbCBvY2N1ci4gRXhhbXBsZTogImVuIiwgImRlX0RFIiwgImVuX1VTX1dJTiIsCiAgICAgKiAiZGVfUE9TSVgiLCAiZnJfTUFDIgogICAgICogQHBhcmFtIHZhciAgIFJlY2VpdmVzIHRoZSBwcm9ncmFtbWF0aWMgbG9jYWxlIG5hbWUuCiAgICAgKiBAcmV0dXJuICAgICAgQSByZWZlcmVuY2UgdG8gIm5hbWUiLgogICAgICovCiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiAgZ2V0TmFtZSggICAgICAgIFVuaWNvZGVTdHJpbmcmICBuYW1lKSBjb25zdDsKCiAgICAvKioKICAgICAqIEZpbGxzIGluICJuYW1lIiB3aXRoIHRoZSBsb2NhbGUncyB0aHJlZS1sZXR0ZXIgbGFuZ3VhZ2UgY29kZSwgYXMgc3BlY2lmaWVkCiAgICAgKiBpbiBJU08gZHJhZnQgc3RhbmRhcmQgSVNPLTYzOS0yLi4KICAgICAqIEBwYXJhbSBuYW1lICBSZWNlaXZlcyB0aGUgdGhyZWUtbGV0dGVyIGxhbmd1YWdlIGNvZGUuCiAgICAgKiBAcGFyYW0gc3RhdHVzIEFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgTUlTU0lOR19SRVNPVVJDRV9FUlJPUnMKICAgICAqIEByZXR1cm4gICAgICBBIHJlZmVyZW5jZSB0byAibmFtZSIuCiAgICAgKi8KICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmICBnZXRJU08zTGFuZ3VhZ2UoVW5pY29kZVN0cmluZyYgIG5hbWUsIFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3Q7CgogICAgLy8gdGhpcyB2ZXJzaW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSBnZXRJU08zTGFuZ3VhZ2UoVW5pY29kZVN0cmluZyYsIFVFcnJvckNvZGUmKQogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldElTTzNMYW5ndWFnZShVbmljb2RlU3RyaW5nJiAgbmFtZSkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBGaWxscyBpbiAibmFtZSIgd2l0aCB0aGUgbG9jYWxlJ3MgdGhyZWUtbGV0dGVyIElTTy0zMTY2IGNvdW50cnkgY29kZS4KICAgICAqIEBwYXJhbSBuYW1lICBSZWNlaXZlcyB0aGUgdGhyZWUtbGV0dGVyIGNvdW50cnkgY29kZS4KICAgICAqIEBwYXJhbSBzdGF0dXMgQW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBNSVNTSU5HX1JFU09VUkNFX0VSUk9ScwogICAgICogQHJldHVybiAgICAgIEEgcmVmZXJlbmNlIHRvICJuYW1lIi4KICAgICAqLwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldElTTzNDb3VudHJ5KCBVbmljb2RlU3RyaW5nJiAgbmFtZSwgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKCiAgICAvLyB0aGlzIHZlcnNpb24gaXMgZGVwcmVjYXRlZCwgdXNlIGdldElTTzNDb3VudHJ5KFVuaWNvZGVTdHJpbmcmLCBVRXJyb3JDb2RlJik7CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiAgZ2V0SVNPM0NvdW50cnkoIFVuaWNvZGVTdHJpbmcmICBuYW1lKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFdpbmRvd3MgTENJRCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbG9jYWxlLgogICAgICogVGhpcyB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIHJlc291cmNlIGRhdGEgZm9yIHRoZSBsb2NhbGUgYXMgYSBvbmUtdG8tZm91ci1kaWdpdAogICAgICogaGV4YWRlY2ltYWwgbnVtYmVyLiAgSWYgdGhlIHJlc291cmNlIGlzIG1pc3NpbmcsIGluIHRoZSB3cm9uZyBmb3JtYXQsIG9yCiAgICAgKiB0aGVyZSBpcyBubyBXaW5kb3dzIExDSUQgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGxvY2FsZSwgcmV0dXJucyAwLgogICAgICovCiAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgZ2V0TENJRCh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIEZpbGxzIGluICJkaXNwTGFuZyIgd2l0aCB0aGUgbmFtZSBvZiB0aGlzIGxvY2FsZSdzIGxhbmd1YWdlIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvcgogICAgICogdXNlciBkaXNwbGF5IGluIHRoZSBkZWZhdWx0IGxvY2FsZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgbG9jYWxlJ3MgbGFuZ3VhZ2UgY29kZSBpcwogICAgICogImZyIiBhbmQgdGhlIGRlZmF1bHQgbG9jYWxlJ3MgbGFuZ3VhZ2UgY29kZSBpcyAiZW4iLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHNldAogICAgICogZGlzcExhbmcgdG8gIkZyZW5jaCIuCiAgICAgKiBAcGFyYW0gZGlzcExhbmcgIFJlY2VpdmVzIHRoZSBsYW5ndWFnZSdzIGRpc3BsYXkgbmFtZS4KICAgICAqIEByZXR1cm4gICAgICAgICAgQSByZWZlcmVuY2UgdG8gImRpc3BMYW5nIi4KICAgICAqLwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldERpc3BsYXlMYW5ndWFnZShVbmljb2RlU3RyaW5nJiAgIGRpc3BMYW5nKSBjb25zdDsKCiAgICAvKioKICAgICAqIEZpbGxzIGluICJkaXNwTGFuZyIgd2l0aCB0aGUgbmFtZSBvZiB0aGlzIGxvY2FsZSdzIGxhbmd1YWdlIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvcgogICAgICogdXNlciBkaXNwbGF5IGluIHRoZSBsb2NhbGUgc3BlY2lmaWVkIGJ5ICJpbkxvY2FsZSIuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGxvY2FsZSdzCiAgICAgKiBsYW5ndWFnZSBjb2RlIGlzICJlbiIgYW5kIGluTG9jYWxlJ3MgbGFuZ3VhZ2UgY29kZSBpcyAiZnIiLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHNldAogICAgICogZGlzcExhbmcgdG8gIkFuZ2xhaXMiLgogICAgICogQHBhcmFtIGluTG9jYWxlICBTcGVjaWZpZXMgdGhlIGxvY2FsZSB0byBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIG5hbWUuICBJbiBvdGhlciB3b3JkcywKICAgICAqICAgICAgICAgICAgICAgICAgaWYgdGhlIGxvY2FsZSdzIGxhbmd1YWdlIGNvZGUgaXMgImVuIiwgcGFzc2luZyBMb2NhbGU6OkZSRU5DSCBmb3IKICAgICAqICAgICAgICAgICAgICAgICAgaW5Mb2NhbGUgd291bGQgcmVzdWx0IGluICJBbmdsYWlzIiwgd2hpbGUgcGFzc2luZyBMb2NhbGU6OkdFUk1BTgogICAgICogICAgICAgICAgICAgICAgICBmb3IgaW5Mb2NhbGUgd291bGQgcmVzdWx0IGluICJFbmdsaXNjaCIuCiAgICAgKiBAcGFyYW0gZGlzcExhbmcgIFJlY2VpdmVzIHRoZSBsYW5ndWFnZSdzIGRpc3BsYXkgbmFtZS4KICAgICAqIEByZXR1cm4gICAgICAgICAgQSByZWZlcmVuY2UgdG8gImRpc3BMYW5nIi4KICAgICAqLwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldERpc3BsYXlMYW5ndWFnZSggY29uc3QgICBMb2NhbGUmICAgICAgICAgaW5Mb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmICBkaXNwTGFuZykgY29uc3Q7CiAgICAvKioKICAgICAqIEZpbGxzIGluICJkaXNwQ291bnRyeSIgd2l0aCB0aGUgbmFtZSBvZiB0aGlzIGxvY2FsZSdzIGNvdW50cnkgaW4gYSBmb3JtYXQgc3VpdGFibGUKICAgICAqIGZvciB1c2VyIGRpc3BsYXkgaW4gdGhlIGRlZmF1bHQgbG9jYWxlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBsb2NhbGUncyBjb3VudHJ5IGNvZGUKICAgICAqIGlzICJGUiIgYW5kIHRoZSBkZWZhdWx0IGxvY2FsZSdzIGxhbmd1YWdlIGNvZGUgaXMgImVuIiwgdGhpcyBmdW5jdGlvbiB3b3VsZCBzZXQKICAgICAqIGRpc3BDb3VudHJ5IHRvICJGcmFuY2UiLgogICAgICogQHBhcmFtIGRpc3BDb3VudHJ5ICAgUmVjZWl2ZXMgdGhlIGNvdW50cnkncyBkaXNwbGF5IG5hbWUuCiAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBBIHJlZmVyZW5jZSB0byAiZGlzcENvdW50cnkiLgogICAgICovCiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiAgZ2V0RGlzcGxheUNvdW50cnkoICAgICAgICAgIFVuaWNvZGVTdHJpbmcmIGRpc3BDb3VudHJ5KSBjb25zdDsKICAgIC8qKgogICAgICogRmlsbHMgaW4gImRpc3BDb3VudHJ5IiB3aXRoIHRoZSBuYW1lIG9mIHRoaXMgbG9jYWxlJ3MgY291bnRyeSBpbiBhIGZvcm1hdCBzdWl0YWJsZQogICAgICogZm9yIHVzZXIgZGlzcGxheSBpbiB0aGUgbG9jYWxlIHNwZWNpZmllZCBieSAiaW5Mb2NhbGUiLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBsb2NhbGUncwogICAgICogY291bnRyeSBjb2RlIGlzICJVUyIgYW5kIGluTG9jYWxlJ3MgbGFuZ3VhZ2UgY29kZSBpcyAiZnIiLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHNldAogICAgICogZGlzcENvdW50cnkgdG8gIkV0YXRzLVVuaXMiLgogICAgICogQHBhcmFtIGluTG9jYWxlICAgICAgU3BlY2lmaWVzIHRoZSBsb2NhbGUgdG8gYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBuYW1lLiAgSW4gb3RoZXIKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdvcmRzLCBpZiB0aGUgbG9jYWxlJ3MgY291bnRyeSBjb2RlIGlzICJVUyIsIHBhc3NpbmcKICAgICAqICAgICAgICAgICAgICAgICAgICAgIExvY2FsZTo6RlJFTkNIIGZvciBpbkxvY2FsZSB3b3VsZCByZXN1bHQgaW4gIsl0YXRzLVVuaXMiLCB3aGlsZQogICAgICogICAgICAgICAgICAgICAgICAgICAgcGFzc2luZyBMb2NhbGU6OkdFUk1BTiBmb3IgaW5Mb2NhbGUgd291bGQgcmVzdWx0IGluCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAiVmVyZWluaWd0ZSBTdGFhdGVuIi4KICAgICAqIEBwYXJhbSBkaXNwQ291bnRyeSAgIFJlY2VpdmVzIHRoZSBjb3VudHJ5J3MgZGlzcGxheSBuYW1lLgogICAgICogQHJldHVybiAgICAgICAgICAgICAgQSByZWZlcmVuY2UgdG8gImRpc3BDb3VudHJ5Ii4KICAgICAqLwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldERpc3BsYXlDb3VudHJ5KCAgY29uc3QgICBMb2NhbGUmICAgICAgICAgaW5Mb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmICBkaXNwQ291bnRyeSkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBGaWxscyBpbiAiZGlzcFZhciIgd2l0aCB0aGUgbmFtZSBvZiB0aGlzIGxvY2FsZSdzIHZhcmlhbnQgY29kZSBpbiBhIGZvcm1hdCBzdWl0YWJsZQogICAgICogZm9yIHVzZXIgZGlzcGxheSBpbiB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgKiBAcGFyYW0gZGlzcFZhciAgIFJlY2VpdmVzIHRoZSB2YXJpYW50J3MgbmFtZS4KICAgICAqIEByZXR1cm4gICAgICAgICAgQSByZWZlcmVuY2UgdG8gImRpc3BWYXIiLgogICAgICovCiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiAgZ2V0RGlzcGxheVZhcmlhbnQoICAgICAgVW5pY29kZVN0cmluZyYgZGlzcFZhcikgY29uc3Q7CiAgICAvKioKICAgICAqIEZpbGxzIGluICJkaXNwVmFyIiB3aXRoIHRoZSBuYW1lIG9mIHRoaXMgbG9jYWxlJ3MgdmFyaWFudCBjb2RlIGluIGEgZm9ybWF0CiAgICAgKiBzdWl0YWJsZSBmb3IgdXNlciBkaXNwbGF5IGluIHRoZSBsb2NhbGUgc3BlY2lmaWVkIGJ5ICJpbkxvY2FsZSIuCiAgICAgKiBAcGFyYW0gaW5Mb2NhbGUgIFNwZWNpZmllcyB0aGUgbG9jYWxlIHRvIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgbmFtZS4KICAgICAqIEBwYXJhbSBkaXNwVmFyICAgUmVjZWl2ZXMgdGhlIHZhcmlhbnQncyBkaXNwbGF5IG5hbWUuCiAgICAgKiBAcmV0dXJuICAgICAgICAgIEEgcmVmZXJlbmNlIHRvICJkaXNwVmFyIi4KICAgICAqLwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldERpc3BsYXlWYXJpYW50KCAgY29uc3QgICBMb2NhbGUmICAgICAgICAgaW5Mb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmICBkaXNwVmFyKSBjb25zdDsKICAgIC8qKgogICAgICogRmlsbHMgaW4gIm5hbWUiIHdpdGggdGhlIG5hbWUgb2YgdGhpcyBsb2NhbGUgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIHVzZXIgZGlzcGxheSAKICAgICAqIGluIHRoZSBkZWZhdWx0IGxvY2FsZS4gIFRoaXMgZnVuY3Rpb24gdXNlcyBnZXREaXNwbGF5TGFuZ3VhZ2UoKSwgZ2V0RGlzcGxheUNvdW50cnkoKSwKICAgICAqIGFuZCBnZXREaXNwbGF5VmFyaWFudCgpIHRvIGRvIGl0cyB3b3JrLCBhbmQgb3V0cHV0cyB0aGUgZGlzcGxheSBuYW1lIGluIHRoZSBmb3JtYXQKICAgICAqICJsYW5ndWFnZSAoY291bnRyeVssdmFyaWFudF0pIi4gIEZvciBleGFtcGxlLCBpZiB0aGUgZGVmYXVsdCBsb2NhbGUgaXMgZW5fVVMsIHRoZW4KICAgICAqIGZyX0ZSJ3MgZGlzcGxheSBuYW1lIHdvdWxkIGJlICJGcmVuY2ggKEZyYW5jZSkiLCBhbmQgZXNfTVhfVHJhZGl0aW9uYWwncyBkaXNwbGF5IG5hbWUKICAgICAqIHdvdWxkIGJlICJTcGFuaXNoIChNZXhpY28sVHJhZGl0aW9uYWwpIi4KICAgICAqIEBwYXJhbSBuYW1lICBSZWNlaXZlcyB0aGUgbG9jYWxlJ3MgZGlzcGxheSBuYW1lLgogICAgICogQHJldHVybiAgICAgIEEgcmVmZXJlbmNlIHRvICJuYW1lIi4KICAgICAqLwogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyYgIGdldERpc3BsYXlOYW1lKCAgICAgICAgIFVuaWNvZGVTdHJpbmcmICBuYW1lKSBjb25zdDsKICAgIC8qKgogICAgICogRmlsbHMgaW4gIm5hbWUiIHdpdGggdGhlIG5hbWUgb2YgdGhpcyBsb2NhbGUgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIHVzZXIgZGlzcGxheSAKICAgICAqIGluIHRoZSBsb2NhbGUgc3BlY2ZpZWQgYnkgImluTG9jYWxlIi4gIFRoaXMgZnVuY3Rpb24gdXNlcyBnZXREaXNwbGF5TGFuZ3VhZ2UoKSwKICAgICAqIGdldERpc3BsYXlDb3VudHJ5KCksIGFuZCBnZXREaXNwbGF5VmFyaWFudCgpIHRvIGRvIGl0cyB3b3JrLCBhbmQgb3V0cHV0cyB0aGUgZGlzcGxheQogICAgICogbmFtZSBpbiB0aGUgZm9ybWF0ICJsYW5ndWFnZSAoY291bnRyeVssdmFyaWFudF0pIi4gIEZvciBleGFtcGxlLCBpZiBpbkxvY2FsZSBpcwogICAgICogZnJfRlIsIHRoZW4gZW5fVVMncyBkaXNwbGF5IG5hbWUgd291bGQgYmUgIkFuZ2xhaXMgKMl0YXRzLVVuaXMpIiwgYW5kIG5vX05PX05ZJ3MKICAgICAqIGRpc3BsYXkgbmFtZSB3b3VsZCBiZSAibm9ydulnaWVuIChOb3J26GdlLE5ZKSIuCiAgICAgKiBAcGFyYW0gaW5Mb2NhbGUgIFNwZWNpZmllcyB0aGUgbG9jYWxlIHRvIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgbmFtZS4KICAgICAqIEBwYXJhbSBuYW1lICAgICAgUmVjZWl2ZXMgdGhlIGxvY2FsZSdzIGRpc3BsYXkgbmFtZS4KICAgICAqIEByZXR1cm4gICAgICAgICAgQSByZWZlcmVuY2UgdG8gIm5hbWUiLgogICAgICovCiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiAgZ2V0RGlzcGxheU5hbWUoIGNvbnN0ICAgTG9jYWxlJiAgICAgICAgIGluTG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcmICBuYW1lKSBjb25zdDsKICAgIC8qKgogICAgICogR2VuZXJhdGVzIGEgaGFzaCBjb2RlIGZvciB0aGUgbG9jYWxlLiBTaW5jZSBMb2NhbGVzIGFyZSBvZnRlbiB1c2VkIGluIGhhc2h0YWJsZXMsIAogICAgICogY2FjaGVzIHRoZSB2YWx1ZSBmb3Igc3BlZWQuCiAgICAgKi8KICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBoYXNoQ29kZSh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgbG9jYWxlcy4KICAgICAqIEBwYXJhbSBjb3VudCBSZWNlaXZlcyB0aGUgbnVtYmVyIG9mIGxvY2FsZXMgaW4gdGhlIGxpc3QuCiAgICAgKiBAcmV0dXJuICAgICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIExvY2FsZSBvYmplY3RzLiAgVGhpcyBhcnJheSBpcyB0aGUgbGlzdAogICAgICogICAgICAgICAgICAgIG9mIGFsbCBsb2NhbGVzIHdpdGggaW5zdGFsbGVkIHJlc291cmNlIGZpbGVzLiAgVGhlIGNhbGxlZCBkb2VzIE5PVAogICAgICogICAgICAgICAgICAgIGdldCBvd25lcnNoaXAgb2YgdGhpcyBsaXN0LCBhbmQgbXVzdCBOT1QgZGVsZXRlIGl0LgogICAgICovCiAgICBzdGF0aWMgIGNvbnN0ICAgTG9jYWxlKiAgICAgZ2V0QXZhaWxhYmxlTG9jYWxlcyhpbnQzMl90JiBjb3VudCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgMi1sZXR0ZXIgY291bnRyeSBjb2RlcyBkZWZpbmVkIGluIElTTyAzMTY2LgogICAgICogQ2FuIGJlIHVzZWQgdG8gY3JlYXRlIExvY2FsZXMuCiAgICAgKiBAcGFyYW0gY291bnQgUmVjZWl2ZXMgdGhlIG51bWJlciBvZiBjb3VudHJpZXMgaW4gdGhlIGxpc3QuCiAgICAgKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBVbmljb2RlU3RyaW5nIG9iamVjdHMuIFRoZSBjYWxsZXIgZG9lcyBOT1QKICAgICAqICBnZXQgb3duZXJzaGlwIG9mIHRoaXMgbGlzdCwgYW5kIG11c3QgTk9UIGRlbGV0ZSBpdC4KICAgICAqLwogICAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcqIGdldElTT0NvdW50cmllcyhpbnQzMl90JiBjb3VudCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgMi1sZXR0ZXIgbGFuZ3VhZ2UgY29kZXMgZGVmaW5lZCBpbiBJU08gNjM5LgogICAgICogQ2FuIGJlIHVzZWQgdG8gY3JlYXRlIExvY2FsZXMuCiAgICAgKiBbTk9URTogIElTTyA2MzkgaXMgbm90IGEgc3RhYmxlIHN0YW5kYXJkLS0gc29tZSBsYW5ndWFnZXMnIGNvZGVzIGhhdmUgY2hhbmdlZC4KICAgICAqIFRoZSBsaXN0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbmNsdWRlcyBib3RoIHRoZSBuZXcgYW5kIHRoZSBvbGQgY29kZXMgZm9yIHRoZQogICAgICogbGFuZ3VhZ2VzIHdob3NlIGNvZGVzIGhhdmUgY2hhbmdlZC5dCiAgICAgKiBAcGFyYW0gY291bnQgUmVjZWl2ZXMgdGhlIG51bWJlciBvZiBsYW5ndWFnZXMgaW4gdGhlIGxpc3QuCiAgICAgKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBVbmljb2RlU3RyaW5nIG9iamVjdHMuIFRoZSBjYWxsZXIgZG9lcyBOT1QKICAgICAqICBnZXQgb3duZXJzaGlwIG9mIHRoaXMgbGlzdCwgYW5kIG11c3QgTk9UIGRlbGV0ZSBpdC4KICAgICAqLwogICAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcqIGdldElTT0xhbmd1YWdlcyhpbnQzMl90JiBjb3VudCk7CiAgICAKICAgIC8qKgogICAgICogR2V0IHRoZSBwYXRoIHRvIHRoZSBSZXNvdXJjZUJ1bmRsZSBsb2NhbGUgZmlsZXMuIFRoaXMgcGF0aCB3aWxsIGJlIGEKICAgICAqIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggbmFtZSBlbmRpbmcgaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLCBzbyB0aGF0IGZpbGUKICAgICAqIG5hbWVzIG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gaXQuIFRoaXMgcGF0aCBtYXkgYmUgY2hhbmdlZCBieSBjYWxsaW5nCiAgICAgKiBzZXREYXRhRGlyZWN0b3J5KCkuIElmIHNldERhdGFEaXJlY3RvcnkoKSBoYXMgbm90IGJlZW4gY2FsbGVkIHlldCwKICAgICAqIGdldERhdGFEaXJlY3RvcnkoKSB3aWxsIHJldHVybiBhIHBsYXRmb3JtLWRlcGVuZGVudCBkZWZhdWx0IHBhdGggYXMKICAgICAqIHNwZWNpZmllZCBieSBUUGxhdGZvcm1VdGlsaXRpZXM6OmdldERlZmF1bHREYXRhRGlyZWN0b3J5KCkuCiAgICAgKgogICAgICogQHJldHVybiBDdXJyZW50IGRhdGEgcGF0aC4KICAgICAqLwogICAgc3RhdGljICBjb25zdCAgIGNoYXIqICAgICAgIGdldERhdGFEaXJlY3Rvcnkodm9pZCk7CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHBhdGggdG8gdGhlIFJlc291cmNlQnVuZGxlIGxvY2FsZSBmaWxlcy4gQWZ0ZXIgbWFraW5nIHRoaXMgY2FsbCwKICAgICAqIGFsbCBvYmplY3RzIGluIHRoZSBVbmljb2RlIEFuYWx5dGljcyBwYWNrYWdlIHdpbGwgcmVhZCBSZXNvdXJjZUJ1bmRsZQogICAgICogZGF0YSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBpbiBvcmRlciB0byBvYnRhaW4gbG9jYWxlIGRhdGEuCiAgICAgKgogICAgICogQHBhcmFtIHBhdGggVGhlIG5ldyBkYXRhIHBhdGggdG8gYmUgc2V0IHRvLgogICAgICovCiAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgc2V0RGF0YURpcmVjdG9yeShjb25zdCBjaGFyKiBwYXRoKTsKICAgIExvY2FsZSYgaW5pdChjb25zdCBjaGFyKiBjTG9jYWxlSUQpOwogICAgCnByb3RlY3RlZDogLy8gb25seSBwcm90ZWN0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuIERPIE5PVCBVU0UuCiAgICB2b2lkIHNldEZyb21QT1NJWElEKGNvbnN0IFVuaWNvZGVTdHJpbmcmIHBvc2l4SUQpOyAvLyBzZXQgaXQgZnJvbSBhIHNpbmdsZSBzdHJpbmcuCiAgICB2b2lkIHNldEZyb21QT1NJWElEKGNvbnN0IGNoYXIgKnBvc2l4SUQpOyAvLyBzZXQgaXQgZnJvbSBhIHNpbmdsZSBzdHJpbmcuCgogICAgLyoqCiAgICAgKiBHaXZlbiBhbiBJU08gY291bnRyeSBjb2RlLCByZXR1cm5zIGFuIGFycmF5IG9mIFN0cmluZ3MgY29udGFpbmluZyB0aGUgSVNPCiAgICAgKiBjb2RlcyBvZiB0aGUgbGFuZ3VhZ2VzIHNwb2tlbiBpbiB0aGF0IGNvdW50cnkuICBPZmZpY2lhbCBsYW5ndWFnZXMgYXJlIGxpc3RlZAogICAgICogaW4gdGhlIHJldHVybmVkIHRhYmxlIGJlZm9yZSB1bm9mZmljaWFsIGxhbmd1YWdlcywgYnV0IG90aGVyIHRoYW4gdGhhdCwgdGhlCiAgICAgKiBvcmRlciBvZiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBpbmRldGVybWluYXRlLiAgSWYgdGhlIHZhbHVlIHRoZSB1c2VyIHBhc3NlcyBpbgogICAgICogZm9yICJjb3VudHJ5IiBpcyBub3QgYSB2YWxpZCBJU08gMzE2IGNvdW50cnkgY29kZSwgb3IgaWYgd2UgZG9uJ3QgaGF2ZSBsYW5ndWFnZQogICAgICogaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgY291bnRyeSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IGFycmF5LgogICAgICoKICAgICAqIFtUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjdXJyZW50bHkgcGFydCBvZiBMb2NhbGUncyBBUEksIGJ1dCBpcyBuZWVkZWQgaW4gdGhlCiAgICAgKiBpbXBsZW1lbnRhdGlvbi4gIFdlIGhvcGUgdG8gYWRkIGl0IHRvIHRoZSBBUEkgaW4gYSBmdXR1cmUgcmVsZWFzZS5dCiAgICAgKiBAcGFyYW0gY291bnRyeSBUaGUgSVNPIDItbGV0dGVyIGNvdW50cnkgY29kZSBvZiB0aGUgZGVzaXJlZCBjb3VudHJ5CiAgICAgKiBAcGFyYW0gY291bnQgUmVjZWl2ZXMgdGhlIG51bWJlciBvZiBsYW5ndWFnZXMgaW4gdGhlIGxpc3QuCiAgICAgKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBVbmljb2RlU3RyaW5nIG9iamVjdHMuIFRoZSBjYWxsZXIgZG9lcyBOT1QKICAgICAqICBnZXQgb3duZXJzaGlwIG9mIHRoaXMgbGlzdCwgYW5kIG11c3QgTk9UIGRlbGV0ZSBpdC4KICAgICAqLwogICAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcqIGdldExhbmd1YWdlc0ZvckNvdW50cnkoICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmIGNvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGNvdW50KTsKCgpwcml2YXRlOgogICAgCiAgICAvKioKICAgICAqIEluaXRpYWxpemVzIGEgTG9jYWxlIG9iamVjdCBmcm9tIGEgVUxvY2FsZSBzdHJ1Y3QsIHdoaWNoIGlzIHRoZSBDIGxvY2FsZSBvYmplY3QsCiAgICAgKiBhbmQgd2hlcmUgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBpcy4KICAgICAqLwogICAgCiAgICB2b2lkIHNldEhhc2hDb2RlKHZvaWQpOwogICAgY2hhciBsYW5ndWFnZVtMQU5HX0NBUEFDSVRZXTsKICAgIGNoYXIgY291bnRyeVtDT1VOVFJZX0NBUEFDSVRZXTsKICAgIGNoYXIqIHZhcmlhbnQ7CiAgICBjaGFyKiBmdWxsTmFtZTsKICAgIGNoYXIgZnVsbE5hbWVCdWZmZXJbRlVMTE5BTUVfQ0FQQUNJVFldOwogICAgaW50MzJfdCBraGFzaENvZGU7CiAgICAKICAgIHN0YXRpYyBMb2NhbGUgKmxvY2FsZUxpc3Q7CiAgICBzdGF0aWMgaW50MzJfdCBsb2NhbGVMaXN0Q291bnQ7CiAgICBzdGF0aWMgVW5pY29kZVN0cmluZyAqaXNvTGFuZ3VhZ2VzOwogICAgc3RhdGljIGludDMyX3QgaXNvTGFuZ3VhZ2VzQ291bnQ7CiAgICBzdGF0aWMgVW5pY29kZVN0cmluZyAqaXNvQ291bnRyaWVzOwogICAgc3RhdGljIGludDMyX3QgaXNvQ291bnRyaWVzQ291bnQ7CiAgICBzdGF0aWMgVUhhc2h0YWJsZSAqY3RyeTJMYW5nTWFwcGluZzsKICAgIHN0YXRpYyBjb25zdCBVbmljb2RlU3RyaW5nIGNvbXByZXNzZWRDdHJ5MkxhbmdNYXBwaW5nOwoKICAgIHN0YXRpYyBMb2NhbGUgZmdEZWZhdWx0TG9jYWxlOwp9OwoKaW5saW5lIGJvb2xfdApMb2NhbGU6Om9wZXJhdG9yIT0oY29uc3QgICAgTG9jYWxlJiAgICAgb3RoZXIpIGNvbnN0CnsKICAgIHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7Cn0KCiNlbmRpZgoKCg==