LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFVDQUxfSAojZGVmaW5lIFVDQUxfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCi8qKgogKiBAbmFtZSBDYWxlbmRhciBDIEFQSQogKgogKiBVQ2FsZW5kYXIgQyBBUEkgaXMgdXNlZCAgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBhIDxjb2RlPlVEYXRlPC9jb2RlPiBvYmplY3QKICogYW5kIGEgc2V0IG9mIGludGVnZXIgZmllbGRzIHN1Y2ggYXMgPGNvZGU+VUNBTF9ZRUFSPC9jb2RlPiwgPGNvZGU+VUNBTF9NT05USDwvY29kZT4sIAogKiA8Y29kZT5VQ0FMX0RBWTwvY29kZT4sIDxjb2RlPlVDQUxfSE9VUjwvY29kZT4sIGFuZCBzbyBvbi4KICogKEEgPGNvZGU+VURhdGU8L2NvZGU+IG9iamVjdCByZXByZXNlbnRzIGEgc3BlY2lmaWMgaW5zdGFudCBpbgogKiB0aW1lIHdpdGggbWlsbGlzZWNvbmQgcHJlY2lzaW9uLiBTZWUKICoge0BsaW5rIFVEYXRlfQogKiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIDxjb2RlPlVEYXRlPC9jb2RlPiAuKQogKgogKiA8cD4KICogVHlwZXMgb2YgPGNvZGU+VUNhbGVuZGFyPC9jb2RlPiBpbnRlcnByZXQgYSA8Y29kZT5VRGF0ZTwvY29kZT4KICogYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiBhIHNwZWNpZmljIGNhbGVuZGFyIHN5c3RlbS4gVGhlIFVfQ0FQSQogKiBwcm92aWRlcyB0aGUgZW51bSBVQ2FsZW5kYXJUeXBlIHdpdGggVUNBTF9UUkFESVRJT05BTCBhbmQgCiAqIFVDQUxfR1JFR09SSUFOLgogKiA8cD4KICogTGlrZSBvdGhlciBsb2NhbGUtc2Vuc2l0aXZlIEMgQVBJLCBjYWxlbmRhciBBUEkgIHByb3ZpZGVzIGEKICogZnVuY3Rpb24sIDxjb2RlPnVjYWxfb3BlbigpPC9jb2RlPiwgd2hpY2ggcmV0dXJucyBhIHBvaW50ZXIgdG8KICogPGNvZGU+VUNhbGVuZGFyPC9jb2RlPiB3aG9zZSB0aW1lIGZpZWxkcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgCiAqIHdpdGggdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZS4gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mCiAqIGNhbGVuZGFyIHRvIGJlIG9wZW5lZCBhbmQgdGhlICB0aW1lem9uZUlkLiAKICogPGJsb2NrcXVvdGU+CiAqIDxwcmU+CiAqIFVDYWxlbmRhciAqY2FsZGVmOwogKiBVQ2hhciAqdHpJZDsKICogVUVycm9yQ29kZSBzdGF0dXM7CiAqIHR6SWQ9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChzdHJsZW4oIlBTVCIpICsxKSApOwogKiB1X3Vhc3RyY3B5KHR6SWQsICJQU1QiKTsKICogY2FsZGVmPXVjYWxfb3Blbih0eklELCB1X3N0cmxlbih0eklEKSwgTlVMTCwgVUNBTF9UUkFESVRJT05BTCwgJnN0YXR1cyk7CiAqIDwvcHJlPgogKiA8L2Jsb2NrcXVvdGU+CiAqCiAqIDxwPgogKiBBIDxjb2RlPlVDYWxlbmRhcjwvY29kZT4gb2JqZWN0IGNhbiBwcm9kdWNlIGFsbCB0aGUgdGltZSBmaWVsZCB2YWx1ZXMKICogbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgZGF0ZS10aW1lIGZvcm1hdHRpbmcgZm9yIGEgcGFydGljdWxhciBsYW5ndWFnZQogKiBhbmQgY2FsZW5kYXIgc3R5bGUgKGZvciBleGFtcGxlLCBKYXBhbmVzZS1HcmVnb3JpYW4sIEphcGFuZXNlLVRyYWRpdGlvbmFsKS4KICoKICogPHA+CiAqIFdoZW4gY29tcHV0aW5nIGEgPGNvZGU+VURhdGU8L2NvZGU+IGZyb20gdGltZSBmaWVsZHMsIHR3byBzcGVjaWFsIGNpcmN1bXN0YW5jZXMKICogbWF5IGFyaXNlOiB0aGVyZSBtYXkgYmUgaW5zdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGNvbXB1dGUgdGhlCiAqIDxjb2RlPlVEYXRlPC9jb2RlPiAoc3VjaCBhcyBvbmx5IHllYXIgYW5kIG1vbnRoIGJ1dCBubyBkYXkgaW4gdGhlIG1vbnRoKSwKICogb3IgdGhlcmUgbWF5IGJlIGluY29uc2lzdGVudCBpbmZvcm1hdGlvbiAoc3VjaCBhcyAiVHVlc2RheSwgSnVseSAxNSwgMTk5NiIKICogLS0gSnVseSAxNSwgMTk5NiBpcyBhY3R1YWxseSBhIE1vbmRheSkuCiAqCiAqIDxwPgogKiA8c3Ryb25nPkluc3VmZmljaWVudCBpbmZvcm1hdGlvbi48L3N0cm9uZz4gVGhlIGNhbGVuZGFyIHdpbGwgdXNlIGRlZmF1bHQKICogaW5mb3JtYXRpb24gdG8gc3BlY2lmeSB0aGUgbWlzc2luZyBmaWVsZHMuIFRoaXMgbWF5IHZhcnkgYnkgY2FsZW5kYXI7IGZvcgogKiB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyLCB0aGUgZGVmYXVsdCBmb3IgYSBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZQogKiBzdGFydCBvZiB0aGUgZXBvY2g6IGkuZS4sIFVDQUxfWUVBUiA9IDE5NzAsIFVDQUxfTU9OVEggPSBKQU5VQVJZLCBVQ0FMX0RBVEUgPSAxLCBldGMuCiAqCiAqIDxwPgogKiA8c3Ryb25nPkluY29uc2lzdGVudCBpbmZvcm1hdGlvbi48L3N0cm9uZz4gSWYgZmllbGRzIGNvbmZsaWN0LCB0aGUgY2FsZW5kYXIKICogd2lsbCBnaXZlIHByZWZlcmVuY2UgdG8gZmllbGRzIHNldCBtb3JlIHJlY2VudGx5LiBGb3IgZXhhbXBsZSwgd2hlbgogKiBkZXRlcm1pbmluZyB0aGUgZGF5LCB0aGUgY2FsZW5kYXIgd2lsbCBsb29rIGZvciBvbmUgb2YgdGhlIGZvbGxvd2luZwogKiBjb21iaW5hdGlvbnMgb2YgZmllbGRzLiAgVGhlIG1vc3QgcmVjZW50IGNvbWJpbmF0aW9uLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZQogKiBtb3N0IHJlY2VudGx5IHNldCBzaW5nbGUgZmllbGQsIHdpbGwgYmUgdXNlZC4KICoKICogPGJsb2NrcXVvdGU+CiAqIDxwcmU+CiAqIFVDQUxfTU9OVEggKyBVQ0FMX0RBWV9PRl9NT05USAogKiBVQ0FMX01PTlRIICsgVUNBTF9XRUVLX09GX01PTlRIICsgVUNBTF9EQVlfT0ZfV0VFSwogKiBVQ0FMX01PTlRIICsgVUNBTF9EQVlfT0ZfV0VFS19JTl9NT05USCArIFVDQUxfREFZX09GX1dFRUsKICogVUNBTF9EQVlfT0ZfWUVBUgogKiBVQ0FMX0RBWV9PRl9XRUVLICsgVUNBTF9XRUVLX09GX1lFQVIKICogPC9wcmU+CiAqIDwvYmxvY2txdW90ZT4KICoKICogRm9yIHRoZSB0aW1lIG9mIGRheToKICoKICogPGJsb2NrcXVvdGU+CiAqIDxwcmU+CiAqIFVDQUxfSE9VUl9PRl9EQVkKICogVUNBTF9BTV9QTSArIFVDQUxfSE9VUgogKiA8L3ByZT4KICogPC9ibG9ja3F1b3RlPgogKgogKiA8cD4KICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBmb3Igc29tZSBub24tR3JlZ29yaWFuIGNhbGVuZGFycywgZGlmZmVyZW50CiAqIGZpZWxkcyBtYXkgYmUgbmVjZXNzYXJ5IGZvciBjb21wbGV0ZSBkaXNhbWJpZ3VhdGlvbi4gRm9yIGV4YW1wbGUsIGEgZnVsbAogKiBzcGVjaWZpY2F0aW9uIG9mIHRoZSBoaXN0b3JpYWwgQXJhYmljIGFzdHJvbm9taWNhbCBjYWxlbmRhciByZXF1aXJlcyB5ZWFyLAogKiBtb250aCwgZGF5LW9mLW1vbnRoIDxlbT5hbmQ8L2VtPiBkYXktb2Ytd2VlayBpbiBzb21lIGNhc2VzLgogKgogKiA8cD4KICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGVyZSBhcmUgY2VydGFpbiBwb3NzaWJsZSBhbWJpZ3VpdGllcyBpbgogKiBpbnRlcnByZXRhdGlvbiBvZiBjZXJ0YWluIHNpbmd1bGFyIHRpbWVzLCB3aGljaCBhcmUgcmVzb2x2ZWQgaW4gdGhlCiAqIGZvbGxvd2luZyB3YXlzOgogKiA8b2w+CiAqICAgICA8bGk+IDI0OjAwOjAwICJiZWxvbmdzIiB0byB0aGUgZm9sbG93aW5nIGRheS4gVGhhdCBpcywKICogICAgICAgICAgMjM6NTkgb24gRGVjIDMxLCAxOTY5ICZsdDsgMjQ6MDAgb24gSmFuIDEsIDE5NzAgJmx0OyAyNDowMTowMCBvbiBKYW4gMSwgMTk3MAogKgogKiAgICAgPGxpPiBBbHRob3VnaCBoaXN0b3JpY2FsbHkgbm90IHByZWNpc2UsIG1pZG5pZ2h0IGFsc28gYmVsb25ncyB0byAiYW0iLAogKiAgICAgICAgICBhbmQgbm9vbiBiZWxvbmdzIHRvICJwbSIsIHNvIG9uIHRoZSBzYW1lIGRheSwKICogICAgICAgICAgMTI6MDAgYW0gKG1pZG5pZ2h0KSAmbHQ7IDEyOjAxIGFtLCBhbmQgMTI6MDAgcG0gKG5vb24pICZsdDsgMTI6MDEgcG0KICogPC9vbD4KICoKICogPHA+CiAqIFRoZSBkYXRlIG9yIHRpbWUgZm9ybWF0IHN0cmluZ3MgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIG9mIGEKICogY2FsZW5kYXIsIGFzIHRob3NlIG11c3QgYmUgbW9kaWZpYWJsZSBvciBvdmVycmlkYWJsZSBieSB0aGUgdXNlciBhdAogKiBydW50aW1lLiBVc2Uge0BsaW5rIFVEYXRlRm9ybWF0fQogKiB0byBmb3JtYXQgZGF0ZXMuCiAqCiAqIDxwPgogKiA8Y29kZT5DYWxlbmRhcjwvY29kZT4gcHJvdmlkZXMgYW4gQVBJIGZvciBmaWVsZCAicm9sbGluZyIsIHdoZXJlIGZpZWxkcwogKiBjYW4gYmUgaW5jcmVtZW50ZWQgb3IgZGVjcmVtZW50ZWQsIGJ1dCB3cmFwIGFyb3VuZC4gRm9yIGV4YW1wbGUsIHJvbGxpbmcgdGhlCiAqIG1vbnRoIHVwIGluIHRoZSBkYXRlIDxjb2RlPkRlY2VtYmVyIDEyLCA8Yj4xOTk2PC9iPjwvY29kZT4gcmVzdWx0cyBpbgogKiA8Y29kZT5KYW51YXJ5IDEyLCA8Yj4xOTk2PC9iPjwvY29kZT4uCiAqCiAqIDxwPgogKiA8Y29kZT5DYWxlbmRhcjwvY29kZT4gYWxzbyBwcm92aWRlcyBhIGRhdGUgYXJpdGhtZXRpYyBmdW5jdGlvbiBmb3IKICogYWRkaW5nIHRoZSBzcGVjaWZpZWQgKHNpZ25lZCkgYW1vdW50IG9mIHRpbWUgdG8gYSBwYXJ0aWN1bGFyIHRpbWUgZmllbGQuCiAqIEZvciBleGFtcGxlLCBzdWJ0cmFjdGluZyA1IGRheXMgZnJvbSB0aGUgZGF0ZSA8Y29kZT5TZXB0ZW1iZXIgMTIsIDE5OTY8L2NvZGU+CiAqIHJlc3VsdHMgaW4gPGNvZGU+U2VwdGVtYmVyIDcsIDE5OTY8L2NvZGU+LgogKgogKi8KCi8qKiBBIGNhbGVuZGFyLgogKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiAqLwp0eXBlZGVmIHZvaWQqIFVDYWxlbmRhcjsKCi8qKiBQb3NzaWJsZSB0eXBlcyBvZiBVQ2FsZW5kYXJzICovCmVudW0gVUNhbGVuZGFyVHlwZSB7CiAgLyoqIEEgdHJhZGl0aW9uYWwgY2FsZW5kYXIgZm9yIHRoZSBsb2NhbGUgKi8KICBVQ0FMX1RSQURJVElPTkFMLAogIC8qKiBUaGUgR3JlZ29yaWFuIGNhbGVuZGFyICovCiAgVUNBTF9HUkVHT1JJQU4KfTsKdHlwZWRlZiBlbnVtIFVDYWxlbmRhclR5cGUgVUNhbGVuZGFyVHlwZTsKICAgIAovKiogUG9zc2libGUgZmllbGRzIGluIGEgVUNhbGVuZGFyICovCmVudW0gVUNhbGVuZGFyRGF0ZUZpZWxkcyB7CiAgLyoqIEVyYSBmaWVsZCAqLwogIFVDQUxfRVJBLAogIC8qKiBZZWFyIGZpZWxkICovCiAgVUNBTF9ZRUFSLAogIC8qKiBNb250aCBmaWVsZCAqLwogIFVDQUxfTU9OVEgsCiAgLyoqIFdlZWsgb2YgeWVhciBmaWVsZCAqLwogIFVDQUxfV0VFS19PRl9ZRUFSLAogIC8qKiBXZWVrIG9mIG1vbnRoIGZpZWxkICovCiAgVUNBTF9XRUVLX09GX01PTlRILAogIC8qKiBEYXRlIGZpZWxkICovCiAgVUNBTF9EQVRFLAogIC8qKiBEYXkgb2YgeWVhciBmaWVsZCAqLwogIFVDQUxfREFZX09GX1lFQVIsCiAgLyoqIERheSBvZiB3ZWVrIGZpZWxkICovCiAgVUNBTF9EQVlfT0ZfV0VFSywKICAvKiogRGF5IG9mIHdlZWsgaW4gbW9udGggZmllbGQgKi8KICBVQ0FMX0RBWV9PRl9XRUVLX0lOX01PTlRILAogIC8qKiBBTS9QTSBmaWVsZCAqLwogIFVDQUxfQU1fUE0sCiAgLyoqIEhvdXIgZmllbGQgKi8KICBVQ0FMX0hPVVIsCiAgLyoqIEhvdXIgb2YgZGF5IGZpZWxkICovCiAgVUNBTF9IT1VSX09GX0RBWSwKICAvKiogTWludXRlIGZpZWxkICovCiAgVUNBTF9NSU5VVEUsCiAgLyoqIFNlY29uZCBmaWVsZCAqLwogIFVDQUxfU0VDT05ELAogIC8qKiBNaWxsaXNlY29uZCBmaWVsZCAqLwogIFVDQUxfTUlMTElTRUNPTkQsCiAgLyoqIFpvbmUgb2Zmc2V0IGZpZWxkICovCiAgVUNBTF9aT05FX09GRlNFVCwKICAvKiogRFNUIG9mZnNldCBmaWVsZCAqLwogIFVDQUxfRFNUX09GRlNFVCwKICAvKiogWWVhciAvIHdlZWsgb2YgeWVhciAqLwogIFVDQUxfWUVBUl9XT1ksCiAgLyoqIERheSBvZiB3ZWVrLCBsb2NhbGl6ZWQgKDEuLjcpICovCiAgVUNBTF9ET1dfTE9DQUwsCiAgLyoqIEZpZWxkIGNvdW50ICovCiAgVUNBTF9GSUVMRF9DT1VOVAp9Owp0eXBlZGVmIGVudW0gVUNhbGVuZGFyRGF0ZUZpZWxkcyBVQ2FsZW5kYXJEYXRlRmllbGRzOwogICAgLyoqCiAgICAgKiBVc2VmdWwgY29uc3RhbnQgZm9yIGRheXMgb2Ygd2Vlay4gTm90ZTogQ2FsZW5kYXIgZGF5LW9mLXdlZWsgaXMgMS1iYXNlZC4gQ2xpZW50cwogICAgICogd2hvIGNyZWF0ZSBsb2NhbGUgcmVzb3VyY2VzIGZvciB0aGUgZmllbGQgb2YgZmlyc3QtZGF5LW9mLXdlZWsgc2hvdWxkIGJlIGF3YXJlIG9mCiAgICAgKiB0aGlzLiBGb3IgaW5zdGFuY2UsIGluIFVTIGxvY2FsZSwgZmlyc3QtZGF5LW9mLXdlZWsgaXMgc2V0IHRvIDEsIGkuZS4sIFVDQUxfU1VOREFZLgogICAgICovCi8qKiBQb3NzaWJsZSBkYXlzIG9mIHRoZSB3ZWVrIGluIGEgVUNhbGVuZGFyICovCmVudW0gVUNhbGVuZGFyRGF5c09mV2VlayB7CiAgLyoqIFN1bmRheSAqLwogIFVDQUxfU1VOREFZID0gMSwKICAvKiogTW9uZGF5ICovCiAgVUNBTF9NT05EQVksCiAgLyoqIFR1ZXNkYXkgKi8KICBVQ0FMX1RVRVNEQVksCiAgLyoqIFdlZG5lc2RheSAqLwogIFVDQUxfV0VETkVTREFZLAogIC8qKiBUaHVyc2RheSAqLwogIFVDQUxfVEhVUlNEQVksCiAgLyoqIEZyaWRheSAqLwogIFVDQUxfRlJJREFZLAogIC8qKiBTYXR1cmRheSAqLwogIFVDQUxfU0FUVVJEQVkKfTsKdHlwZWRlZiBlbnVtIFVDYWxlbmRhckRheXNPZldlZWsgVUNhbGVuZGFyRGF5c09mV2VlazsKCi8qKiBQb3NzaWJsZSBtb250aHMgaW4gYSBVQ2FsZW5kYXIuIE5vdGU6IENhbGVuZGFyIG1vbnRoIGlzIDAtYmFzZWQuKi8KZW51bSBVQ2FsZW5kYXJNb250aHMgewogIC8qKiBKYW51YXJ5ICovCiAgVUNBTF9KQU5VQVJZLAogIC8qKiBGZWJydWFyeSAqLwogIFVDQUxfRkVCUlVBUlksCiAgLyoqIE1hcmNoICovCiAgVUNBTF9NQVJDSCwKICAvKiogQXByaWwgKi8KICBVQ0FMX0FQUklMLAogIC8qKiBNYXkgKi8KICBVQ0FMX01BWSwKICAvKiogSnVuZSAqLwogIFVDQUxfSlVORSwKICAvKiogSnVseSAqLwogIFVDQUxfSlVMWSwKICAvKiogQXVndXN0ICovCiAgVUNBTF9BVUdVU1QsCiAgLyoqIFNlcHRlbWJlciAqLwogIFVDQUxfU0VQVEVNQkVSLAogIC8qKiBPY3RvYmVyICovCiAgVUNBTF9PQ1RPQkVSLAogIC8qKiBOb3ZlbWJlciAqLwogIFVDQUxfTk9WRU1CRVIsCiAgLyoqIERlY2VtYmVyICovCiAgVUNBTF9ERUNFTUJFUiwKICAvKiogVW5kZWNpbWJlciAqLwogIFVDQUxfVU5ERUNJTUJFUgp9Owp0eXBlZGVmIGVudW0gVUNhbGVuZGFyTW9udGhzIFVDYWxlbmRhck1vbnRoczsKCi8qKiBQb3NzaWJsZSBBTS9QTSB2YWx1ZXMgaW4gYSBVQ2FsZW5kYXIgKi8KZW51bSBVQ2FsZW5kYXJBTVBNcyB7CiAgICAvKiogQU0gKi8KICBVQ0FMX0FNLAogIC8qKiBQTSAqLwogIFVDQUxfUE0KfTsKdHlwZWRlZiBlbnVtIFVDYWxlbmRhckFNUE1zIFVDYWxlbmRhckFNUE1zOwoKLyoqCiogR2V0IGFuIGF2YWlsYWJsZSBUaW1lWm9uZSBJRC4KKiBBIFRpbWV6b25lIElEIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtICJBbWVyaWNhL0xvcyBBbmdlbGVzIi4KKiBAcGFyYW0gcmF3T2Zmc2V0IFRoZSBkZXNpcmVkIEdNVCBvZmZzZXQKKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIFRpbWVab25lLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgcmVxdWVzdGVkIFRpbWVab25lIElELCBvciAwIGlmIG5vdCBmb3VuZAoqIEBzZWUgdWNhbF9jb3VudEF2YWlsYWJsZVRaSURzCiovClVfQ0FQSSBjb25zdCBVQ2hhcioKdWNhbF9nZXRBdmFpbGFibGVUWklEcyggICAgICAgIGludDMyX3QgICAgICAgICByYXdPZmZzZXQsCiAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgc3RhdHVzKTsKCi8qKgoqIERldGVybWluZSBob3cgbWFueSBUaW1lWm9uZXMgZXhpc3Qgd2l0aCBhIGNlcnRhaW4gb2Zmc2V0LgoqIFRoaXMgZnVuY3Rpb24gaXMgbW9zdCB1c2VmdWwgYXMgZGV0ZXJtaW5pbmcgdGhlIGxvb3AgZW5kaW5nIGNvbmRpdGlvbiBmb3IKKiBjYWxscyB0byBcUmVme3VjYWxfZ2V0QXZhaWxhYmxlVFpJRHN9LgoqIEBwYXJhbSByYXdPZmZzZXQgVGhlIGRlc2lyZWQgR01UIG9mZnNldC4KKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgVGltZVpvbmVzIHdpdGggcmF3T2Zmc2V0LgoqIEBzZWUgdWNhbF9nZXRBdmFpbGFibGVUWklEcwoqLwpVX0NBUEkgaW50MzJfdAp1Y2FsX2NvdW50QXZhaWxhYmxlVFpJRHMoaW50MzJfdCByYXdPZmZzZXQpOwoKLyoqCiogR2V0IHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCiogVGhlIHZhbHVlIHJldHVybmVkIGlzIHJlcHJlc2VudGVkIGFzIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBlcG9jaC4KKiBAcmV0dXJuIFRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCiovClVfQ0FQSSBVRGF0ZSAKdWNhbF9nZXROb3codm9pZCk7CgovKioKKiBPcGVuIGEgVUNhbGVuZGFyLgoqIEEgVUNhbGVuZGFyIG1heSBiZSB1c2VkIHRvIGNvbnZlcnQgYSBtaWxsaXNlY29uZCB2YWx1ZSB0byBhIHllYXIsIAoqIG1vbnRoLCBhbmQgZGF5LgoqIEBwYXJhbSB6b25lSUQgVGhlIGRlc2lyZWQgVGltZVpvbmUgSUQuICBJZiAwLCB1c2UgdGhlIGRlZmF1bHQgdGltZSB6b25lLgoqIEBwYXJhbSBsZW4gVGhlIGxlbmd0aCBvZiB6b25lSUQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAcGFyYW0gbG9jYWxlIFRoZSBkZXNpcmVkIGxvY2FsZQoqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIFVDYWxlbmRhciB0byBvcGVuLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBVQ2FsZW5kYXIsIG9yIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiovClVfQ0FQSSBVQ2FsZW5kYXIqIAp1Y2FsX29wZW4oICAgIGNvbnN0ICAgIFVDaGFyKiAgICAgICAgICB6b25lSUQsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgIGxlbiwKICAgICAgICBjb25zdCAgICBjaGFyKiAgICAgICAgICAgbG9jYWxlLAogICAgICAgICAgICBVQ2FsZW5kYXJUeXBlICAgICB0eXBlLAogICAgICAgICAgICBVRXJyb3JDb2RlKiAgICBzdGF0dXMpOwoKLyoqCiogQ2xvc2UgYSBVQ2FsZW5kYXIuCiogT25jZSBjbG9zZWQsIGEgVUNhbGVuZGFyIG1heSBubyBsb25nZXIgYmUgdXNlZC4KKiBAcGFyYW0gY2FsIFRoZSBVQ2FsZW5kYXIgdG8gY2xvc2UuCiovClVfQ0FQSSB2b2lkCnVjYWxfY2xvc2UoVUNhbGVuZGFyICpjYWwpOwoKLyoqCiogU2V0IHRoZSBUaW1lWm9uZSB1c2VkIGJ5IGEgVUNhbGVuZGFyLgoqIEEgVUNhbGVuZGFyIHVzZXMgYSB0aW1lem9uZSBmb3IgY29udmVydGluZyBmcm9tIEdyZWVud2ljaCB0aW1lIHRvIGxvY2FsIHRpbWUuCiogQHBhcmFtIGNhbCBUaGUgVUNhbGVuZGFyIHRvIHNldC4KKiBAcGFyYW0gem9uZUlEIFRoZSBkZXNpcmVkIFRpbWVab25lIElELiAgSWYgMCwgdXNlIHRoZSBkZWZhdWx0IHRpbWUgem9uZS4KKiBAcGFyYW0gbGVuIFRoZSBsZW5ndGggb2Ygem9uZUlELCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMuCiovClVfQ0FQSSB2b2lkIAp1Y2FsX3NldFRpbWVab25lKCAgICAgICAgVUNhbGVuZGFyKiAgICAgIGNhbCwKICAgICAgICAgICAgY29uc3QgICAgVUNoYXIqICAgICAgICB6b25lSUQsCiAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICBsZW4sCiAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAqc3RhdHVzKTsKCi8qKiBQb3NzaWJsZSBmb3JtYXRzIGZvciBhIFVDYWxlbmRhcidzIGRpc3BsYXkgbmFtZSAqLwplbnVtIFVDYWxlbmRhckRpc3BsYXlOYW1lVHlwZSB7CiAgLyoqIFN0YW5kYXJkIGRpc3BsYXkgbmFtZSAqLwogIFVDQUxfU1RBTkRBUkQsCiAgLyoqIFNob3J0IHN0YW5kYXJkIGRpc3BsYXkgbmFtZSAqLwogIFVDQUxfU0hPUlRfU1RBTkRBUkQsCiAgLyoqIERheWxpZ2h0IHNhdmluZ3MgZGlzcGxheSBuYW1lICovCiAgVUNBTF9EU1QsCiAgLyoqIFNob3J0IGRheWxpZ2h0IHNhdmluZ3MgZGlzcGxheSBuYW1lICovCiAgVUNBTF9TSE9SVF9EU1QKfTsKdHlwZWRlZiBlbnVtIFVDYWxlbmRhckRpc3BsYXlOYW1lVHlwZSBVQ2FsZW5kYXJEaXNwbGF5TmFtZVR5cGU7CgovKioKKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBVQ2FsZW5kYXIncyBUaW1lWm9uZS4KKiBBIGRpc3BsYXkgbmFtZSBpcyBzdWl0YWJsZSBmb3IgcHJlc2VudGF0aW9uIHRvIGEgdXNlci4KKiBAcGFyYW0gY2FsIFRoZSBVQ2FsZW5kYXIgdG8gcXVlcnkuCiogQHBhcmFtIHR5cGUgVGhlIGRlc2lyZWQgZGlzcGxheSBuYW1lIGZvcm1hdDsgb25lIG9mIFVDQUxfU1RBTkRBUkQsIFVDQUxfU0hPUlRfU1RBTkRBUkQsIAoqIFVDQUxfRFNULCBVQ0FMX1NIT1JUX0RTVAoqIEBwYXJhbSBsb2NhbGUgVGhlIGRlc2lyZWQgbG9jYWxlIGZvciB0aGUgZGlzcGxheSBuYW1lLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZm9ybWF0dGVkIG51bWJlci4KKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgoqIEBwYXJhbSByZXN1bHRMZW5ndGhOZWVkZWQgSWYgbm90IDAsIG9uIG91dHB1dCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkKKiB3cml0dGVuIHRvIHJlc3VsdC4KKiBAcmV0dXJuIFRoZSB0b3RhbCBidWZmZXIgc2l6ZSBuZWVkZWQ7IGlmIGdyZWF0ZXIgdGhhbiByZXN1bHRMZW5ndGgsIHRoZSBvdXRwdXQgd2FzIHRydW5jYXRlZC4KKi8KVV9DQVBJIGludDMyX3QKdWNhbF9nZXRUaW1lWm9uZURpc3BsYXlOYW1lKCAgICBjb25zdCAgICAgVUNhbGVuZGFyKiAgICAgICAgICAgICAgICAgY2FsLAogICAgICAgICAgICAgICAgICAgIFVDYWxlbmRhckRpc3BsYXlOYW1lVHlwZSAgICAgdHlwZSwKICAgICAgICAgICAgICAgIGNvbnN0ICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICpsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgVUNoYXIqICAgICAgICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgICAgICBzdGF0dXMpOwoKLyoqCiogRGV0ZXJtaW5lIGlmIGEgVUNhbGVuZGFyIGlzIGN1cnJlbnRseSBpbiBkYXlsaWdodCBzYXZpbmdzIHRpbWUuCiogRGF5bGlnaHQgc2F2aW5ncyB0aW1lIGlzIG5vdCB1c2VkIGluIGFsbCBwYXJ0cyBvZiB0aGUgd29ybGQuCiogQHBhcmFtIGNhbCBUaGUgVUNhbGVuZGFyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUUlVFIGlmIGNhbCBpcyBjdXJyZW50bHkgaW4gZGF5bGlnaHQgc2F2aW5ncyB0aW1lLCBGQUxTRSBvdGhlcndpc2UKKi8KVV9DQVBJIGJvb2xfdCAKdWNhbF9pbkRheWxpZ2h0VGltZSggICAgY29uc3QgICAgVUNhbGVuZGFyKiAgICAgIGNhbCwgCiAgICAgICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgc3RhdHVzICk7CgovKiogVHlwZXMgb2YgVUNhbGVuZGFyIGF0dHJpYnV0ZXMgKi8KZW51bSBVQ2FsZW5kYXJBdHRyaWJ1dGUgewogICAgLyoqIExlbmllbnQgcGFyc2luZyAqLwogIFVDQUxfTEVOSUVOVCwKICAvKiogRmlyc3QgZGF5IG9mIHdlZWsgKi8KICBVQ0FMX0ZJUlNUX0RBWV9PRl9XRUVLLAogIC8qKiBNaW5pbXVtIG51bWJlciBvZiBkYXlzIGluIGZpcnN0IHdlZWsgKi8KICBVQ0FMX01JTklNQUxfREFZU19JTl9GSVJTVF9XRUVLICAgIAp9Owp0eXBlZGVmIGVudW0gVUNhbGVuZGFyQXR0cmlidXRlIFVDYWxlbmRhckF0dHJpYnV0ZTsKCi8qKiAKKiBHZXQgYSBudW1lcmljIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggYSBVQ2FsZW5kYXIuCiogTnVtZXJpYyBhdHRyaWJ1dGVzIGluY2x1ZGUgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlaywgb3IgdGhlIG1pbmltYWwgbnVtYmVycwoqIG9mIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIG1vbnRoLgoqIEBwYXJhbSBjYWwgVGhlIFVDYWxlbmRhciB0byBxdWVyeS4KKiBAcGFyYW0gYXR0ciBUaGUgZGVzaXJlZCBhdHRyaWJ1dGU7IG9uZSBvZiBVQ0FMX0xFTklFTlQsIFVDQUxfRklSU1RfREFZX09GX1dFRUssIAoqIG9yIFVDQUxfTUlOSU1BTF9EQVlTX0lOX0ZJUlNUX1dFRUsKKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiBhdHRyLgoqIEBzZWUgdWNhbF9zZXRBdHRyaWJ1dGUKKi8KVV9DQVBJIGludDMyX3QKdWNhbF9nZXRBdHRyaWJ1dGUoICAgIGNvbnN0ICAgIFVDYWxlbmRhciogICAgICAgICAgICAgIGNhbCwKICAgICAgICAgICAgICAgIFVDYWxlbmRhckF0dHJpYnV0ZSAgICAgIGF0dHIpOwoKLyoqIAoqIFNldCBhIG51bWVyaWMgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBhIFVDYWxlbmRhci4KKiBOdW1lcmljIGF0dHJpYnV0ZXMgaW5jbHVkZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLCBvciB0aGUgbWluaW1hbCBudW1iZXJzCiogb2YgZGF5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgbW9udGguCiogQHBhcmFtIGNhbCBUaGUgVUNhbGVuZGFyIHRvIHNldC4KKiBAcGFyYW0gYXR0ciBUaGUgZGVzaXJlZCBhdHRyaWJ1dGU7IG9uZSBvZiBVQ0FMX0xFTklFTlQsIFVDQUxfRklSU1RfREFZX09GX1dFRUssIAoqIG9yIFVDQUxfTUlOSU1BTF9EQVlTX0lOX0ZJUlNUX1dFRUsKKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiBhdHRyLgoqIEBzZWUgdWNhbF9nZXRBdHRyaWJ1dGUKKi8KVV9DQVBJIHZvaWQKdWNhbF9zZXRBdHRyaWJ1dGUoICAgICAgVUNhbGVuZGFyKiAgICAgICAgICAgICAgY2FsLAogICAgICAgICAgICBVQ2FsZW5kYXJBdHRyaWJ1dGUgICAgICBhdHRyLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7CgovKioKKiBHZXQgYSBsb2NhbGUgZm9yIHdoaWNoIGNhbGVuZGFycyBhcmUgYXZhaWxhYmxlLgoqIEEgVUNhbGVuZGFyIGluIGEgbG9jYWxlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2lsbCBjb250YWluIHRoZSBjb3JyZWN0CiogZGF5IGFuZCBtb250aCBuYW1lcyBmb3IgdGhlIGxvY2FsZS4KKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGxvY2FsZS4KKiBAcmV0dXJuIEEgbG9jYWxlIGZvciB3aGljaCBjYWxlbmRhcnMgYXJlIGF2YWlsYWJsZSwgb3IgMCBpZiBub25lLgoqIEBzZWUgdWNhbF9jb3VudEF2YWlsYWJsZQoqLwpVX0NBUEkgY29uc3QgY2hhcioKdWNhbF9nZXRBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7CgovKioKKiBEZXRlcm1pbmUgaG93IG1hbnkgbG9jYWxlcyBoYXZlIGNhbGVuZGFycyBhdmFpbGFibGUuCiogVGhpcyBmdW5jdGlvbiBpcyBtb3N0IHVzZWZ1bCBhcyBkZXRlcm1pbmluZyB0aGUgbG9vcCBlbmRpbmcgY29uZGl0aW9uIGZvcgoqIGNhbGxzIHRvIFxSZWZ7dWNhbF9nZXRBdmFpbGFibGV9LgoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBsb2NhbGVzIGZvciB3aGljaCBjYWxlbmRhcnMgYXJlIGF2YWlsYWJsZS4KKiBAc2VlIHVjYWxfZ2V0QXZhaWxhYmxlCiovClVfQ0FQSSBpbnQzMl90CnVjYWxfY291bnRBdmFpbGFibGUodm9pZCk7CgovKioKKiBHZXQgYSBVQ2FsZW5kYXIncyBjdXJyZW50IHRpbWUgaW4gbWlsbGlzLgoqIFRoZSB0aW1lIGlzIHJlcHJlc2VudGVkIGFzIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBlcG9jaC4KKiBAcGFyYW0gY2FsIFRoZSBVQ2FsZW5kYXIgdG8gcXVlcnkuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIFRoZSBjYWxlbmRhcidzIGN1cnJlbnQgdGltZSBpbiBtaWxsaXMuCiogQHNlZSB1Y2FsX3NldE1pbGxpcwoqIEBzZWUgdWNhbF9zZXREYXRlCiogQHNlZSB1Y2FsX3NldERhdGVUaW1lCiovClVfQ0FQSSBVRGF0ZSAKdWNhbF9nZXRNaWxsaXMoICAgIGNvbnN0ICAgIFVDYWxlbmRhciogICAgICBjYWwsCiAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMpOwoKLyoqCiogU2V0IGEgVUNhbGVuZGFyJ3MgY3VycmVudCB0aW1lIGluIG1pbGxpcy4KKiBUaGUgdGltZSBpcyByZXByZXNlbnRlZCBhcyBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZXBvY2guCiogQHBhcmFtIGNhbCBUaGUgVUNhbGVuZGFyIHRvIHNldC4KKiBAcGFyYW0gZGF0ZVRpbWUgVGhlIGRlc2lyZWQgZGF0ZSBhbmQgdGltZS4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBzZWUgdWNhbF9nZXRNaWxsaXMKKiBAc2VlIHVjYWxfc2V0RGF0ZQoqIEBzZWUgdWNhbF9zZXREYXRlVGltZQoqLwpVX0NBUEkgdm9pZCAKdWNhbF9zZXRNaWxsaXMoICAgICAgICBVQ2FsZW5kYXIqICAgICAgY2FsLAogICAgICAgICAgICBVRGF0ZSAgICAgICAgICAgZGF0ZVRpbWUsCiAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMgKTsKCi8qKgoqIFNldCBhIFVDYWxlbmRhcidzIGN1cnJlbnQgZGF0ZS4KKiBUaGUgZGF0ZSBpcyByZXByZXNlbnRlZCBhcyBhIHNlcmllcyBvZiAzMi1iaXQgaW50ZWdlcnMuCiogQHBhcmFtIGNhbCBUaGUgVUNhbGVuZGFyIHRvIHNldC4KKiBAcGFyYW0geWVhciBUaGUgZGVzaXJlZCB5ZWFyLgoqIEBwYXJhbSBtb250aCBUaGUgZGVzaXJlZCBtb250aDsgb25lIG9mIFVDQUxfSkFOVUFSWSwgVUNBTF9GRUJSVUFSWSwgVUNBTF9NQVJDSCwgVUNBTF9BUFJJTCwgVUNBTF9NQVksIAoqIFVDQUxfSlVORSwgVUNBTF9KVUxZLCBVQ0FMX0FVR1VTVCwgVUNBTF9TRVBURU1CRVIsIFVDQUxfT0NUT0JFUiwgVUNBTF9OT1ZFTUJFUiwgVUNBTF9ERUNFTUJFUiwgVUNBTF9VTkRFQ0lNQkVSCiogQHBhcmFtIGRhdGUgVGhlIGRlc2lyZWQgZGF5IG9mIHRoZSBtb250aC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBzZWUgdWNhbF9nZXRNaWxsaXMKKiBAc2VlIHVjYWxfc2V0TWlsbGlzCiogQHNlZSB1Y2FsX3NldERhdGVUaW1lCiovClVfQ0FQSSB2b2lkIAp1Y2FsX3NldERhdGUoICAgICAgICBVQ2FsZW5kYXIqICAgICAgICBjYWwsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICB5ZWFyLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbW9udGgsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBkYXRlLAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAqc3RhdHVzKTsKCi8qKgoqIFNldCBhIFVDYWxlbmRhcidzIGN1cnJlbnQgZGF0ZS4KKiBUaGUgZGF0ZSBpcyByZXByZXNlbnRlZCBhcyBhIHNlcmllcyBvZiAzMi1iaXQgaW50ZWdlcnMuCiogQHBhcmFtIGNhbCBUaGUgVUNhbGVuZGFyIHRvIHNldC4KKiBAcGFyYW0geWVhciBUaGUgZGVzaXJlZCB5ZWFyLgoqIEBwYXJhbSBtb250aCBUaGUgZGVzaXJlZCBtb250aDsgb25lIG9mIFVDQUxfSkFOVUFSWSwgVUNBTF9GRUJSVUFSWSwgVUNBTF9NQVJDSCwgVUNBTF9BUFJJTCwgVUNBTF9NQVksIAoqIFVDQUxfSlVORSwgVUNBTF9KVUxZLCBVQ0FMX0FVR1VTVCwgVUNBTF9TRVBURU1CRVIsIFVDQUxfT0NUT0JFUiwgVUNBTF9OT1ZFTUJFUiwgVUNBTF9ERUNFTUJFUiwgVUNBTF9VTkRFQ0lNQkVSCiogQHBhcmFtIGRhdGUgVGhlIGRlc2lyZWQgZGF5IG9mIHRoZSBtb250aC4KKiBAcGFyYW0gaG91ciBUaGUgZGVzaXJlZCBob3VyIG9mIGRheS4KKiBAcGFyYW0gbWludXRlIFRoZSBkZXNpcmVkIG1pbnV0ZS4KKiBAcGFyYW0gc2Vjb25kIFRoZSBkZXNpcmVjIHNlY29uZC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBzZWUgdWNhbF9nZXRNaWxsaXMKKiBAc2VlIHVjYWxfc2V0TWlsbGlzCiogQHNlZSB1Y2FsX3NldERhdGUKKi8KVV9DQVBJIHZvaWQgCnVjYWxfc2V0RGF0ZVRpbWUoICAgIFVDYWxlbmRhciogICAgICAgIGNhbCwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHllYXIsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBtb250aCwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgIGRhdGUsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBob3VyLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbWludXRlLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgc2Vjb25kLAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAqc3RhdHVzKTsKCi8qKgoqIERldGVybWluZSBpZiB0d28gVUNhbGVuZGFycyByZXByZXNlbnQgdGhlIHNhbWUgZGF0ZS4KKiBUd28gVUNhbGVuZGFycyBtYXkgcmVwcmVzZW50IHRoZSBzYW1lIGRhdGUgYW5kIGhhdmUgZGlmZmVyZW50IGZpZWxkcwoqIGlmIHRoZXkgYXJlIGluIGRpZmZlcmVudCB0aW1lIHpvbmVzLgoqIEBwYXJhbSBjYWwxIFRoZSBmaXJzdCBvZiB0aGUgVUNhbGVuZGFycyB0byBjb21wYXJlLgoqIEBwYXJhbSBjYWwyIFRoZSBzZWNvbmQgb2YgdGhlIFVDYWxlbmRhcnMgdG8gY29tcGFyZS4KKiBAcmV0dXJuIFRSVUUgaWYgY2FsMSBhbmQgY2FsMiByZXByZXNlbnQgdGhlIHNhbWUgZGF0ZSwgRkFMU0Ugb3RoZXJ3aXNlLgoqLwpVX0NBUEkgYm9vbF90IAp1Y2FsX2VxdWl2YWxlbnRUbyggICAgY29uc3QgVUNhbGVuZGFyKiAgICAgIGNhbDEsCiAgICAgICAgICAgIGNvbnN0IFVDYWxlbmRhciogICAgICBjYWwyKTsKCi8qKgoqIEFkZCBhIHNwZWNpZmllZCBzaWduZWQgYW1vdW50IHRvIGEgcGFydGljdWxhciBmaWVsZCBpbiBhIFVDYWxlbmRhci4KKiBUaGlzIGNhbiBtb2RpZnkgbW9yZSBzaWduaWZpY2FudCBmaWVsZHMgaW4gdGhlIGNhbGVuZGFyLgoqIEBwYXJhbSBjYWwgVGhlIFVDYWxlbmRhciB0byB3aGljaCB0byBhZGQuCiogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCB0byB3aGljaCB0byBhZGQgdGhlIHNpZ25lZCB2YWx1ZTsgb25lIG9mIFVDQUxfRVJBLCBVQ0FMX1lFQVIsIFVDQUxfTU9OVEgsIAoqIFVDQUxfV0VFS19PRl9ZRUFSLCBVQ0FMX1dFRUtfT0ZfTU9OVEgsIFVDQUxfREFURSwgVUNBTF9EQVlfT0ZfWUVBUiwgVUNBTF9EQVlfT0ZfV0VFSywgCiogVUNBTF9EQVlfT0ZfV0VFS19JTl9NT05USCwgVUNBTF9BTV9QTSwgVUNBTF9IT1VSLCBVQ0FMX0hPVVJfT0ZfREFZLCBVQ0FMX01JTlVURSwgVUNBTF9TRUNPTkQsIAoqIFVDQUxfTUlMTElTRUNPTkQsIFVDQUxfWk9ORV9PRkZTRVQsIFVDQUxfRFNUX09GRlNFVC4KKiBAcGFyYW0gYW1vdW50IFRoZSBzaWduZWQgYW1vdW50IHRvIGFkZCB0byBmaWVsZC4gSWYgdGhlIGFtb3VudCBjYXVzZXMgdGhlIHZhbHVlCiogdG8gZXhjZWVkIHRvIG1heGltdW0gb3IgbWluaW11bSB2YWx1ZXMgZm9yIHRoYXQgZmllbGQsIG90aGVyIGZpZWxkcyBhcmUgbW9kaWZpZWQKKiB0byBwcmVzZXJ2ZSB0aGUgbWFnbml0dWRlIG9mIHRoZSBjaGFuZ2UuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAc2VlIHVjYWxfcm9sbAoqLwpVX0NBUEkgdm9pZCAKdWNhbF9hZGQoICAgIFVDYWxlbmRhciogICAgICAgICAgICBjYWwsCiAgICAgICAgVUNhbGVuZGFyRGF0ZUZpZWxkcyAgICAgICAgZmllbGQsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICBhbW91bnQsCiAgICAgICAgVUVycm9yQ29kZSogICAgICAgICAgICBzdGF0dXMpOwoKLyoqCiogQWRkIGEgc3BlY2lmaWVkIHNpZ25lZCBhbW91bnQgdG8gYSBwYXJ0aWN1bGFyIGZpZWxkIGluIGEgVUNhbGVuZGFyLgoqIFRoaXMgd2lsbCBub3QgbW9kaWZ5IG1vcmUgc2lnbmlmaWNhbnQgZmllbGRzIGluIHRoZSBjYWxlbmRhci4KKiBAcGFyYW0gY2FsIFRoZSBVQ2FsZW5kYXIgdG8gd2hpY2ggdG8gYWRkLgoqIEBwYXJhbSBmaWVsZCBUaGUgZmllbGQgdG8gd2hpY2ggdG8gYWRkIHRoZSBzaWduZWQgdmFsdWU7IG9uZSBvZiBVQ0FMX0VSQSwgVUNBTF9ZRUFSLCBVQ0FMX01PTlRILCAKKiBVQ0FMX1dFRUtfT0ZfWUVBUiwgVUNBTF9XRUVLX09GX01PTlRILCBVQ0FMX0RBVEUsIFVDQUxfREFZX09GX1lFQVIsIFVDQUxfREFZX09GX1dFRUssIAoqIFVDQUxfREFZX09GX1dFRUtfSU5fTU9OVEgsIFVDQUxfQU1fUE0sIFVDQUxfSE9VUiwgVUNBTF9IT1VSX09GX0RBWSwgVUNBTF9NSU5VVEUsIFVDQUxfU0VDT05ELCAKKiBVQ0FMX01JTExJU0VDT05ELCBVQ0FMX1pPTkVfT0ZGU0VULCBVQ0FMX0RTVF9PRkZTRVQuCiogQHBhcmFtIGFtb3VudCBUaGUgc2lnbmVkIGFtb3VudCB0byBhZGQgdG8gZmllbGQuIElmIHRoZSBhbW91bnQgY2F1c2VzIHRoZSB2YWx1ZQoqIHRvIGV4Y2VlZCB0byBtYXhpbXVtIG9yIG1pbmltdW0gdmFsdWVzIGZvciB0aGF0IGZpZWxkLCB0aGUgZmllbGQgaXMgcGlubmVkIHRvIGEgcGVybWlzc2libGUKKiB2YWx1ZS4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBzZWUgdWNhbF9hZGQKKi8KVV9DQVBJIHZvaWQgCnVjYWxfcm9sbCggICAgICAgIFVDYWxlbmRhciogICAgICAgIGNhbCwKICAgICAgICAgICAgVUNhbGVuZGFyRGF0ZUZpZWxkcyAgICAgZmllbGQsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBhbW91bnQsCiAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICAgICBzdGF0dXMpOwoKLyoqCiogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgZmllbGQgZnJvbSBhIFVDYWxlbmRhci4KKiBBbGwgZmllbGRzIGFyZSByZXByZXNlbnRlZCBhcyAzMi1iaXQgaW50ZWdlcnMuCiogQHBhcmFtIGNhbCBUaGUgVUNhbGVuZGFyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBmaWVsZCBUaGUgZGVzaXJlZCBmaWVsZDsgb25lIG9mIFVDQUxfRVJBLCBVQ0FMX1lFQVIsIFVDQUxfTU9OVEgsIAoqIFVDQUxfV0VFS19PRl9ZRUFSLCBVQ0FMX1dFRUtfT0ZfTU9OVEgsIFVDQUxfREFURSwgVUNBTF9EQVlfT0ZfWUVBUiwgVUNBTF9EQVlfT0ZfV0VFSywgCiogVUNBTF9EQVlfT0ZfV0VFS19JTl9NT05USCwgVUNBTF9BTV9QTSwgVUNBTF9IT1VSLCBVQ0FMX0hPVVJfT0ZfREFZLCBVQ0FMX01JTlVURSwgVUNBTF9TRUNPTkQsIAoqIFVDQUxfTUlMTElTRUNPTkQsIFVDQUxfWk9ORV9PRkZTRVQsIFVDQUxfRFNUX09GRlNFVC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBkZXNpcmVkIGZpZWxkLgoqIEBzZWUgdWNhbF9zZXQKKiBAc2VlIHVjYWxfaXNTZXQKKiBAc2VlIHVjYWxfY2xlYXJGaWVsZAoqIEBzZWUgdWNhbF9jbGVhcgoqLwpVX0NBUEkgaW50MzJfdCAKdWNhbF9nZXQoICAgIGNvbnN0ICAgIFVDYWxlbmRhciogICAgICAgICAgICBjYWwsCiAgICAgICAgICAgIFVDYWxlbmRhckRhdGVGaWVsZHMgICAgICAgIGZpZWxkLAogICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgICAgIHN0YXR1cyApOwoKLyoqCiogU2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGluIGEgVUNhbGVuZGFyLgoqIEFsbCBmaWVsZHMgYXJlIHJlcHJlc2VudGVkIGFzIDMyLWJpdCBpbnRlZ2Vycy4KKiBAcGFyYW0gY2FsIFRoZSBVQ2FsZW5kYXIgdG8gc2V0LgoqIEBwYXJhbSBmaWVsZCBUaGUgZmllbGQgdG8gc2V0OyBvbmUgb2YgVUNBTF9FUkEsIFVDQUxfWUVBUiwgVUNBTF9NT05USCwgCiogVUNBTF9XRUVLX09GX1lFQVIsIFVDQUxfV0VFS19PRl9NT05USCwgVUNBTF9EQVRFLCBVQ0FMX0RBWV9PRl9ZRUFSLCBVQ0FMX0RBWV9PRl9XRUVLLCAKKiBVQ0FMX0RBWV9PRl9XRUVLX0lOX01PTlRILCBVQ0FMX0FNX1BNLCBVQ0FMX0hPVVIsIFVDQUxfSE9VUl9PRl9EQVksIFVDQUxfTUlOVVRFLCBVQ0FMX1NFQ09ORCwgCiogVUNBTF9NSUxMSVNFQ09ORCwgVUNBTF9aT05FX09GRlNFVCwgVUNBTF9EU1RfT0ZGU0VULgoqIEBwYXJhbSB2YWx1ZSBUaGUgZGVzaXJlZCB2YWx1ZSBvZiBmaWVsZC4KKiBAc2VlIHVjYWxfZ2V0CiogQHNlZSB1Y2FsX2lzU2V0CiogQHNlZSB1Y2FsX2NsZWFyRmllbGQKKiBAc2VlIHVjYWxfY2xlYXIKKi8KVV9DQVBJIHZvaWQgCnVjYWxfc2V0KCAgICBVQ2FsZW5kYXIqICAgICAgICAgICAgY2FsLAogICAgICAgIFVDYWxlbmRhckRhdGVGaWVsZHMgICAgICAgIGZpZWxkLAogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgdmFsdWUpOwoKLyoqCiogRGV0ZXJtaW5lIGlmIGEgZmllbGQgaW4gYSBVQ2FsZW5kYXIgaXMgc2V0LgoqIEFsbCBmaWVsZHMgYXJlIHJlcHJlc2VudGVkIGFzIDMyLWJpdCBpbnRlZ2Vycy4KKiBAcGFyYW0gY2FsIFRoZSBVQ2FsZW5kYXIgdG8gcXVlcnkuCiogQHBhcmFtIGZpZWxkIFRoZSBkZXNpcmVkIGZpZWxkOyBvbmUgb2YgVUNBTF9FUkEsIFVDQUxfWUVBUiwgVUNBTF9NT05USCwgCiogVUNBTF9XRUVLX09GX1lFQVIsIFVDQUxfV0VFS19PRl9NT05USCwgVUNBTF9EQVRFLCBVQ0FMX0RBWV9PRl9ZRUFSLCBVQ0FMX0RBWV9PRl9XRUVLLCAKKiBVQ0FMX0RBWV9PRl9XRUVLX0lOX01PTlRILCBVQ0FMX0FNX1BNLCBVQ0FMX0hPVVIsIFVDQUxfSE9VUl9PRl9EQVksIFVDQUxfTUlOVVRFLCBVQ0FMX1NFQ09ORCwgCiogVUNBTF9NSUxMSVNFQ09ORCwgVUNBTF9aT05FX09GRlNFVCwgVUNBTF9EU1RfT0ZGU0VULgoqIEBwYXJhbSByZXR1cm4gVFJVRSBpZiBmaWVsZCBpcyBzZXQsIEZBTFNFIG90aGVyd2lzZS4KKiBAc2VlIHVjYWxfZ2V0CiogQHNlZSB1Y2FsX3NldAoqIEBzZWUgdWNhbF9jbGVhckZpZWxkCiogQHNlZSB1Y2FsX2NsZWFyCiovClVfQ0FQSSBib29sX3QgCnVjYWxfaXNTZXQoICAgIGNvbnN0ICAgIFVDYWxlbmRhciogICAgICAgIGNhbCwKICAgICAgICAgICAgVUNhbGVuZGFyRGF0ZUZpZWxkcyAgICBmaWVsZCk7CgovKioKKiBDbGVhciBhIGZpZWxkIGluIGEgVUNhbGVuZGFyLgoqIEFsbCBmaWVsZHMgYXJlIHJlcHJlc2VudGVkIGFzIDMyLWJpdCBpbnRlZ2Vycy4KKiBAcGFyYW0gY2FsIFRoZSBVQ2FsZW5kYXIgY29udGFpbmluZyB0aGUgZmllbGQgdG8gY2xlYXIuCiogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCB0byBjbGVhcjsgb25lIG9mIFVDQUxfRVJBLCBVQ0FMX1lFQVIsIFVDQUxfTU9OVEgsIAoqIFVDQUxfV0VFS19PRl9ZRUFSLCBVQ0FMX1dFRUtfT0ZfTU9OVEgsIFVDQUxfREFURSwgVUNBTF9EQVlfT0ZfWUVBUiwgVUNBTF9EQVlfT0ZfV0VFSywgCiogVUNBTF9EQVlfT0ZfV0VFS19JTl9NT05USCwgVUNBTF9BTV9QTSwgVUNBTF9IT1VSLCBVQ0FMX0hPVVJfT0ZfREFZLCBVQ0FMX01JTlVURSwgVUNBTF9TRUNPTkQsIAoqIFVDQUxfTUlMTElTRUNPTkQsIFVDQUxfWk9ORV9PRkZTRVQsIFVDQUxfRFNUX09GRlNFVC4KKiBAc2VlIHVjYWxfZ2V0CiogQHNlZSB1Y2FsX3NldAoqIEBzZWUgdWNhbF9pc1NldAoqIEBzZWUgdWNhbF9jbGVhcgoqLwpVX0NBUEkgdm9pZCAKdWNhbF9jbGVhckZpZWxkKCAgICBVQ2FsZW5kYXIqICAgICAgICBjYWwsCiAgICAgICAgICAgIFVDYWxlbmRhckRhdGVGaWVsZHMgICAgIGZpZWxkKTsKCi8qKgoqIENsZWFyIGFsbCBmaWVsZHMgaW4gYSBVQ2FsZW5kYXIuCiogQWxsIGZpZWxkcyBhcmUgcmVwcmVzZW50ZWQgYXMgMzItYml0IGludGVnZXJzLgoqIEBwYXJhbSBjYWwgVGhlIFVDYWxlbmRhciB0byBjbGVhci4KKiBAc2VlIHVjYWxfZ2V0CiogQHNlZSB1Y2FsX3NldAoqIEBzZWUgdWNhbF9pc1NldAoqIEBzZWUgdWNhbF9jbGVhckZpZWxkCiovClVfQ0FQSSB2b2lkIAp1Y2FsX2NsZWFyKFVDYWxlbmRhciogY2FsZW5kYXIpOwoKLyoqIFBvc3NpYmxlIGxpbWl0IHZhbHVlcyBmb3IgYSBVQ2FsZW5kYXIgKi8KZW51bSBVQ2FsZW5kYXJMaW1pdFR5cGUgewogIC8qKiBNaW5pbXVtIHZhbHVlICovCiAgVUNBTF9NSU5JTVVNLAogIC8qKiBNYXhpbXVtIHZhbHVlICovCiAgVUNBTF9NQVhJTVVNLAogIC8qKiBHcmVhdGVzdCBtaW5pbXVtIHZhbHVlICovCiAgVUNBTF9HUkVBVEVTVF9NSU5JTVVNLAogIC8qKiBMZWFlc3QgbWF4aW11bSB2YWx1ZSAqLwogIFVDQUxfTEVBU1RfTUFYSU1VTSwKICAvKiogQWN0dWFsIG1pbmltdW0gdmFsdWUgKi8KICBVQ0FMX0FDVFVBTF9NSU5JTVVNLAogIC8qKiBBY3R1YWwgbWF4aW11bSB2YWx1ZSAqLwogIFVDQUxfQUNUVUFMX01BWElNVU0KfTsKdHlwZWRlZiBlbnVtIFVDYWxlbmRhckxpbWl0VHlwZSBVQ2FsZW5kYXJMaW1pdFR5cGU7CgovKioKKiBEZXRlcm1pbmUgYSBsaW1pdCBmb3IgYSBmaWVsZCBpbiBhIFVDYWxlbmRhci4KKiBBIGxpbWl0IGlzIGEgbWF4aW11bSBvciBtaW5pbXVtIHZhbHVlIGZvciBhIGZpZWxkLgoqIEBwYXJhbSBjYWwgVGhlIFVDYWxlbmRhciB0byBxdWVyeS4KKiBAcGFyYW0gZmllbGQgVGhlIGRlc2lyZWQgZmllbGQ7IG9uZSBvZiBVQ0FMX0VSQSwgVUNBTF9ZRUFSLCBVQ0FMX01PTlRILCAKKiBVQ0FMX1dFRUtfT0ZfWUVBUiwgVUNBTF9XRUVLX09GX01PTlRILCBVQ0FMX0RBVEUsIFVDQUxfREFZX09GX1lFQVIsIFVDQUxfREFZX09GX1dFRUssIAoqIFVDQUxfREFZX09GX1dFRUtfSU5fTU9OVEgsIFVDQUxfQU1fUE0sIFVDQUxfSE9VUiwgVUNBTF9IT1VSX09GX0RBWSwgVUNBTF9NSU5VVEUsIFVDQUxfU0VDT05ELCAKKiBVQ0FMX01JTExJU0VDT05ELCBVQ0FMX1pPTkVfT0ZGU0VULCBVQ0FMX0RTVF9PRkZTRVQuCiogQHBhcmFtIHR5cGUgVGhlIGRlc2lyZWQgY3JpdGljYWwgcG9pbnQ7IG9uZSBvZiBVQ0FMX01JTklNVU0sIFVDQUxfTUFYSU1VTSwgVUNBTF9HUkVBVEVTVF9NSU5JTVVNLCAKKiBVQ0FMX0xFQVNUX01BWElNVU0sIFVDQUxfQUNUVUFMX01JTklNVU0sIFVDQUxfQUNUVUFMX01BWElNVU0KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycy4KKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgdmFsdWUuCiovClVfQ0FQSSBpbnQzMl90IAp1Y2FsX2dldExpbWl0KCAgICBjb25zdCAgICBVQ2FsZW5kYXIqICAgICAgICAgICAgICBjYWwsCiAgICAgICAgICAgIFVDYWxlbmRhckRhdGVGaWVsZHMgICAgIGZpZWxkLAogICAgICAgICAgICBVQ2FsZW5kYXJMaW1pdFR5cGUgICAgICB0eXBlLAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAqc3RhdHVzKTsKCiNlbmRpZgo=