public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: gdr@gcc.gnu.org To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: c++/1772 Date: Sun, 01 Apr 2001 00:00:00 -0000 [thread overview] Message-ID: <20010125194602.1708.qmail@sourceware.cygnus.com> (raw) The following reply was made to PR c++/1772; it has been noted by GNATS. From: gdr@gcc.gnu.org To: Jens.Maurer@gmx.net, gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org Cc: Subject: Re: c++/1772 Date: 25 Jan 2001 19:41:25 -0000 Synopsis: ICE when instantiating templates with "long long" values State-Changed-From-To: open->analyzed State-Changed-By: gdr State-Changed-When: Thu Jan 25 11:41:25 2001 State-Changed-Why: Confirmed as bug in both gcc-2.92.x and current CVS g++. Note however that `long long' extension support in g++ is not well documented. At any rate, this is a blatant compiler deficiency. -- Gaby http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=1772&database=gcc >From bmrevet@igr.fr Sun Apr 01 00:00:00 2001 From: bmrevet@igr.fr To: gcc-gnats@gcc.gnu.org Subject: c/1820: GToolKit.m:2213: Internal error: Segmentation faul Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010131162845.15110.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg00844.html Content-length: 258379 >Number: 1820 >Category: c >Synopsis: GToolKit.m:2213: Internal error: Segmentation faul >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Wed Jan 31 08:36:07 PST 2001 >Closed-Date: >Last-Modified: >Originator: Bernard Revet >Release: gcc version 2.96 20000731 (Red Hat Linux 7.0) >Organization: >Environment: dell latitude c600 running under RH 7 >Description: GToolKit]$ make /bin/sh ../libtool --mode compile gcc -c -pipe -Wall -O2 -mcpu=pentium -pthread -DHAVE_CONFIG_H -I.. -I/usr/include/gnome-xml -I/usr/lib/glib/include -I/usr/X11R6/include -D_REENTRANT GToolKit.m rm -f .libs/GToolKit.lo gcc -c -pipe -Wall -O2 -mcpu=pentium -pthread -DHAVE_CONFIG_H -I.. -I/usr/include/gnome-xml -I/usr/lib/glib/include -I/usr/X11R6/include -D_REENTRANT GToolKit.m -fPIC -DPIC -o .libs/GToolKit.lo GToolKit.m:2213: Internal error: Segmentation fault. While compiling gtoolkit-0.9.4 >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="GToolKit.m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="GToolKit.m" LyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtp dAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBH ZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2FjY2VsZ3JvdXAuaCBieSBndGtnZW4uCiAq CiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQv R1RLQWNjZWxHcm91cC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0FjY2VsR3JvdXAKKyAoaWQpIGFj Y2VsR3JvdXAKewogICAgcmV0dXJuIFtbKEdUS0FjY2VsR3JvdXAgKilbc2VsZiBhbGxvY10gaW5p dF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0 aEd0azpndGtfYWNjZWxfZ3JvdXBfbmV3KCldOwp9CisgKEdUS0FjY2VsR3JvdXAqKSBnZXREZWZh dWx0CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX2FjY2VsX2dyb3VwX2dldF9kZWZh dWx0KCksICJHVEtBY2NlbEdyb3VwIik7Cn0KLSAoR1RLQWNjZWxHcm91cCopIHJlZgp7CiAgICBy ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19hY2NlbF9ncm91cF9yZWYoZ3RrKSwgIkdUS0FjY2Vs R3JvdXAiKTsKfQotICh2b2lkKSB1bnJlZgp7CiAgICBndGtfYWNjZWxfZ3JvdXBfdW5yZWYoZ3Rr KTsKfQotICh2b2lkKSBsb2NrCnsKICAgIGd0a19hY2NlbF9ncm91cF9sb2NrKGd0ayk7Cn0KLSAo dm9pZCkgdW5sb2NrCnsKICAgIGd0a19hY2NlbF9ncm91cF91bmxvY2soZ3RrKTsKfQojZGVmaW5l IGd0awkoKEd0a0FjY2VsR3JvdXAgKikgZ3RrKQogLSAob25ld2F5IHZvaWQpIHJlbGVhc2UKewog ICAgdW5zaWduZWQgcmVmX2NvdW50ID0gZ3RrID8gZ3RrLT5yZWZfY291bnQgOiAxOwoKI2lmZGVm IERFQlVHCiAgICBpZiAocmVmX2NvdW50ID09IDApIGdfZXJyb3IoInJlZl9jb3VudCA9PSAwIGlu ICIgX19GSUxFX18gIiAocmVsZWFzZSkiKTsKI2VuZGlmCiAgICBpZiAoZ3RrKSBbc2VsZiB1bnJl Zl07CiAgICBpZiAocmVmX2NvdW50ID09IDEpIFtzZWxmIGRlYWxsb2NdOwp9CgogLSAoaWQpIHJl dGFpbgp7CiAgICBpZiAoZ3RrKSBbc2VsZiByZWZdOwogICAgcmV0dXJuIHNlbGY7Cn0KCiAtICh1 bnNpZ25lZCkgcmV0YWluQ291bnQKewogICAgcmV0dXJuIGd0ayA/IGd0ay0+cmVmX2NvdW50IDog MTsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZh Y2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAg IEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2FjY2Vs bGFiZWwuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWNjZWxMYWJlbC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQv R1RLV2lkZ2V0Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQWNjZWxMYWJlbAorIChHdGtUeXBlKSBn ZXRUeXBlCnsKICAgIHJldHVybiBndGtfYWNjZWxfbGFiZWxfZ2V0X3R5cGUoKTsKfQorIChpZCkg YWNjZWxMYWJlbFdpdGhTdHJpbmc6KE5TU3RyaW5nICopIHN0cmluZwp7CiAgICByZXR1cm4gW1so R1RLQWNjZWxMYWJlbCAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFN0cmluZzpzdHJpbmddIGF1dG9y ZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhTdHJpbmc6KE5TU3RyaW5nICopIHN0cmluZwp7CiAg ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2FjY2VsX2xhYmVsX25ldyhndG9vbGtpdF91 dGY4X3N0cmluZyggc3RyaW5nKSldOwp9Ci0gKGd1aW50KSBnZXRBY2NlbFdpZHRoCnsKICAgIHJl dHVybiBndGtfYWNjZWxfbGFiZWxfZ2V0X2FjY2VsX3dpZHRoKGd0ayk7Cn0KLSAodm9pZCkgc2V0 QWNjZWxXaWRnZXQ6KEdUS1dpZGdldCAqKSBhY2NlbF93aWRnZXQKewogICAgZ3RrX2FjY2VsX2xh YmVsX3NldF9hY2NlbF93aWRnZXQoZ3RrLCBhY2NlbF93aWRnZXQgPyBhY2NlbF93aWRnZXQtPmd0 ayA6IDApOwp9Ci0gKGdib29sZWFuKSByZWZldGNoCnsKICAgIHJldHVybiBndGtfYWNjZWxfbGFi ZWxfcmVmZXRjaChndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRl cmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIw MDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2Fk anVzdG1lbnQuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxp c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAy LjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u CiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9u IEdUS0FkanVzdG1lbnQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2FkanVz dG1lbnRfZ2V0X3R5cGUoKTsKfQorIChpZCkgYWRqdXN0bWVudFdpdGhWYWx1ZTooZ2Zsb2F0KSB2 YWx1ZSBsb3dlcjooZ2Zsb2F0KSBsb3dlciB1cHBlcjooZ2Zsb2F0KSB1cHBlciBzdGVwSW5jcmVt ZW50OihnZmxvYXQpIHN0ZXBfaW5jcmVtZW50IHBhZ2VJbmNyZW1lbnQ6KGdmbG9hdCkgcGFnZV9p bmNyZW1lbnQgcGFnZVNpemU6KGdmbG9hdCkgcGFnZV9zaXplCnsKICAgIHJldHVybiBbWyhHVEtB ZGp1c3RtZW50ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWU6dmFsdWUgbG93ZXI6bG93ZXIg dXBwZXI6dXBwZXIgc3RlcEluY3JlbWVudDpzdGVwX2luY3JlbWVudCBwYWdlSW5jcmVtZW50OnBh Z2VfaW5jcmVtZW50IHBhZ2VTaXplOnBhZ2Vfc2l6ZV0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBp bml0V2l0aFZhbHVlOihnZmxvYXQpIHZhbHVlIGxvd2VyOihnZmxvYXQpIGxvd2VyIHVwcGVyOihn ZmxvYXQpIHVwcGVyIHN0ZXBJbmNyZW1lbnQ6KGdmbG9hdCkgc3RlcF9pbmNyZW1lbnQgcGFnZUlu Y3JlbWVudDooZ2Zsb2F0KSBwYWdlX2luY3JlbWVudCBwYWdlU2l6ZTooZ2Zsb2F0KSBwYWdlX3Np emUKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19hZGp1c3RtZW50X25ldyggdmFs dWUgLCBsb3dlciAsIHVwcGVyICwgc3RlcF9pbmNyZW1lbnQgLCBwYWdlX2luY3JlbWVudCAsIHBh Z2Vfc2l6ZSldOwp9Ci0gKHZvaWQpIGNoYW5nZWQKewogICAgZ3RrX2FkanVzdG1lbnRfY2hhbmdl ZChndGspOwp9Ci0gKHZvaWQpIHZhbHVlQ2hhbmdlZAp7CiAgICBndGtfYWRqdXN0bWVudF92YWx1 ZV9jaGFuZ2VkKGd0ayk7Cn0KLSAodm9pZCkgY2xhbXBQYWdlOihnZmxvYXQpIGxvd2VyIHVwcGVy OihnZmxvYXQpIHVwcGVyCnsKICAgIGd0a19hZGp1c3RtZW50X2NsYW1wX3BhZ2UoZ3RrLCBsb3dl ciAsIHVwcGVyKTsKfQotICh2b2lkKSBzZXRWYWx1ZTooZ2Zsb2F0KSB2YWx1ZQp7CiAgICBndGtf YWRqdXN0bWVudF9zZXRfdmFsdWUoZ3RrLCB2YWx1ZSk7Cn0KI2RlZmluZSBndGsJKChHdGtBZGp1 c3RtZW50ICopIGd0aykKLSAoZ2Zsb2F0KSBnZXRWYWx1ZQp7CiAgICByZXR1cm4gZ3RrLT52YWx1 ZTsKfQoKLSAodm9pZCkgc2V0TG93ZXI6KGdmbG9hdCkgbG93ZXIgdXBwZXI6KGdmbG9hdCkgdXBw ZXIKCSBzdGVwSW5jcmVtZW50OihnZmxvYXQpIHN0ZXBfaW5jcmVtZW50CgkgcGFnZUluY3JlbWVu dDooZ2Zsb2F0KSBwYWdlX2luY3JlbWVudCBwYWdlU2l6ZTooZ2Zsb2F0KSBwYWdlX3NpemUKewog ICAgZ3RrLT5sb3dlciA9IGxvd2VyOwogICAgZ3RrLT51cHBlciA9IHVwcGVyOwogICAgZ3RrLT5z dGVwX2luY3JlbWVudCA9IHN0ZXBfaW5jcmVtZW50OwogICAgZ3RrLT5wYWdlX2luY3JlbWVudCA9 IHBhZ2VfaW5jcmVtZW50OwogICAgZ3RrLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7Cn0KCi0gKHZv aWQpIGdldExvd2VyOihnZmxvYXQgKikgbG93ZXIgdXBwZXI6KGdmbG9hdCAqKSB1cHBlcgoJIHN0 ZXBJbmNyZW1lbnQ6KGdmbG9hdCAqKSBzdGVwX2luY3JlbWVudAoJIHBhZ2VJbmNyZW1lbnQ6KGdm bG9hdCAqKSBwYWdlX2luY3JlbWVudCBwYWdlU2l6ZTooZ2Zsb2F0ICopIHBhZ2Vfc2l6ZQp7CiAg ICAqbG93ZXIgPSBndGstPmxvd2VyOwogICAgKnVwcGVyID0gZ3RrLT51cHBlcjsKICAgICpzdGVw X2luY3JlbWVudCA9IGd0ay0+c3RlcF9pbmNyZW1lbnQ7CiAgICAqcGFnZV9pbmNyZW1lbnQgPSBn dGstPnBhZ2VfaW5jcmVtZW50OwogICAgKnBhZ2Vfc2l6ZSA9IGd0ay0+cGFnZV9zaXplOwp9CiN1 bmRlZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0 aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIg THVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrYWxpZ25tZW50Lmgg YnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBM aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1 ZGUgPEdUb29sS2l0L0dUS0FsaWdubWVudC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0FsaWdubWVu dAorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfYWxpZ25tZW50X2dldF90eXBl KCk7Cn0KKyAoaWQpIGFsaWdubWVudFdpdGhYYWxpZ246KGdmbG9hdCkgeGFsaWduIHlhbGlnbjoo Z2Zsb2F0KSB5YWxpZ24geHNjYWxlOihnZmxvYXQpIHhzY2FsZSB5c2NhbGU6KGdmbG9hdCkgeXNj YWxlCnsKICAgIHJldHVybiBbWyhHVEtBbGlnbm1lbnQgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhY YWxpZ246eGFsaWduIHlhbGlnbjp5YWxpZ24geHNjYWxlOnhzY2FsZSB5c2NhbGU6eXNjYWxlXSBh dXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoWGFsaWduOihnZmxvYXQpIHhhbGlnbiB5YWxp Z246KGdmbG9hdCkgeWFsaWduIHhzY2FsZTooZ2Zsb2F0KSB4c2NhbGUgeXNjYWxlOihnZmxvYXQp IHlzY2FsZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2FsaWdubWVudF9uZXco IHhhbGlnbiAsIHlhbGlnbiAsIHhzY2FsZSAsIHlzY2FsZSldOwp9Ci0gKHZvaWQpIHNldDooZ2Zs b2F0KSB4YWxpZ24geWFsaWduOihnZmxvYXQpIHlhbGlnbiB4c2NhbGU6KGdmbG9hdCkgeHNjYWxl IHlzY2FsZTooZ2Zsb2F0KSB5c2NhbGUKewogICAgZ3RrX2FsaWdubWVudF9zZXQoZ3RrLCB4YWxp Z24gLCB5YWxpZ24gLCB4c2NhbGUgLCB5c2NhbGUpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBP YmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMp IDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGlj YWxseSBmcm9tIGd0a2Fycm93LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAq IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0Fycm93Lmg+CgpAaW1wbGVtZW50 YXRpb24gR1RLQXJyb3cKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2Fycm93 X2dldF90eXBlKCk7Cn0KKyAoaWQpIGFycm93V2l0aFR5cGU6KEd0a0Fycm93VHlwZSkgYXJyb3df dHlwZSBzaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSBzaGFkb3dfdHlwZQp7CiAgICByZXR1cm4g W1soR1RLQXJyb3cgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhUeXBlOmFycm93X3R5cGUgc2hhZG93 VHlwZTpzaGFkb3dfdHlwZV0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aFR5cGU6KEd0 a0Fycm93VHlwZSkgYXJyb3dfdHlwZSBzaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSBzaGFkb3df dHlwZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2Fycm93X25ldyggYXJyb3df dHlwZSAsIHNoYWRvd190eXBlKV07Cn0KLSAodm9pZCkgc2V0OihHdGtBcnJvd1R5cGUpIGFycm93 X3R5cGUgc2hhZG93VHlwZTooR3RrU2hhZG93VHlwZSkgc2hhZG93X3R5cGUKewogICAgZ3RrX2Fy cm93X3NldChndGssIGFycm93X3R5cGUgLCBzaGFkb3dfdHlwZSk7Cn0KQGVuZAovKgogKiBHVG9v bEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHly aWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBh dXRvbWF0aWNhbGx5IGZyb20gZ3RrYXNwZWN0ZnJhbWUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMg bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1 YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQXNwZWN0 RnJhbWUuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtBc3BlY3RGcmFtZQorIChHdGtUeXBlKSBnZXRU eXBlCnsKICAgIHJldHVybiBndGtfYXNwZWN0X2ZyYW1lX2dldF90eXBlKCk7Cn0KKyAoaWQpIGFz cGVjdEZyYW1lV2l0aExhYmVsOihOU1N0cmluZyAqKSBsYWJlbCB4YWxpZ246KGdmbG9hdCkgeGFs aWduIHlhbGlnbjooZ2Zsb2F0KSB5YWxpZ24gcmF0aW86KGdmbG9hdCkgcmF0aW8gb2JleUNoaWxk OihnYm9vbGVhbikgb2JleV9jaGlsZAp7CiAgICByZXR1cm4gW1soR1RLQXNwZWN0RnJhbWUgKilb c2VsZiBhbGxvY10gaW5pdFdpdGhMYWJlbDpsYWJlbCB4YWxpZ246eGFsaWduIHlhbGlnbjp5YWxp Z24gcmF0aW86cmF0aW8gb2JleUNoaWxkOm9iZXlfY2hpbGRdIGF1dG9yZWxlYXNlXTsKfQotIChp ZCkgaW5pdFdpdGhMYWJlbDooTlNTdHJpbmcgKikgbGFiZWwgeGFsaWduOihnZmxvYXQpIHhhbGln biB5YWxpZ246KGdmbG9hdCkgeWFsaWduIHJhdGlvOihnZmxvYXQpIHJhdGlvIG9iZXlDaGlsZDoo Z2Jvb2xlYW4pIG9iZXlfY2hpbGQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19h c3BlY3RfZnJhbWVfbmV3KGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCApLCB4YWxpZ24gLCB5 YWxpZ24gLCByYXRpbyAsIG9iZXlfY2hpbGQpXTsKfQotICh2b2lkKSBzZXQ6KGdmbG9hdCkgeGFs aWduIHlhbGlnbjooZ2Zsb2F0KSB5YWxpZ24gcmF0aW86KGdmbG9hdCkgcmF0aW8gb2JleUNoaWxk OihnYm9vbGVhbikgb2JleV9jaGlsZAp7CiAgICBndGtfYXNwZWN0X2ZyYW1lX3NldChndGssIHhh bGlnbiAsIHlhbGlnbiAsIHJhdGlvICwgb2JleV9jaGlsZCk7Cn0KQGVuZAovKgogKiBHVG9vbEtp dCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdo dCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRv bWF0aWNhbGx5IGZyb20gZ3RrYmJveC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtCdXR0b25Cb3guaD4KCkBp bXBsZW1lbnRhdGlvbiBHVEtCdXR0b25Cb3gKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1 cm4gZ3RrX2J1dHRvbl9ib3hfZ2V0X3R5cGUoKTsKfQorICh2b2lkKSBnZXRDaGlsZFNpemVEZWZh dWx0OihnaW50ICopIG1pbl93aWR0aCBtaW5IZWlnaHQ6KGdpbnQgKikgbWluX2hlaWdodAp7CiAg ICBndGtfYnV0dG9uX2JveF9nZXRfY2hpbGRfc2l6ZV9kZWZhdWx0KCBtaW5fd2lkdGggLCBtaW5f aGVpZ2h0KTsKfQorICh2b2lkKSBnZXRDaGlsZElwYWRkaW5nRGVmYXVsdDooZ2ludCAqKSBpcGFk X3ggaXBhZFk6KGdpbnQgKikgaXBhZF95CnsKICAgIGd0a19idXR0b25fYm94X2dldF9jaGlsZF9p cGFkZGluZ19kZWZhdWx0KCBpcGFkX3ggLCBpcGFkX3kpOwp9CisgKHZvaWQpIHNldENoaWxkU2l6 ZURlZmF1bHQ6KGdpbnQpIG1pbl93aWR0aCBtaW5IZWlnaHQ6KGdpbnQpIG1pbl9oZWlnaHQKewog ICAgZ3RrX2J1dHRvbl9ib3hfc2V0X2NoaWxkX3NpemVfZGVmYXVsdCggbWluX3dpZHRoICwgbWlu X2hlaWdodCk7Cn0KKyAodm9pZCkgc2V0Q2hpbGRJcGFkZGluZ0RlZmF1bHQ6KGdpbnQpIGlwYWRf eCBpcGFkWTooZ2ludCkgaXBhZF95CnsKICAgIGd0a19idXR0b25fYm94X3NldF9jaGlsZF9pcGFk ZGluZ19kZWZhdWx0KCBpcGFkX3ggLCBpcGFkX3kpOwp9Ci0gKGdpbnQpIGdldFNwYWNpbmcKewog ICAgcmV0dXJuIGd0a19idXR0b25fYm94X2dldF9zcGFjaW5nKGd0ayk7Cn0KLSAoR3RrQnV0dG9u Qm94U3R5bGUpIGdldExheW91dAp7CiAgICByZXR1cm4gZ3RrX2J1dHRvbl9ib3hfZ2V0X2xheW91 dChndGspOwp9Ci0gKHZvaWQpIGdldENoaWxkU2l6ZTooZ2ludCAqKSBtaW5fd2lkdGggbWluSGVp Z2h0OihnaW50ICopIG1pbl9oZWlnaHQKewogICAgZ3RrX2J1dHRvbl9ib3hfZ2V0X2NoaWxkX3Np emUoZ3RrLCBtaW5fd2lkdGggLCBtaW5faGVpZ2h0KTsKfQotICh2b2lkKSBnZXRDaGlsZElwYWRk aW5nOihnaW50ICopIGlwYWRfeCBpcGFkWTooZ2ludCAqKSBpcGFkX3kKewogICAgZ3RrX2J1dHRv bl9ib3hfZ2V0X2NoaWxkX2lwYWRkaW5nKGd0aywgaXBhZF94ICwgaXBhZF95KTsKfQotICh2b2lk KSBzZXRTcGFjaW5nOihnaW50KSBzcGFjaW5nCnsKICAgIGd0a19idXR0b25fYm94X3NldF9zcGFj aW5nKGd0aywgc3BhY2luZyk7Cn0KLSAodm9pZCkgc2V0TGF5b3V0OihHdGtCdXR0b25Cb3hTdHls ZSkgbGF5b3V0X3N0eWxlCnsKICAgIGd0a19idXR0b25fYm94X3NldF9sYXlvdXQoZ3RrLCBsYXlv dXRfc3R5bGUpOwp9Ci0gKHZvaWQpIHNldENoaWxkU2l6ZTooZ2ludCkgbWluX3dpZHRoIG1pbkhl aWdodDooZ2ludCkgbWluX2hlaWdodAp7CiAgICBndGtfYnV0dG9uX2JveF9zZXRfY2hpbGRfc2l6 ZShndGssIG1pbl93aWR0aCAsIG1pbl9oZWlnaHQpOwp9Ci0gKHZvaWQpIHNldENoaWxkSXBhZGRp bmc6KGdpbnQpIGlwYWRfeCBpcGFkWTooZ2ludCkgaXBhZF95CnsKICAgIGd0a19idXR0b25fYm94 X3NldF9jaGlsZF9pcGFkZGluZyhndGssIGlwYWRfeCAsIGlwYWRfeSk7Cn0KQGVuZAovKgogKiBH VG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENv cHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRl ZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrYmluLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJh cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1v ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p IGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0Jpbi5oPgoKQGlt cGxlbWVudGF0aW9uIEdUS0JpbgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtf YmluX2dldF90eXBlKCk7Cn0KI2RlZmluZSBndGsJKChHdGtCaW4gKikgZ3RrKQotIChpZCkgY2hp bGQKewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmNoaWxkKTsKfQojdW5kZWYgZ3Rr CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2JveC5oIGJ5IGd0a2dlbi4KICoK ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H VEtCb3guaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9u IEdUS0JveAorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfYm94X2dldF90eXBl KCk7Cn0KLSAodm9pZCkgcGFja1N0YXJ0OihHVEtXaWRnZXQgKikgY2hpbGQgZXhwYW5kOihnYm9v bGVhbikgZXhwYW5kIGZpbGw6KGdib29sZWFuKSBmaWxsIHBhZGRpbmc6KGd1aW50KSBwYWRkaW5n CnsKICAgIGd0a19ib3hfcGFja19zdGFydChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwg ZXhwYW5kICwgZmlsbCAsIHBhZGRpbmcpOwp9Ci0gKHZvaWQpIHBhY2tFbmQ6KEdUS1dpZGdldCAq KSBjaGlsZCBleHBhbmQ6KGdib29sZWFuKSBleHBhbmQgZmlsbDooZ2Jvb2xlYW4pIGZpbGwgcGFk ZGluZzooZ3VpbnQpIHBhZGRpbmcKewogICAgZ3RrX2JveF9wYWNrX2VuZChndGssIGNoaWxkICA/ IGNoaWxkIC0+Z3RrIDogMCwgZXhwYW5kICwgZmlsbCAsIHBhZGRpbmcpOwp9Ci0gKHZvaWQpIHBh Y2tTdGFydERlZmF1bHRzOihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIGd0a19ib3hfcGFja19z dGFydF9kZWZhdWx0cyhndGssIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg cGFja0VuZERlZmF1bHRzOihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIGd0a19ib3hfcGFja19l bmRfZGVmYXVsdHMoZ3RrLCB3aWRnZXQgPyB3aWRnZXQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNl dEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dlbmVvdXMKewogICAgZ3RrX2JveF9zZXRfaG9t b2dlbmVvdXMoZ3RrLCBob21vZ2VuZW91cyk7Cn0KLSAodm9pZCkgc2V0U3BhY2luZzooZ2ludCkg c3BhY2luZwp7CiAgICBndGtfYm94X3NldF9zcGFjaW5nKGd0aywgc3BhY2luZyk7Cn0KLSAodm9p ZCkgcmVvcmRlckNoaWxkOihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRpb246KGdpbnQpIHBvc2l0 aW9uCnsKICAgIGd0a19ib3hfcmVvcmRlcl9jaGlsZChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3Rr IDogMCwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHF1ZXJ5Q2hpbGRQYWNraW5nOihHVEtXaWRnZXQg KikgY2hpbGQgZXhwYW5kOihnYm9vbGVhbiAqKSBleHBhbmQgZmlsbDooZ2Jvb2xlYW4gKikgZmls bCBwYWRkaW5nOihndWludCAqKSBwYWRkaW5nIHBhY2tUeXBlOihHdGtQYWNrVHlwZSAqKSBwYWNr X3R5cGUKewogICAgZ3RrX2JveF9xdWVyeV9jaGlsZF9wYWNraW5nKGd0aywgY2hpbGQgID8gY2hp bGQgLT5ndGsgOiAwLCBleHBhbmQgLCBmaWxsICwgcGFkZGluZyAsIHBhY2tfdHlwZSk7Cn0KLSAo dm9pZCkgc2V0Q2hpbGRQYWNraW5nOihHVEtXaWRnZXQgKikgY2hpbGQgZXhwYW5kOihnYm9vbGVh bikgZXhwYW5kIGZpbGw6KGdib29sZWFuKSBmaWxsIHBhZGRpbmc6KGd1aW50KSBwYWRkaW5nIHBh Y2tUeXBlOihHdGtQYWNrVHlwZSkgcGFja190eXBlCnsKICAgIGd0a19ib3hfc2V0X2NoaWxkX3Bh Y2tpbmcoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIGV4cGFuZCAsIGZpbGwgLCBwYWRk aW5nICwgcGFja190eXBlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50 ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAy MDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGti dXR0b24uaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQnV0dG9uLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQnV0 dG9uCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19idXR0b25fZ2V0X3R5cGUo KTsKfQorIChpZCkgYnV0dG9uCnsKICAgIHJldHVybiBbWyhHVEtCdXR0b24gKilbc2VsZiBhbGxv Y10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBp bml0V2l0aEd0azpndGtfYnV0dG9uX25ldygpXTsKfQorIChpZCkgYnV0dG9uV2l0aExhYmVsOihO U1N0cmluZyAqKSBsYWJlbAp7CiAgICByZXR1cm4gW1soR1RLQnV0dG9uICopW3NlbGYgYWxsb2Nd IGluaXRXaXRoTGFiZWw6bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhMYWJl bDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19i dXR0b25fbmV3X3dpdGhfbGFiZWwoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVsKSldOwp9Ci0g KHZvaWQpIHByZXNzZWQKewogICAgZ3RrX2J1dHRvbl9wcmVzc2VkKGd0ayk7Cn0KLSAodm9pZCkg cmVsZWFzZWQKewogICAgZ3RrX2J1dHRvbl9yZWxlYXNlZChndGspOwp9Ci0gKHZvaWQpIGNsaWNr ZWQKewogICAgZ3RrX2J1dHRvbl9jbGlja2VkKGd0ayk7Cn0KLSAodm9pZCkgZW50ZXIKewogICAg Z3RrX2J1dHRvbl9lbnRlcihndGspOwp9Ci0gKHZvaWQpIGxlYXZlCnsKICAgIGd0a19idXR0b25f bGVhdmUoZ3RrKTsKfQotICh2b2lkKSBzZXRSZWxpZWY6KEd0a1JlbGllZlN0eWxlKSBuZXdzdHls ZQp7CiAgICBndGtfYnV0dG9uX3NldF9yZWxpZWYoZ3RrLCBuZXdzdHlsZSk7Cn0KLSAoR3RrUmVs aWVmU3R5bGUpIGdldFJlbGllZgp7CiAgICByZXR1cm4gZ3RrX2J1dHRvbl9nZXRfcmVsaWVmKGd0 ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUg R0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVk d2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrY2FsZW5kYXIuaCBieSBn dGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8 R1Rvb2xLaXQvR1RLQ2FsZW5kYXIuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtDYWxlbmRhcgorIChH dGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfY2FsZW5kYXJfZ2V0X3R5cGUoKTsKfQor IChpZCkgY2FsZW5kYXIKewogICAgcmV0dXJuIFtbKEdUS0NhbGVuZGFyICopW3NlbGYgYWxsb2Nd IGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5p dFdpdGhHdGs6Z3RrX2NhbGVuZGFyX25ldygpXTsKfQotIChnaW50KSBzZWxlY3RNb250aDooZ3Vp bnQpIG1vbnRoIHllYXI6KGd1aW50KSB5ZWFyCnsKICAgIHJldHVybiBndGtfY2FsZW5kYXJfc2Vs ZWN0X21vbnRoKGd0aywgbW9udGggLCB5ZWFyKTsKfQotICh2b2lkKSBzZWxlY3REYXk6KGd1aW50 KSBkYXkKewogICAgZ3RrX2NhbGVuZGFyX3NlbGVjdF9kYXkoZ3RrLCBkYXkpOwp9Ci0gKGdpbnQp IG1hcmtEYXk6KGd1aW50KSBkYXkKewogICAgcmV0dXJuIGd0a19jYWxlbmRhcl9tYXJrX2RheShn dGssIGRheSk7Cn0KLSAoZ2ludCkgdW5tYXJrRGF5OihndWludCkgZGF5CnsKICAgIHJldHVybiBn dGtfY2FsZW5kYXJfdW5tYXJrX2RheShndGssIGRheSk7Cn0KLSAodm9pZCkgY2xlYXJNYXJrcwp7 CiAgICBndGtfY2FsZW5kYXJfY2xlYXJfbWFya3MoZ3RrKTsKfQotICh2b2lkKSBkaXNwbGF5T3B0 aW9uczooR3RrQ2FsZW5kYXJEaXNwbGF5T3B0aW9ucykgZmxhZ3MKewogICAgZ3RrX2NhbGVuZGFy X2Rpc3BsYXlfb3B0aW9ucyhndGssIGZsYWdzKTsKfQotICh2b2lkKSBnZXREYXRlOihndWludCAq KSB5ZWFyIG1vbnRoOihndWludCAqKSBtb250aCBkYXk6KGd1aW50ICopIGRheQp7CiAgICBndGtf Y2FsZW5kYXJfZ2V0X2RhdGUoZ3RrLCB5ZWFyICwgbW9udGggLCBkYXkpOwp9Ci0gKHZvaWQpIGZy ZWV6ZQp7CiAgICBndGtfY2FsZW5kYXJfZnJlZXplKGd0ayk7Cn0KLSAodm9pZCkgdGhhdwp7CiAg ICBndGtfY2FsZW5kYXJfdGhhdyhndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm cm9tIGd0a2NoZWNrYnV0dG9uLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAq IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0NoZWNrQnV0dG9uLmg+CgpAaW1w bGVtZW50YXRpb24gR1RLQ2hlY2tCdXR0b24KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1 cm4gZ3RrX2NoZWNrX2J1dHRvbl9nZXRfdHlwZSgpOwp9CisgKGlkKSBjaGVja0J1dHRvbgp7CiAg ICByZXR1cm4gW1soR1RLQ2hlY2tCdXR0b24gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVh c2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY2hl Y2tfYnV0dG9uX25ldygpXTsKfQorIChpZCkgY2hlY2tCdXR0b25XaXRoTGFiZWw6KE5TU3RyaW5n ICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhHVEtDaGVja0J1dHRvbiAqKVtzZWxmIGFsbG9jXSBp bml0V2l0aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6 KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY2hl Y2tfYnV0dG9uX25ld193aXRoX2xhYmVsKGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsK fQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1Q IFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcK ICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtjaGVja21lbnVpdGVtLmggYnkg Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg PEdUb29sS2l0L0dUS0NoZWNrTWVudUl0ZW0uaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtDaGVja01l bnVJdGVtCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19jaGVja19tZW51X2l0 ZW1fZ2V0X3R5cGUoKTsKfQorIChpZCkgY2hlY2tNZW51SXRlbQp7CiAgICByZXR1cm4gW1soR1RL Q2hlY2tNZW51SXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp IGluaXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19jaGVja19tZW51X2l0ZW1f bmV3KCldOwp9CisgKGlkKSBjaGVja01lbnVJdGVtV2l0aExhYmVsOihOU1N0cmluZyAqKSBsYWJl bAp7CiAgICByZXR1cm4gW1soR1RLQ2hlY2tNZW51SXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0V2l0 aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6KE5TU3Ry aW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY2hlY2tfbWVu dV9pdGVtX25ld193aXRoX2xhYmVsKGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQot ICh2b2lkKSBzZXRBY3RpdmU6KGdib29sZWFuKSBpc19hY3RpdmUKewogICAgZ3RrX2NoZWNrX21l bnVfaXRlbV9zZXRfYWN0aXZlKGd0aywgaXNfYWN0aXZlKTsKfQotICh2b2lkKSBzZXRTaG93VG9n Z2xlOihnYm9vbGVhbikgYWx3YXlzCnsKICAgIGd0a19jaGVja19tZW51X2l0ZW1fc2V0X3Nob3df dG9nZ2xlKGd0aywgYWx3YXlzKTsKfQotICh2b2lkKSB0b2dnbGVkCnsKICAgIGd0a19jaGVja19t ZW51X2l0ZW1fdG9nZ2xlZChndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5 OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t IGd0a2NsaXN0LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24g Mi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0NMaXN0Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9H VEtXaWRnZXQuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KI2luY2x1ZGUg PEdUb29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQ0xpc3QKKyAoR3RrVHlw ZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2dldF90eXBlKCk7Cn0KKyAoaWQpIGNM aXN0V2l0aENvbHVtbnM6KGdpbnQpIGNvbHVtbnMKewogICAgcmV0dXJuIFtbKEdUS0NMaXN0ICop W3NlbGYgYWxsb2NdIGluaXRXaXRoQ29sdW1uczpjb2x1bW5zXSBhdXRvcmVsZWFzZV07Cn0KLSAo aWQpIGluaXRXaXRoQ29sdW1uczooZ2ludCkgY29sdW1ucwp7CiAgICByZXR1cm4gW3NlbGYgaW5p dFdpdGhHdGs6Z3RrX2NsaXN0X25ldyggY29sdW1ucyldOwp9CisgKGlkKSBjTGlzdFdpdGhUaXRs ZXM6KGdpbnQpIGNvbHVtbnMgdGl0bGVzOihOU0FycmF5ICAqKSB0aXRsZXMKewogICAgcmV0dXJu IFtbKEdUS0NMaXN0ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVGl0bGVzOmNvbHVtbnMgdGl0bGVz OnRpdGxlc10gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aFRpdGxlczooZ2ludCkgY29s dW1ucyB0aXRsZXM6KE5TQXJyYXkgICopIHRpdGxlcwp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdp dGhHdGs6Z3RrX2NsaXN0X25ld193aXRoX3RpdGxlcyggY29sdW1ucyAsKGNoYXIgKiopZ3Rvb2xr aXRfYXJyYXlfdG9fc3RydmVjKCB0aXRsZXMpKV07Cn0KLSAodm9pZCkgc2V0SGFkanVzdG1lbnQ6 KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfY2xpc3Rfc2V0X2hhZGp1c3Rt ZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNl dFZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgZ3RrX2NsaXN0 X3NldF92YWRqdXN0bWVudChndGssIGFkanVzdG1lbnQgPyBhZGp1c3RtZW50LT5ndGsgOiAwKTsK fQotIChHVEtBZGp1c3RtZW50KikgZ2V0SGFkanVzdG1lbnQKewogICAgcmV0dXJuIGd0b29sa2l0 X29iamVjdChndGtfY2xpc3RfZ2V0X2hhZGp1c3RtZW50KGd0ayksIDApOwp9Ci0gKEdUS0FkanVz dG1lbnQqKSBnZXRWYWRqdXN0bWVudAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19j bGlzdF9nZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0U2hhZG93VHlwZToo R3RrU2hhZG93VHlwZSkgdHlwZQp7CiAgICBndGtfY2xpc3Rfc2V0X3NoYWRvd190eXBlKGd0aywg dHlwZSk7Cn0KLSAodm9pZCkgc2V0U2VsZWN0aW9uTW9kZTooR3RrU2VsZWN0aW9uTW9kZSkgbW9k ZQp7CiAgICBndGtfY2xpc3Rfc2V0X3NlbGVjdGlvbl9tb2RlKGd0aywgbW9kZSk7Cn0KLSAodm9p ZCkgc2V0UmVvcmRlcmFibGU6KGdib29sZWFuKSByZW9yZGVyYWJsZQp7CiAgICBndGtfY2xpc3Rf c2V0X3Jlb3JkZXJhYmxlKGd0aywgcmVvcmRlcmFibGUpOwp9Ci0gKHZvaWQpIHNldFVzZURyYWdJ Y29uczooZ2Jvb2xlYW4pIHVzZV9pY29ucwp7CiAgICBndGtfY2xpc3Rfc2V0X3VzZV9kcmFnX2lj b25zKGd0aywgdXNlX2ljb25zKTsKfQotICh2b2lkKSBzZXRCdXR0b25BY3Rpb25zOihndWludCkg YnV0dG9uIGJ1dHRvbkFjdGlvbnM6KGd1aW50OCkgYnV0dG9uX2FjdGlvbnMKewogICAgZ3RrX2Ns aXN0X3NldF9idXR0b25fYWN0aW9ucyhndGssIGJ1dHRvbiAsIGJ1dHRvbl9hY3Rpb25zKTsKfQot ICh2b2lkKSBmcmVlemUKewogICAgZ3RrX2NsaXN0X2ZyZWV6ZShndGspOwp9Ci0gKHZvaWQpIHRo YXcKewogICAgZ3RrX2NsaXN0X3RoYXcoZ3RrKTsKfQotICh2b2lkKSBjb2x1bW5UaXRsZXNTaG93 CnsKICAgIGd0a19jbGlzdF9jb2x1bW5fdGl0bGVzX3Nob3coZ3RrKTsKfQotICh2b2lkKSBjb2x1 bW5UaXRsZXNIaWRlCnsKICAgIGd0a19jbGlzdF9jb2x1bW5fdGl0bGVzX2hpZGUoZ3RrKTsKfQot ICh2b2lkKSBjb2x1bW5UaXRsZUFjdGl2ZTooZ2ludCkgY29sdW1uCnsKICAgIGd0a19jbGlzdF9j b2x1bW5fdGl0bGVfYWN0aXZlKGd0aywgY29sdW1uKTsKfQotICh2b2lkKSBjb2x1bW5UaXRsZVBh c3NpdmU6KGdpbnQpIGNvbHVtbgp7CiAgICBndGtfY2xpc3RfY29sdW1uX3RpdGxlX3Bhc3NpdmUo Z3RrLCBjb2x1bW4pOwp9Ci0gKHZvaWQpIGNvbHVtblRpdGxlc0FjdGl2ZQp7CiAgICBndGtfY2xp c3RfY29sdW1uX3RpdGxlc19hY3RpdmUoZ3RrKTsKfQotICh2b2lkKSBjb2x1bW5UaXRsZXNQYXNz aXZlCnsKICAgIGd0a19jbGlzdF9jb2x1bW5fdGl0bGVzX3Bhc3NpdmUoZ3RrKTsKfQotICh2b2lk KSBzZXRDb2x1bW46KGdpbnQpIGNvbHVtbiB0aXRsZTooTlNTdHJpbmcgKikgdGl0bGUKewogICAg Z3RrX2NsaXN0X3NldF9jb2x1bW5fdGl0bGUoZ3RrLCBjb2x1bW4gLGd0b29sa2l0X3V0Zjhfc3Ry aW5nKCB0aXRsZSkpOwp9Ci0gKE5TU3RyaW5nICopIGdldENvbHVtblRpdGxlOihnaW50KSBjb2x1 bW4KewogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19jbGlzdF9nZXRfY29sdW1u X3RpdGxlKGd0aywgY29sdW1uKSk7Cn0KLSAodm9pZCkgc2V0Q29sdW1uOihnaW50KSBjb2x1bW4g d2lkZ2V0OihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIGd0a19jbGlzdF9zZXRfY29sdW1uX3dp ZGdldChndGssIGNvbHVtbiAsIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAoR1RLV2lk Z2V0ICopIGdldENvbHVtbldpZGdldDooZ2ludCkgY29sdW1uCnsKICAgIHJldHVybiBndG9vbGtp dF9vYmplY3QoZ3RrX2NsaXN0X2dldF9jb2x1bW5fd2lkZ2V0KGd0aywgY29sdW1uKSwgMCk7Cn0K LSAodm9pZCkgc2V0Q29sdW1uOihnaW50KSBjb2x1bW4ganVzdGlmaWNhdGlvbjooR3RrSnVzdGlm aWNhdGlvbikganVzdGlmaWNhdGlvbgp7CiAgICBndGtfY2xpc3Rfc2V0X2NvbHVtbl9qdXN0aWZp Y2F0aW9uKGd0aywgY29sdW1uICwganVzdGlmaWNhdGlvbik7Cn0KLSAodm9pZCkgc2V0Q29sdW1u VmlzaWJpbGl0eTooZ2ludCkgY29sdW1uIHZpc2libGU6KGdib29sZWFuKSB2aXNpYmxlCnsKICAg IGd0a19jbGlzdF9zZXRfY29sdW1uX3Zpc2liaWxpdHkoZ3RrLCBjb2x1bW4gLCB2aXNpYmxlKTsK fQotICh2b2lkKSBzZXRDb2x1bW46KGdpbnQpIGNvbHVtbiByZXNpemVhYmxlOihnYm9vbGVhbikg cmVzaXplYWJsZQp7CiAgICBndGtfY2xpc3Rfc2V0X2NvbHVtbl9yZXNpemVhYmxlKGd0aywgY29s dW1uICwgcmVzaXplYWJsZSk7Cn0KLSAodm9pZCkgc2V0Q29sdW1uOihnaW50KSBjb2x1bW4gYXV0 b1Jlc2l6ZTooZ2Jvb2xlYW4pIGF1dG9fcmVzaXplCnsKICAgIGd0a19jbGlzdF9zZXRfY29sdW1u X2F1dG9fcmVzaXplKGd0aywgY29sdW1uICwgYXV0b19yZXNpemUpOwp9Ci0gKGdpbnQpIGNvbHVt bnNBdXRvc2l6ZQp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2NvbHVtbnNfYXV0b3NpemUoZ3RrKTsK fQotIChnaW50KSBvcHRpbWFsQ29sdW1uV2lkdGg6KGdpbnQpIGNvbHVtbgp7CiAgICByZXR1cm4g Z3RrX2NsaXN0X29wdGltYWxfY29sdW1uX3dpZHRoKGd0aywgY29sdW1uKTsKfQotICh2b2lkKSBz ZXRDb2x1bW46KGdpbnQpIGNvbHVtbiB3aWR0aDooZ2ludCkgd2lkdGgKewogICAgZ3RrX2NsaXN0 X3NldF9jb2x1bW5fd2lkdGgoZ3RrLCBjb2x1bW4gLCB3aWR0aCk7Cn0KLSAodm9pZCkgc2V0Q29s dW1uOihnaW50KSBjb2x1bW4gbWluV2lkdGg6KGdpbnQpIG1pbl93aWR0aAp7CiAgICBndGtfY2xp c3Rfc2V0X2NvbHVtbl9taW5fd2lkdGgoZ3RrLCBjb2x1bW4gLCBtaW5fd2lkdGgpOwp9Ci0gKHZv aWQpIHNldENvbHVtbjooZ2ludCkgY29sdW1uIG1heFdpZHRoOihnaW50KSBtYXhfd2lkdGgKewog ICAgZ3RrX2NsaXN0X3NldF9jb2x1bW5fbWF4X3dpZHRoKGd0aywgY29sdW1uICwgbWF4X3dpZHRo KTsKfQotICh2b2lkKSBzZXRSb3dIZWlnaHQ6KGd1aW50KSBoZWlnaHQKewogICAgZ3RrX2NsaXN0 X3NldF9yb3dfaGVpZ2h0KGd0aywgaGVpZ2h0KTsKfQotICh2b2lkKSBtb3ZldG86KGdpbnQpIHJv dyBjb2x1bW46KGdpbnQpIGNvbHVtbiByb3dBbGlnbjooZ2Zsb2F0KSByb3dfYWxpZ24gY29sQWxp Z246KGdmbG9hdCkgY29sX2FsaWduCnsKICAgIGd0a19jbGlzdF9tb3ZldG8oZ3RrLCByb3cgLCBj b2x1bW4gLCByb3dfYWxpZ24gLCBjb2xfYWxpZ24pOwp9Ci0gKEd0a1Zpc2liaWxpdHkpIHJvd0lz VmlzaWJsZTooZ2ludCkgcm93CnsKICAgIHJldHVybiBndGtfY2xpc3Rfcm93X2lzX3Zpc2libGUo Z3RrLCByb3cpOwp9Ci0gKEd0a0NlbGxUeXBlKSBnZXRDZWxsVHlwZTooZ2ludCkgcm93IGNvbHVt bjooZ2ludCkgY29sdW1uCnsKICAgIHJldHVybiBndGtfY2xpc3RfZ2V0X2NlbGxfdHlwZShndGss IHJvdyAsIGNvbHVtbik7Cn0KLSAodm9pZCkgc2V0VGV4dDooZ2ludCkgcm93IGNvbHVtbjooZ2lu dCkgY29sdW1uIHRleHQ6KE5TU3RyaW5nICopIHRleHQKewogICAgZ3RrX2NsaXN0X3NldF90ZXh0 KGd0aywgcm93ICwgY29sdW1uICxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4dCkpOwp9Ci0gKGdp bnQpIGdldFRleHQ6KGdpbnQpIHJvdyBjb2x1bW46KGdpbnQpIGNvbHVtbiB0ZXh0OihOU1N0cmlu ZyAqKikgdGV4dAp7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBnaW50IF9yZXR2YWxfMTsKICAg IF9yZXR2YWxfMSA9IGd0a19jbGlzdF9nZXRfdGV4dChndGssIHJvdyAsIGNvbHVtbiAsJl9vdXR2 YWxfMSk7CiAgICAqIHRleHQgPSBndG9vbGtpdF9vYmpjX3N0cmluZyhfb3V0dmFsXzEpOwogICAg cmV0dXJuIF9yZXR2YWxfMTsKfQotICh2b2lkKSBzZXRQaXhtYXA6KGdpbnQpIHJvdyBjb2x1bW46 KGdpbnQpIGNvbHVtbiBwaXhtYXA6KEdka1BpeG1hcCAqKSBwaXhtYXAgbWFzazooR2RrQml0bWFw ICopIG1hc2sKewogICAgZ3RrX2NsaXN0X3NldF9waXhtYXAoZ3RrLCByb3cgLCBjb2x1bW4gLCBw aXhtYXAgLCBtYXNrKTsKfQotIChnaW50KSBnZXRQaXhtYXA6KGdpbnQpIHJvdyBjb2x1bW46KGdp bnQpIGNvbHVtbiBwaXhtYXA6KEdka1BpeG1hcCAqKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAq KikgbWFzawp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2dldF9waXhtYXAoZ3RrLCByb3cgLCBjb2x1 bW4gLCBwaXhtYXAgLCBtYXNrKTsKfQotICh2b2lkKSBzZXRQaXh0ZXh0OihnaW50KSByb3cgY29s dW1uOihnaW50KSBjb2x1bW4gdGV4dDooTlNTdHJpbmcgKikgdGV4dCBzcGFjaW5nOihndWludDgp IHNwYWNpbmcgcGl4bWFwOihHZGtQaXhtYXAgKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAqKSBt YXNrCnsKICAgIGd0a19jbGlzdF9zZXRfcGl4dGV4dChndGssIHJvdyAsIGNvbHVtbiAsZ3Rvb2xr aXRfdXRmOF9zdHJpbmcoIHRleHQgKSwgc3BhY2luZyAsIHBpeG1hcCAsIG1hc2spOwp9Ci0gKGdp bnQpIGdldFBpeHRleHQ6KGdpbnQpIHJvdyBjb2x1bW46KGdpbnQpIGNvbHVtbiB0ZXh0OihOU1N0 cmluZyAqKikgdGV4dCBzcGFjaW5nOihndWludDggKikgc3BhY2luZyBwaXhtYXA6KEdka1BpeG1h cCAqKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAqKikgbWFzawp7CiAgICBjaGFyICpfb3V0dmFs XzE7CiAgICBnaW50IF9yZXR2YWxfMTsKICAgIF9yZXR2YWxfMSA9IGd0a19jbGlzdF9nZXRfcGl4 dGV4dChndGssIHJvdyAsIGNvbHVtbiAsJl9vdXR2YWxfMSwgc3BhY2luZyAsIHBpeG1hcCAsIG1h c2spOwogICAgKiB0ZXh0ICA9IGd0b29sa2l0X29iamNfc3RyaW5nKF9vdXR2YWxfMSk7CiAgICBy ZXR1cm4gX3JldHZhbF8xOwp9Ci0gKHZvaWQpIHNldEZvcmVncm91bmQ6KGdpbnQpIHJvdyBjb2xv cjooR2RrQ29sb3IgKikgY29sb3IKewogICAgZ3RrX2NsaXN0X3NldF9mb3JlZ3JvdW5kKGd0aywg cm93ICwgY29sb3IpOwp9Ci0gKHZvaWQpIHNldEJhY2tncm91bmQ6KGdpbnQpIHJvdyBjb2xvcjoo R2RrQ29sb3IgKikgY29sb3IKewogICAgZ3RrX2NsaXN0X3NldF9iYWNrZ3JvdW5kKGd0aywgcm93 ICwgY29sb3IpOwp9Ci0gKHZvaWQpIHNldENlbGxTdHlsZTooZ2ludCkgcm93IGNvbHVtbjooZ2lu dCkgY29sdW1uIHN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY2xpc3Rfc2V0X2Nl bGxfc3R5bGUoZ3RrLCByb3cgLCBjb2x1bW4gLCBzdHlsZSA/IHN0eWxlLT5ndGsgOiAwKTsKfQot IChHVEtTdHlsZSAqKSBnZXRDZWxsU3R5bGU6KGdpbnQpIHJvdyBjb2x1bW46KGdpbnQpIGNvbHVt bgp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19jbGlzdF9nZXRfY2VsbF9zdHlsZShn dGssIHJvdyAsIGNvbHVtbiksICJHVEtTdHlsZSIpOwp9Ci0gKHZvaWQpIHNldFJvdzooZ2ludCkg cm93IHN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY2xpc3Rfc2V0X3Jvd19zdHls ZShndGssIHJvdyAsIHN0eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9Ci0gKEdUS1N0eWxlICopIGdl dFJvd1N0eWxlOihnaW50KSByb3cKewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfY2xp c3RfZ2V0X3Jvd19zdHlsZShndGssIHJvdyksICJHVEtTdHlsZSIpOwp9Ci0gKHZvaWQpIHNldFNo aWZ0OihnaW50KSByb3cgY29sdW1uOihnaW50KSBjb2x1bW4gdmVydGljYWw6KGdpbnQpIHZlcnRp Y2FsIGhvcml6b250YWw6KGdpbnQpIGhvcml6b250YWwKewogICAgZ3RrX2NsaXN0X3NldF9zaGlm dChndGssIHJvdyAsIGNvbHVtbiAsIHZlcnRpY2FsICwgaG9yaXpvbnRhbCk7Cn0KLSAodm9pZCkg c2V0U2VsZWN0YWJsZTooZ2ludCkgcm93IHNlbGVjdGFibGU6KGdib29sZWFuKSBzZWxlY3RhYmxl CnsKICAgIGd0a19jbGlzdF9zZXRfc2VsZWN0YWJsZShndGssIHJvdyAsIHNlbGVjdGFibGUpOwp9 Ci0gKGdib29sZWFuKSBnZXRTZWxlY3RhYmxlOihnaW50KSByb3cKewogICAgcmV0dXJuIGd0a19j bGlzdF9nZXRfc2VsZWN0YWJsZShndGssIHJvdyk7Cn0KLSAoZ2ludCkgcHJlcGVuZDooTlNBcnJh eSAgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X3ByZXBlbmQoZ3RrLChjaGFyICoqKWd0 b29sa2l0X2FycmF5X3RvX3N0cnZlYyggdGV4dCkpOwp9Ci0gKGdpbnQpIGFwcGVuZDooTlNBcnJh eSAgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2FwcGVuZChndGssKGNoYXIgKiopZ3Rv b2xraXRfYXJyYXlfdG9fc3RydmVjKCB0ZXh0KSk7Cn0KLSAoZ2ludCkgaW5zZXJ0OihnaW50KSBy b3cgdGV4dDooTlNBcnJheSAgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2luc2VydChn dGssIHJvdyAsKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3RydmVjKCB0ZXh0KSk7Cn0KLSAo dm9pZCkgcmVtb3ZlOihnaW50KSByb3cKewogICAgZ3RrX2NsaXN0X3JlbW92ZShndGssIHJvdyk7 Cn0KLSAodm9pZCkgc2V0Um93OihnaW50KSByb3cgZGF0YTooZ3BvaW50ZXIpIGRhdGEKewogICAg Z3RrX2NsaXN0X3NldF9yb3dfZGF0YShndGssIHJvdyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHNldFJv d0RhdGFGdWxsOihnaW50KSByb3cgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZGVzdHJveTooR3RrRGVz dHJveU5vdGlmeSkgZGVzdHJveQp7CiAgICBndGtfY2xpc3Rfc2V0X3Jvd19kYXRhX2Z1bGwoZ3Rr LCByb3cgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAoZ3BvaW50ZXIpIGdldFJvd0RhdGE6KGdpbnQp IHJvdwp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2dldF9yb3dfZGF0YShndGssIHJvdyk7Cn0KLSAo Z2ludCkgZmluZFJvd0Zyb21EYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2Ns aXN0X2ZpbmRfcm93X2Zyb21fZGF0YShndGssIGRhdGEpOwp9Ci0gKHZvaWQpIHNlbGVjdFJvdzoo Z2ludCkgcm93IGNvbHVtbjooZ2ludCkgY29sdW1uCnsKICAgIGd0a19jbGlzdF9zZWxlY3Rfcm93 KGd0aywgcm93ICwgY29sdW1uKTsKfQotICh2b2lkKSB1bnNlbGVjdFJvdzooZ2ludCkgcm93IGNv bHVtbjooZ2ludCkgY29sdW1uCnsKICAgIGd0a19jbGlzdF91bnNlbGVjdF9yb3coZ3RrLCByb3cg LCBjb2x1bW4pOwp9Ci0gKHZvaWQpIHVuZG9TZWxlY3Rpb24KewogICAgZ3RrX2NsaXN0X3VuZG9f c2VsZWN0aW9uKGd0ayk7Cn0KLSAodm9pZCkgY2xlYXIKewogICAgZ3RrX2NsaXN0X2NsZWFyKGd0 ayk7Cn0KLSAoZ2ludCkgZ2V0U2VsZWN0aW9uSW5mbzooZ2ludCkgeCB5OihnaW50KSB5IHJvdzoo Z2ludCAqKSByb3cgY29sdW1uOihnaW50ICopIGNvbHVtbgp7CiAgICByZXR1cm4gZ3RrX2NsaXN0 X2dldF9zZWxlY3Rpb25faW5mbyhndGssIHggLCB5ICwgcm93ICwgY29sdW1uKTsKfQotICh2b2lk KSBzZWxlY3RBbGwKewogICAgZ3RrX2NsaXN0X3NlbGVjdF9hbGwoZ3RrKTsKfQotICh2b2lkKSB1 bnNlbGVjdEFsbAp7CiAgICBndGtfY2xpc3RfdW5zZWxlY3RfYWxsKGd0ayk7Cn0KLSAodm9pZCkg c3dhcFJvd3M6KGdpbnQpIHJvdzEgcm93MjooZ2ludCkgcm93Mgp7CiAgICBndGtfY2xpc3Rfc3dh cF9yb3dzKGd0aywgcm93MSAsIHJvdzIpOwp9Ci0gKHZvaWQpIHJvd01vdmU6KGdpbnQpIHNvdXJj ZV9yb3cgZGVzdFJvdzooZ2ludCkgZGVzdF9yb3cKewogICAgZ3RrX2NsaXN0X3Jvd19tb3ZlKGd0 aywgc291cmNlX3JvdyAsIGRlc3Rfcm93KTsKfQotICh2b2lkKSBzZXRDb21wYXJlRnVuYzooR3Rr Q0xpc3RDb21wYXJlRnVuYykgY21wX2Z1bmMKewogICAgZ3RrX2NsaXN0X3NldF9jb21wYXJlX2Z1 bmMoZ3RrLCBjbXBfZnVuYyk7Cn0KLSAodm9pZCkgc2V0U29ydENvbHVtbjooZ2ludCkgY29sdW1u CnsKICAgIGd0a19jbGlzdF9zZXRfc29ydF9jb2x1bW4oZ3RrLCBjb2x1bW4pOwp9Ci0gKHZvaWQp IHNldFNvcnRUeXBlOihHdGtTb3J0VHlwZSkgc29ydF90eXBlCnsKICAgIGd0a19jbGlzdF9zZXRf c29ydF90eXBlKGd0aywgc29ydF90eXBlKTsKfQotICh2b2lkKSBzb3J0CnsKICAgIGd0a19jbGlz dF9zb3J0KGd0ayk7Cn0KLSAodm9pZCkgc2V0QXV0b1NvcnQ6KGdib29sZWFuKSBhdXRvX3NvcnQK ewogICAgZ3RrX2NsaXN0X3NldF9hdXRvX3NvcnQoZ3RrLCBhdXRvX3NvcnQpOwp9CkBlbmQKLyoK ICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAog KiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5l cmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2NvbG9yc2VsLmggYnkgZ3RrZ2VuLgogKgogKiBU aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh bCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0Nv bG9yU2VsZWN0aW9uLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQ29sb3JTZWxlY3Rpb24KKyAoR3Rr VHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2NvbG9yX3NlbGVjdGlvbl9nZXRfdHlwZSgp Owp9CisgKGlkKSBjb2xvclNlbGVjdGlvbgp7CiAgICByZXR1cm4gW1soR1RLQ29sb3JTZWxlY3Rp b24gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAg IHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY29sb3Jfc2VsZWN0aW9uX25ldygpXTsKfQot ICh2b2lkKSBzZXRVcGRhdGVQb2xpY3k6KEd0a1VwZGF0ZVR5cGUpIHBvbGljeQp7CiAgICBndGtf Y29sb3Jfc2VsZWN0aW9uX3NldF91cGRhdGVfcG9saWN5KGd0aywgcG9saWN5KTsKfQotICh2b2lk KSBzZXRPcGFjaXR5OihnaW50KSB1c2Vfb3BhY2l0eQp7CiAgICBndGtfY29sb3Jfc2VsZWN0aW9u X3NldF9vcGFjaXR5KGd0aywgdXNlX29wYWNpdHkpOwp9Ci0gKHZvaWQpIHNldENvbG9yOihnZG91 YmxlICopIGNvbG9yCnsKICAgIGd0a19jb2xvcl9zZWxlY3Rpb25fc2V0X2NvbG9yKGd0aywgY29s b3IpOwp9Ci0gKHZvaWQpIGdldENvbG9yOihnZG91YmxlICopIGNvbG9yCnsKICAgIGd0a19jb2xv cl9zZWxlY3Rpb25fZ2V0X2NvbG9yKGd0aywgY29sb3IpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQg LSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQg KGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21h dGljYWxseSBmcm9tIGd0a2NvbG9yc2VsLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkg aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlm eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICog TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0NvbG9yU2VsZWN0aW9u RGlhbG9nLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQ29sb3JTZWxlY3Rpb25EaWFsb2cKKyAoR3Rr VHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2NvbG9yX3NlbGVjdGlvbl9kaWFsb2dfZ2V0 X3R5cGUoKTsKfQorIChpZCkgY29sb3JTZWxlY3Rpb25EaWFsb2dXaXRoVGl0bGU6KE5TU3RyaW5n ICopIHRpdGxlCnsKICAgIHJldHVybiBbWyhHVEtDb2xvclNlbGVjdGlvbkRpYWxvZyAqKVtzZWxm IGFsbG9jXSBpbml0V2l0aFRpdGxlOnRpdGxlXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRX aXRoVGl0bGU6KE5TU3RyaW5nICopIHRpdGxlCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0 azpndGtfY29sb3Jfc2VsZWN0aW9uX2RpYWxvZ19uZXcoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRp dGxlKSldOwp9CiNkZWZpbmUgZ3RrCSgoR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2cgKikgZ3RrKQot IChHVEtDb2xvclNlbGVjdGlvbiAqKSBjb2xvclNlbGVjdGlvbgp7CiAgICByZXR1cm4gR1RPT0xL SVRfT0JKRUNUKGd0ay0+Y29sb3JzZWwpOwp9Ci0gKEdUS1dpZGdldCAqKSBva0J1dHRvbgp7CiAg ICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+b2tfYnV0dG9uKTsKfQotIChHVEtXaWRnZXQg KikgcmVzZXRCdXR0b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPnJlc2V0X2J1 dHRvbik7Cn0KLSAoR1RLV2lkZ2V0ICopIGNhbmNlbEJ1dHRvbgp7CiAgICByZXR1cm4gR1RPT0xL SVRfT0JKRUNUKGd0ay0+Y2FuY2VsX2J1dHRvbik7Cn0KLSAoR1RLV2lkZ2V0ICopIGhlbHBCdXR0 b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmhlbHBfYnV0dG9uKTsKfQojdW5k ZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhl IEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1 ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2NvbWJvLmggYnkgZ3Rr Z2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM ZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdU b29sS2l0L0dUS0NvbWJvLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJdGVtLmg+CgpAaW1wbGVt ZW50YXRpb24gR1RLQ29tYm8KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2Nv bWJvX2dldF90eXBlKCk7Cn0KKyAoaWQpIGNvbWJvCnsKICAgIHJldHVybiBbWyhHVEtDb21ibyAq KVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0 dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19jb21ib19uZXcoKV07Cn0KLSAodm9pZCkgc2V0VmFs dWVJbkxpc3Q6KGdpbnQpIHZhbCBva0lmRW1wdHk6KGdpbnQpIG9rX2lmX2VtcHR5CnsKICAgIGd0 a19jb21ib19zZXRfdmFsdWVfaW5fbGlzdChndGssIHZhbCAsIG9rX2lmX2VtcHR5KTsKfQotICh2 b2lkKSBzZXRVc2VBcnJvd3M6KGdpbnQpIHZhbAp7CiAgICBndGtfY29tYm9fc2V0X3VzZV9hcnJv d3MoZ3RrLCB2YWwpOwp9Ci0gKHZvaWQpIHNldFVzZUFycm93c0Fsd2F5czooZ2ludCkgdmFsCnsK ICAgIGd0a19jb21ib19zZXRfdXNlX2Fycm93c19hbHdheXMoZ3RrLCB2YWwpOwp9Ci0gKHZvaWQp IHNldENhc2VTZW5zaXRpdmU6KGdpbnQpIHZhbAp7CiAgICBndGtfY29tYm9fc2V0X2Nhc2Vfc2Vu c2l0aXZlKGd0aywgdmFsKTsKfQotICh2b2lkKSBzZXRJdGVtU3RyaW5nOihHVEtJdGVtKikgaXRl bSBpdGVtVmFsdWU6KE5TU3RyaW5nICopIGl0ZW1fdmFsdWUKewogICAgZ3RrX2NvbWJvX3NldF9p dGVtX3N0cmluZyhndGssIGl0ZW0gID8gaXRlbSAtPmd0ayA6IDAsZ3Rvb2xraXRfdXRmOF9zdHJp bmcoIGl0ZW1fdmFsdWUpKTsKfQotICh2b2lkKSBzZXRQb3Bkb3duU3RyaW5nczooTlNBcnJheSAq KSBzdHJpbmdzCnsKICAgIGd0a19jb21ib19zZXRfcG9wZG93bl9zdHJpbmdzKGd0ayxndG9vbGtp dF9hcnJheV90b19saXN0KCBzdHJpbmdzKSk7Cn0KLSAodm9pZCkgZGlzYWJsZUFjdGl2YXRlCnsK ICAgIGd0a19jb21ib19kaXNhYmxlX2FjdGl2YXRlKGd0ayk7Cn0KI2RlZmluZSBndGsJKChHdGtD b21ibyAqKSBndGspCi0gKGlkKSBlbnRyeQp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0 ay0+ZW50cnkpOwp9Ci0gKEdUS1dpZGdldCAqKSBsaXN0CnsKICAgIHJldHVybiBHVE9PTEtJVF9P QkpFQ1QoZ3RrLT5saXN0KTsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmpl Y3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5 OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxs eSBmcm9tIGd0a2NvbnRhaW5lci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgog KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtDb250YWluZXIuaD4KI2luY2x1 ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVu dC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0NvbnRhaW5lcgorIChHdGtUeXBlKSBnZXRUeXBlCnsK ICAgIHJldHVybiBndGtfY29udGFpbmVyX2dldF90eXBlKCk7Cn0KLSAodm9pZCkgc2V0Qm9yZGVy V2lkdGg6KGd1aW50KSBib3JkZXJfd2lkdGgKewogICAgZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVy X3dpZHRoKGd0aywgYm9yZGVyX3dpZHRoKTsKfQotICh2b2lkKSBhZGQ6KEdUS1dpZGdldCAqKSB3 aWRnZXQKewogICAgZ3RrX2NvbnRhaW5lcl9hZGQoZ3RrLCB3aWRnZXQgPyB3aWRnZXQtPmd0ayA6 IDApOwp9Ci0gKHZvaWQpIHJlbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldAp7CiAgICBndGtfY29u dGFpbmVyX3JlbW92ZShndGssIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg c2V0UmVzaXplTW9kZTooR3RrUmVzaXplTW9kZSkgcmVzaXplX21vZGUKewogICAgZ3RrX2NvbnRh aW5lcl9zZXRfcmVzaXplX21vZGUoZ3RrLCByZXNpemVfbW9kZSk7Cn0KLSAodm9pZCkgY2hlY2tS ZXNpemUKewogICAgZ3RrX2NvbnRhaW5lcl9jaGVja19yZXNpemUoZ3RrKTsKfQotICh2b2lkKSBm b3JlYWNoOihHdGtDYWxsYmFjaykgY2FsbGJhY2sgY2FsbGJhY2tEYXRhOihncG9pbnRlcikgY2Fs bGJhY2tfZGF0YQp7CiAgICBndGtfY29udGFpbmVyX2ZvcmVhY2goZ3RrLCBjYWxsYmFjayAsIGNh bGxiYWNrX2RhdGEpOwp9Ci0gKHZvaWQpIGZvcmVhY2hGdWxsOihHdGtDYWxsYmFjaykgY2FsbGJh Y2sgbWFyc2hhbDooR3RrQ2FsbGJhY2tNYXJzaGFsKSBtYXJzaGFsIGNhbGxiYWNrRGF0YTooZ3Bv aW50ZXIpIGNhbGxiYWNrX2RhdGEgbm90aWZ5OihHdGtEZXN0cm95Tm90aWZ5KSBub3RpZnkKewog ICAgZ3RrX2NvbnRhaW5lcl9mb3JlYWNoX2Z1bGwoZ3RrLCBjYWxsYmFjayAsIG1hcnNoYWwgLCBj YWxsYmFja19kYXRhICwgbm90aWZ5KTsKfQotIChOU0FycmF5ICopIGNoaWxkcmVuCnsKICAgIHJl dHVybiBndG9vbGtpdF9saXN0X3RvX2FycmF5KGd0a19jb250YWluZXJfY2hpbGRyZW4oZ3RrKSk7 Cn0KLSAoZ2ludCkgZm9jdXM6KEd0a0RpcmVjdGlvblR5cGUpIGRpcmVjdGlvbgp7CiAgICByZXR1 cm4gZ3RrX2NvbnRhaW5lcl9mb2N1cyhndGssIGRpcmVjdGlvbik7Cn0KLSAodm9pZCkgc2V0UmVh bGxvY2F0ZVJlZHJhd3M6KGdib29sZWFuKSBuZWVkc19yZWRyYXdzCnsKICAgIGd0a19jb250YWlu ZXJfc2V0X3JlYWxsb2NhdGVfcmVkcmF3cyhndGssIG5lZWRzX3JlZHJhd3MpOwp9Ci0gKHZvaWQp IHNldEZvY3VzQ2hpbGQ6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBndGtfY29udGFpbmVyX3Nl dF9mb2N1c19jaGlsZChndGssIGNoaWxkID8gY2hpbGQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNl dEZvY3VzVmFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtf Y29udGFpbmVyX3NldF9mb2N1c192YWRqdXN0bWVudChndGssIGFkanVzdG1lbnQgPyBhZGp1c3Rt ZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRGb2N1c0hhZGp1c3RtZW50OihHVEtBZGp1c3Rt ZW50ICopIGFkanVzdG1lbnQKewogICAgZ3RrX2NvbnRhaW5lcl9zZXRfZm9jdXNfaGFkanVzdG1l bnQoZ3RrLCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcmVn aXN0ZXJUb3BsZXZlbAp7CiAgICBndGtfY29udGFpbmVyX3JlZ2lzdGVyX3RvcGxldmVsKGd0ayk7 Cn0KLSAodm9pZCkgdW5yZWdpc3RlclRvcGxldmVsCnsKICAgIGd0a19jb250YWluZXJfdW5yZWdp c3Rlcl90b3BsZXZlbChndGspOwp9CisgKE5TQXJyYXkgKikgZ2V0VG9wbGV2ZWxzCnsKICAgIHJl dHVybiBndG9vbGtpdF9saXN0X3RvX2FycmF5KGd0a19jb250YWluZXJfZ2V0X3RvcGxldmVscygp KTsKfQotICh2b2lkKSByZXNpemVDaGlsZHJlbgp7CiAgICBndGtfY29udGFpbmVyX3Jlc2l6ZV9j aGlsZHJlbihndGspOwp9Ci0gKEd0a1R5cGUpIGNoaWxkVHlwZQp7CiAgICByZXR1cm4gZ3RrX2Nv bnRhaW5lcl9jaGlsZF90eXBlKGd0ayk7Cn0KKyAodm9pZCkgYWRkQ2hpbGRBcmdUeXBlOihOU1N0 cmluZyAqKSBhcmdfbmFtZSBhcmdUeXBlOihHdGtUeXBlKSBhcmdfdHlwZSBhcmdGbGFnczooZ3Vp bnQpIGFyZ19mbGFncyBhcmdJZDooZ3VpbnQpIGFyZ19pZAp7CiAgICBndGtfY29udGFpbmVyX2Fk ZF9jaGlsZF9hcmdfdHlwZShndG9vbGtpdF91dGY4X3N0cmluZyggYXJnX25hbWUgKSwgYXJnX3R5 cGUgLCBhcmdfZmxhZ3MgLCBhcmdfaWQpOwp9CisgKEd0a0FyZyopIHF1ZXJ5Q2hpbGRBcmdzOihH dGtUeXBlKSBjbGFzc190eXBlIGFyZ0ZsYWdzOihndWludDMyICoqKSBhcmdfZmxhZ3MgbkFyZ3M6 KGd1aW50ICopIG5hcmdzCnsKICAgIHJldHVybiBndGtfY29udGFpbmVyX3F1ZXJ5X2NoaWxkX2Fy Z3MoIGNsYXNzX3R5cGUgLCBhcmdfZmxhZ3MgLCBuYXJncyk7Cn0KLSAodm9pZCkgY2hpbGRHZXR2 OihHVEtXaWRnZXQgKikgY2hpbGQgbkFyZ3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJnICop IGFyZ3MKewogICAgZ3RrX2NvbnRhaW5lcl9jaGlsZF9nZXR2KGd0aywgY2hpbGQgID8gY2hpbGQg LT5ndGsgOiAwLCBuX2FyZ3MgLCBhcmdzKTsKfQotICh2b2lkKSBjaGlsZFNldHY6KEdUS1dpZGdl dCAqKSBjaGlsZCBuQXJnczooZ3VpbnQpIG5fYXJncyBhcmdzOihHdGtBcmcgKikgYXJncwp7CiAg ICBndGtfY29udGFpbmVyX2NoaWxkX3NldHYoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAs IG5fYXJncyAsIGFyZ3MpOwp9Ci0gKHZvaWQpIGFkZHY6KEdUS1dpZGdldCAqKSB3aWRnZXQgbkFy Z3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJnICopIGFyZ3MKewogICAgZ3RrX2NvbnRhaW5l cl9hZGR2KGd0aywgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6IDAsIG5fYXJncyAsIGFyZ3MpOwp9 CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2N0cmVlLmggYnkgZ3RrZ2VuLgog KgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIg R2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0 L0dUS0NUcmVlLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtTdHlsZS5oPgoKQGltcGxlbWVudGF0 aW9uIEdUS0NUcmVlCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19jdHJlZV9n ZXRfdHlwZSgpOwp9CisgKGlkKSBjVHJlZVdpdGhUaXRsZXM6KGdpbnQpIGNvbHVtbnMgdHJlZUNv bHVtbjooZ2ludCkgdHJlZV9jb2x1bW4gdGl0bGVzOihOU0FycmF5ICAqKSB0aXRsZXMKewogICAg cmV0dXJuIFtbKEdUS0NUcmVlICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVGl0bGVzOmNvbHVtbnMg dHJlZUNvbHVtbjp0cmVlX2NvbHVtbiB0aXRsZXM6dGl0bGVzXSBhdXRvcmVsZWFzZV07Cn0KLSAo aWQpIGluaXRXaXRoVGl0bGVzOihnaW50KSBjb2x1bW5zIHRyZWVDb2x1bW46KGdpbnQpIHRyZWVf Y29sdW1uIHRpdGxlczooTlNBcnJheSAgKikgdGl0bGVzCnsKICAgIHJldHVybiBbc2VsZiBpbml0 V2l0aEd0azpndGtfY3RyZWVfbmV3X3dpdGhfdGl0bGVzKCBjb2x1bW5zICwgdHJlZV9jb2x1bW4g LChjaGFyICoqKWd0b29sa2l0X2FycmF5X3RvX3N0cnZlYyggdGl0bGVzKSldOwp9CisgKGlkKSBj VHJlZVdpdGhDb2x1bW5zOihnaW50KSBjb2x1bW5zIHRyZWVDb2x1bW46KGdpbnQpIHRyZWVfY29s dW1uCnsKICAgIHJldHVybiBbWyhHVEtDVHJlZSAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aENvbHVt bnM6Y29sdW1ucyB0cmVlQ29sdW1uOnRyZWVfY29sdW1uXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp IGluaXRXaXRoQ29sdW1uczooZ2ludCkgY29sdW1ucyB0cmVlQ29sdW1uOihnaW50KSB0cmVlX2Nv bHVtbgp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2N0cmVlX25ldyggY29sdW1u cyAsIHRyZWVfY29sdW1uKV07Cn0KLSAoR3RrQ1RyZWVOb2RlICopIGluc2VydE5vZGU6KEd0a0NU cmVlTm9kZSAqKSBwYXJlbnQgc2libGluZzooR3RrQ1RyZWVOb2RlICopIHNpYmxpbmcgdGV4dDoo TlNBcnJheSAgKikgdGV4dCBzcGFjaW5nOihndWludDgpIHNwYWNpbmcgcGl4bWFwQ2xvc2VkOihH ZGtQaXhtYXAgKikgcGl4bWFwX2Nsb3NlZCBtYXNrQ2xvc2VkOihHZGtCaXRtYXAgKikgbWFza19j bG9zZWQgcGl4bWFwT3BlbmVkOihHZGtQaXhtYXAgKikgcGl4bWFwX29wZW5lZCBtYXNrT3BlbmVk OihHZGtCaXRtYXAgKikgbWFza19vcGVuZWQgaXNMZWFmOihnYm9vbGVhbikgaXNfbGVhZiBleHBh bmRlZDooZ2Jvb2xlYW4pIGV4cGFuZGVkCnsKICAgIHJldHVybiBndGtfY3RyZWVfaW5zZXJ0X25v ZGUoZ3RrLCBwYXJlbnQgLCBzaWJsaW5nICwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2 ZWMoIHRleHQgKSwgc3BhY2luZyAsIHBpeG1hcF9jbG9zZWQgLCBtYXNrX2Nsb3NlZCAsIHBpeG1h cF9vcGVuZWQgLCBtYXNrX29wZW5lZCAsIGlzX2xlYWYgLCBleHBhbmRlZCk7Cn0KLSAodm9pZCkg cmVtb3ZlTm9kZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3JlbW92ZV9u b2RlKGd0aywgbm9kZSk7Cn0KLSAoR3RrQ1RyZWVOb2RlICopIGluc2VydEdub2RlOihHdGtDVHJl ZU5vZGUgKikgcGFyZW50IHNpYmxpbmc6KEd0a0NUcmVlTm9kZSAqKSBzaWJsaW5nIGdub2RlOihH Tm9kZSAqKSBnbm9kZSBmdW5jOihHdGtDVHJlZUdOb2RlRnVuYykgZnVuYyBkYXRhOihncG9pbnRl cikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2luc2VydF9nbm9kZShndGssIHBhcmVudCAs IHNpYmxpbmcgLCBnbm9kZSAsIGZ1bmMgLCBkYXRhKTsKfQotIChHTm9kZSAqKSBleHBvcnRUb0du b2RlOihHTm9kZSAqKSBwYXJlbnQgc2libGluZzooR05vZGUgKikgc2libGluZyBub2RlOihHdGtD VHJlZU5vZGUgKikgbm9kZSBmdW5jOihHdGtDVHJlZUdOb2RlRnVuYykgZnVuYyBkYXRhOihncG9p bnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2V4cG9ydF90b19nbm9kZShndGssIHBh cmVudCAsIHNpYmxpbmcgLCBub2RlICwgZnVuYyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHBvc3RSZWN1 cnNpdmU6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGZ1bmM6KEd0a0NUcmVlRnVuYykgZnVuYyBkYXRh OihncG9pbnRlcikgZGF0YQp7CiAgICBndGtfY3RyZWVfcG9zdF9yZWN1cnNpdmUoZ3RrLCBub2Rl ICwgZnVuYyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHBvc3RSZWN1cnNpdmU6KEd0a0NUcmVlTm9kZSAq KSBub2RlIHRvRGVwdGg6KGdpbnQpIGRlcHRoIGZ1bmM6KEd0a0NUcmVlRnVuYykgZnVuYyBkYXRh OihncG9pbnRlcikgZGF0YQp7CiAgICBndGtfY3RyZWVfcG9zdF9yZWN1cnNpdmVfdG9fZGVwdGgo Z3RrLCBub2RlICwgZGVwdGggLCBmdW5jICwgZGF0YSk7Cn0KLSAodm9pZCkgcHJlUmVjdXJzaXZl OihHdGtDVHJlZU5vZGUgKikgbm9kZSBmdW5jOihHdGtDVHJlZUZ1bmMpIGZ1bmMgZGF0YTooZ3Bv aW50ZXIpIGRhdGEKewogICAgZ3RrX2N0cmVlX3ByZV9yZWN1cnNpdmUoZ3RrLCBub2RlICwgZnVu YyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHByZVJlY3Vyc2l2ZTooR3RrQ1RyZWVOb2RlICopIG5vZGUg dG9EZXB0aDooZ2ludCkgZGVwdGggZnVuYzooR3RrQ1RyZWVGdW5jKSBmdW5jIGRhdGE6KGdwb2lu dGVyKSBkYXRhCnsKICAgIGd0a19jdHJlZV9wcmVfcmVjdXJzaXZlX3RvX2RlcHRoKGd0aywgbm9k ZSAsIGRlcHRoICwgZnVuYyAsIGRhdGEpOwp9Ci0gKGdib29sZWFuKSBpc1ZpZXdhYmxlOihHdGtD VHJlZU5vZGUgKikgbm9kZQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2lzX3ZpZXdhYmxlKGd0aywg bm9kZSk7Cn0KLSAoR3RrQ1RyZWVOb2RlICopIGxhc3Q6KEd0a0NUcmVlTm9kZSAqKSBub2RlCnsK ICAgIHJldHVybiBndGtfY3RyZWVfbGFzdChndGssIG5vZGUpOwp9Ci0gKEd0a0NUcmVlTm9kZSAq KSBmaW5kTm9kZVB0cjooR3RrQ1RyZWVSb3cgKikgY3RyZWVfcm93CnsKICAgIHJldHVybiBndGtf Y3RyZWVfZmluZF9ub2RlX3B0cihndGssIGN0cmVlX3Jvdyk7Cn0KLSAoR3RrQ1RyZWVOb2RlICop IG5vZGVOdGg6KGd1aW50KSByb3cKewogICAgcmV0dXJuIGd0a19jdHJlZV9ub2RlX250aChndGss IHJvdyk7Cn0KLSAoZ2Jvb2xlYW4pIGZpbmQ6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGNoaWxkOihH dGtDVHJlZU5vZGUgKikgY2hpbGQKewogICAgcmV0dXJuIGd0a19jdHJlZV9maW5kKGd0aywgbm9k ZSAsIGNoaWxkKTsKfQotIChnYm9vbGVhbikgaXNBbmNlc3RvcjooR3RrQ1RyZWVOb2RlICopIG5v ZGUgY2hpbGQ6KEd0a0NUcmVlTm9kZSAqKSBjaGlsZAp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2lz X2FuY2VzdG9yKGd0aywgbm9kZSAsIGNoaWxkKTsKfQotIChHdGtDVHJlZU5vZGUgKikgZmluZEJ5 Um93OihHdGtDVHJlZU5vZGUgKikgbm9kZSBkYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1 cm4gZ3RrX2N0cmVlX2ZpbmRfYnlfcm93X2RhdGEoZ3RrLCBub2RlICwgZGF0YSk7Cn0KLSAoR0xp c3QgKikgZmluZEFsbEJ5Um93OihHdGtDVHJlZU5vZGUgKikgbm9kZSBkYXRhOihncG9pbnRlcikg ZGF0YQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2ZpbmRfYWxsX2J5X3Jvd19kYXRhKGd0aywgbm9k ZSAsIGRhdGEpOwp9Ci0gKEd0a0NUcmVlTm9kZSAqKSBmaW5kQnlSb3dEYXRhQ3VzdG9tOihHdGtD VHJlZU5vZGUgKikgbm9kZSBkYXRhOihncG9pbnRlcikgZGF0YSBmdW5jOihHQ29tcGFyZUZ1bmMp IGZ1bmMKewogICAgcmV0dXJuIGd0a19jdHJlZV9maW5kX2J5X3Jvd19kYXRhX2N1c3RvbShndGss IG5vZGUgLCBkYXRhICwgZnVuYyk7Cn0KLSAoR0xpc3QgKikgZmluZEFsbEJ5Um93RGF0YUN1c3Rv bTooR3RrQ1RyZWVOb2RlICopIG5vZGUgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZnVuYzooR0NvbXBh cmVGdW5jKSBmdW5jCnsKICAgIHJldHVybiBndGtfY3RyZWVfZmluZF9hbGxfYnlfcm93X2RhdGFf Y3VzdG9tKGd0aywgbm9kZSAsIGRhdGEgLCBmdW5jKTsKfQotIChnYm9vbGVhbikgaXNIb3RTcG90 OihnaW50KSB4IHk6KGdpbnQpIHkKewogICAgcmV0dXJuIGd0a19jdHJlZV9pc19ob3Rfc3BvdChn dGssIHggLCB5KTsKfQotICh2b2lkKSBtb3ZlOihHdGtDVHJlZU5vZGUgKikgbm9kZSBuZXdQYXJl bnQ6KEd0a0NUcmVlTm9kZSAqKSBuZXdfcGFyZW50IG5ld1NpYmxpbmc6KEd0a0NUcmVlTm9kZSAq KSBuZXdfc2libGluZwp7CiAgICBndGtfY3RyZWVfbW92ZShndGssIG5vZGUgLCBuZXdfcGFyZW50 ICwgbmV3X3NpYmxpbmcpOwp9Ci0gKHZvaWQpIGV4cGFuZDooR3RrQ1RyZWVOb2RlICopIG5vZGUK ewogICAgZ3RrX2N0cmVlX2V4cGFuZChndGssIG5vZGUpOwp9Ci0gKHZvaWQpIGV4cGFuZFJlY3Vy c2l2ZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX2V4cGFuZF9yZWN1cnNp dmUoZ3RrLCBub2RlKTsKfQotICh2b2lkKSBleHBhbmQ6KEd0a0NUcmVlTm9kZSAqKSBub2RlIHRv RGVwdGg6KGdpbnQpIGRlcHRoCnsKICAgIGd0a19jdHJlZV9leHBhbmRfdG9fZGVwdGgoZ3RrLCBu b2RlICwgZGVwdGgpOwp9Ci0gKHZvaWQpIGNvbGxhcHNlOihHdGtDVHJlZU5vZGUgKikgbm9kZQp7 CiAgICBndGtfY3RyZWVfY29sbGFwc2UoZ3RrLCBub2RlKTsKfQotICh2b2lkKSBjb2xsYXBzZVJl Y3Vyc2l2ZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX2NvbGxhcHNlX3Jl Y3Vyc2l2ZShndGssIG5vZGUpOwp9Ci0gKHZvaWQpIGNvbGxhcHNlOihHdGtDVHJlZU5vZGUgKikg bm9kZSB0b0RlcHRoOihnaW50KSBkZXB0aAp7CiAgICBndGtfY3RyZWVfY29sbGFwc2VfdG9fZGVw dGgoZ3RrLCBub2RlICwgZGVwdGgpOwp9Ci0gKHZvaWQpIHRvZ2dsZUV4cGFuc2lvbjooR3RrQ1Ry ZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3RvZ2dsZV9leHBhbnNpb24oZ3RrLCBub2Rl KTsKfQotICh2b2lkKSB0b2dnbGVFeHBhbnNpb25SZWN1cnNpdmU6KEd0a0NUcmVlTm9kZSAqKSBu b2RlCnsKICAgIGd0a19jdHJlZV90b2dnbGVfZXhwYW5zaW9uX3JlY3Vyc2l2ZShndGssIG5vZGUp Owp9Ci0gKHZvaWQpIHNlbGVjdDooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVl X3NlbGVjdChndGssIG5vZGUpOwp9Ci0gKHZvaWQpIHNlbGVjdFJlY3Vyc2l2ZTooR3RrQ1RyZWVO b2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3NlbGVjdF9yZWN1cnNpdmUoZ3RrLCBub2RlKTsK fQotICh2b2lkKSB1bnNlbGVjdDooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVl X3Vuc2VsZWN0KGd0aywgbm9kZSk7Cn0KLSAodm9pZCkgdW5zZWxlY3RSZWN1cnNpdmU6KEd0a0NU cmVlTm9kZSAqKSBub2RlCnsKICAgIGd0a19jdHJlZV91bnNlbGVjdF9yZWN1cnNpdmUoZ3RrLCBu b2RlKTsKfQotICh2b2lkKSByZWFsU2VsZWN0UmVjdXJzaXZlOihHdGtDVHJlZU5vZGUgKikgbm9k ZSBzdGF0ZTooZ2ludCkgc3RhdGUKewogICAgZ3RrX2N0cmVlX3JlYWxfc2VsZWN0X3JlY3Vyc2l2 ZShndGssIG5vZGUgLCBzdGF0ZSk7Cn0KLSAodm9pZCkgbm9kZVNldFRleHQ6KEd0a0NUcmVlTm9k ZSAqKSBub2RlIGNvbHVtbjooZ2ludCkgY29sdW1uIHRleHQ6KE5TU3RyaW5nICopIHRleHQKewog ICAgZ3RrX2N0cmVlX25vZGVfc2V0X3RleHQoZ3RrLCBub2RlICwgY29sdW1uICxndG9vbGtpdF91 dGY4X3N0cmluZyggdGV4dCkpOwp9Ci0gKHZvaWQpIG5vZGVTZXRQaXhtYXA6KEd0a0NUcmVlTm9k ZSAqKSBub2RlIGNvbHVtbjooZ2ludCkgY29sdW1uIHBpeG1hcDooR2RrUGl4bWFwICopIHBpeG1h cCBtYXNrOihHZGtCaXRtYXAgKikgbWFzawp7CiAgICBndGtfY3RyZWVfbm9kZV9zZXRfcGl4bWFw KGd0aywgbm9kZSAsIGNvbHVtbiAsIHBpeG1hcCAsIG1hc2spOwp9Ci0gKHZvaWQpIG5vZGVTZXRQ aXh0ZXh0OihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbiB0ZXh0OihO U1N0cmluZyAqKSB0ZXh0IHNwYWNpbmc6KGd1aW50OCkgc3BhY2luZyBwaXhtYXA6KEdka1BpeG1h cCAqKSBwaXhtYXAgbWFzazooR2RrQml0bWFwICopIG1hc2sKewogICAgZ3RrX2N0cmVlX25vZGVf c2V0X3BpeHRleHQoZ3RrLCBub2RlICwgY29sdW1uICxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4 dCApLCBzcGFjaW5nICwgcGl4bWFwICwgbWFzayk7Cn0KLSAodm9pZCkgc2V0Tm9kZUluZm86KEd0 a0NUcmVlTm9kZSAqKSBub2RlIHRleHQ6KE5TU3RyaW5nICopIHRleHQgc3BhY2luZzooZ3VpbnQ4 KSBzcGFjaW5nIHBpeG1hcENsb3NlZDooR2RrUGl4bWFwICopIHBpeG1hcF9jbG9zZWQgbWFza0Ns b3NlZDooR2RrQml0bWFwICopIG1hc2tfY2xvc2VkIHBpeG1hcE9wZW5lZDooR2RrUGl4bWFwICop IHBpeG1hcF9vcGVuZWQgbWFza09wZW5lZDooR2RrQml0bWFwICopIG1hc2tfb3BlbmVkIGlzTGVh ZjooZ2Jvb2xlYW4pIGlzX2xlYWYgZXhwYW5kZWQ6KGdib29sZWFuKSBleHBhbmRlZAp7CiAgICBn dGtfY3RyZWVfc2V0X25vZGVfaW5mbyhndGssIG5vZGUgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0 ZXh0ICksIHNwYWNpbmcgLCBwaXhtYXBfY2xvc2VkICwgbWFza19jbG9zZWQgLCBwaXhtYXBfb3Bl bmVkICwgbWFza19vcGVuZWQgLCBpc19sZWFmICwgZXhwYW5kZWQpOwp9Ci0gKHZvaWQpIG5vZGVT ZXRTaGlmdDooR3RrQ1RyZWVOb2RlICopIG5vZGUgY29sdW1uOihnaW50KSBjb2x1bW4gdmVydGlj YWw6KGdpbnQpIHZlcnRpY2FsIGhvcml6b250YWw6KGdpbnQpIGhvcml6b250YWwKewogICAgZ3Rr X2N0cmVlX25vZGVfc2V0X3NoaWZ0KGd0aywgbm9kZSAsIGNvbHVtbiAsIHZlcnRpY2FsICwgaG9y aXpvbnRhbCk7Cn0KLSAodm9pZCkgbm9kZVNldDooR3RrQ1RyZWVOb2RlICopIG5vZGUgc2VsZWN0 YWJsZTooZ2Jvb2xlYW4pIHNlbGVjdGFibGUKewogICAgZ3RrX2N0cmVlX25vZGVfc2V0X3NlbGVj dGFibGUoZ3RrLCBub2RlICwgc2VsZWN0YWJsZSk7Cn0KLSAoZ2Jvb2xlYW4pIG5vZGVHZXRTZWxl Y3RhYmxlOihHdGtDVHJlZU5vZGUgKikgbm9kZQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX25vZGVf Z2V0X3NlbGVjdGFibGUoZ3RrLCBub2RlKTsKfQotIChHdGtDZWxsVHlwZSkgbm9kZUdldENlbGxU eXBlOihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbgp7CiAgICByZXR1 cm4gZ3RrX2N0cmVlX25vZGVfZ2V0X2NlbGxfdHlwZShndGssIG5vZGUgLCBjb2x1bW4pOwp9Ci0g KGdpbnQpIG5vZGVHZXRUZXh0OihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNv bHVtbiB0ZXh0OihOU1N0cmluZyAqKikgdGV4dAp7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBn aW50IF9yZXR2YWxfMTsKICAgIF9yZXR2YWxfMSA9IGd0a19jdHJlZV9ub2RlX2dldF90ZXh0KGd0 aywgbm9kZSAsIGNvbHVtbiAsJl9vdXR2YWxfMSk7CiAgICAqIHRleHQgPSBndG9vbGtpdF9vYmpj X3N0cmluZyhfb3V0dmFsXzEpOwogICAgcmV0dXJuIF9yZXR2YWxfMTsKfQotIChnaW50KSBub2Rl R2V0UGl4bWFwOihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbiBwaXht YXA6KEdka1BpeG1hcCAqKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAqKikgbWFzawp7CiAgICBy ZXR1cm4gZ3RrX2N0cmVlX25vZGVfZ2V0X3BpeG1hcChndGssIG5vZGUgLCBjb2x1bW4gLCBwaXht YXAgLCBtYXNrKTsKfQotIChnaW50KSBub2RlR2V0UGl4dGV4dDooR3RrQ1RyZWVOb2RlICopIG5v ZGUgY29sdW1uOihnaW50KSBjb2x1bW4gdGV4dDooTlNTdHJpbmcgKiopIHRleHQgc3BhY2luZzoo Z3VpbnQ4ICopIHNwYWNpbmcgcGl4bWFwOihHZGtQaXhtYXAgKiopIHBpeG1hcCBtYXNrOihHZGtC aXRtYXAgKiopIG1hc2sKewogICAgY2hhciAqX291dHZhbF8xOwogICAgZ2ludCBfcmV0dmFsXzE7 CiAgICBfcmV0dmFsXzEgPSBndGtfY3RyZWVfbm9kZV9nZXRfcGl4dGV4dChndGssIG5vZGUgLCBj b2x1bW4gLCZfb3V0dmFsXzEsIHNwYWNpbmcgLCBwaXhtYXAgLCBtYXNrKTsKICAgICogdGV4dCAg PSBndG9vbGtpdF9vYmpjX3N0cmluZyhfb3V0dmFsXzEpOwogICAgcmV0dXJuIF9yZXR2YWxfMTsK fQotIChnaW50KSBnZXROb2RlSW5mbzooR3RrQ1RyZWVOb2RlICopIG5vZGUgdGV4dDooTlNTdHJp bmcgKiopIHRleHQgc3BhY2luZzooZ3VpbnQ4ICopIHNwYWNpbmcgcGl4bWFwQ2xvc2VkOihHZGtQ aXhtYXAgKiopIHBpeG1hcF9jbG9zZWQgbWFza0Nsb3NlZDooR2RrQml0bWFwICoqKSBtYXNrX2Ns b3NlZCBwaXhtYXBPcGVuZWQ6KEdka1BpeG1hcCAqKikgcGl4bWFwX29wZW5lZCBtYXNrT3BlbmVk OihHZGtCaXRtYXAgKiopIG1hc2tfb3BlbmVkIGlzTGVhZjooZ2Jvb2xlYW4gKikgaXNfbGVhZiBl eHBhbmRlZDooZ2Jvb2xlYW4gKikgZXhwYW5kZWQKewogICAgY2hhciAqX291dHZhbF8xOwogICAg Z2ludCBfcmV0dmFsXzE7CiAgICBfcmV0dmFsXzEgPSBndGtfY3RyZWVfZ2V0X25vZGVfaW5mbyhn dGssIG5vZGUgLCZfb3V0dmFsXzEsIHNwYWNpbmcgLCBwaXhtYXBfY2xvc2VkICwgbWFza19jbG9z ZWQgLCBwaXhtYXBfb3BlbmVkICwgbWFza19vcGVuZWQgLCBpc19sZWFmICwgZXhwYW5kZWQpOwog ICAgKiB0ZXh0ICA9IGd0b29sa2l0X29iamNfc3RyaW5nKF9vdXR2YWxfMSk7CiAgICByZXR1cm4g X3JldHZhbF8xOwp9Ci0gKHZvaWQpIG5vZGVTZXRSb3c6KEd0a0NUcmVlTm9kZSAqKSBub2RlIHN0 eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY3RyZWVfbm9kZV9zZXRfcm93X3N0eWxl KGd0aywgbm9kZSAsIHN0eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9Ci0gKEdUS1N0eWxlICopIG5v ZGVHZXRSb3dTdHlsZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgcmV0dXJuIGd0b29sa2l0 X29iamVjdChndGtfY3RyZWVfbm9kZV9nZXRfcm93X3N0eWxlKGd0aywgbm9kZSksICJHVEtTdHls ZSIpOwp9Ci0gKHZvaWQpIG5vZGVTZXRDZWxsU3R5bGU6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGNv bHVtbjooZ2ludCkgY29sdW1uIHN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY3Ry ZWVfbm9kZV9zZXRfY2VsbF9zdHlsZShndGssIG5vZGUgLCBjb2x1bW4gLCBzdHlsZSA/IHN0eWxl LT5ndGsgOiAwKTsKfQotIChHVEtTdHlsZSAqKSBub2RlR2V0Q2VsbFN0eWxlOihHdGtDVHJlZU5v ZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbgp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2Jq ZWN0KGd0a19jdHJlZV9ub2RlX2dldF9jZWxsX3N0eWxlKGd0aywgbm9kZSAsIGNvbHVtbiksICJH VEtTdHlsZSIpOwp9Ci0gKHZvaWQpIG5vZGVTZXRGb3JlZ3JvdW5kOihHdGtDVHJlZU5vZGUgKikg bm9kZSBjb2xvcjooR2RrQ29sb3IgKikgY29sb3IKewogICAgZ3RrX2N0cmVlX25vZGVfc2V0X2Zv cmVncm91bmQoZ3RrLCBub2RlICwgY29sb3IpOwp9Ci0gKHZvaWQpIG5vZGVTZXRCYWNrZ3JvdW5k OihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2xvcjooR2RrQ29sb3IgKikgY29sb3IKewogICAgZ3Rr X2N0cmVlX25vZGVfc2V0X2JhY2tncm91bmQoZ3RrLCBub2RlICwgY29sb3IpOwp9Ci0gKHZvaWQp IG5vZGVTZXRSb3c6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGRhdGE6KGdwb2ludGVyKSBkYXRhCnsK ICAgIGd0a19jdHJlZV9ub2RlX3NldF9yb3dfZGF0YShndGssIG5vZGUgLCBkYXRhKTsKfQotICh2 b2lkKSBub2RlU2V0Um93RGF0YUZ1bGw6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGRhdGE6KGdwb2lu dGVyKSBkYXRhIGRlc3Ryb3k6KEd0a0Rlc3Ryb3lOb3RpZnkpIGRlc3Ryb3kKewogICAgZ3RrX2N0 cmVlX25vZGVfc2V0X3Jvd19kYXRhX2Z1bGwoZ3RrLCBub2RlICwgZGF0YSAsIGRlc3Ryb3kpOwp9 Ci0gKGdwb2ludGVyKSBub2RlR2V0Um93RGF0YTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAg cmV0dXJuIGd0a19jdHJlZV9ub2RlX2dldF9yb3dfZGF0YShndGssIG5vZGUpOwp9Ci0gKHZvaWQp IG5vZGVNb3ZldG86KEd0a0NUcmVlTm9kZSAqKSBub2RlIGNvbHVtbjooZ2ludCkgY29sdW1uIHJv d0FsaWduOihnZmxvYXQpIHJvd19hbGlnbiBjb2xBbGlnbjooZ2Zsb2F0KSBjb2xfYWxpZ24Kewog ICAgZ3RrX2N0cmVlX25vZGVfbW92ZXRvKGd0aywgbm9kZSAsIGNvbHVtbiAsIHJvd19hbGlnbiAs IGNvbF9hbGlnbik7Cn0KLSAoR3RrVmlzaWJpbGl0eSkgbm9kZUlzVmlzaWJsZTooR3RrQ1RyZWVO b2RlICopIG5vZGUKewogICAgcmV0dXJuIGd0a19jdHJlZV9ub2RlX2lzX3Zpc2libGUoZ3RrLCBu b2RlKTsKfQotICh2b2lkKSBzZXRJbmRlbnQ6KGdpbnQpIGluZGVudAp7CiAgICBndGtfY3RyZWVf c2V0X2luZGVudChndGssIGluZGVudCk7Cn0KLSAodm9pZCkgc2V0U3BhY2luZzooZ2ludCkgc3Bh Y2luZwp7CiAgICBndGtfY3RyZWVfc2V0X3NwYWNpbmcoZ3RrLCBzcGFjaW5nKTsKfQotICh2b2lk KSBzZXRTaG93U3R1YjooZ2Jvb2xlYW4pIHNob3dfc3R1Ygp7CiAgICBndGtfY3RyZWVfc2V0X3No b3dfc3R1YihndGssIHNob3dfc3R1Yik7Cn0KLSAodm9pZCkgc2V0TGluZVN0eWxlOihHdGtDVHJl ZUxpbmVTdHlsZSkgbGluZV9zdHlsZQp7CiAgICBndGtfY3RyZWVfc2V0X2xpbmVfc3R5bGUoZ3Rr LCBsaW5lX3N0eWxlKTsKfQotICh2b2lkKSBzZXRFeHBhbmRlclN0eWxlOihHdGtDVHJlZUV4cGFu ZGVyU3R5bGUpIGV4cGFuZGVyX3N0eWxlCnsKICAgIGd0a19jdHJlZV9zZXRfZXhwYW5kZXJfc3R5 bGUoZ3RrLCBleHBhbmRlcl9zdHlsZSk7Cn0KLSAodm9pZCkgc2V0RHJhZ0NvbXBhcmVGdW5jOihH dGtDVHJlZUNvbXBhcmVEcmFnRnVuYykgY21wX2Z1bmMKewogICAgZ3RrX2N0cmVlX3NldF9kcmFn X2NvbXBhcmVfZnVuYyhndGssIGNtcF9mdW5jKTsKfQotICh2b2lkKSBzb3J0Tm9kZTooR3RrQ1Ry ZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3NvcnRfbm9kZShndGssIG5vZGUpOwp9Ci0g KHZvaWQpIHNvcnRSZWN1cnNpdmU6KEd0a0NUcmVlTm9kZSAqKSBub2RlCnsKICAgIGd0a19jdHJl ZV9zb3J0X3JlY3Vyc2l2ZShndGssIG5vZGUpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmpl Y3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5 OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxs eSBmcm9tIGd0a2N1cnZlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZl cnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0N1cnZlLmg+CgpAaW1wbGVtZW50YXRp b24gR1RLQ3VydmUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2N1cnZlX2dl dF90eXBlKCk7Cn0KKyAoaWQpIGN1cnZlCnsKICAgIHJldHVybiBbWyhHVEtDdXJ2ZSAqKVtzZWxm IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtz ZWxmIGluaXRXaXRoR3RrOmd0a19jdXJ2ZV9uZXcoKV07Cn0KLSAodm9pZCkgcmVzZXQKewogICAg Z3RrX2N1cnZlX3Jlc2V0KGd0ayk7Cn0KLSAodm9pZCkgc2V0R2FtbWE6KGdmbG9hdCkgZ2FtbWEK ewogICAgZ3RrX2N1cnZlX3NldF9nYW1tYShndGssIGdhbW1hKTsKfQotICh2b2lkKSBzZXRSYW5n ZTooZ2Zsb2F0KSBtaW5feCBtYXhYOihnZmxvYXQpIG1heF94IG1pblk6KGdmbG9hdCkgbWluX3kg bWF4WTooZ2Zsb2F0KSBtYXhfeQp7CiAgICBndGtfY3VydmVfc2V0X3JhbmdlKGd0aywgbWluX3gg LCBtYXhfeCAsIG1pbl95ICwgbWF4X3kpOwp9Ci0gKHZvaWQpIGdldFZlY3RvcjooaW50KSB2ZWNs ZW4gdmVjdG9yOihnZmxvYXQgKikgdmVjdG9yCnsKICAgIGd0a19jdXJ2ZV9nZXRfdmVjdG9yKGd0 aywgdmVjbGVuICwgdmVjdG9yKTsKfQotICh2b2lkKSBzZXRWZWN0b3I6KGludCkgdmVjbGVuIHZl Y3RvcjooZ2Zsb2F0ICopIHZlY3Rvcgp7CiAgICBndGtfY3VydmVfc2V0X3ZlY3RvcihndGssIHZl Y2xlbiAsIHZlY3Rvcik7Cn0KLSAodm9pZCkgc2V0Q3VydmVUeXBlOihHdGtDdXJ2ZVR5cGUpIHR5 cGUKewogICAgZ3RrX2N1cnZlX3NldF9jdXJ2ZV90eXBlKGd0aywgdHlwZSk7Cn0KQGVuZAovKgog KiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAq IENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVy YXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrZGF0YS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBs aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi bGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtEYXRhLmg+ CgpAaW1wbGVtZW50YXRpb24gR1RLRGF0YQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVy biBndGtfZGF0YV9nZXRfdHlwZSgpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5 OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t IGd0a2RpYWxvZy5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtEaWFsb2cuaD4KCkBpbXBsZW1lbnRhdGlvbiBH VEtEaWFsb2cKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2RpYWxvZ19nZXRf dHlwZSgpOwp9CisgKGlkKSBkaWFsb2cKewogICAgcmV0dXJuIFtbKEdUS0RpYWxvZyAqKVtzZWxm IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtz ZWxmIGluaXRXaXRoR3RrOmd0a19kaWFsb2dfbmV3KCldOwp9CiNkZWZpbmUgZ3RrCSgoR3RrRGlh bG9nICopIGd0aykKLSAoR1RLV2lkZ2V0ICopIHZib3gKewogICAgcmV0dXJuIEdUT09MS0lUX09C SkVDVChndGstPnZib3gpOwp9Ci0gKEdUS1dpZGdldCAqKSBhY3Rpb25BcmVhCnsKICAgIHJldHVy biBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5hY3Rpb25fYXJlYSk7Cn0KI3VuZGVmIGd0awpAZW5kCi8q CiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQK ICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2Vu ZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtkcmF3aW5nYXJlYS5oIGJ5IGd0a2dlbi4KICoK ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H VEtEcmF3aW5nQXJlYS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0RyYXdpbmdBcmVhCisgKEd0a1R5 cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19kcmF3aW5nX2FyZWFfZ2V0X3R5cGUoKTsKfQor IChpZCkgZHJhd2luZ0FyZWEKewogICAgcmV0dXJuIFtbKEdUS0RyYXdpbmdBcmVhICopW3NlbGYg YWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3Nl bGYgaW5pdFdpdGhHdGs6Z3RrX2RyYXdpbmdfYXJlYV9uZXcoKV07Cn0KLSAodm9pZCkgc2l6ZToo Z2ludCkgd2lkdGggaGVpZ2h0OihnaW50KSBoZWlnaHQKewogICAgZ3RrX2RyYXdpbmdfYXJlYV9z aXplKGd0aywgd2lkdGggLCBoZWlnaHQpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm cm9tIGd0a2VkaXRhYmxlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZl cnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0VkaXRhYmxlLmg+CgpAaW1wbGVtZW50 YXRpb24gR1RLRWRpdGFibGUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2Vk aXRhYmxlX2dldF90eXBlKCk7Cn0KLSAodm9pZCkgc2VsZWN0UmVnaW9uOihnaW50KSBzdGFydCBl bmQ6KGdpbnQpIGVuZAp7CiAgICBndGtfZWRpdGFibGVfc2VsZWN0X3JlZ2lvbihndGssIHN0YXJ0 ICwgZW5kKTsKfQotICh2b2lkKSBpbnNlcnRUZXh0OihOU1N0cmluZyAqKSBuZXdfdGV4dCBuZXdU ZXh0TGVuZ3RoOihnaW50KSBuZXdfdGV4dF9sZW5ndGggcG9zaXRpb246KGdpbnQgKikgcG9zaXRp b24KewogICAgZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0KGd0ayxndG9vbGtpdF91dGY4X3N0cmlu ZyggbmV3X3RleHQgKSwgbmV3X3RleHRfbGVuZ3RoICwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIGRl bGV0ZVRleHQ6KGdpbnQpIHN0YXJ0X3BvcyBlbmRQb3M6KGdpbnQpIGVuZF9wb3MKewogICAgZ3Rr X2VkaXRhYmxlX2RlbGV0ZV90ZXh0KGd0aywgc3RhcnRfcG9zICwgZW5kX3Bvcyk7Cn0KLSAoTlNT dHJpbmcgKikgZ2V0Q2hhcnM6KGdpbnQpIHN0YXJ0X3BvcyBlbmRQb3M6KGdpbnQpIGVuZF9wb3MK ewogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19lZGl0YWJsZV9nZXRfY2hhcnMo Z3RrLCBzdGFydF9wb3MgLCBlbmRfcG9zKSk7Cn0KLSAodm9pZCkgY3V0Q2xpcGJvYXJkCnsKICAg IGd0a19lZGl0YWJsZV9jdXRfY2xpcGJvYXJkKGd0ayk7Cn0KLSAodm9pZCkgY29weUNsaXBib2Fy ZAp7CiAgICBndGtfZWRpdGFibGVfY29weV9jbGlwYm9hcmQoZ3RrKTsKfQotICh2b2lkKSBwYXN0 ZUNsaXBib2FyZAp7CiAgICBndGtfZWRpdGFibGVfcGFzdGVfY2xpcGJvYXJkKGd0ayk7Cn0KLSAo dm9pZCkgY2xhaW1TZWxlY3Rpb246KGdib29sZWFuKSBjbGFpbSB0aW1lOihndWludDMyKSB0aW1l CnsKICAgIGd0a19lZGl0YWJsZV9jbGFpbV9zZWxlY3Rpb24oZ3RrLCBjbGFpbSAsIHRpbWUpOwp9 Ci0gKHZvaWQpIGRlbGV0ZVNlbGVjdGlvbgp7CiAgICBndGtfZWRpdGFibGVfZGVsZXRlX3NlbGVj dGlvbihndGspOwp9Ci0gKHZvaWQpIGNoYW5nZWQKewogICAgZ3RrX2VkaXRhYmxlX2NoYW5nZWQo Z3RrKTsKfQotICh2b2lkKSBzZXRQb3NpdGlvbjooZ2ludCkgcG9zaXRpb24KewogICAgZ3RrX2Vk aXRhYmxlX3NldF9wb3NpdGlvbihndGssIHBvc2l0aW9uKTsKfQotIChnaW50KSBnZXRQb3NpdGlv bgp7CiAgICByZXR1cm4gZ3RrX2VkaXRhYmxlX2dldF9wb3NpdGlvbihndGspOwp9Ci0gKHZvaWQp IHNldEVkaXRhYmxlOihnYm9vbGVhbikgaXNfZWRpdGFibGUKewogICAgZ3RrX2VkaXRhYmxlX3Nl dF9lZGl0YWJsZShndGssIGlzX2VkaXRhYmxlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2Jq ZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAx OTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2Fs bHkgZnJvbSBndGtlbnRyeS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2 ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtFbnRyeS5oPgoKQGltcGxlbWVudGF0 aW9uIEdUS0VudHJ5CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19lbnRyeV9n ZXRfdHlwZSgpOwp9CisgKGlkKSBlbnRyeQp7CiAgICByZXR1cm4gW1soR1RLRW50cnkgKilbc2Vs ZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBb c2VsZiBpbml0V2l0aEd0azpndGtfZW50cnlfbmV3KCldOwp9CisgKGlkKSBlbnRyeVdpdGhNYXhM ZW5ndGg6KGd1aW50MTYpIG1heAp7CiAgICByZXR1cm4gW1soR1RLRW50cnkgKilbc2VsZiBhbGxv Y10gaW5pdFdpdGhNYXhMZW5ndGg6bWF4XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRo TWF4TGVuZ3RoOihndWludDE2KSBtYXgKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0 a19lbnRyeV9uZXdfd2l0aF9tYXhfbGVuZ3RoKCBtYXgpXTsKfQotICh2b2lkKSBzZXRUZXh0OihO U1N0cmluZyAqKSB0ZXh0CnsKICAgIGd0a19lbnRyeV9zZXRfdGV4dChndGssZ3Rvb2xraXRfdXRm OF9zdHJpbmcoIHRleHQpKTsKfQotICh2b2lkKSBhcHBlbmRUZXh0OihOU1N0cmluZyAqKSB0ZXh0 CnsKICAgIGd0a19lbnRyeV9hcHBlbmRfdGV4dChndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRl eHQpKTsKfQotICh2b2lkKSBwcmVwZW5kVGV4dDooTlNTdHJpbmcgKikgdGV4dAp7CiAgICBndGtf ZW50cnlfcHJlcGVuZF90ZXh0KGd0ayxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4dCkpOwp9Ci0g KHZvaWQpIHNldFBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfZW50cnlfc2V0X3Bv c2l0aW9uKGd0aywgcG9zaXRpb24pOwp9Ci0gKE5TU3RyaW5nICopIGdldFRleHQKewogICAgcmV0 dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19lbnRyeV9nZXRfdGV4dChndGspKTsKfQotICh2 b2lkKSBzZWxlY3RSZWdpb246KGdpbnQpIHN0YXJ0IGVuZDooZ2ludCkgZW5kCnsKICAgIGd0a19l bnRyeV9zZWxlY3RfcmVnaW9uKGd0aywgc3RhcnQgLCBlbmQpOwp9Ci0gKHZvaWQpIHNldFZpc2li aWxpdHk6KGdib29sZWFuKSB2aXNpYmxlCnsKICAgIGd0a19lbnRyeV9zZXRfdmlzaWJpbGl0eShn dGssIHZpc2libGUpOwp9Ci0gKHZvaWQpIHNldEVkaXRhYmxlOihnYm9vbGVhbikgZWRpdGFibGUK ewogICAgZ3RrX2VudHJ5X3NldF9lZGl0YWJsZShndGssIGVkaXRhYmxlKTsKfQotICh2b2lkKSBz ZXRNYXhMZW5ndGg6KGd1aW50MTYpIG1heAp7CiAgICBndGtfZW50cnlfc2V0X21heF9sZW5ndGgo Z3RrLCBtYXgpOwp9CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgotICh2 b2lkKSBzZXREb3VibGVWYWx1ZTooZG91YmxlKSB2YWx1ZQp7CiAgICBjaGFyIHN0cmluZ1s2NF07 CgogICAgc3ByaW50ZihzdHJpbmcsICIlZyIsIHZhbHVlKTsKICAgIGd0a19lbnRyeV9zZXRfdGV4 dChndGssIHN0cmluZyk7Cn0KCi0gKHZvaWQpIHNldEludFZhbHVlOihpbnQpIHZhbHVlCnsKICAg IGNoYXIgc3RyaW5nWzY0XTsKCiAgICBzcHJpbnRmKHN0cmluZywgIiVkIiwgdmFsdWUpOwogICAg Z3RrX2VudHJ5X3NldF90ZXh0KGd0aywgc3RyaW5nKTsKfQoKLSAodm9pZCkgc2V0U3RyaW5nVmFs dWU6KE5TU3RyaW5nICopIHZhbHVlCnsKICAgIGd0a19lbnRyeV9zZXRfdGV4dChndGssIGd0b29s a2l0X3V0Zjhfc3RyaW5nKHZhbHVlKSk7Cn0KCi0gKGRvdWJsZSkgZG91YmxlVmFsdWUKewogICAg cmV0dXJuIGF0b2YoZ3RrX2VudHJ5X2dldF90ZXh0KGd0aykpOwp9CgotIChpbnQpIGludFZhbHVl CnsKICAgIHJldHVybiBhdG9pKGd0a19lbnRyeV9nZXRfdGV4dChndGspKTsKfQoKLSAoTlNTdHJp bmcgKikgc3RyaW5nVmFsdWUKewogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19l bnRyeV9nZXRfdGV4dChndGspKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMg aW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5 LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBn dGtldmVudGJveC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtFdmVudEJveC5oPgoKQGltcGxlbWVudGF0aW9u IEdUS0V2ZW50Qm94CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19ldmVudF9i b3hfZ2V0X3R5cGUoKTsKfQorIChpZCkgZXZlbnRCb3gKewogICAgcmV0dXJuIFtbKEdUS0V2ZW50 Qm94ICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAg ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2V2ZW50X2JveF9uZXcoKV07Cn0KQGVuZAov KgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0 CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdl bmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrZmlsZXNlbC5oIGJ5IGd0a2dlbi4KICoKICog VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy YWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtG aWxlU2VsZWN0aW9uLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLRmlsZVNlbGVjdGlvbgorIChHdGtU eXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X3R5cGUoKTsK fQorIChpZCkgZmlsZVNlbGVjdGlvbldpdGhUaXRsZTooTlNTdHJpbmcgKikgdGl0bGUKewogICAg cmV0dXJuIFtbKEdUS0ZpbGVTZWxlY3Rpb24gKilbc2VsZiBhbGxvY10gaW5pdFdpdGhUaXRsZTp0 aXRsZV0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aFRpdGxlOihOU1N0cmluZyAqKSB0 aXRsZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2ZpbGVfc2VsZWN0aW9uX25l dyhndG9vbGtpdF91dGY4X3N0cmluZyggdGl0bGUpKV07Cn0KLSAodm9pZCkgc2V0RmlsZW5hbWU6 KE5TU3RyaW5nICopIGZpbGVuYW1lCnsKICAgIGd0a19maWxlX3NlbGVjdGlvbl9zZXRfZmlsZW5h bWUoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBmaWxlbmFtZSkpOwp9Ci0gKE5TU3RyaW5nICop IGdldEZpbGVuYW1lCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfZmlsZV9z ZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lKGd0aykpOwp9Ci0gKHZvaWQpIGNvbXBsZXRlOihOU1N0cmlu ZyAqKSBwYXR0ZXJuCnsKICAgIGd0a19maWxlX3NlbGVjdGlvbl9jb21wbGV0ZShndGssZ3Rvb2xr aXRfdXRmOF9zdHJpbmcoIHBhdHRlcm4pKTsKfQotICh2b2lkKSBzaG93RmlsZW9wQnV0dG9ucwp7 CiAgICBndGtfZmlsZV9zZWxlY3Rpb25fc2hvd19maWxlb3BfYnV0dG9ucyhndGspOwp9Ci0gKHZv aWQpIGhpZGVGaWxlb3BCdXR0b25zCnsKICAgIGd0a19maWxlX3NlbGVjdGlvbl9oaWRlX2ZpbGVv cF9idXR0b25zKGd0ayk7Cn0KI2RlZmluZSBndGsJKChHdGtGaWxlU2VsZWN0aW9uICopIGd0aykK LSAoR1RLV2lkZ2V0ICopIG9rQnV0dG9uCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3Rr LT5va19idXR0b24pOwp9Ci0gKEdUS1dpZGdldCAqKSBjYW5jZWxCdXR0b24KewogICAgcmV0dXJu IEdUT09MS0lUX09CSkVDVChndGstPmNhbmNlbF9idXR0b24pOwp9Ci0gKEdUS1dpZGdldCAqKSBo ZWxwQnV0dG9uCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5oZWxwX2J1dHRvbik7 Cn0KI3VuZGVmIGd0awpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNl IHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBF bG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtmaXhlZC5o IGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUg TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNs dWRlIDxHVG9vbEtpdC9HVEtGaXhlZC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+ CgpAaW1wbGVtZW50YXRpb24gR1RLRml4ZWQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1 cm4gZ3RrX2ZpeGVkX2dldF90eXBlKCk7Cn0KKyAoaWQpIGZpeGVkCnsKICAgIHJldHVybiBbWyhH VEtGaXhlZCAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQK ewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19maXhlZF9uZXcoKV07Cn0KLSAodm9p ZCkgcHV0OihHVEtXaWRnZXQgKikgd2lkZ2V0IHg6KGdpbnQxNikgeCB5OihnaW50MTYpIHkKewog ICAgZ3RrX2ZpeGVkX3B1dChndGssIHdpZGdldCAgPyB3aWRnZXQgLT5ndGsgOiAwLCB4ICwgeSk7 Cn0KLSAodm9pZCkgbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldCB4OihnaW50MTYpIHggeTooZ2lu dDE2KSB5CnsKICAgIGd0a19maXhlZF9tb3ZlKGd0aywgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6 IDAsIHggLCB5KTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNl IHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBF bG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtmb250c2Vs LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRo ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2lu Y2x1ZGUgPEdUb29sS2l0L0dUS0ZvbnRTZWxlY3Rpb24uaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtG b250U2VsZWN0aW9uCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19mb250X3Nl bGVjdGlvbl9nZXRfdHlwZSgpOwp9CisgKGlkKSBmb250U2VsZWN0aW9uCnsKICAgIHJldHVybiBb WyhHVEtGb250U2VsZWN0aW9uICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQot IChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2ZvbnRfc2VsZWN0 aW9uX25ldygpXTsKfQotIChOU1N0cmluZyAqKSBnZXRGb250TmFtZQp7CiAgICByZXR1cm4gZ3Rv b2xraXRfb2JqY19zdHJpbmcoZ3RrX2ZvbnRfc2VsZWN0aW9uX2dldF9mb250X25hbWUoZ3RrKSk7 Cn0KLSAoR2RrRm9udCopIGdldEZvbnQKewogICAgcmV0dXJuIGd0a19mb250X3NlbGVjdGlvbl9n ZXRfZm9udChndGspOwp9Ci0gKGdib29sZWFuKSBzZXRGb250TmFtZTooTlNTdHJpbmcgKikgZm9u dG5hbWUKewogICAgcmV0dXJuIGd0a19mb250X3NlbGVjdGlvbl9zZXRfZm9udF9uYW1lKGd0ayxn dG9vbGtpdF91dGY4X3N0cmluZyggZm9udG5hbWUpKTsKfQotICh2b2lkKSBzZXRGaWx0ZXI6KEd0 a0ZvbnRGaWx0ZXJUeXBlKSBmaWx0ZXJfdHlwZSBmb250VHlwZTooR3RrRm9udFR5cGUpIGZvbnRf dHlwZSBmb3VuZHJpZXM6KE5TQXJyYXkgICopIGZvdW5kcmllcyB3ZWlnaHRzOihOU0FycmF5ICAq KSB3ZWlnaHRzIHNsYW50czooTlNBcnJheSAgKikgc2xhbnRzIHNldHdpZHRoczooTlNBcnJheSAg Kikgc2V0d2lkdGhzIHNwYWNpbmdzOihOU0FycmF5ICAqKSBzcGFjaW5ncyBjaGFyc2V0czooTlNB cnJheSAgKikgY2hhcnNldHMKewogICAgZ3RrX2ZvbnRfc2VsZWN0aW9uX3NldF9maWx0ZXIoZ3Rr LCBmaWx0ZXJfdHlwZSAsIGZvbnRfdHlwZSAsKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3Ry dmVjKCBmb3VuZHJpZXMgKSwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIHdlaWdo dHMgKSwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIHNsYW50cyApLChjaGFyICoq KWd0b29sa2l0X2FycmF5X3RvX3N0cnZlYyggc2V0d2lkdGhzICksKGNoYXIgKiopZ3Rvb2xraXRf YXJyYXlfdG9fc3RydmVjKCBzcGFjaW5ncyApLChjaGFyICoqKWd0b29sa2l0X2FycmF5X3RvX3N0 cnZlYyggY2hhcnNldHMpKTsKfQotIChOU1N0cmluZyAqKSBnZXRQcmV2aWV3VGV4dAp7CiAgICBy ZXR1cm4gZ3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX2ZvbnRfc2VsZWN0aW9uX2dldF9wcmV2aWV3 X3RleHQoZ3RrKSk7Cn0KLSAodm9pZCkgc2V0UHJldmlld1RleHQ6KE5TU3RyaW5nICopIHRleHQK ewogICAgZ3RrX2ZvbnRfc2VsZWN0aW9uX3NldF9wcmV2aWV3X3RleHQoZ3RrLGd0b29sa2l0X3V0 Zjhfc3RyaW5nKCB0ZXh0KSk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGlu dGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwg MjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rr Zm9udHNlbC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIu MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K ICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtGb250U2VsZWN0aW9uRGlhbG9nLmg+CgpAaW1wbGVt ZW50YXRpb24gR1RLRm9udFNlbGVjdGlvbkRpYWxvZworIChHdGtUeXBlKSBnZXRUeXBlCnsKICAg IHJldHVybiBndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX2dldF90eXBlKCk7Cn0KKyAoaWQpIGZv bnRTZWxlY3Rpb25EaWFsb2dXaXRoVGl0bGU6KE5TU3RyaW5nICopIHRpdGxlCnsKICAgIHJldHVy biBbWyhHVEtGb250U2VsZWN0aW9uRGlhbG9nICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVGl0bGU6 dGl0bGVdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhUaXRsZTooTlNTdHJpbmcgKikg dGl0bGUKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19mb250X3NlbGVjdGlvbl9k aWFsb2dfbmV3KGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0aXRsZSkpXTsKfQotIChOU1N0cmluZyAq KSBnZXRGb250TmFtZQp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX2ZvbnRf c2VsZWN0aW9uX2RpYWxvZ19nZXRfZm9udF9uYW1lKGd0aykpOwp9Ci0gKEdka0ZvbnQqKSBnZXRG b250CnsKICAgIHJldHVybiBndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX2dldF9mb250KGd0ayk7 Cn0KLSAoZ2Jvb2xlYW4pIHNldEZvbnROYW1lOihOU1N0cmluZyAqKSBmb250bmFtZQp7CiAgICBy ZXR1cm4gZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZm9udF9uYW1lKGd0ayxndG9vbGtp dF91dGY4X3N0cmluZyggZm9udG5hbWUpKTsKfQotICh2b2lkKSBzZXRGaWx0ZXI6KEd0a0ZvbnRG aWx0ZXJUeXBlKSBmaWx0ZXJfdHlwZSBmb250VHlwZTooR3RrRm9udFR5cGUpIGZvbnRfdHlwZSBm b3VuZHJpZXM6KE5TQXJyYXkgICopIGZvdW5kcmllcyB3ZWlnaHRzOihOU0FycmF5ICAqKSB3ZWln aHRzIHNsYW50czooTlNBcnJheSAgKikgc2xhbnRzIHNldHdpZHRoczooTlNBcnJheSAgKikgc2V0 d2lkdGhzIHNwYWNpbmdzOihOU0FycmF5ICAqKSBzcGFjaW5ncyBjaGFyc2V0czooTlNBcnJheSAg KikgY2hhcnNldHMKewogICAgZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZmlsdGVyKGd0 aywgZmlsdGVyX3R5cGUgLCBmb250X3R5cGUgLChjaGFyICoqKWd0b29sa2l0X2FycmF5X3RvX3N0 cnZlYyggZm91bmRyaWVzICksKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3RydmVjKCB3ZWln aHRzICksKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3RydmVjKCBzbGFudHMgKSwoY2hhciAq KilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIHNldHdpZHRocyApLChjaGFyICoqKWd0b29sa2l0 X2FycmF5X3RvX3N0cnZlYyggc3BhY2luZ3MgKSwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19z dHJ2ZWMoIGNoYXJzZXRzKSk7Cn0KLSAoTlNTdHJpbmcgKikgZ2V0UHJldmlld1RleHQKewogICAg cmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfZ2V0 X3ByZXZpZXdfdGV4dChndGspKTsKfQotICh2b2lkKSBzZXRQcmV2aWV3VGV4dDooTlNTdHJpbmcg KikgdGV4dAp7CiAgICBndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX3NldF9wcmV2aWV3X3RleHQo Z3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0ZXh0KSk7Cn0KI2RlZmluZSBndGsJKChHdGtGb250 U2VsZWN0aW9uRGlhbG9nICopIGd0aykKLSAoR1RLRm9udFNlbGVjdGlvbiAqKSBmb250U2VsZWN0 aW9uCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5mb250c2VsKTsKfQotIChHVEtX aWRnZXQgKikgb2tCdXR0b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPm9rX2J1 dHRvbik7Cn0KLSAoR1RLV2lkZ2V0ICopIGFwcGx5QnV0dG9uCnsKICAgIHJldHVybiBHVE9PTEtJ VF9PQkpFQ1QoZ3RrLT5hcHBseV9idXR0b24pOwp9Ci0gKEdUS1dpZGdldCAqKSBjYW5jZWxCdXR0 b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmNhbmNlbF9idXR0b24pOwp9CiN1 bmRlZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0 aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIg THVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrZnJhbWUuaCBieSBn dGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8 R1Rvb2xLaXQvR1RLRnJhbWUuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtGcmFtZQorIChHdGtUeXBl KSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfZnJhbWVfZ2V0X3R5cGUoKTsKfQorIChpZCkgZnJh bWVXaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhHVEtGcmFtZSAq KVtzZWxmIGFsbG9jXSBpbml0V2l0aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp IGluaXRXaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0 V2l0aEd0azpndGtfZnJhbWVfbmV3KGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQot ICh2b2lkKSBzZXRMYWJlbDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgZ3RrX2ZyYW1lX3NldF9s YWJlbChndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVsKSk7Cn0KLSAodm9pZCkgc2V0TGFi ZWxBbGlnbjooZ2Zsb2F0KSB4YWxpZ24geWFsaWduOihnZmxvYXQpIHlhbGlnbgp7CiAgICBndGtf ZnJhbWVfc2V0X2xhYmVsX2FsaWduKGd0aywgeGFsaWduICwgeWFsaWduKTsKfQotICh2b2lkKSBz ZXRTaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSB0eXBlCnsKICAgIGd0a19mcmFtZV9zZXRfc2hh ZG93X3R5cGUoZ3RrLCB0eXBlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMg aW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5 LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBn dGtnYW1tYS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIu MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K ICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtHYW1tYUN1cnZlLmg+CgpAaW1wbGVtZW50YXRpb24g R1RLR2FtbWFDdXJ2ZQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfZ2FtbWFf Y3VydmVfZ2V0X3R5cGUoKTsKfQorIChpZCkgZ2FtbWFDdXJ2ZQp7CiAgICByZXR1cm4gW1soR1RL R2FtbWFDdXJ2ZSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGlu aXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19nYW1tYV9jdXJ2ZV9uZXcoKV07 Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lN UCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2ln CiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraGFuZGxlYm94LmggYnkgZ3Rr Z2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM ZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdU b29sS2l0L0dUS0hhbmRsZUJveC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0hhbmRsZUJveAorIChH dGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfaGFuZGxlX2JveF9nZXRfdHlwZSgpOwp9 CisgKGlkKSBoYW5kbGVCb3gKewogICAgcmV0dXJuIFtbKEdUS0hhbmRsZUJveCAqKVtzZWxmIGFs bG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxm IGluaXRXaXRoR3RrOmd0a19oYW5kbGVfYm94X25ldygpXTsKfQotICh2b2lkKSBzZXRTaGFkb3dU eXBlOihHdGtTaGFkb3dUeXBlKSB0eXBlCnsKICAgIGd0a19oYW5kbGVfYm94X3NldF9zaGFkb3df dHlwZShndGssIHR5cGUpOwp9Ci0gKHZvaWQpIHNldEhhbmRsZVBvc2l0aW9uOihHdGtQb3NpdGlv blR5cGUpIHBvc2l0aW9uCnsKICAgIGd0a19oYW5kbGVfYm94X3NldF9oYW5kbGVfcG9zaXRpb24o Z3RrLCBwb3NpdGlvbik7Cn0KLSAodm9pZCkgc2V0U25hcEVkZ2U6KEd0a1Bvc2l0aW9uVHlwZSkg ZWRnZQp7CiAgICBndGtfaGFuZGxlX2JveF9zZXRfc25hcF9lZGdlKGd0aywgZWRnZSk7Cn0KQGVu ZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29s a2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAq IEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraGJib3guaCBieSBndGtnZW4uCiAqCiAq IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l cmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RL SEJ1dHRvbkJveC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0hCdXR0b25Cb3gKKyAoR3RrVHlwZSkg Z2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hidXR0b25fYm94X2dldF90eXBlKCk7Cn0KKyAoaWQp IGhCdXR0b25Cb3gKewogICAgcmV0dXJuIFtbKEdUS0hCdXR0b25Cb3ggKilbc2VsZiBhbGxvY10g aW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0 V2l0aEd0azpndGtfaGJ1dHRvbl9ib3hfbmV3KCldOwp9CisgKGdpbnQpIGdldFNwYWNpbmdEZWZh dWx0CnsKICAgIHJldHVybiBndGtfaGJ1dHRvbl9ib3hfZ2V0X3NwYWNpbmdfZGVmYXVsdCgpOwp9 CisgKEd0a0J1dHRvbkJveFN0eWxlKSBnZXRMYXlvdXREZWZhdWx0CnsKICAgIHJldHVybiBndGtf aGJ1dHRvbl9ib3hfZ2V0X2xheW91dF9kZWZhdWx0KCk7Cn0KKyAodm9pZCkgc2V0U3BhY2luZ0Rl ZmF1bHQ6KGdpbnQpIHNwYWNpbmcKewogICAgZ3RrX2hidXR0b25fYm94X3NldF9zcGFjaW5nX2Rl ZmF1bHQoIHNwYWNpbmcpOwp9CisgKHZvaWQpIHNldExheW91dERlZmF1bHQ6KEd0a0J1dHRvbkJv eFN0eWxlKSBsYXlvdXQKewogICAgZ3RrX2hidXR0b25fYm94X3NldF9sYXlvdXRfZGVmYXVsdCgg bGF5b3V0KTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRv IHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1h ciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtoYm94LmggYnkg Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg PEdUb29sS2l0L0dUS0hCb3guaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtIQm94CisgKEd0a1R5cGUp IGdldFR5cGUKewogICAgcmV0dXJuIGd0a19oYm94X2dldF90eXBlKCk7Cn0KKyAoaWQpIGhCb3hX aXRoSG9tb2dlbmVvdXM6KGdib29sZWFuKSBob21vZ2VuZW91cyBzcGFjaW5nOihnaW50KSBzcGFj aW5nCnsKICAgIHJldHVybiBbWyhHVEtIQm94ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoSG9tb2dl bmVvdXM6aG9tb2dlbmVvdXMgc3BhY2luZzpzcGFjaW5nXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp IGluaXRXaXRoSG9tb2dlbmVvdXM6KGdib29sZWFuKSBob21vZ2VuZW91cyBzcGFjaW5nOihnaW50 KSBzcGFjaW5nCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfaGJveF9uZXcoIGhv bW9nZW5lb3VzICwgc3BhY2luZyldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5 OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t IGd0a2hwYW5lZC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtIUGFuZWQuaD4KCkBpbXBsZW1lbnRhdGlvbiBH VEtIUGFuZWQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hwYW5lZF9nZXRf dHlwZSgpOwp9CisgKGlkKSBoUGFuZWQKewogICAgcmV0dXJuIFtbKEdUS0hQYW5lZCAqKVtzZWxm IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtz ZWxmIGluaXRXaXRoR3RrOmd0a19ocGFuZWRfbmV3KCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQg LSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQg KGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21h dGljYWxseSBmcm9tIGd0a2hydWxlci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtIUnVsZXIuaD4KCkBpbXBs ZW1lbnRhdGlvbiBHVEtIUnVsZXIKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3Rr X2hydWxlcl9nZXRfdHlwZSgpOwp9CisgKGlkKSBoUnVsZXIKewogICAgcmV0dXJuIFtbKEdUS0hS dWxlciAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewog ICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19ocnVsZXJfbmV3KCldOwp9CkBlbmQKLyoK ICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAog KiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5l cmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2hzY2FsZS5oIGJ5IGd0a2dlbi4KICoKICogVGhp cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v cgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg UHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtIU2Nh bGUuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlv biBHVEtIU2NhbGUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hzY2FsZV9n ZXRfdHlwZSgpOwp9CisgKGlkKSBoU2NhbGVXaXRoQWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAq KSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtIU2NhbGUgKilbc2VsZiBhbGxvY10gaW5p dFdpdGhBZGp1c3RtZW50OmFkanVzdG1lbnRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdp dGhBZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgcmV0dXJuIFtz ZWxmIGluaXRXaXRoR3RrOmd0a19oc2NhbGVfbmV3KCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+ Z3RrIDogMCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2Ug dG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVs bWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2hzY3JvbGxi YXIuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2Yg dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwoj aW5jbHVkZSA8R1Rvb2xLaXQvR1RLSFNjcm9sbGJhci5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RL QWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0hTY3JvbGxiYXIKKyAoR3RrVHlwZSkg Z2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hzY3JvbGxiYXJfZ2V0X3R5cGUoKTsKfQorIChpZCkg aFNjcm9sbGJhcldpdGhBZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewog ICAgcmV0dXJuIFtbKEdUS0hTY3JvbGxiYXIgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhBZGp1c3Rt ZW50OmFkanVzdG1lbnRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhBZGp1c3RtZW50 OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRo R3RrOmd0a19oc2Nyb2xsYmFyX25ldyggYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDAp XTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBH SU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3 aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtoc2VwYXJhdG9yLmggYnkg Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg PEdUb29sS2l0L0dUS0hTZXBhcmF0b3IuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtIU2VwYXJhdG9y CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19oc2VwYXJhdG9yX2dldF90eXBl KCk7Cn0KKyAoaWQpIGhTZXBhcmF0b3IKewogICAgcmV0dXJuIFtbKEdUS0hTZXBhcmF0b3IgKilb c2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVy biBbc2VsZiBpbml0V2l0aEd0azpndGtfaHNlcGFyYXRvcl9uZXcoKV07Cn0KQGVuZAovKgogKiBH VG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENv cHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRl ZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraW1hZ2UuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGli cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICog bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp YwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLSW1hZ2UuaD4K CkBpbXBsZW1lbnRhdGlvbiBHVEtJbWFnZQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVy biBndGtfaW1hZ2VfZ2V0X3R5cGUoKTsKfQorIChpZCkgaW1hZ2VXaXRoVmFsOihHZGtJbWFnZSAq KSB2YWwgbWFzazooR2RrQml0bWFwICopIG1hc2sKewogICAgcmV0dXJuIFtbKEdUS0ltYWdlICop W3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsOnZhbCBtYXNrOm1hc2tdIGF1dG9yZWxlYXNlXTsKfQot IChpZCkgaW5pdFdpdGhWYWw6KEdka0ltYWdlICopIHZhbCBtYXNrOihHZGtCaXRtYXAgKikgbWFz awp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2ltYWdlX25ldyggdmFsICwgbWFz ayldOwp9Ci0gKHZvaWQpIHNldDooR2RrSW1hZ2UgKikgdmFsIG1hc2s6KEdka0JpdG1hcCAqKSBt YXNrCnsKICAgIGd0a19pbWFnZV9zZXQoZ3RrLCB2YWwgLCBtYXNrKTsKfQotICh2b2lkKSBnZXQ6 KEdka0ltYWdlICoqKSB2YWwgbWFzazooR2RrQml0bWFwICoqKSBtYXNrCnsKICAgIGd0a19pbWFn ZV9nZXQoZ3RrLCB2YWwgLCBtYXNrKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZl LUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAx OTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJv bSBndGtpbnB1dGRpYWxvZy5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2 ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJbnB1dERpYWxvZy5oPgoKQGltcGxl bWVudGF0aW9uIEdUS0lucHV0RGlhbG9nCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJu IGd0a19pbnB1dF9kaWFsb2dfZ2V0X3R5cGUoKTsKfQorIChpZCkgaW5wdXREaWFsb2cKewogICAg cmV0dXJuIFtbKEdUS0lucHV0RGlhbG9nICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNl XTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2lucHV0 X2RpYWxvZ19uZXcoKV07Cn0KI2RlZmluZSBndGsJKChHdGtJbnB1dERpYWxvZyAqKSBndGspCi0g KEdUS1dpZGdldCAqKSBjbG9zZUJ1dHRvbgp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0 ay0+Y2xvc2VfYnV0dG9uKTsKfQotIChHVEtXaWRnZXQgKikgc2F2ZUJ1dHRvbgp7CiAgICByZXR1 cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+c2F2ZV9idXR0b24pOwp9CiN1bmRlZiBndGsKQGVuZAov KgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0 CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdl bmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraW52aXNpYmxlLmggYnkgZ3RrZ2VuLgogKgog KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu ZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dU S0ludmlzaWJsZS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0ludmlzaWJsZQorIChHdGtUeXBlKSBn ZXRUeXBlCnsKICAgIHJldHVybiBndGtfaW52aXNpYmxlX2dldF90eXBlKCk7Cn0KKyAoaWQpIGlu dmlzaWJsZQp7CiAgICByZXR1cm4gW1soR1RLSW52aXNpYmxlICopW3NlbGYgYWxsb2NdIGluaXRd IGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH dGs6Z3RrX2ludmlzaWJsZV9uZXcoKV07Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2 ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwg MTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZy b20gZ3RraXRlbS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJdGVtLmg+CgpAaW1wbGVtZW50YXRpb24gR1RL SXRlbQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfaXRlbV9nZXRfdHlwZSgp Owp9Ci0gKHZvaWQpIHNlbGVjdAp7CiAgICBndGtfaXRlbV9zZWxlY3QoZ3RrKTsKfQotICh2b2lk KSBkZXNlbGVjdAp7CiAgICBndGtfaXRlbV9kZXNlbGVjdChndGspOwp9Ci0gKHZvaWQpIHRvZ2ds ZQp7CiAgICBndGtfaXRlbV90b2dnbGUoZ3RrKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2Jq ZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAx OTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2Fs bHkgZnJvbSBndGtpdGVtZmFjdG9yeS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJdGVtRmFjdG9yeS5oPgoj aW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBY2Nl bEdyb3VwLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLSXRlbUZhY3RvcnkKKyAoR3RrVHlwZSkgZ2V0 VHlwZQp7CiAgICByZXR1cm4gZ3RrX2l0ZW1fZmFjdG9yeV9nZXRfdHlwZSgpOwp9CisgKGlkKSBp dGVtRmFjdG9yeVdpdGhDb250YWluZXJUeXBlOihHdGtUeXBlKSBjb250YWluZXJfdHlwZSBwYXRo OihOU1N0cmluZyAqKSBwYXRoIGFjY2VsR3JvdXA6KEdUS0FjY2VsR3JvdXAgKikgYWNjZWxfZ3Jv dXAKewogICAgcmV0dXJuIFtbKEdUS0l0ZW1GYWN0b3J5ICopW3NlbGYgYWxsb2NdIGluaXRXaXRo Q29udGFpbmVyVHlwZTpjb250YWluZXJfdHlwZSBwYXRoOnBhdGggYWNjZWxHcm91cDphY2NlbF9n cm91cF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aENvbnRhaW5lclR5cGU6KEd0a1R5 cGUpIGNvbnRhaW5lcl90eXBlIHBhdGg6KE5TU3RyaW5nICopIHBhdGggYWNjZWxHcm91cDooR1RL QWNjZWxHcm91cCAqKSBhY2NlbF9ncm91cAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6 Z3RrX2l0ZW1fZmFjdG9yeV9uZXcoIGNvbnRhaW5lcl90eXBlICxndG9vbGtpdF91dGY4X3N0cmlu ZyggcGF0aCApLCBhY2NlbF9ncm91cCA/IGFjY2VsX2dyb3VwLT5ndGsgOiAwKV07Cn0KKyAodm9p ZCkgcGFyc2VSYzooTlNTdHJpbmcgKikgZmlsZV9uYW1lCnsKICAgIGd0a19pdGVtX2ZhY3Rvcnlf cGFyc2VfcmMoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGZpbGVfbmFtZSkpOwp9CisgKHZvaWQpIHBh cnNlUmNTdHJpbmc6KE5TU3RyaW5nICopIHJjX3N0cmluZwp7CiAgICBndGtfaXRlbV9mYWN0b3J5 X3BhcnNlX3JjX3N0cmluZyhndG9vbGtpdF91dGY4X3N0cmluZyggcmNfc3RyaW5nKSk7Cn0KKyAo dm9pZCkgcGFyc2VSY1NjYW5uZXI6KEdTY2FubmVyICopIHNjYW5uZXIKewogICAgZ3RrX2l0ZW1f ZmFjdG9yeV9wYXJzZV9yY19zY2FubmVyKCBzY2FubmVyKTsKfQorICh2b2lkKSBhZGRGb3JlaWdu OihHVEtXaWRnZXQgKikgYWNjZWxfd2lkZ2V0IGZ1bGxQYXRoOihOU1N0cmluZyAqKSBmdWxsX3Bh dGggYWNjZWxHcm91cDooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9ncm91cCBrZXl2YWw6KGd1aW50 KSBrZXl2YWwgbW9kaWZpZXJzOihHZGtNb2RpZmllclR5cGUpIG1vZGlmaWVycwp7CiAgICBndGtf aXRlbV9mYWN0b3J5X2FkZF9mb3JlaWduKCBhY2NlbF93aWRnZXQgID8gYWNjZWxfd2lkZ2V0IC0+ Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggZnVsbF9wYXRoICksIGFjY2VsX2dyb3VwICA/ IGFjY2VsX2dyb3VwIC0+Z3RrIDogMCwga2V5dmFsICwgbW9kaWZpZXJzKTsKfQorIChHVEtJdGVt RmFjdG9yeSopIGZyb21XaWRnZXQ6KEdUS1dpZGdldCAqKSB3aWRnZXQKewogICAgcmV0dXJuIGd0 b29sa2l0X29iamVjdChndGtfaXRlbV9mYWN0b3J5X2Zyb21fd2lkZ2V0KCB3aWRnZXQgPyB3aWRn ZXQtPmd0ayA6IDApLCAwKTsKfQorIChOU1N0cmluZyAqKSBwYXRoRnJvbVdpZGdldDooR1RLV2lk Z2V0ICopIHdpZGdldAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX2l0ZW1f ZmFjdG9yeV9wYXRoX2Zyb21fd2lkZ2V0KCB3aWRnZXQgPyB3aWRnZXQtPmd0ayA6IDApKTsKfQot IChHVEtXaWRnZXQqKSBnZXRJdGVtOihOU1N0cmluZyAqKSBwYXRoCnsKICAgIHJldHVybiBndG9v bGtpdF9vYmplY3QoZ3RrX2l0ZW1fZmFjdG9yeV9nZXRfaXRlbShndGssZ3Rvb2xraXRfdXRmOF9z dHJpbmcoIHBhdGgpKSwgMCk7Cn0KLSAoR1RLV2lkZ2V0KikgZ2V0V2lkZ2V0OihOU1N0cmluZyAq KSBwYXRoCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX2l0ZW1fZmFjdG9yeV9nZXRf d2lkZ2V0KGd0ayxndG9vbGtpdF91dGY4X3N0cmluZyggcGF0aCkpLCAwKTsKfQotIChHVEtXaWRn ZXQqKSBnZXRXaWRnZXRCeUFjdGlvbjooZ3VpbnQpIGFjdGlvbgp7CiAgICByZXR1cm4gZ3Rvb2xr aXRfb2JqZWN0KGd0a19pdGVtX2ZhY3RvcnlfZ2V0X3dpZGdldF9ieV9hY3Rpb24oZ3RrLCBhY3Rp b24pLCAwKTsKfQotIChHVEtXaWRnZXQqKSBnZXRJdGVtQnlBY3Rpb246KGd1aW50KSBhY3Rpb24K ewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfaXRlbV9mYWN0b3J5X2dldF9pdGVtX2J5 X2FjdGlvbihndGssIGFjdGlvbiksIDApOwp9CisgKHZvaWQpIGR1bXBJdGVtczooR3RrUGF0dGVy blNwZWMgKikgcGF0aF9wc3BlYyBtb2RpZmllZE9ubHk6KGdib29sZWFuKSBtb2RpZmllZF9vbmx5 IHByaW50RnVuYzooR3RrUHJpbnRGdW5jKSBwcmludF9mdW5jIGZ1bmNEYXRhOihncG9pbnRlcikg ZnVuY19kYXRhCnsKICAgIGd0a19pdGVtX2ZhY3RvcnlfZHVtcF9pdGVtcyggcGF0aF9wc3BlYyAs IG1vZGlmaWVkX29ubHkgLCBwcmludF9mdW5jICwgZnVuY19kYXRhKTsKfQorICh2b2lkKSBkdW1w UmM6KE5TU3RyaW5nICopIGZpbGVfbmFtZSBwYXRoUHNwZWM6KEd0a1BhdHRlcm5TcGVjICopIHBh dGhfcHNwZWMgbW9kaWZpZWRPbmx5OihnYm9vbGVhbikgbW9kaWZpZWRfb25seQp7CiAgICBndGtf aXRlbV9mYWN0b3J5X2R1bXBfcmMoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGZpbGVfbmFtZSApLCBw YXRoX3BzcGVjICwgbW9kaWZpZWRfb25seSk7Cn0KLSAodm9pZCkgY3JlYXRlSXRlbTooR3RrSXRl bUZhY3RvcnlFbnRyeSAqKSBlbnRyeSBjYWxsYmFja0RhdGE6KGdwb2ludGVyKSBjYWxsYmFja19k YXRhIGNhbGxiYWNrVHlwZTooZ3VpbnQpIGNhbGxiYWNrX3R5cGUKewogICAgZ3RrX2l0ZW1fZmFj dG9yeV9jcmVhdGVfaXRlbShndGssIGVudHJ5ICwgY2FsbGJhY2tfZGF0YSAsIGNhbGxiYWNrX3R5 cGUpOwp9Ci0gKHZvaWQpIGNyZWF0ZUl0ZW1zOihndWludCkgbl9lbnRyaWVzIGVudHJpZXM6KEd0 a0l0ZW1GYWN0b3J5RW50cnkgKikgZW50cmllcyBjYWxsYmFja0RhdGE6KGdwb2ludGVyKSBjYWxs YmFja19kYXRhCnsKICAgIGd0a19pdGVtX2ZhY3RvcnlfY3JlYXRlX2l0ZW1zKGd0aywgbl9lbnRy aWVzICwgZW50cmllcyAsIGNhbGxiYWNrX2RhdGEpOwp9Ci0gKHZvaWQpIGRlbGV0ZUl0ZW06KE5T U3RyaW5nICopIHBhdGgKewogICAgZ3RrX2l0ZW1fZmFjdG9yeV9kZWxldGVfaXRlbShndGssZ3Rv b2xraXRfdXRmOF9zdHJpbmcoIHBhdGgpKTsKfQotICh2b2lkKSBkZWxldGVFbnRyeTooR3RrSXRl bUZhY3RvcnlFbnRyeSAqKSBlbnRyeQp7CiAgICBndGtfaXRlbV9mYWN0b3J5X2RlbGV0ZV9lbnRy eShndGssIGVudHJ5KTsKfQotICh2b2lkKSBkZWxldGVFbnRyaWVzOihndWludCkgbl9lbnRyaWVz IGVudHJpZXM6KEd0a0l0ZW1GYWN0b3J5RW50cnkgKikgZW50cmllcwp7CiAgICBndGtfaXRlbV9m YWN0b3J5X2RlbGV0ZV9lbnRyaWVzKGd0aywgbl9lbnRyaWVzICwgZW50cmllcyk7Cn0KLSAodm9p ZCkgcG9wdXA6KGd1aW50KSB4IHk6KGd1aW50KSB5IG1vdXNlQnV0dG9uOihndWludCkgbW91c2Vf YnV0dG9uIHRpbWU6KGd1aW50MzIpIHRpbWUKewogICAgZ3RrX2l0ZW1fZmFjdG9yeV9wb3B1cChn dGssIHggLCB5ICwgbW91c2VfYnV0dG9uICwgdGltZSk7Cn0KLSAodm9pZCkgcG9wdXBXaXRoRGF0 YTooZ3BvaW50ZXIpIHBvcHVwX2RhdGEgZGVzdHJveTooR3RrRGVzdHJveU5vdGlmeSkgZGVzdHJv eSB4OihndWludCkgeCB5OihndWludCkgeSBtb3VzZUJ1dHRvbjooZ3VpbnQpIG1vdXNlX2J1dHRv biB0aW1lOihndWludDMyKSB0aW1lCnsKICAgIGd0a19pdGVtX2ZhY3RvcnlfcG9wdXBfd2l0aF9k YXRhKGd0aywgcG9wdXBfZGF0YSAsIGRlc3Ryb3kgLCB4ICwgeSAsIG1vdXNlX2J1dHRvbiAsIHRp bWUpOwp9Ci0gKGdwb2ludGVyKSBwb3B1cERhdGEKewogICAgcmV0dXJuIGd0a19pdGVtX2ZhY3Rv cnlfcG9wdXBfZGF0YShndGspOwp9CisgKGdwb2ludGVyKSBwb3B1cERhdGFGcm9tV2lkZ2V0OihH VEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIHJldHVybiBndGtfaXRlbV9mYWN0b3J5X3BvcHVwX2Rh dGFfZnJvbV93aWRnZXQoIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgc2V0 VHJhbnNsYXRlRnVuYzooR3RrVHJhbnNsYXRlRnVuYykgZnVuYyBkYXRhOihncG9pbnRlcikgZGF0 YSBub3RpZnk6KEd0a0Rlc3Ryb3lOb3RpZnkpIG5vdGlmeQp7CiAgICBndGtfaXRlbV9mYWN0b3J5 X3NldF90cmFuc2xhdGVfZnVuYyhndGssIGZ1bmMgLCBkYXRhICwgbm90aWZ5KTsKfQojaW5jbHVk ZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Rm91bmRhdGlvbi9OU0F1 dG9yZWxlYXNlUG9vbC5oPgoKCnN0YXRpYyB2b2lkIGl0ZW1fZm9yd2FyZF9zaWduYWwgKGdwb2lu dGVyIGRhdGEsIGd1aW50IGFjdGlvbiwgR3RrV2lkZ2V0ICp3aWRnZXQpCnsKICAgIE5TQXV0b3Jl bGVhc2VQb29sICpwb29sID0gW05TQXV0b3JlbGVhc2VQb29sIG5ld107CiAgICBpZCB0YXJnZXQg PSBndGtfb2JqZWN0X2dldF9kYXRhKChHdGtPYmplY3QgKikgd2lkZ2V0LCAiX21lbnVfdGFyZ2V0 Iik7CgojaWZkZWYgREVCVUcKICAgIGZwcmludGYoc3RkZXJyLCAiKGl0ZW1fZm9yd2FyZF9zaWdu YWwgaW5pdCkgZ3RrID0gJXAsIGFjdGlvbiBbJXAgJXNdXG4iLAoJICAgIHdpZGdldCwgdGFyZ2V0 LCBzZWxfZ2V0X25hbWUoZGF0YSkpOwojZW5kaWYKICAgIFt0YXJnZXQgcGVyZm9ybVNlbGVjdG9y OmRhdGEgd2l0aE9iamVjdDpHVE9PTEtJVF9PQkpFQ1Qod2lkZ2V0KV07CiAgICBbcG9vbCByZWxl YXNlXTsKI2lmZGVmIERFQlVHCiAgICBmcHJpbnRmKHN0ZGVyciwgIihpdGVtX2ZvcndhcmRfc2ln bmFsIGV4aXQpIGd0ayA9ICVwXG4iLCB3aWRnZXQpOwojZW5kaWYKfQoKIC8qIFRoaXMgbXVzdCBi ZSBrZXB0IGluIHN5bmMgd2l0aCBndGtfaXRlbV9mYWN0b3J5X3BhcnNlX3BhdGgoKSEgKi8Kc3Rh dGljIHZvaWQgaXRlbV9wYXJzZV9wYXRoIChjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzdHIpCnsK ICAgIHdoaWxlICgqc3RyID09ICdfJyA/ICpzdHIrKyA6ICgqcGF0aCsrID0gKnN0cisrKSk7Cn0K CiAtIChpZCkgaW5pdFdpdGhHdGs6KGdwb2ludGVyKSBfZ3RrCnsKICAgIFtzdXBlciBpbml0V2l0 aEd0azpfZ3RrXTsKICAgIGd0a193aWRnZXRfc2hvdyhndGtfaXRlbV9mYWN0b3J5X2dldF93aWRn ZXQoX2d0aywgIiIpKTsKICAgIHJldHVybiAgc2VsZjsJLy8gYXZvaWQgYnVnIGluIG9iamNkb2MK fQoKLyoKICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCB0byBjcmVhdGUgaXRlbSBmYWN0 b3kgZW50cmllcy4gTm90ZSB0aGF0CiAqIGl0IGV4cGVjdHMgYSB2ZWN0b3Igb2YgdHlwZSBHVEtJ dGVtRmFjdG9yeUVudHJ5IChkZWZpbmVkIGluCiAqIEdUb29sS2l0L0dUS0l0ZW1GYWN0b3J5Lmgp IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIEd0a0l0ZW1GYWN0b3J5RW50cnkuCiAqIEBzZWUgLWRl bGV0ZUVudHJpZXM6Y291bnQ6CiAqLwotICh2b2lkKSBjcmVhdGVJdGVtczooR1RLSXRlbUZhY3Rv cnlFbnRyeSAqKSBlbnRyaWVzIGNvdW50OihndWludCkgY291bnQKCSBmb3JUYXJnZXQ6KGlkKSB0 YXJnZXQKewogICAgZm9yICg7IGNvdW50LS07ICsrZW50cmllcykKICAgIHsKCWNoYXIgKnBhdGgg PSBnX25ldyhjaGFyLCBzdHJsZW4oZW50cmllcy0+aXRlbS5wYXRoKSArIDEpOwoJR3RrV2lkZ2V0 ICppdGVtX3dpZGdldDsKCglpZiAoZW50cmllcy0+aXRlbS5jYWxsYmFjayA9PSBOVUxMICYmIGVu dHJpZXMtPnNlbGVjdG9yKQoJICAgIGVudHJpZXMtPml0ZW0uY2FsbGJhY2sgPQoJCShHdGtJdGVt RmFjdG9yeUNhbGxiYWNrKSBpdGVtX2ZvcndhcmRfc2lnbmFsOwoKCWd0a19pdGVtX2ZhY3Rvcnlf Y3JlYXRlX2l0ZW0oZ3RrLCAmZW50cmllcy0+aXRlbSwKCQkJCSAgICAgKGdwb2ludGVyKSBlbnRy aWVzLT5zZWxlY3RvciwgMSk7CgoJaXRlbV9wYXJzZV9wYXRoKHBhdGgsIGVudHJpZXMtPml0ZW0u cGF0aCk7CglpdGVtX3dpZGdldCA9IGd0a19pdGVtX2ZhY3RvcnlfZ2V0X3dpZGdldChndGssIHBh dGgpOwoJZ3RrX29iamVjdF9zZXRfZGF0YSgoR3RrT2JqZWN0ICopIGl0ZW1fd2lkZ2V0LCAiX21l bnVfdGFyZ2V0IiwgdGFyZ2V0KTsKCWdfZnJlZShwYXRoKTsKICAgIH0KfQoKLyoKICogVGhpcyBp cyB0aGUgcHJlZmVycmVkIG1ldGhvZCB0byBkZWxldGUgaXRlbSBmYWN0b3kgZW50cmllcy4gTm90 ZSB0aGF0IGl0CiAqIGV4cGVjdHMgYSB2ZWN0b3Igb2YgdHlwZSBHVEtJdGVtRmFjdG9yeUVudHJ5 IChkZWZpbmVkIGluCiAqIEdUb29sS2l0L0dUS0l0ZW1GYWN0b3J5LmgpIGluc3RlYWQgb2YgdGhl IG9yaWdpbmFsIEd0a0l0ZW1GYWN0b3J5RW50cnkuCiAqIEBzZWUgLWNyZWF0ZUl0ZW1zOmNvdW50 OmZvclRhcmdldDoKICovCi0gKHZvaWQpIGRlbGV0ZUVudHJpZXM6KEdUS0l0ZW1GYWN0b3J5RW50 cnkgKikgZW50cmllcyBjb3VudDooZ3VpbnQpIGNvdW50CnsKICAgIGZvciAoOyBjb3VudC0tOyAr K2VudHJpZXMpCglndGtfaXRlbV9mYWN0b3J5X2RlbGV0ZV9lbnRyeShndGssICZlbnRyaWVzLT5p dGVtKTsKfQoKI2RlZmluZSBndGsJKChHdGtJdGVtRmFjdG9yeSAqKSBndGspCi0gKEdUS0FjY2Vs R3JvdXAgKikgYWNjZWxHcm91cAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0ay0+YWNj ZWxfZ3JvdXAsICJHVEtBY2NlbEdyb3VwIik7Cn0KI3VuZGVmIGd0awpAZW5kCi8qCiAqIEdUb29s S2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJp Z2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1 dG9tYXRpY2FsbHkgZnJvbSBndGtsYWJlbC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5 IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2Rp ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAq IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtMYWJlbC5oPgoKQGlt cGxlbWVudGF0aW9uIEdUS0xhYmVsCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0 a19sYWJlbF9nZXRfdHlwZSgpOwp9CisgKGlkKSBsYWJlbFdpdGhTdHI6KE5TU3RyaW5nICopIHN0 cgp7CiAgICByZXR1cm4gW1soR1RLTGFiZWwgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhTdHI6c3Ry XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoU3RyOihOU1N0cmluZyAqKSBzdHIKewog ICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19sYWJlbF9uZXcoZ3Rvb2xraXRfdXRmOF9z dHJpbmcoIHN0cikpXTsKfQotICh2b2lkKSBzZXRUZXh0OihOU1N0cmluZyAqKSBzdHIKewogICAg Z3RrX2xhYmVsX3NldF90ZXh0KGd0ayxndG9vbGtpdF91dGY4X3N0cmluZyggc3RyKSk7Cn0KLSAo dm9pZCkgc2V0SnVzdGlmeTooR3RrSnVzdGlmaWNhdGlvbikganR5cGUKewogICAgZ3RrX2xhYmVs X3NldF9qdXN0aWZ5KGd0aywganR5cGUpOwp9Ci0gKHZvaWQpIHNldFBhdHRlcm46KE5TU3RyaW5n ICopIHBhdHRlcm4KewogICAgZ3RrX2xhYmVsX3NldF9wYXR0ZXJuKGd0ayxndG9vbGtpdF91dGY4 X3N0cmluZyggcGF0dGVybikpOwp9Ci0gKHZvaWQpIHNldExpbmVXcmFwOihnYm9vbGVhbikgd3Jh cAp7CiAgICBndGtfbGFiZWxfc2V0X2xpbmVfd3JhcChndGssIHdyYXApOwp9Ci0gKHZvaWQpIGdl dDooTlNTdHJpbmcgKiopIHN0cgp7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBndGtfbGFiZWxf Z2V0KGd0aywmX291dHZhbF8xKTsKICAgICogc3RyID0gZ3Rvb2xraXRfb2JqY19zdHJpbmcoX291 dHZhbF8xKTsKfQotIChndWludCkgcGFyc2VVbGluZTooTlNTdHJpbmcgKikgc3RyaW5nCnsKICAg IHJldHVybiBndGtfbGFiZWxfcGFyc2VfdWxpbmUoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBz dHJpbmcpKTsKfQojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKLSAodm9p ZCkgc2V0RG91YmxlVmFsdWU6KGRvdWJsZSkgdmFsdWUKewogICAgY2hhciBzdHJpbmdbNjRdOwoK ICAgIHNwcmludGYoc3RyaW5nLCAiJWciLCB2YWx1ZSk7CiAgICBndGtfbGFiZWxfc2V0X3RleHQo Z3RrLCBzdHJpbmcpOwp9CgotICh2b2lkKSBzZXRJbnRWYWx1ZTooaW50KSB2YWx1ZQp7CiAgICBj aGFyIHN0cmluZ1s2NF07CgogICAgc3ByaW50ZihzdHJpbmcsICIlZCIsIHZhbHVlKTsKICAgIGd0 a19sYWJlbF9zZXRfdGV4dChndGssIHN0cmluZyk7Cn0KCi0gKHZvaWQpIHNldFN0cmluZ1ZhbHVl OihOU1N0cmluZyAqKSB2YWx1ZQp7CiAgICBndGtfbGFiZWxfc2V0X3RleHQoZ3RrLCBndG9vbGtp dF91dGY4X3N0cmluZyh2YWx1ZSkpOwp9CgotIChkb3VibGUpIGRvdWJsZVZhbHVlCnsKICAgIGNo YXIgKnN0cmluZzsKCiAgICBndGtfbGFiZWxfZ2V0KGd0aywgJnN0cmluZyk7CiAgICByZXR1cm4g YXRvZihzdHJpbmcpOwp9CgotIChpbnQpIGludFZhbHVlCnsKICAgIGNoYXIgKnN0cmluZzsKCiAg ICBndGtfbGFiZWxfZ2V0KGd0aywgJnN0cmluZyk7CiAgICByZXR1cm4gYXRvaShzdHJpbmcpOwp9 CgotIChOU1N0cmluZyAqKSBzdHJpbmdWYWx1ZQp7CiAgICBjaGFyICpzdHJpbmc7CgogICAgZ3Rr X2xhYmVsX2dldChndGssICZzdHJpbmcpOwogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5n KHN0cmluZyk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0 byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxt YXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrbGF5b3V0Lmgg YnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBM aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1 ZGUgPEdUb29sS2l0L0dUS0xheW91dC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+ CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBZGp1c3RtZW50Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RL TGF5b3V0CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19sYXlvdXRfZ2V0X3R5 cGUoKTsKfQorIChpZCkgbGF5b3V0V2l0aEhhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhh ZGp1c3RtZW50IHZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAg IHJldHVybiBbWyhHVEtMYXlvdXQgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhIYWRqdXN0bWVudDpo YWRqdXN0bWVudCB2YWRqdXN0bWVudDp2YWRqdXN0bWVudF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlk KSBpbml0V2l0aEhhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3RtZW50IHZhZGp1 c3RtZW50OihHVEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJldHVybiBbc2VsZiBp bml0V2l0aEd0azpndGtfbGF5b3V0X25ldyggaGFkanVzdG1lbnQgID8gaGFkanVzdG1lbnQgLT5n dGsgOiAwLCB2YWRqdXN0bWVudCA/IHZhZGp1c3RtZW50LT5ndGsgOiAwKV07Cn0KLSAodm9pZCkg cHV0OihHVEtXaWRnZXQgKikgd2lkZ2V0IHg6KGdpbnQpIHggeTooZ2ludCkgeQp7CiAgICBndGtf bGF5b3V0X3B1dChndGssIHdpZGdldCAgPyB3aWRnZXQgLT5ndGsgOiAwLCB4ICwgeSk7Cn0KLSAo dm9pZCkgbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldCB4OihnaW50KSB4IHk6KGdpbnQpIHkKewog ICAgZ3RrX2xheW91dF9tb3ZlKGd0aywgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6IDAsIHggLCB5 KTsKfQotICh2b2lkKSBzZXRTaXplOihndWludCkgd2lkdGggaGVpZ2h0OihndWludCkgaGVpZ2h0 CnsKICAgIGd0a19sYXlvdXRfc2V0X3NpemUoZ3RrLCB3aWR0aCAsIGhlaWdodCk7Cn0KLSAoR1RL QWRqdXN0bWVudCopIGdldEhhZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3Qo Z3RrX2xheW91dF9nZXRfaGFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAoR1RLQWRqdXN0bWVudCop IGdldFZhZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX2xheW91dF9n ZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0SGFkanVzdG1lbnQ6KEdUS0Fk anVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfbGF5b3V0X3NldF9oYWRqdXN0bWVudChn dGssIGFkanVzdG1lbnQgPyBhZGp1c3RtZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRWYWRq dXN0bWVudDooR1RLQWRqdXN0bWVudCAqKSBhZGp1c3RtZW50CnsKICAgIGd0a19sYXlvdXRfc2V0 X3ZhZGp1c3RtZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0g KHZvaWQpIGZyZWV6ZQp7CiAgICBndGtfbGF5b3V0X2ZyZWV6ZShndGspOwp9Ci0gKHZvaWQpIHRo YXcKewogICAgZ3RrX2xheW91dF90aGF3KGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh bGx5IGZyb20gZ3RrbGlzdC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2 ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtMaXN0Lmg+CiNpbmNsdWRlIDxHVG9v bEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtMaXN0CisgKEd0a1R5cGUpIGdl dFR5cGUKewogICAgcmV0dXJuIGd0a19saXN0X2dldF90eXBlKCk7Cn0KKyAoaWQpIGxpc3QKewog ICAgcmV0dXJuIFtbKEdUS0xpc3QgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9 Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfbGlzdF9uZXco KV07Cn0KLSAodm9pZCkgaW5zZXJ0SXRlbXM6KE5TQXJyYXkgKikgaXRlbXMgcG9zaXRpb246KGdp bnQpIHBvc2l0aW9uCnsKICAgIGd0a19saXN0X2luc2VydF9pdGVtcyhndGssZ3Rvb2xraXRfYXJy YXlfdG9fbGlzdCggaXRlbXMgKSwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIGFwcGVuZEl0ZW1zOihO U0FycmF5ICopIGl0ZW1zCnsKICAgIGd0a19saXN0X2FwcGVuZF9pdGVtcyhndGssZ3Rvb2xraXRf YXJyYXlfdG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSBwcmVwZW5kSXRlbXM6KE5TQXJyYXkg KikgaXRlbXMKewogICAgZ3RrX2xpc3RfcHJlcGVuZF9pdGVtcyhndGssZ3Rvb2xraXRfYXJyYXlf dG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSByZW1vdmVJdGVtczooTlNBcnJheSAqKSBpdGVt cwp7CiAgICBndGtfbGlzdF9yZW1vdmVfaXRlbXMoZ3RrLGd0b29sa2l0X2FycmF5X3RvX2xpc3Qo IGl0ZW1zKSk7Cn0KLSAodm9pZCkgcmVtb3ZlSXRlbXNOb1VucmVmOihOU0FycmF5ICopIGl0ZW1z CnsKICAgIGd0a19saXN0X3JlbW92ZV9pdGVtc19ub191bnJlZihndGssZ3Rvb2xraXRfYXJyYXlf dG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSBjbGVhckl0ZW1zOihnaW50KSBzdGFydCBlbmQ6 KGdpbnQpIGVuZAp7CiAgICBndGtfbGlzdF9jbGVhcl9pdGVtcyhndGssIHN0YXJ0ICwgZW5kKTsK fQotICh2b2lkKSBzZWxlY3RJdGVtOihnaW50KSBpdGVtCnsKICAgIGd0a19saXN0X3NlbGVjdF9p dGVtKGd0aywgaXRlbSk7Cn0KLSAodm9pZCkgdW5zZWxlY3RJdGVtOihnaW50KSBpdGVtCnsKICAg IGd0a19saXN0X3Vuc2VsZWN0X2l0ZW0oZ3RrLCBpdGVtKTsKfQotICh2b2lkKSBzZWxlY3RDaGls ZDooR1RLV2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19saXN0X3NlbGVjdF9jaGlsZChndGssIGNo aWxkID8gY2hpbGQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHVuc2VsZWN0Q2hpbGQ6KEdUS1dpZGdl dCAqKSBjaGlsZAp7CiAgICBndGtfbGlzdF91bnNlbGVjdF9jaGlsZChndGssIGNoaWxkID8gY2hp bGQtPmd0ayA6IDApOwp9Ci0gKGdpbnQpIGNoaWxkUG9zaXRpb246KEdUS1dpZGdldCAqKSBjaGls ZAp7CiAgICByZXR1cm4gZ3RrX2xpc3RfY2hpbGRfcG9zaXRpb24oZ3RrLCBjaGlsZCA/IGNoaWxk LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRTZWxlY3Rpb25Nb2RlOihHdGtTZWxlY3Rpb25Nb2Rl KSBtb2RlCnsKICAgIGd0a19saXN0X3NldF9zZWxlY3Rpb25fbW9kZShndGssIG1vZGUpOwp9Ci0g KHZvaWQpIGV4dGVuZFNlbGVjdGlvbjooR3RrU2Nyb2xsVHlwZSkgc2Nyb2xsX3R5cGUgcG9zaXRp b246KGdmbG9hdCkgcG9zaXRpb24gYXV0b1N0YXJ0U2VsZWN0aW9uOihnYm9vbGVhbikgYXV0b19z dGFydF9zZWxlY3Rpb24KewogICAgZ3RrX2xpc3RfZXh0ZW5kX3NlbGVjdGlvbihndGssIHNjcm9s bF90eXBlICwgcG9zaXRpb24gLCBhdXRvX3N0YXJ0X3NlbGVjdGlvbik7Cn0KLSAodm9pZCkgc3Rh cnRTZWxlY3Rpb24KewogICAgZ3RrX2xpc3Rfc3RhcnRfc2VsZWN0aW9uKGd0ayk7Cn0KLSAodm9p ZCkgZW5kU2VsZWN0aW9uCnsKICAgIGd0a19saXN0X2VuZF9zZWxlY3Rpb24oZ3RrKTsKfQotICh2 b2lkKSBzZWxlY3RBbGwKewogICAgZ3RrX2xpc3Rfc2VsZWN0X2FsbChndGspOwp9Ci0gKHZvaWQp IHVuc2VsZWN0QWxsCnsKICAgIGd0a19saXN0X3Vuc2VsZWN0X2FsbChndGspOwp9Ci0gKHZvaWQp IHNjcm9sbEhvcml6b250YWw6KEd0a1Njcm9sbFR5cGUpIHNjcm9sbF90eXBlIHBvc2l0aW9uOihn ZmxvYXQpIHBvc2l0aW9uCnsKICAgIGd0a19saXN0X3Njcm9sbF9ob3Jpem9udGFsKGd0aywgc2Ny b2xsX3R5cGUgLCBwb3NpdGlvbik7Cn0KLSAodm9pZCkgc2Nyb2xsVmVydGljYWw6KEd0a1Njcm9s bFR5cGUpIHNjcm9sbF90eXBlIHBvc2l0aW9uOihnZmxvYXQpIHBvc2l0aW9uCnsKICAgIGd0a19s aXN0X3Njcm9sbF92ZXJ0aWNhbChndGssIHNjcm9sbF90eXBlICwgcG9zaXRpb24pOwp9Ci0gKHZv aWQpIHRvZ2dsZUFkZE1vZGUKewogICAgZ3RrX2xpc3RfdG9nZ2xlX2FkZF9tb2RlKGd0ayk7Cn0K LSAodm9pZCkgdG9nZ2xlRm9jdXNSb3cKewogICAgZ3RrX2xpc3RfdG9nZ2xlX2ZvY3VzX3Jvdyhn dGspOwp9Ci0gKHZvaWQpIHRvZ2dsZVJvdzooR1RLV2lkZ2V0ICopIGl0ZW0KewogICAgZ3RrX2xp c3RfdG9nZ2xlX3JvdyhndGssIGl0ZW0gPyBpdGVtLT5ndGsgOiAwKTsKfQotICh2b2lkKSB1bmRv U2VsZWN0aW9uCnsKICAgIGd0a19saXN0X3VuZG9fc2VsZWN0aW9uKGd0ayk7Cn0KLSAodm9pZCkg ZW5kRHJhZ1NlbGVjdGlvbgp7CiAgICBndGtfbGlzdF9lbmRfZHJhZ19zZWxlY3Rpb24oZ3RrKTsK fQojZGVmaW5lIGd0awkoKEd0a0xpc3QgKikgZ3RrKQotIChOU0FycmF5ICopIHNlbGVjdGlvbgp7 CiAgICByZXR1cm4gZ3Rvb2xraXRfbGlzdF90b19hcnJheShndGstPnNlbGVjdGlvbik7Cn0KI3Vu ZGVmIGd0awpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRo ZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBM dWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtsaXN0aXRlbS5oIGJ5 IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGlj ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRl IDxHVG9vbEtpdC9HVEtMaXN0SXRlbS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0xpc3RJdGVtCisg KEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19saXN0X2l0ZW1fZ2V0X3R5cGUoKTsK fQorIChpZCkgbGlzdEl0ZW0KewogICAgcmV0dXJuIFtbKEdUS0xpc3RJdGVtICopW3NlbGYgYWxs b2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYg aW5pdFdpdGhHdGs6Z3RrX2xpc3RfaXRlbV9uZXcoKV07Cn0KKyAoaWQpIGxpc3RJdGVtV2l0aExh YmVsOihOU1N0cmluZyAqKSBsYWJlbAp7CiAgICByZXR1cm4gW1soR1RLTGlzdEl0ZW0gKilbc2Vs ZiBhbGxvY10gaW5pdFdpdGhMYWJlbDpsYWJlbF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0 V2l0aExhYmVsOihOU1N0cmluZyAqKSBsYWJlbAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH dGs6Z3RrX2xpc3RfaXRlbV9uZXdfd2l0aF9sYWJlbChndG9vbGtpdF91dGY4X3N0cmluZyggbGFi ZWwpKV07Cn0KLSAodm9pZCkgc2VsZWN0CnsKICAgIGd0a19saXN0X2l0ZW1fc2VsZWN0KGd0ayk7 Cn0KLSAodm9pZCkgZGVzZWxlY3QKewogICAgZ3RrX2xpc3RfaXRlbV9kZXNlbGVjdChndGspOwp9 CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a21haW4uaCBieSBndGtnZW4uCiAq CiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQv R1RLTWFpbi5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CiNpbmNsdWRlIDxHVG9v bEtpdC9HVEtPYmplY3QuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVt ZW50YXRpb24gR1RLTWFpbgotIChOU1N0cmluZyAqKSBjaGVja1ZlcnNpb246KGd1aW50KSByZXF1 aXJlZF9tYWpvciByZXF1aXJlZE1pbm9yOihndWludCkgcmVxdWlyZWRfbWlub3IgcmVxdWlyZWRN aWNybzooZ3VpbnQpIHJlcXVpcmVkX21pY3JvCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpjX3N0 cmluZyhndGtfY2hlY2tfdmVyc2lvbiggcmVxdWlyZWRfbWFqb3IgLCByZXF1aXJlZF9taW5vciAs IHJlcXVpcmVkX21pY3JvKSk7Cn0KLSAodm9pZCkgZXhpdDooZ2ludCkgZXJyb3JfY29kZQp7CiAg ICBndGtfZXhpdCggZXJyb3JfY29kZSk7Cn0KLSAoTlNTdHJpbmcgKikgc2V0TG9jYWxlCnsKICAg IHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfc2V0X2xvY2FsZSgpKTsKfQotIChnaW50 KSBldmVudHNQZW5kaW5nCnsKICAgIHJldHVybiBndGtfZXZlbnRzX3BlbmRpbmcoKTsKfQotICh2 b2lkKSBtYWluRG9FdmVudDooR2RrRXZlbnQgKikgZXZlbnQKewogICAgZ3RrX21haW5fZG9fZXZl bnQoIGV2ZW50KTsKfQotICh2b2lkKSBtYWluCnsKICAgIGd0a19tYWluKCk7Cn0KLSAoZ3VpbnQp IG1haW5MZXZlbAp7CiAgICByZXR1cm4gZ3RrX21haW5fbGV2ZWwoKTsKfQotICh2b2lkKSBtYWlu UXVpdAp7CiAgICBndGtfbWFpbl9xdWl0KCk7Cn0KLSAoZ2ludCkgbWFpbkl0ZXJhdGlvbgp7CiAg ICByZXR1cm4gZ3RrX21haW5faXRlcmF0aW9uKCk7Cn0KLSAoZ2ludCkgbWFpbkl0ZXJhdGlvbkRv OihnYm9vbGVhbikgYmxvY2tpbmcKewogICAgcmV0dXJuIGd0a19tYWluX2l0ZXJhdGlvbl9kbygg YmxvY2tpbmcpOwp9Ci0gKGdpbnQpIHRydWUKewogICAgcmV0dXJuIGd0a190cnVlKCk7Cn0KLSAo Z2ludCkgZmFsc2UKewogICAgcmV0dXJuIGd0a19mYWxzZSgpOwp9Ci0gKHZvaWQpIGdyYWJBZGQ6 KEdUS1dpZGdldCAqKSB3aWRnZXQKewogICAgZ3RrX2dyYWJfYWRkKCB3aWRnZXQgPyB3aWRnZXQt Pmd0ayA6IDApOwp9Ci0gKEdUS1dpZGdldCopIGdyYWJHZXRDdXJyZW50CnsKICAgIHJldHVybiBn dG9vbGtpdF9vYmplY3QoZ3RrX2dyYWJfZ2V0X2N1cnJlbnQoKSwgMCk7Cn0KLSAodm9pZCkgZ3Jh YlJlbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldAp7CiAgICBndGtfZ3JhYl9yZW1vdmUoIHdpZGdl dCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgaW5pdEFkZDooR3RrRnVuY3Rpb24pIGZ1 bmN0aW9uIGRhdGE6KGdwb2ludGVyKSBkYXRhCnsKICAgIGd0a19pbml0X2FkZCggZnVuY3Rpb24g LCBkYXRhKTsKfQotICh2b2lkKSBxdWl0QWRkRGVzdHJveTooZ3VpbnQpIG1haW5fbGV2ZWwgb2Jq ZWN0OihHVEtPYmplY3QgKikgb2JqZWN0CnsKICAgIGd0a19xdWl0X2FkZF9kZXN0cm95KCBtYWlu X2xldmVsICwgb2JqZWN0ID8gb2JqZWN0LT5ndGsgOiAwKTsKfQotIChndWludCkgcXVpdEFkZDoo Z3VpbnQpIG1haW5fbGV2ZWwgZnVuY3Rpb246KEd0a0Z1bmN0aW9uKSBmdW5jdGlvbiBkYXRhOihn cG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX3F1aXRfYWRkKCBtYWluX2xldmVsICwgZnVu Y3Rpb24gLCBkYXRhKTsKfQotIChndWludCkgcXVpdEFkZEZ1bGw6KGd1aW50KSBtYWluX2xldmVs IGZ1bmN0aW9uOihHdGtGdW5jdGlvbikgZnVuY3Rpb24gbWFyc2hhbDooR3RrQ2FsbGJhY2tNYXJz aGFsKSBtYXJzaGFsIGRhdGE6KGdwb2ludGVyKSBkYXRhIGRlc3Ryb3k6KEd0a0Rlc3Ryb3lOb3Rp ZnkpIGRlc3Ryb3kKewogICAgcmV0dXJuIGd0a19xdWl0X2FkZF9mdWxsKCBtYWluX2xldmVsICwg ZnVuY3Rpb24gLCBtYXJzaGFsICwgZGF0YSAsIGRlc3Ryb3kpOwp9Ci0gKHZvaWQpIHF1aXRSZW1v dmU6KGd1aW50KSBxdWl0X2hhbmRsZXJfaWQKewogICAgZ3RrX3F1aXRfcmVtb3ZlKCBxdWl0X2hh bmRsZXJfaWQpOwp9Ci0gKHZvaWQpIHF1aXRSZW1vdmVCeURhdGE6KGdwb2ludGVyKSBkYXRhCnsK ICAgIGd0a19xdWl0X3JlbW92ZV9ieV9kYXRhKCBkYXRhKTsKfQotIChndWludCkgdGltZW91dEFk ZDooZ3VpbnQzMikgaW50ZXJ2YWwgZnVuY3Rpb246KEd0a0Z1bmN0aW9uKSBmdW5jdGlvbiBkYXRh OihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX3RpbWVvdXRfYWRkKCBpbnRlcnZhbCAs IGZ1bmN0aW9uICwgZGF0YSk7Cn0KLSAoZ3VpbnQpIHRpbWVvdXRBZGRGdWxsOihndWludDMyKSBp bnRlcnZhbCBmdW5jdGlvbjooR3RrRnVuY3Rpb24pIGZ1bmN0aW9uIG1hcnNoYWw6KEd0a0NhbGxi YWNrTWFyc2hhbCkgbWFyc2hhbCBkYXRhOihncG9pbnRlcikgZGF0YSBkZXN0cm95OihHdGtEZXN0 cm95Tm90aWZ5KSBkZXN0cm95CnsKICAgIHJldHVybiBndGtfdGltZW91dF9hZGRfZnVsbCggaW50 ZXJ2YWwgLCBmdW5jdGlvbiAsIG1hcnNoYWwgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAodm9pZCkg dGltZW91dFJlbW92ZTooZ3VpbnQpIHRpbWVvdXRfaGFuZGxlcl9pZAp7CiAgICBndGtfdGltZW91 dF9yZW1vdmUoIHRpbWVvdXRfaGFuZGxlcl9pZCk7Cn0KLSAoZ3VpbnQpIGlkbGVBZGQ6KEd0a0Z1 bmN0aW9uKSBmdW5jdGlvbiBkYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2lk bGVfYWRkKCBmdW5jdGlvbiAsIGRhdGEpOwp9Ci0gKGd1aW50KSBpZGxlQWRkUHJpb3JpdHk6KGdp bnQpIHByaW9yaXR5IGZ1bmN0aW9uOihHdGtGdW5jdGlvbikgZnVuY3Rpb24gZGF0YTooZ3BvaW50 ZXIpIGRhdGEKewogICAgcmV0dXJuIGd0a19pZGxlX2FkZF9wcmlvcml0eSggcHJpb3JpdHkgLCBm dW5jdGlvbiAsIGRhdGEpOwp9Ci0gKGd1aW50KSBpZGxlQWRkRnVsbDooZ2ludCkgcHJpb3JpdHkg ZnVuY3Rpb246KEd0a0Z1bmN0aW9uKSBmdW5jdGlvbiBtYXJzaGFsOihHdGtDYWxsYmFja01hcnNo YWwpIG1hcnNoYWwgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZGVzdHJveTooR3RrRGVzdHJveU5vdGlm eSkgZGVzdHJveQp7CiAgICByZXR1cm4gZ3RrX2lkbGVfYWRkX2Z1bGwoIHByaW9yaXR5ICwgZnVu Y3Rpb24gLCBtYXJzaGFsICwgZGF0YSAsIGRlc3Ryb3kpOwp9Ci0gKHZvaWQpIGlkbGVSZW1vdmU6 KGd1aW50KSBpZGxlX2hhbmRsZXJfaWQKewogICAgZ3RrX2lkbGVfcmVtb3ZlKCBpZGxlX2hhbmRs ZXJfaWQpOwp9Ci0gKHZvaWQpIGlkbGVSZW1vdmVCeURhdGE6KGdwb2ludGVyKSBkYXRhCnsKICAg IGd0a19pZGxlX3JlbW92ZV9ieV9kYXRhKCBkYXRhKTsKfQotIChndWludCkgaW5wdXRBZGRGdWxs OihnaW50KSBzb3VyY2UgY29uZGl0aW9uOihHZGtJbnB1dENvbmRpdGlvbikgY29uZGl0aW9uIGZ1 bmN0aW9uOihHZGtJbnB1dEZ1bmN0aW9uKSBmdW5jdGlvbiBtYXJzaGFsOihHdGtDYWxsYmFja01h cnNoYWwpIG1hcnNoYWwgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZGVzdHJveTooR3RrRGVzdHJveU5v dGlmeSkgZGVzdHJveQp7CiAgICByZXR1cm4gZ3RrX2lucHV0X2FkZF9mdWxsKCBzb3VyY2UgLCBj b25kaXRpb24gLCBmdW5jdGlvbiAsIG1hcnNoYWwgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAodm9p ZCkgaW5wdXRSZW1vdmU6KGd1aW50KSBpbnB1dF9oYW5kbGVyX2lkCnsKICAgIGd0a19pbnB1dF9y ZW1vdmUoIGlucHV0X2hhbmRsZXJfaWQpOwp9Ci0gKGd1aW50KSBrZXlTbm9vcGVySW5zdGFsbDoo R3RrS2V5U25vb3BGdW5jKSBzbm9vcGVyIGZ1bmNEYXRhOihncG9pbnRlcikgZnVuY19kYXRhCnsK ICAgIHJldHVybiBndGtfa2V5X3Nub29wZXJfaW5zdGFsbCggc25vb3BlciAsIGZ1bmNfZGF0YSk7 Cn0KLSAodm9pZCkga2V5U25vb3BlclJlbW92ZTooZ3VpbnQpIHNub29wZXJfaGFuZGxlcl9pZAp7 CiAgICBndGtfa2V5X3Nub29wZXJfcmVtb3ZlKCBzbm9vcGVyX2hhbmRsZXJfaWQpOwp9Ci0gKEdk a0V2ZW50KikgZ2V0Q3VycmVudEV2ZW50CnsKICAgIHJldHVybiBndGtfZ2V0X2N1cnJlbnRfZXZl bnQoKTsKfQotIChHVEtXaWRnZXQqKSBnZXRFdmVudFdpZGdldDooR2RrRXZlbnQgKikgZXZlbnQK ewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfZ2V0X2V2ZW50X3dpZGdldCggZXZlbnQp LCAwKTsKfQotICh2b2lkKSByY0luaXQKewogICAgZ3RrX3JjX2luaXQoKTsKfQotICh2b2lkKSBy Y0FkZERlZmF1bHRGaWxlOihOU1N0cmluZyAqKSBmaWxlbmFtZQp7CiAgICBndGtfcmNfYWRkX2Rl ZmF1bHRfZmlsZShndG9vbGtpdF91dGY4X3N0cmluZyggZmlsZW5hbWUpKTsKfQotICh2b2lkKSBy Y1NldERlZmF1bHRGaWxlczooTlNBcnJheSAgKikgZmlsZW5hbWVzCnsKICAgIGd0a19yY19zZXRf ZGVmYXVsdF9maWxlcygoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIGZpbGVuYW1l cykpOwp9Ci0gKE5TQXJyYXkgICopIHJjR2V0RGVmYXVsdEZpbGVzCnsKICAgIHJldHVybiBndG9v bGtpdF9zdHJ2ZWNfdG9fYXJyYXkoKGNvbnN0IGNoYXIgKiopZ3RrX3JjX2dldF9kZWZhdWx0X2Zp bGVzKCkpOwp9Ci0gKHZvaWQpIHJjUGFyc2U6KE5TU3RyaW5nICopIGZpbGVuYW1lCnsKICAgIGd0 a19yY19wYXJzZShndG9vbGtpdF91dGY4X3N0cmluZyggZmlsZW5hbWUpKTsKfQotICh2b2lkKSBy Y1BhcnNlU3RyaW5nOihOU1N0cmluZyAqKSByY19zdHJpbmcKewogICAgZ3RrX3JjX3BhcnNlX3N0 cmluZyhndG9vbGtpdF91dGY4X3N0cmluZyggcmNfc3RyaW5nKSk7Cn0KLSAoZ2Jvb2xlYW4pIHJj UmVwYXJzZUFsbAp7CiAgICByZXR1cm4gZ3RrX3JjX3JlcGFyc2VfYWxsKCk7Cn0KLSAoR1RLU3R5 bGUqKSByY0dldFN0eWxlOihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIHJldHVybiBndG9vbGtp dF9vYmplY3QoZ3RrX3JjX2dldF9zdHlsZSggd2lkZ2V0ID8gd2lkZ2V0LT5ndGsgOiAwKSwgIkdU S1N0eWxlIik7Cn0KLSAodm9pZCkgcmNBZGRXaWRnZXROYW1lU3R5bGU6KEd0a1JjU3R5bGUgKikg cmNfc3R5bGUgcGF0dGVybjooTlNTdHJpbmcgKikgcGF0dGVybgp7CiAgICBndGtfcmNfYWRkX3dp ZGdldF9uYW1lX3N0eWxlKCByY19zdHlsZSAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHBhdHRlcm4p KTsKfQotICh2b2lkKSByY0FkZFdpZGdldENsYXNzU3R5bGU6KEd0a1JjU3R5bGUgKikgcmNfc3R5 bGUgcGF0dGVybjooTlNTdHJpbmcgKikgcGF0dGVybgp7CiAgICBndGtfcmNfYWRkX3dpZGdldF9j bGFzc19zdHlsZSggcmNfc3R5bGUgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBwYXR0ZXJuKSk7Cn0K LSAodm9pZCkgcmNBZGRDbGFzc1N0eWxlOihHdGtSY1N0eWxlICopIHJjX3N0eWxlIHBhdHRlcm46 KE5TU3RyaW5nICopIHBhdHRlcm4KewogICAgZ3RrX3JjX2FkZF9jbGFzc19zdHlsZSggcmNfc3R5 bGUgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBwYXR0ZXJuKSk7Cn0KLSAoR3RrUmNTdHlsZSopIHJj U3R5bGVOZXcKewogICAgcmV0dXJuIGd0a19yY19zdHlsZV9uZXcoKTsKfQotICh2b2lkKSByY1N0 eWxlUmVmOihHdGtSY1N0eWxlICopIHJjX3N0eWxlCnsKICAgIGd0a19yY19zdHlsZV9yZWYoIHJj X3N0eWxlKTsKfQotICh2b2lkKSByY1N0eWxlVW5yZWY6KEd0a1JjU3R5bGUgKikgcmNfc3R5bGUK ewogICAgZ3RrX3JjX3N0eWxlX3VucmVmKCByY19zdHlsZSk7Cn0KLSAodm9pZCkgcmNTZXRJbWFn ZUxvYWRlcjooR3RrSW1hZ2VMb2FkZXIpIGxvYWRlcgp7CiAgICBndGtfcmNfc2V0X2ltYWdlX2xv YWRlciggbG9hZGVyKTsKfQotIChHZGtQaXhtYXAqKSByY0xvYWRJbWFnZTooR2RrQ29sb3JtYXAg KikgY29sb3JtYXAgdHJhbnNwYXJlbnRDb2xvcjooR2RrQ29sb3IgKikgdHJhbnNwYXJlbnRfY29s b3IgZmlsZW5hbWU6KE5TU3RyaW5nICopIGZpbGVuYW1lCnsKICAgIHJldHVybiBndGtfcmNfbG9h ZF9pbWFnZSggY29sb3JtYXAgLCB0cmFuc3BhcmVudF9jb2xvciAsZ3Rvb2xraXRfdXRmOF9zdHJp bmcoIGZpbGVuYW1lKSk7Cn0KLSAoTlNTdHJpbmcgKikgcmNGaW5kUGl4bWFwSW5QYXRoOihHU2Nh bm5lciAqKSBzY2FubmVyIHBpeG1hcEZpbGU6KE5TU3RyaW5nICopIHBpeG1hcF9maWxlCnsKICAg IHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfcmNfZmluZF9waXhtYXBfaW5fcGF0aCgg c2Nhbm5lciAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHBpeG1hcF9maWxlKSkpOwp9Ci0gKE5TU3Ry aW5nICopIHJjRmluZE1vZHVsZUluUGF0aDooTlNTdHJpbmcgKikgbW9kdWxlX2ZpbGUKewogICAg cmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19yY19maW5kX21vZHVsZV9pbl9wYXRoKGd0 b29sa2l0X3V0Zjhfc3RyaW5nKCBtb2R1bGVfZmlsZSkpKTsKfQotIChOU1N0cmluZyAqKSByY0dl dFRoZW1lRGlyCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfcmNfZ2V0X3Ro ZW1lX2RpcigpKTsKfQotIChOU1N0cmluZyAqKSByY0dldE1vZHVsZURpcgp7CiAgICByZXR1cm4g Z3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX3JjX2dldF9tb2R1bGVfZGlyKCkpOwp9Ci0gKGd1aW50 KSByY1BhcnNlOihHU2Nhbm5lciAqKSBzY2FubmVyIGNvbG9yOihHZGtDb2xvciAqKSBjb2xvcgp7 CiAgICByZXR1cm4gZ3RrX3JjX3BhcnNlX2NvbG9yKCBzY2FubmVyICwgY29sb3IpOwp9Ci0gKGd1 aW50KSByY1BhcnNlOihHU2Nhbm5lciAqKSBzY2FubmVyIHN0YXRlOihHdGtTdGF0ZVR5cGUgKikg c3RhdGUKewogICAgcmV0dXJuIGd0a19yY19wYXJzZV9zdGF0ZSggc2Nhbm5lciAsIHN0YXRlKTsK fQotIChndWludCkgcmNQYXJzZTooR1NjYW5uZXIgKikgc2Nhbm5lciBwcmlvcml0eTooR3RrUGF0 aFByaW9yaXR5VHlwZSAqKSBwcmlvcml0eQp7CiAgICByZXR1cm4gZ3RrX3JjX3BhcnNlX3ByaW9y aXR5KCBzY2FubmVyICwgcHJpb3JpdHkpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm cm9tIGd0a21lbnUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lv biAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLTWVudS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQv R1RLV2lkZ2V0Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBY2NlbEdyb3VwLmg+CgpAaW1wbGVt ZW50YXRpb24gR1RLTWVudQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfbWVu dV9nZXRfdHlwZSgpOwp9CisgKGlkKSBtZW51CnsKICAgIHJldHVybiBbWyhHVEtNZW51ICopW3Nl bGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4g W3NlbGYgaW5pdFdpdGhHdGs6Z3RrX21lbnVfbmV3KCldOwp9Ci0gKHZvaWQpIGFwcGVuZDooR1RL V2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19tZW51X2FwcGVuZChndGssIGNoaWxkID8gY2hpbGQt Pmd0ayA6IDApOwp9Ci0gKHZvaWQpIHByZXBlbmQ6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBn dGtfbWVudV9wcmVwZW5kKGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg aW5zZXJ0OihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAg IGd0a19tZW51X2luc2VydChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgcG9zaXRpb24p Owp9Ci0gKHZvaWQpIHBvcHVwOihHVEtXaWRnZXQgKikgcGFyZW50X21lbnVfc2hlbGwgcGFyZW50 TWVudUl0ZW06KEdUS1dpZGdldCAqKSBwYXJlbnRfbWVudV9pdGVtIGZ1bmM6KEd0a01lbnVQb3Np dGlvbkZ1bmMpIGZ1bmMgZGF0YTooZ3BvaW50ZXIpIGRhdGEgYnV0dG9uOihndWludCkgYnV0dG9u IGFjdGl2YXRlVGltZTooZ3VpbnQzMikgYWN0aXZhdGVfdGltZQp7CiAgICBndGtfbWVudV9wb3B1 cChndGssIHBhcmVudF9tZW51X3NoZWxsICA/IHBhcmVudF9tZW51X3NoZWxsIC0+Z3RrIDogMCwg cGFyZW50X21lbnVfaXRlbSAgPyBwYXJlbnRfbWVudV9pdGVtIC0+Z3RrIDogMCwgZnVuYyAsIGRh dGEgLCBidXR0b24gLCBhY3RpdmF0ZV90aW1lKTsKfQotICh2b2lkKSByZXBvc2l0aW9uCnsKICAg IGd0a19tZW51X3JlcG9zaXRpb24oZ3RrKTsKfQotICh2b2lkKSBwb3Bkb3duCnsKICAgIGd0a19t ZW51X3BvcGRvd24oZ3RrKTsKfQotIChHVEtXaWRnZXQqKSBnZXRBY3RpdmUKewogICAgcmV0dXJu IGd0b29sa2l0X29iamVjdChndGtfbWVudV9nZXRfYWN0aXZlKGd0ayksIDApOwp9Ci0gKHZvaWQp IHNldEFjdGl2ZTooZ3VpbnQpIGluZGV4CnsKICAgIGd0a19tZW51X3NldF9hY3RpdmUoZ3RrLCBp bmRleCk7Cn0KLSAodm9pZCkgc2V0QWNjZWxHcm91cDooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9n cm91cAp7CiAgICBndGtfbWVudV9zZXRfYWNjZWxfZ3JvdXAoZ3RrLCBhY2NlbF9ncm91cCA/IGFj Y2VsX2dyb3VwLT5ndGsgOiAwKTsKfQotIChHVEtBY2NlbEdyb3VwKikgZ2V0QWNjZWxHcm91cAp7 CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19tZW51X2dldF9hY2NlbF9ncm91cChndGsp LCAiR1RLQWNjZWxHcm91cCIpOwp9Ci0gKHZvaWQpIGF0dGFjaFRvV2lkZ2V0OihHVEtXaWRnZXQg KikgYXR0YWNoX3dpZGdldCBkZXRhY2hlcjooR3RrTWVudURldGFjaEZ1bmMpIGRldGFjaGVyCnsK ICAgIGd0a19tZW51X2F0dGFjaF90b193aWRnZXQoZ3RrLCBhdHRhY2hfd2lkZ2V0ICA/IGF0dGFj aF93aWRnZXQgLT5ndGsgOiAwLCBkZXRhY2hlcik7Cn0KLSAodm9pZCkgZGV0YWNoCnsKICAgIGd0 a19tZW51X2RldGFjaChndGspOwp9Ci0gKEdUS1dpZGdldCopIGdldEF0dGFjaFdpZGdldAp7CiAg ICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19tZW51X2dldF9hdHRhY2hfd2lkZ2V0KGd0ayks IDApOwp9Ci0gKHZvaWQpIHNldFRlYXJvZmZTdGF0ZTooZ2Jvb2xlYW4pIHRvcm5fb2ZmCnsKICAg IGd0a19tZW51X3NldF90ZWFyb2ZmX3N0YXRlKGd0aywgdG9ybl9vZmYpOwp9Ci0gKHZvaWQpIHNl dFRpdGxlOihOU1N0cmluZyAqKSB0aXRsZQp7CiAgICBndGtfbWVudV9zZXRfdGl0bGUoZ3RrLGd0 b29sa2l0X3V0Zjhfc3RyaW5nKCB0aXRsZSkpOwp9Ci0gKHZvaWQpIHJlb3JkZXJDaGlsZDooR1RL V2lkZ2V0ICopIGNoaWxkIHBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfbWVudV9y ZW9yZGVyX2NoaWxkKGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCBwb3NpdGlvbik7Cn0K QGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBU b29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAq CiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrbWVudWJhci5oIGJ5IGd0a2dlbi4K ICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3Ig KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtp dC9HVEtNZW51QmFyLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1l bnRhdGlvbiBHVEtNZW51QmFyCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19t ZW51X2Jhcl9nZXRfdHlwZSgpOwp9CisgKGlkKSBtZW51QmFyCnsKICAgIHJldHVybiBbWyhHVEtN ZW51QmFyICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7 CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX21lbnVfYmFyX25ldygpXTsKfQotICh2 b2lkKSBhcHBlbmQ6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBndGtfbWVudV9iYXJfYXBwZW5k KGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcHJlcGVuZDooR1RLV2lk Z2V0ICopIGNoaWxkCnsKICAgIGd0a19tZW51X2Jhcl9wcmVwZW5kKGd0aywgY2hpbGQgPyBjaGls ZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgaW5zZXJ0OihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRp b246KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19tZW51X2Jhcl9pbnNlcnQoZ3RrLCBjaGlsZCAg PyBjaGlsZCAtPmd0ayA6IDAsIHBvc2l0aW9uKTsKfQotICh2b2lkKSBzZXRTaGFkb3dUeXBlOihH dGtTaGFkb3dUeXBlKSB0eXBlCnsKICAgIGd0a19tZW51X2Jhcl9zZXRfc2hhZG93X3R5cGUoZ3Rr LCB0eXBlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRv IHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1h ciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGttZW51ZmFjdG9y eS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0 aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNp bmNsdWRlIDxHVG9vbEtpdC9HVEtNZW51RmFjdG9yeS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS01l bnVGYWN0b3J5CisgKGlkKSBtZW51RmFjdG9yeVdpdGhUeXBlOihHdGtNZW51RmFjdG9yeVR5cGUp IHR5cGUKewogICAgcmV0dXJuIFtbKEdUS01lbnVGYWN0b3J5ICopW3NlbGYgYWxsb2NdIGluaXRX aXRoVHlwZTp0eXBlXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoVHlwZTooR3RrTWVu dUZhY3RvcnlUeXBlKSB0eXBlCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfbWVu dV9mYWN0b3J5X25ldyggdHlwZSldOwp9Ci0gKHZvaWQpIGRlc3Ryb3kKewogICAgZ3RrX21lbnVf ZmFjdG9yeV9kZXN0cm95KGd0ayk7Cn0KLSAodm9pZCkgYWRkRW50cmllczooR3RrTWVudUVudHJ5 ICopIGVudHJpZXMgbmVudHJpZXM6KGludCkgbmVudHJpZXMKewogICAgZ3RrX21lbnVfZmFjdG9y eV9hZGRfZW50cmllcyhndGssIGVudHJpZXMgLCBuZW50cmllcyk7Cn0KLSAodm9pZCkgYWRkU3Vi ZmFjdG9yeTooR1RLTWVudUZhY3RvcnkgKikgc3ViZmFjdG9yeSBwYXRoOihOU1N0cmluZyAqKSBw YXRoCnsKICAgIGd0a19tZW51X2ZhY3RvcnlfYWRkX3N1YmZhY3RvcnkoZ3RrLCBzdWJmYWN0b3J5 ICA/IHN1YmZhY3RvcnkgLT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBwYXRoKSk7Cn0K LSAodm9pZCkgcmVtb3ZlUGF0aHM6KE5TQXJyYXkgICopIHBhdGhzIG5wYXRoczooaW50KSBucGF0 aHMKewogICAgZ3RrX21lbnVfZmFjdG9yeV9yZW1vdmVfcGF0aHMoZ3RrLChjaGFyICoqKWd0b29s a2l0X2FycmF5X3RvX3N0cnZlYyggcGF0aHMgKSwgbnBhdGhzKTsKfQotICh2b2lkKSByZW1vdmVF bnRyaWVzOihHdGtNZW51RW50cnkgKikgZW50cmllcyBuZW50cmllczooaW50KSBuZW50cmllcwp7 CiAgICBndGtfbWVudV9mYWN0b3J5X3JlbW92ZV9lbnRyaWVzKGd0aywgZW50cmllcyAsIG5lbnRy aWVzKTsKfQotICh2b2lkKSByZW1vdmVTdWJmYWN0b3J5OihHVEtNZW51RmFjdG9yeSAqKSBzdWJm YWN0b3J5IHBhdGg6KE5TU3RyaW5nICopIHBhdGgKewogICAgZ3RrX21lbnVfZmFjdG9yeV9yZW1v dmVfc3ViZmFjdG9yeShndGssIHN1YmZhY3RvcnkgID8gc3ViZmFjdG9yeSAtPmd0ayA6IDAsZ3Rv b2xraXRfdXRmOF9zdHJpbmcoIHBhdGgpKTsKfQotIChHdGtNZW51UGF0aCopIGZpbmQ6KE5TU3Ry aW5nICopIHBhdGgKewogICAgcmV0dXJuIGd0a19tZW51X2ZhY3RvcnlfZmluZChndGssZ3Rvb2xr aXRfdXRmOF9zdHJpbmcoIHBhdGgpKTsKfQojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPEZv dW5kYXRpb24vTlNBdXRvcmVsZWFzZVBvb2wuaD4KCgpzdGF0aWMgdm9pZCBtZW51X2ZvcndhcmRf c2lnbmFsIChHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQp7CiAgICBOU0F1 dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtOU0F1dG9yZWxlYXNlUG9vbCBuZXddOwogICAgaWQgdGFy Z2V0ID0gZ3RrX29iamVjdF9nZXRfZGF0YSgoR3RrT2JqZWN0ICopIHdpZGdldCwgIl9tZW51X3Rh cmdldCIpOwoKI2lmZGVmIERFQlVHCiAgICBmcHJpbnRmKHN0ZGVyciwgIihtZW51X2ZvcndhcmRf c2lnbmFsIGluaXQpIGd0ayA9ICVwLCBhY3Rpb24gWyVwICVzXVxuIiwKCSAgICB3aWRnZXQsIHRh cmdldCwgc2VsX2dldF9uYW1lKHVzZXJfZGF0YSkpOwojZW5kaWYKICAgIFt0YXJnZXQgcGVyZm9y bVNlbGVjdG9yOnVzZXJfZGF0YSB3aXRoT2JqZWN0OkdUT09MS0lUX09CSkVDVCh3aWRnZXQpXTsK ICAgIFtwb29sIHJlbGVhc2VdOwojaWZkZWYgREVCVUcKICAgIGZwcmludGYoc3RkZXJyLCAiKG1l bnVfZm9yd2FyZF9zaWduYWwgZXhpdCkgZ3RrID0gJXBcbiIsIHdpZGdldCk7CiNlbmRpZgp9Cgot ICh2b2lkKSBhZGRFbnRyaWVzOihHdGtNZW51RW50cnkgKikgZW50cmllcyBmb3JUYXJnZXQ6KGlk KSB0YXJnZXQKewogICAgR3RrTWVudUVudHJ5ICpiYXNlID0gZW50cmllczsKICAgIGludCBpbmRl eCwgY291bnQgPSAwOwoKICAgIHdoaWxlIChlbnRyaWVzLT5wYXRoKSArK2VudHJpZXMsICsrY291 bnQ7CiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggIT0gY291bnQ7ICsraW5kZXgpCgliYXNlW2lu ZGV4XS5jYWxsYmFjayA9IG1lbnVfZm9yd2FyZF9zaWduYWw7CgogICAgZ3RrX21lbnVfZmFjdG9y eV9hZGRfZW50cmllcyhndGssIGJhc2UsIGNvdW50KTsKCiAgICBmb3IgKGluZGV4ID0gMDsgaW5k ZXggIT0gY291bnQ7ICsraW5kZXgpCglpZiAoYmFzZVtpbmRleF0ud2lkZ2V0KQoJICAgIGd0a19v YmplY3Rfc2V0X2RhdGEoKEd0a09iamVjdCAqKSBiYXNlW2luZGV4XS53aWRnZXQsCgkJCQkiX21l bnVfdGFyZ2V0IiwgdGFyZ2V0KTsKfQoKI2RlZmluZSBndGsJKChHdGtNZW51RmFjdG9yeSAqKSBn dGspCi0gKEdUS0FjY2VsR3JvdXAgKikgYWNjZWxHcm91cAp7CiAgICByZXR1cm4gZ3Rvb2xraXRf b2JqZWN0KGd0ay0+YWNjZWxfZ3JvdXAsICJHVEtBY2NlbEdyb3VwIik7Cn0KLSAoR1RLV2lkZ2V0 ICopIHdpZGdldAp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+d2lkZ2V0KTsKfQoj dW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8g dGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFy IEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a21lbnVpdGVtLmgg YnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBM aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1 ZGUgPEdUb29sS2l0L0dUS01lbnVJdGVtLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQu aD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtNZW51SXRlbQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAg IHJldHVybiBndGtfbWVudV9pdGVtX2dldF90eXBlKCk7Cn0KKyAoaWQpIG1lbnVJdGVtCnsKICAg IHJldHVybiBbWyhHVEtNZW51SXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07 Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19tZW51X2l0 ZW1fbmV3KCldOwp9CisgKGlkKSBtZW51SXRlbVdpdGhMYWJlbDooTlNTdHJpbmcgKikgbGFiZWwK ewogICAgcmV0dXJuIFtbKEdUS01lbnVJdGVtICopW3NlbGYgYWxsb2NdIGluaXRXaXRoTGFiZWw6 bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhMYWJlbDooTlNTdHJpbmcgKikg bGFiZWwKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19tZW51X2l0ZW1fbmV3X3dp dGhfbGFiZWwoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVsKSldOwp9Ci0gKHZvaWQpIHNldFN1 Ym1lbnU6KEdUS1dpZGdldCAqKSBzdWJtZW51CnsKICAgIGd0a19tZW51X2l0ZW1fc2V0X3N1Ym1l bnUoZ3RrLCBzdWJtZW51ID8gc3VibWVudS0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcmVtb3ZlU3Vi bWVudQp7CiAgICBndGtfbWVudV9pdGVtX3JlbW92ZV9zdWJtZW51KGd0ayk7Cn0KLSAodm9pZCkg c2V0UGxhY2VtZW50OihHdGtTdWJtZW51UGxhY2VtZW50KSBwbGFjZW1lbnQKewogICAgZ3RrX21l bnVfaXRlbV9zZXRfcGxhY2VtZW50KGd0aywgcGxhY2VtZW50KTsKfQotICh2b2lkKSBjb25maWd1 cmU6KGdpbnQpIHNob3dfdG9nZ2xlX2luZGljYXRvciBzaG93U3VibWVudUluZGljYXRvcjooZ2lu dCkgc2hvd19zdWJtZW51X2luZGljYXRvcgp7CiAgICBndGtfbWVudV9pdGVtX2NvbmZpZ3VyZShn dGssIHNob3dfdG9nZ2xlX2luZGljYXRvciAsIHNob3dfc3VibWVudV9pbmRpY2F0b3IpOwp9Ci0g KHZvaWQpIHNlbGVjdAp7CiAgICBndGtfbWVudV9pdGVtX3NlbGVjdChndGspOwp9Ci0gKHZvaWQp IGRlc2VsZWN0CnsKICAgIGd0a19tZW51X2l0ZW1fZGVzZWxlY3QoZ3RrKTsKfQotICh2b2lkKSBh Y3RpdmF0ZQp7CiAgICBndGtfbWVudV9pdGVtX2FjdGl2YXRlKGd0ayk7Cn0KLSAodm9pZCkgcmln aHRKdXN0aWZ5CnsKICAgIGd0a19tZW51X2l0ZW1fcmlnaHRfanVzdGlmeShndGspOwp9CiNkZWZp bmUgZ3RrCSgoR3RrTWVudUl0ZW0gKikgZ3RrKQotIChHVEtXaWRnZXQgKikgc3VibWVudQp7CiAg ICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+c3VibWVudSk7Cn0KI3VuZGVmIGd0awpAZW5k Ci8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xr aXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICog R2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGttZW51c2hlbGwuaCBieSBndGtnZW4uCiAq CiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQv R1RLTWVudVNoZWxsLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1l bnRhdGlvbiBHVEtNZW51U2hlbGwKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3Rr X21lbnVfc2hlbGxfZ2V0X3R5cGUoKTsKfQotICh2b2lkKSBhcHBlbmQ6KEdUS1dpZGdldCAqKSBj aGlsZAp7CiAgICBndGtfbWVudV9zaGVsbF9hcHBlbmQoZ3RrLCBjaGlsZCA/IGNoaWxkLT5ndGsg OiAwKTsKfQotICh2b2lkKSBwcmVwZW5kOihHVEtXaWRnZXQgKikgY2hpbGQKewogICAgZ3RrX21l bnVfc2hlbGxfcHJlcGVuZChndGssIGNoaWxkID8gY2hpbGQtPmd0ayA6IDApOwp9Ci0gKHZvaWQp IGluc2VydDooR1RLV2lkZ2V0ICopIGNoaWxkIHBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAg ICBndGtfbWVudV9zaGVsbF9pbnNlcnQoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIHBv c2l0aW9uKTsKfQotICh2b2lkKSBkZWFjdGl2YXRlCnsKICAgIGd0a19tZW51X3NoZWxsX2RlYWN0 aXZhdGUoZ3RrKTsKfQotICh2b2lkKSBzZWxlY3RJdGVtOihHVEtXaWRnZXQgKikgbWVudV9pdGVt CnsKICAgIGd0a19tZW51X3NoZWxsX3NlbGVjdF9pdGVtKGd0aywgbWVudV9pdGVtID8gbWVudV9p dGVtLT5ndGsgOiAwKTsKfQotICh2b2lkKSBkZXNlbGVjdAp7CiAgICBndGtfbWVudV9zaGVsbF9k ZXNlbGVjdChndGspOwp9Ci0gKHZvaWQpIGFjdGl2YXRlSXRlbTooR1RLV2lkZ2V0ICopIG1lbnVf aXRlbSBmb3JjZURlYWN0aXZhdGU6KGdib29sZWFuKSBmb3JjZV9kZWFjdGl2YXRlCnsKICAgIGd0 a19tZW51X3NoZWxsX2FjdGl2YXRlX2l0ZW0oZ3RrLCBtZW51X2l0ZW0gID8gbWVudV9pdGVtIC0+ Z3RrIDogMCwgZm9yY2VfZGVhY3RpdmF0ZSk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVj dGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5 OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5 IGZyb20gZ3RrbWlzYy5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJz aW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy c2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtNaXNjLmg+CgpAaW1wbGVtZW50YXRpb24g R1RLTWlzYworIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfbWlzY19nZXRfdHlw ZSgpOwp9Ci0gKHZvaWQpIHNldEFsaWdubWVudDooZ2Zsb2F0KSB4YWxpZ24geWFsaWduOihnZmxv YXQpIHlhbGlnbgp7CiAgICBndGtfbWlzY19zZXRfYWxpZ25tZW50KGd0aywgeGFsaWduICwgeWFs aWduKTsKfQotICh2b2lkKSBzZXRQYWRkaW5nOihnaW50KSB4cGFkIHlwYWQ6KGdpbnQpIHlwYWQK ewogICAgZ3RrX21pc2Nfc2V0X3BhZGRpbmcoZ3RrLCB4cGFkICwgeXBhZCk7Cn0KQGVuZAovKgog KiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAq IENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVy YXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrbm90ZWJvb2suaCBieSBndGtnZW4uCiAqCiAqIFRo aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs IFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLTm90 ZWJvb2suaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9u IEdUS05vdGVib29rCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19ub3RlYm9v a19nZXRfdHlwZSgpOwp9CisgKGlkKSBub3RlYm9vawp7CiAgICByZXR1cm4gW1soR1RLTm90ZWJv b2sgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAg IHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfbm90ZWJvb2tfbmV3KCldOwp9Ci0gKHZvaWQp IGFwcGVuZFBhZ2U6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICopIHRh Yl9sYWJlbAp7CiAgICBndGtfbm90ZWJvb2tfYXBwZW5kX3BhZ2UoZ3RrLCBjaGlsZCAgPyBjaGls ZCAtPmd0ayA6IDAsIHRhYl9sYWJlbCA/IHRhYl9sYWJlbC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg YXBwZW5kUGFnZU1lbnU6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICop IHRhYl9sYWJlbCBtZW51TGFiZWw6KEdUS1dpZGdldCAqKSBtZW51X2xhYmVsCnsKICAgIGd0a19u b3RlYm9va19hcHBlbmRfcGFnZV9tZW51KGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCB0 YWJfbGFiZWwgID8gdGFiX2xhYmVsIC0+Z3RrIDogMCwgbWVudV9sYWJlbCA/IG1lbnVfbGFiZWwt Pmd0ayA6IDApOwp9Ci0gKHZvaWQpIHByZXBlbmRQYWdlOihHVEtXaWRnZXQgKikgY2hpbGQgdGFi TGFiZWw6KEdUS1dpZGdldCAqKSB0YWJfbGFiZWwKewogICAgZ3RrX25vdGVib29rX3ByZXBlbmRf cGFnZShndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsID8gdGFiX2xhYmVs LT5ndGsgOiAwKTsKfQotICh2b2lkKSBwcmVwZW5kUGFnZU1lbnU6KEdUS1dpZGdldCAqKSBjaGls ZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICopIHRhYl9sYWJlbCBtZW51TGFiZWw6KEdUS1dpZGdldCAq KSBtZW51X2xhYmVsCnsKICAgIGd0a19ub3RlYm9va19wcmVwZW5kX3BhZ2VfbWVudShndGssIGNo aWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsICA/IHRhYl9sYWJlbCAtPmd0ayA6IDAs IG1lbnVfbGFiZWwgPyBtZW51X2xhYmVsLT5ndGsgOiAwKTsKfQotICh2b2lkKSBpbnNlcnRQYWdl OihHVEtXaWRnZXQgKikgY2hpbGQgdGFiTGFiZWw6KEdUS1dpZGdldCAqKSB0YWJfbGFiZWwgcG9z aXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19ub3RlYm9va19pbnNlcnRfcGFnZShndGss IGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsICA/IHRhYl9sYWJlbCAtPmd0ayA6 IDAsIHBvc2l0aW9uKTsKfQotICh2b2lkKSBpbnNlcnRQYWdlTWVudTooR1RLV2lkZ2V0ICopIGNo aWxkIHRhYkxhYmVsOihHVEtXaWRnZXQgKikgdGFiX2xhYmVsIG1lbnVMYWJlbDooR1RLV2lkZ2V0 ICopIG1lbnVfbGFiZWwgcG9zaXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19ub3RlYm9v a19pbnNlcnRfcGFnZV9tZW51KGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCB0YWJfbGFi ZWwgID8gdGFiX2xhYmVsIC0+Z3RrIDogMCwgbWVudV9sYWJlbCAgPyBtZW51X2xhYmVsIC0+Z3Rr IDogMCwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHJlbW92ZVBhZ2U6KGdpbnQpIHBhZ2VfbnVtCnsK ICAgIGd0a19ub3RlYm9va19yZW1vdmVfcGFnZShndGssIHBhZ2VfbnVtKTsKfQotIChnaW50KSBn ZXRDdXJyZW50UGFnZQp7CiAgICByZXR1cm4gZ3RrX25vdGVib29rX2dldF9jdXJyZW50X3BhZ2Uo Z3RrKTsKfQotIChHVEtXaWRnZXQqKSBnZXROdGhQYWdlOihnaW50KSBwYWdlX251bQp7CiAgICBy ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19ub3RlYm9va19nZXRfbnRoX3BhZ2UoZ3RrLCBwYWdl X251bSksIDApOwp9Ci0gKGdpbnQpIHBhZ2VOdW06KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBy ZXR1cm4gZ3RrX25vdGVib29rX3BhZ2VfbnVtKGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7 Cn0KLSAodm9pZCkgc2V0UGFnZTooZ2ludCkgcGFnZV9udW0KewogICAgZ3RrX25vdGVib29rX3Nl dF9wYWdlKGd0aywgcGFnZV9udW0pOwp9Ci0gKHZvaWQpIG5leHRQYWdlCnsKICAgIGd0a19ub3Rl Ym9va19uZXh0X3BhZ2UoZ3RrKTsKfQotICh2b2lkKSBwcmV2UGFnZQp7CiAgICBndGtfbm90ZWJv b2tfcHJldl9wYWdlKGd0ayk7Cn0KLSAodm9pZCkgc2V0U2hvd0JvcmRlcjooZ2Jvb2xlYW4pIHNo b3dfYm9yZGVyCnsKICAgIGd0a19ub3RlYm9va19zZXRfc2hvd19ib3JkZXIoZ3RrLCBzaG93X2Jv cmRlcik7Cn0KLSAodm9pZCkgc2V0U2hvd1RhYnM6KGdib29sZWFuKSBzaG93X3RhYnMKewogICAg Z3RrX25vdGVib29rX3NldF9zaG93X3RhYnMoZ3RrLCBzaG93X3RhYnMpOwp9Ci0gKHZvaWQpIHNl dFRhYlBvczooR3RrUG9zaXRpb25UeXBlKSBwb3MKewogICAgZ3RrX25vdGVib29rX3NldF90YWJf cG9zKGd0aywgcG9zKTsKfQotICh2b2lkKSBzZXRIb21vZ2VuZW91c1RhYnM6KGdib29sZWFuKSBo b21vZ2VuZW91cwp7CiAgICBndGtfbm90ZWJvb2tfc2V0X2hvbW9nZW5lb3VzX3RhYnMoZ3RrLCBo b21vZ2VuZW91cyk7Cn0KLSAodm9pZCkgc2V0VGFiQm9yZGVyOihndWludCkgYm9yZGVyX3dpZHRo CnsKICAgIGd0a19ub3RlYm9va19zZXRfdGFiX2JvcmRlcihndGssIGJvcmRlcl93aWR0aCk7Cn0K LSAodm9pZCkgc2V0VGFiSGJvcmRlcjooZ3VpbnQpIHRhYl9oYm9yZGVyCnsKICAgIGd0a19ub3Rl Ym9va19zZXRfdGFiX2hib3JkZXIoZ3RrLCB0YWJfaGJvcmRlcik7Cn0KLSAodm9pZCkgc2V0VGFi VmJvcmRlcjooZ3VpbnQpIHRhYl92Ym9yZGVyCnsKICAgIGd0a19ub3RlYm9va19zZXRfdGFiX3Zi b3JkZXIoZ3RrLCB0YWJfdmJvcmRlcik7Cn0KLSAodm9pZCkgc2V0U2Nyb2xsYWJsZTooZ2Jvb2xl YW4pIHNjcm9sbGFibGUKewogICAgZ3RrX25vdGVib29rX3NldF9zY3JvbGxhYmxlKGd0aywgc2Ny b2xsYWJsZSk7Cn0KLSAodm9pZCkgcG9wdXBFbmFibGUKewogICAgZ3RrX25vdGVib29rX3BvcHVw X2VuYWJsZShndGspOwp9Ci0gKHZvaWQpIHBvcHVwRGlzYWJsZQp7CiAgICBndGtfbm90ZWJvb2tf cG9wdXBfZGlzYWJsZShndGspOwp9Ci0gKEdUS1dpZGdldCAqKSBnZXRUYWJMYWJlbDooR1RLV2lk Z2V0ICopIGNoaWxkCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX25vdGVib29rX2dl dF90YWJfbGFiZWwoZ3RrLCBjaGlsZCA/IGNoaWxkLT5ndGsgOiAwKSwgMCk7Cn0KLSAodm9pZCkg c2V0VGFiTGFiZWw6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICopIHRh Yl9sYWJlbAp7CiAgICBndGtfbm90ZWJvb2tfc2V0X3RhYl9sYWJlbChndGssIGNoaWxkICA/IGNo aWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsID8gdGFiX2xhYmVsLT5ndGsgOiAwKTsKfQotICh2b2lk KSBzZXRUYWJMYWJlbFRleHQ6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJUZXh0OihOU1N0cmluZyAq KSB0YWJfdGV4dAp7CiAgICBndGtfbm90ZWJvb2tfc2V0X3RhYl9sYWJlbF90ZXh0KGd0aywgY2hp bGQgID8gY2hpbGQgLT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0YWJfdGV4dCkpOwp9 Ci0gKEdUS1dpZGdldCAqKSBnZXRNZW51TGFiZWw6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBy ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19ub3RlYm9va19nZXRfbWVudV9sYWJlbChndGssIGNo aWxkID8gY2hpbGQtPmd0ayA6IDApLCAwKTsKfQotICh2b2lkKSBzZXRNZW51TGFiZWw6KEdUS1dp ZGdldCAqKSBjaGlsZCBtZW51TGFiZWw6KEdUS1dpZGdldCAqKSBtZW51X2xhYmVsCnsKICAgIGd0 a19ub3RlYm9va19zZXRfbWVudV9sYWJlbChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwg bWVudV9sYWJlbCA/IG1lbnVfbGFiZWwtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNldE1lbnVMYWJl bFRleHQ6KEdUS1dpZGdldCAqKSBjaGlsZCBtZW51VGV4dDooTlNTdHJpbmcgKikgbWVudV90ZXh0 CnsKICAgIGd0a19ub3RlYm9va19zZXRfbWVudV9sYWJlbF90ZXh0KGd0aywgY2hpbGQgID8gY2hp bGQgLT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBtZW51X3RleHQpKTsKfQotICh2b2lk KSBxdWVyeVRhYkxhYmVsUGFja2luZzooR1RLV2lkZ2V0ICopIGNoaWxkIGV4cGFuZDooZ2Jvb2xl YW4gKikgZXhwYW5kIGZpbGw6KGdib29sZWFuICopIGZpbGwgcGFja1R5cGU6KEd0a1BhY2tUeXBl ICopIHBhY2tfdHlwZQp7CiAgICBndGtfbm90ZWJvb2tfcXVlcnlfdGFiX2xhYmVsX3BhY2tpbmco Z3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIGV4cGFuZCAsIGZpbGwgLCBwYWNrX3R5cGUp Owp9Ci0gKHZvaWQpIHNldFRhYkxhYmVsUGFja2luZzooR1RLV2lkZ2V0ICopIGNoaWxkIGV4cGFu ZDooZ2Jvb2xlYW4pIGV4cGFuZCBmaWxsOihnYm9vbGVhbikgZmlsbCBwYWNrVHlwZTooR3RrUGFj a1R5cGUpIHBhY2tfdHlwZQp7CiAgICBndGtfbm90ZWJvb2tfc2V0X3RhYl9sYWJlbF9wYWNraW5n KGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCBleHBhbmQgLCBmaWxsICwgcGFja190eXBl KTsKfQotICh2b2lkKSByZW9yZGVyQ2hpbGQ6KEdUS1dpZGdldCAqKSBjaGlsZCBwb3NpdGlvbjoo Z2ludCkgcG9zaXRpb24KewogICAgZ3RrX25vdGVib29rX3Jlb3JkZXJfY2hpbGQoZ3RrLCBjaGls ZCAgPyBjaGlsZCAtPmd0ayA6IDAsIHBvc2l0aW9uKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0g T2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChj KSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRp Y2FsbHkgZnJvbSBndGtvYmplY3QuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK ICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh dGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLT2JqZWN0Lmg+CgpAaW1wbGVt ZW50YXRpb24gR1RLT2JqZWN0CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19v YmplY3RfZ2V0X3R5cGUoKTsKfQorIChndWludCkgY2xhc3NVc2VyU2lnbmFsTmV3djooR3RrT2Jq ZWN0Q2xhc3MgKikga2xhc3MgbmFtZTooTlNTdHJpbmcgKikgbmFtZSBzaWduYWxGbGFnczooR3Rr U2lnbmFsUnVuVHlwZSkgc2lnbmFsX2ZsYWdzIG1hcnNoYWxsZXI6KEd0a1NpZ25hbE1hcnNoYWxs ZXIpIG1hcnNoYWxsZXIgcmV0dXJuVmFsOihHdGtUeXBlKSByZXR1cm5fdmFsIG5wYXJhbXM6KGd1 aW50KSBucGFyYW1zIHBhcmFtczooR3RrVHlwZSAqKSBwYXJhbXMKewogICAgcmV0dXJuIGd0a19v YmplY3RfY2xhc3NfdXNlcl9zaWduYWxfbmV3digga2xhc3MgLGd0b29sa2l0X3V0Zjhfc3RyaW5n KCBuYW1lICksIHNpZ25hbF9mbGFncyAsIG1hcnNoYWxsZXIgLCByZXR1cm5fdmFsICwgbnBhcmFt cyAsIHBhcmFtcyk7Cn0KKyAoaWQpIG9iamVjdHZXaXRoVHlwZTooR3RrVHlwZSkgb2JqZWN0X3R5 cGUgbkFyZ3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJnICopIGFyZ3MKewogICAgcmV0dXJu IFtbKEdUS09iamVjdCAqKVtzZWxmIGFsbG9jXSBpbml0dldpdGhUeXBlOm9iamVjdF90eXBlIG5B cmdzOm5fYXJncyBhcmdzOmFyZ3NdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdHZXaXRoVHlw ZTooR3RrVHlwZSkgb2JqZWN0X3R5cGUgbkFyZ3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJn ICopIGFyZ3MKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19vYmplY3RfbmV3digg b2JqZWN0X3R5cGUgLCBuX2FyZ3MgLCBhcmdzKV07Cn0KLSAodm9pZCkgZGVmYXVsdENvbnN0cnVj dAp7CiAgICBndGtfb2JqZWN0X2RlZmF1bHRfY29uc3RydWN0KGd0ayk7Cn0KLSAodm9pZCkgc2lu awp7CiAgICBndGtfb2JqZWN0X3NpbmsoZ3RrKTsKfQotICh2b2lkKSByZWYKewogICAgZ3RrX29i amVjdF9yZWYoZ3RrKTsKfQotICh2b2lkKSB1bnJlZgp7CiAgICBndGtfb2JqZWN0X3VucmVmKGd0 ayk7Cn0KLSAodm9pZCkgd2Vha3JlZjooR3RrRGVzdHJveU5vdGlmeSkgbm90aWZ5IGRhdGE6KGdw b2ludGVyKSBkYXRhCnsKICAgIGd0a19vYmplY3Rfd2Vha3JlZihndGssIG5vdGlmeSAsIGRhdGEp Owp9Ci0gKHZvaWQpIHdlYWt1bnJlZjooR3RrRGVzdHJveU5vdGlmeSkgbm90aWZ5IGRhdGE6KGdw b2ludGVyKSBkYXRhCnsKICAgIGd0a19vYmplY3Rfd2Vha3VucmVmKGd0aywgbm90aWZ5ICwgZGF0 YSk7Cn0KLSAodm9pZCkgZGVzdHJveQp7CiAgICBndGtfb2JqZWN0X2Rlc3Ryb3koZ3RrKTsKfQot ICh2b2lkKSBnZXR2OihndWludCkgbl9hcmdzIGFyZ3M6KEd0a0FyZyAqKSBhcmdzCnsKICAgIGd0 a19vYmplY3RfZ2V0dihndGssIG5fYXJncyAsIGFyZ3MpOwp9Ci0gKHZvaWQpIHNldHY6KGd1aW50 KSBuX2FyZ3MgYXJnczooR3RrQXJnICopIGFyZ3MKewogICAgZ3RrX29iamVjdF9zZXR2KGd0aywg bl9hcmdzICwgYXJncyk7Cn0KKyAoR3RrQXJnKikgcXVlcnlBcmdzOihHdGtUeXBlKSBjbGFzc190 eXBlIGFyZ0ZsYWdzOihndWludDMyICoqKSBhcmdfZmxhZ3MgbkFyZ3M6KGd1aW50ICopIG5fYXJn cwp7CiAgICByZXR1cm4gZ3RrX29iamVjdF9xdWVyeV9hcmdzKCBjbGFzc190eXBlICwgYXJnX2Zs YWdzICwgbl9hcmdzKTsKfQotICh2b2lkKSBzZXREYXRhOihOU1N0cmluZyAqKSBrZXkgZGF0YToo Z3BvaW50ZXIpIGRhdGEKewogICAgZ3RrX29iamVjdF9zZXRfZGF0YShndGssZ3Rvb2xraXRfdXRm OF9zdHJpbmcoIGtleSApLCBkYXRhKTsKfQotICh2b2lkKSBzZXREYXRhRnVsbDooTlNTdHJpbmcg Kikga2V5IGRhdGE6KGdwb2ludGVyKSBkYXRhIGRlc3Ryb3k6KEd0a0Rlc3Ryb3lOb3RpZnkpIGRl c3Ryb3kKewogICAgZ3RrX29iamVjdF9zZXRfZGF0YV9mdWxsKGd0ayxndG9vbGtpdF91dGY4X3N0 cmluZygga2V5ICksIGRhdGEgLCBkZXN0cm95KTsKfQotICh2b2lkKSByZW1vdmVEYXRhOihOU1N0 cmluZyAqKSBrZXkKewogICAgZ3RrX29iamVjdF9yZW1vdmVfZGF0YShndGssZ3Rvb2xraXRfdXRm OF9zdHJpbmcoIGtleSkpOwp9Ci0gKGdwb2ludGVyKSBnZXREYXRhOihOU1N0cmluZyAqKSBrZXkK ewogICAgcmV0dXJuIGd0a19vYmplY3RfZ2V0X2RhdGEoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5n KCBrZXkpKTsKfQotICh2b2lkKSByZW1vdmVOb05vdGlmeTooTlNTdHJpbmcgKikga2V5CnsKICAg IGd0a19vYmplY3RfcmVtb3ZlX25vX25vdGlmeShndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGtl eSkpOwp9Ci0gKHZvaWQpIHNldFVzZXJEYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICBndGtfb2Jq ZWN0X3NldF91c2VyX2RhdGEoZ3RrLCBkYXRhKTsKfQotIChncG9pbnRlcikgZ2V0VXNlckRhdGEK ewogICAgcmV0dXJuIGd0a19vYmplY3RfZ2V0X3VzZXJfZGF0YShndGspOwp9CisgKHZvaWQpIGNs YXNzQWRkU2lnbmFsczooR3RrT2JqZWN0Q2xhc3MgKikga2xhc3Mgc2lnbmFsczooZ3VpbnQgKikg c2lnbmFscyBuc2lnbmFsczooZ3VpbnQpIG5zaWduYWxzCnsKICAgIGd0a19vYmplY3RfY2xhc3Nf YWRkX3NpZ25hbHMoIGtsYXNzICwgc2lnbmFscyAsIG5zaWduYWxzKTsKfQorICh2b2lkKSBhZGRB cmdUeXBlOihOU1N0cmluZyAqKSBhcmdfbmFtZSBhcmdUeXBlOihHdGtUeXBlKSBhcmdfdHlwZSBh cmdGbGFnczooZ3VpbnQpIGFyZ19mbGFncyBhcmdJZDooZ3VpbnQpIGFyZ19pZAp7CiAgICBndGtf b2JqZWN0X2FkZF9hcmdfdHlwZShndG9vbGtpdF91dGY4X3N0cmluZyggYXJnX25hbWUgKSwgYXJn X3R5cGUgLCBhcmdfZmxhZ3MgLCBhcmdfaWQpOwp9Ci0gKHZvaWQpIHNldERhdGFCeUlkOihHUXVh cmspIGRhdGFfaWQgZGF0YTooZ3BvaW50ZXIpIGRhdGEKewogICAgZ3RrX29iamVjdF9zZXRfZGF0 YV9ieV9pZChndGssIGRhdGFfaWQgLCBkYXRhKTsKfQotICh2b2lkKSBzZXREYXRhQnlJZEZ1bGw6 KEdRdWFyaykgZGF0YV9pZCBkYXRhOihncG9pbnRlcikgZGF0YSBkZXN0cm95OihHdGtEZXN0cm95 Tm90aWZ5KSBkZXN0cm95CnsKICAgIGd0a19vYmplY3Rfc2V0X2RhdGFfYnlfaWRfZnVsbChndGss IGRhdGFfaWQgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAoZ3BvaW50ZXIpIGdldERhdGFCeUlkOihH UXVhcmspIGRhdGFfaWQKewogICAgcmV0dXJuIGd0a19vYmplY3RfZ2V0X2RhdGFfYnlfaWQoZ3Rr LCBkYXRhX2lkKTsKfQotICh2b2lkKSByZW1vdmVEYXRhQnlJZDooR1F1YXJrKSBkYXRhX2lkCnsK ICAgIGd0a19vYmplY3RfcmVtb3ZlX2RhdGFfYnlfaWQoZ3RrLCBkYXRhX2lkKTsKfQotICh2b2lk KSByZW1vdmVOb05vdGlmeUJ5SWQ6KEdRdWFyaykga2V5X2lkCnsKICAgIGd0a19vYmplY3RfcmVt b3ZlX25vX25vdGlmeV9ieV9pZChndGssIGtleV9pZCk7Cn0Kc3RhdGljIHZvaWQgZGVzdHJveV9u b3RpZnkgKEdUS09iamVjdCAqc2VsZikKewogICAgW3NlbGYgZGVhbGxvY107Cn0KCiAtIChpZCkg aW5pdFdpdGhHdGs6KGdwb2ludGVyKSBfZ3RrCnsKICAgIFtzdXBlciBpbml0V2l0aEd0azpfZ3Rr XTsKCiAgICAvLyBkaXNhYmxlIGZsb2F0aW5nIGZsYWcsIHdlIHVzZSBhdXRvcmVsZWFzZSBpbnN0 ZWFkLi4uCiAgICBHVEtfT0JKRUNUX1VOU0VUX0ZMQUdTKF9ndGssIEdUS19GTE9BVElORyk7CiAg ICBbc2VsZiB3ZWFrcmVmOihHdGtEZXN0cm95Tm90aWZ5KSBkZXN0cm95X25vdGlmeSBkYXRhOnNl bGZdOwoKICAgIGlmICh0YWcpIHRhZyA9IDA7CQkvLyB0YWcgdmFsdWUgLTEgaW5kaWNhdGVzICJk byBub3Qgc2hvdyIKICAgIC8vIHNob3cgYWxsIHdpZGdldHMgKGV4Y2VwdCB3aW5kb3dzIGFuZCBt ZW51cykgYnkgZGVmYXVsdAogICAgZWxzZSBpZiAoW3NlbGYgcmVzcG9uZHNUb1NlbGVjdG9yOkBz ZWxlY3RvcihzaG93KV0gJiYKCSAgICAgIVtzZWxmIGlzS2luZE9mQ2xhc3M6W0dUS01lbnUgY2xh c3NdXSAmJgoJICAgICAhW3NlbGYgaXNLaW5kT2ZDbGFzczpbR1RLV2luZG93IGNsYXNzXV0pIFso aWQpIHNlbGYgc2hvd107CiAgICByZXR1cm4gc2VsZjsKfQoKI2RlZmluZSBndGsJKChHdGtPYmpl Y3QgKikgZ3RrKQogLSAob25ld2F5IHZvaWQpIHJlbGVhc2UKewojaWZkZWYgREVCVUcKICAgIGlm IChndGsgJiYgZ3RrLT5yZWZfY291bnQgPT0gMCkKCWdfZXJyb3IoInJlZl9jb3VudCA9PSAwIGlu ICIgX19GSUxFX18gIiAocmVsZWFzZSkiKTsKI2VuZGlmCiAgICBpZiAoZ3RrKSBbc2VsZiB1bnJl Zl07CiAgICBlbHNlIFtzZWxmIGRlYWxsb2NdOwp9CgogLSAoaWQpIHJldGFpbgp7CiAgICBpZiAo Z3RrKSBbc2VsZiByZWZdOwogICAgcmV0dXJuIHNlbGY7Cn0KCiAtICh1bnNpZ25lZCkgcmV0YWlu Q291bnQKewogICAgcmV0dXJuIGd0ayA/IGd0ay0+cmVmX2NvdW50IDogMTsKfQojdW5kZWYgZ3Rr CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a29wdGlvbm1lbnUuaCBieSBndGtn ZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl c3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2Us IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rv b2xLaXQvR1RLT3B0aW9uTWVudS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CgpA aW1wbGVtZW50YXRpb24gR1RLT3B0aW9uTWVudQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJl dHVybiBndGtfb3B0aW9uX21lbnVfZ2V0X3R5cGUoKTsKfQorIChpZCkgb3B0aW9uTWVudQp7CiAg ICByZXR1cm4gW1soR1RLT3B0aW9uTWVudSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFz ZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19vcHRp b25fbWVudV9uZXcoKV07Cn0KLSAoR1RLV2lkZ2V0KikgZ2V0TWVudQp7CiAgICByZXR1cm4gZ3Rv b2xraXRfb2JqZWN0KGd0a19vcHRpb25fbWVudV9nZXRfbWVudShndGspLCAwKTsKfQotICh2b2lk KSBzZXRNZW51OihHVEtXaWRnZXQgKikgbWVudQp7CiAgICBndGtfb3B0aW9uX21lbnVfc2V0X21l bnUoZ3RrLCBtZW51ID8gbWVudS0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcmVtb3ZlTWVudQp7CiAg ICBndGtfb3B0aW9uX21lbnVfcmVtb3ZlX21lbnUoZ3RrKTsKfQotICh2b2lkKSBzZXRIaXN0b3J5 OihndWludCkgaW5kZXgKewogICAgZ3RrX29wdGlvbl9tZW51X3NldF9oaXN0b3J5KGd0aywgaW5k ZXgpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhl IEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1 ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3BhY2tlci5oIGJ5IGd0 a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg TGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5z ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxH VG9vbEtpdC9HVEtQYWNrZXIuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGlt cGxlbWVudGF0aW9uIEdUS1BhY2tlcgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBn dGtfcGFja2VyX2dldF90eXBlKCk7Cn0KKyAoaWQpIHBhY2tlcgp7CiAgICByZXR1cm4gW1soR1RL UGFja2VyICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7 CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3BhY2tlcl9uZXcoKV07Cn0KLSAodm9p ZCkgYWRkRGVmYXVsdHM6KEdUS1dpZGdldCAqKSBjaGlsZCBzaWRlOihHdGtTaWRlVHlwZSkgc2lk ZSBhbmNob3I6KEd0a0FuY2hvclR5cGUpIGFuY2hvciBvcHRpb25zOihHdGtQYWNrZXJPcHRpb25z KSBvcHRpb25zCnsKICAgIGd0a19wYWNrZXJfYWRkX2RlZmF1bHRzKGd0aywgY2hpbGQgID8gY2hp bGQgLT5ndGsgOiAwLCBzaWRlICwgYW5jaG9yICwgb3B0aW9ucyk7Cn0KLSAodm9pZCkgYWRkOihH VEtXaWRnZXQgKikgY2hpbGQgc2lkZTooR3RrU2lkZVR5cGUpIHNpZGUgYW5jaG9yOihHdGtBbmNo b3JUeXBlKSBhbmNob3Igb3B0aW9uczooR3RrUGFja2VyT3B0aW9ucykgb3B0aW9ucyBib3JkZXJX aWR0aDooZ3VpbnQpIGJvcmRlcl93aWR0aCBwYWRYOihndWludCkgcGFkX3ggcGFkWTooZ3VpbnQp IHBhZF95IGlQYWRYOihndWludCkgaV9wYWRfeCBpUGFkWTooZ3VpbnQpIGlfcGFkX3kKewogICAg Z3RrX3BhY2tlcl9hZGQoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIHNpZGUgLCBhbmNo b3IgLCBvcHRpb25zICwgYm9yZGVyX3dpZHRoICwgcGFkX3ggLCBwYWRfeSAsIGlfcGFkX3ggLCBp X3BhZF95KTsKfQotICh2b2lkKSBzZXRDaGlsZFBhY2tpbmc6KEdUS1dpZGdldCAqKSBjaGlsZCBz aWRlOihHdGtTaWRlVHlwZSkgc2lkZSBhbmNob3I6KEd0a0FuY2hvclR5cGUpIGFuY2hvciBvcHRp b25zOihHdGtQYWNrZXJPcHRpb25zKSBvcHRpb25zIGJvcmRlcldpZHRoOihndWludCkgYm9yZGVy X3dpZHRoIHBhZFg6KGd1aW50KSBwYWRfeCBwYWRZOihndWludCkgcGFkX3kgaVBhZFg6KGd1aW50 KSBpX3BhZF94IGlQYWRZOihndWludCkgaV9wYWRfeQp7CiAgICBndGtfcGFja2VyX3NldF9jaGls ZF9wYWNraW5nKGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCBzaWRlICwgYW5jaG9yICwg b3B0aW9ucyAsIGJvcmRlcl93aWR0aCAsIHBhZF94ICwgcGFkX3kgLCBpX3BhZF94ICwgaV9wYWRf eSk7Cn0KLSAodm9pZCkgcmVvcmRlckNoaWxkOihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRpb246 KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19wYWNrZXJfcmVvcmRlcl9jaGlsZChndGssIGNoaWxk ICA/IGNoaWxkIC0+Z3RrIDogMCwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHNldFNwYWNpbmc6KGd1 aW50KSBzcGFjaW5nCnsKICAgIGd0a19wYWNrZXJfc2V0X3NwYWNpbmcoZ3RrLCBzcGFjaW5nKTsK fQotICh2b2lkKSBzZXREZWZhdWx0Qm9yZGVyV2lkdGg6KGd1aW50KSBib3JkZXIKewogICAgZ3Rr X3BhY2tlcl9zZXRfZGVmYXVsdF9ib3JkZXJfd2lkdGgoZ3RrLCBib3JkZXIpOwp9Ci0gKHZvaWQp IHNldERlZmF1bHRQYWQ6KGd1aW50KSBwYWRfeCBwYWRZOihndWludCkgcGFkX3kKewogICAgZ3Rr X3BhY2tlcl9zZXRfZGVmYXVsdF9wYWQoZ3RrLCBwYWRfeCAsIHBhZF95KTsKfQotICh2b2lkKSBz ZXREZWZhdWx0SXBhZDooZ3VpbnQpIGlfcGFkX3ggaVBhZFk6KGd1aW50KSBpX3BhZF95CnsKICAg IGd0a19wYWNrZXJfc2V0X2RlZmF1bHRfaXBhZChndGssIGlfcGFkX3ggLCBpX3BhZF95KTsKfQpA ZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRv b2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoK ICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtwYW5lZC5oIGJ5IGd0a2dlbi4KICoK ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H VEtQYW5lZC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CgpAaW1wbGVtZW50YXRp b24gR1RLUGFuZWQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3BhbmVkX2dl dF90eXBlKCk7Cn0KLSAodm9pZCkgYWRkMTooR1RLV2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19w YW5lZF9hZGQxKGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgYWRkMjoo R1RLV2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19wYW5lZF9hZGQyKGd0aywgY2hpbGQgPyBjaGls ZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcGFjazE6KEdUS1dpZGdldCAqKSBjaGlsZCByZXNpemU6 KGdib29sZWFuKSByZXNpemUgc2hyaW5rOihnYm9vbGVhbikgc2hyaW5rCnsKICAgIGd0a19wYW5l ZF9wYWNrMShndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgcmVzaXplICwgc2hyaW5rKTsK fQotICh2b2lkKSBwYWNrMjooR1RLV2lkZ2V0ICopIGNoaWxkIHJlc2l6ZTooZ2Jvb2xlYW4pIHJl c2l6ZSBzaHJpbms6KGdib29sZWFuKSBzaHJpbmsKewogICAgZ3RrX3BhbmVkX3BhY2syKGd0aywg Y2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCByZXNpemUgLCBzaHJpbmspOwp9Ci0gKHZvaWQpIHNl dFBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKGd0 aywgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHNldEhhbmRsZVNpemU6KGd1aW50MTYpIHNpemUKewog ICAgZ3RrX3BhbmVkX3NldF9oYW5kbGVfc2l6ZShndGssIHNpemUpOwp9Ci0gKHZvaWQpIHNldEd1 dHRlclNpemU6KGd1aW50MTYpIHNpemUKewogICAgZ3RrX3BhbmVkX3NldF9ndXR0ZXJfc2l6ZShn dGssIHNpemUpOwp9CiNkZWZpbmUgZ3RrCSgoR3RrUGFuZWQgKikgZ3RrKQotIChpZCkgY2hpbGQx CnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5jaGlsZDEpOwp9Ci0gKGlkKSBjaGls ZDIKewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmNoaWxkMik7Cn0KI3VuZGVmIGd0 awpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1Q IFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcK ICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtwaXhtYXAuaCBieSBndGtnZW4u CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl ciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9y IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xL aXQvR1RLUGl4bWFwLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLUGl4bWFwCisgKEd0a1R5cGUpIGdl dFR5cGUKewogICAgcmV0dXJuIGd0a19waXhtYXBfZ2V0X3R5cGUoKTsKfQorIChpZCkgcGl4bWFw V2l0aFBpeG1hcDooR2RrUGl4bWFwICopIHBpeG1hcCBtYXNrOihHZGtCaXRtYXAgKikgbWFzawp7 CiAgICByZXR1cm4gW1soR1RLUGl4bWFwICopW3NlbGYgYWxsb2NdIGluaXRXaXRoUGl4bWFwOnBp eG1hcCBtYXNrOm1hc2tdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhQaXhtYXA6KEdk a1BpeG1hcCAqKSBwaXhtYXAgbWFzazooR2RrQml0bWFwICopIG1hc2sKewogICAgcmV0dXJuIFtz ZWxmIGluaXRXaXRoR3RrOmd0a19waXhtYXBfbmV3KCBwaXhtYXAgLCBtYXNrKV07Cn0KLSAodm9p ZCkgc2V0OihHZGtQaXhtYXAgKikgdmFsIG1hc2s6KEdka0JpdG1hcCAqKSBtYXNrCnsKICAgIGd0 a19waXhtYXBfc2V0KGd0aywgdmFsICwgbWFzayk7Cn0KLSAodm9pZCkgZ2V0OihHZGtQaXhtYXAg KiopIHZhbCBtYXNrOihHZGtCaXRtYXAgKiopIG1hc2sKewogICAgZ3RrX3BpeG1hcF9nZXQoZ3Rr LCB2YWwgLCBtYXNrKTsKfQotICh2b2lkKSBzZXRCdWlsZEluc2Vuc2l0aXZlOihndWludCkgYnVp bGQKewogICAgZ3RrX3BpeG1hcF9zZXRfYnVpbGRfaW5zZW5zaXRpdmUoZ3RrLCBidWlsZCk7Cn0K QGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBU b29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAq CiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrcGx1Zy5oIGJ5IGd0a2dlbi4KICoK ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H VEtQbHVnLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLUGx1ZworIChHdGtUeXBlKSBnZXRUeXBlCnsK ICAgIHJldHVybiBndGtfcGx1Z19nZXRfdHlwZSgpOwp9CisgKGlkKSBwbHVnV2l0aFNvY2tldElk OihndWludDMyKSBzb2NrZXRfaWQKewogICAgcmV0dXJuIFtbKEdUS1BsdWcgKilbc2VsZiBhbGxv Y10gaW5pdFdpdGhTb2NrZXRJZDpzb2NrZXRfaWRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5p dFdpdGhTb2NrZXRJZDooZ3VpbnQzMikgc29ja2V0X2lkCnsKICAgIHJldHVybiBbc2VsZiBpbml0 V2l0aEd0azpndGtfcGx1Z19uZXcoIHNvY2tldF9pZCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQg LSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQg KGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21h dGljYWxseSBmcm9tIGd0a3ByZXZpZXcuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5 IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLUHJldmlldy5oPgoKQGlt cGxlbWVudGF0aW9uIEdUS1ByZXZpZXcKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4g Z3RrX3ByZXZpZXdfZ2V0X3R5cGUoKTsKfQorICh2b2lkKSB1bmluaXQKewogICAgZ3RrX3ByZXZp ZXdfdW5pbml0KCk7Cn0KKyAoaWQpIHByZXZpZXdXaXRoVHlwZTooR3RrUHJldmlld1R5cGUpIHR5 cGUKewogICAgcmV0dXJuIFtbKEdUS1ByZXZpZXcgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhUeXBl OnR5cGVdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhUeXBlOihHdGtQcmV2aWV3VHlw ZSkgdHlwZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3ByZXZpZXdfbmV3KCB0 eXBlKV07Cn0KLSAodm9pZCkgc2l6ZTooZ2ludCkgd2lkdGggaGVpZ2h0OihnaW50KSBoZWlnaHQK ewogICAgZ3RrX3ByZXZpZXdfc2l6ZShndGssIHdpZHRoICwgaGVpZ2h0KTsKfQotICh2b2lkKSBw dXQ6KEdka1dpbmRvdyAqKSB3aW5kb3cgZ2M6KEdka0dDICopIGdjIHNyY3g6KGdpbnQpIHNyY3gg c3JjeTooZ2ludCkgc3JjeSBkZXN0eDooZ2ludCkgZGVzdHggZGVzdHk6KGdpbnQpIGRlc3R5IHdp ZHRoOihnaW50KSB3aWR0aCBoZWlnaHQ6KGdpbnQpIGhlaWdodAp7CiAgICBndGtfcHJldmlld19w dXQoZ3RrLCB3aW5kb3cgLCBnYyAsIHNyY3ggLCBzcmN5ICwgZGVzdHggLCBkZXN0eSAsIHdpZHRo ICwgaGVpZ2h0KTsKfQotICh2b2lkKSBkcmF3Um93OihndWNoYXIgKikgZGF0YSB4OihnaW50KSB4 IHk6KGdpbnQpIHkgdzooZ2ludCkgdwp7CiAgICBndGtfcHJldmlld19kcmF3X3JvdyhndGssIGRh dGEgLCB4ICwgeSAsIHcpOwp9Ci0gKHZvaWQpIHNldEV4cGFuZDooZ2Jvb2xlYW4pIGV4cGFuZAp7 CiAgICBndGtfcHJldmlld19zZXRfZXhwYW5kKGd0aywgZXhwYW5kKTsKfQorICh2b2lkKSBzZXRH YW1tYTooZG91YmxlKSBnYW1tYQp7CiAgICBndGtfcHJldmlld19zZXRfZ2FtbWEoIGdhbW1hKTsK fQorICh2b2lkKSBzZXRDb2xvckN1YmU6KGd1aW50KSBucmVkX3NoYWRlcyBuZ3JlZW5TaGFkZXM6 KGd1aW50KSBuZ3JlZW5fc2hhZGVzIG5ibHVlU2hhZGVzOihndWludCkgbmJsdWVfc2hhZGVzIG5n cmF5U2hhZGVzOihndWludCkgbmdyYXlfc2hhZGVzCnsKICAgIGd0a19wcmV2aWV3X3NldF9jb2xv cl9jdWJlKCBucmVkX3NoYWRlcyAsIG5ncmVlbl9zaGFkZXMgLCBuYmx1ZV9zaGFkZXMgLCBuZ3Jh eV9zaGFkZXMpOwp9CisgKHZvaWQpIHNldEluc3RhbGxDbWFwOihnaW50KSBpbnN0YWxsX2NtYXAK ewogICAgZ3RrX3ByZXZpZXdfc2V0X2luc3RhbGxfY21hcCggaW5zdGFsbF9jbWFwKTsKfQorICh2 b2lkKSBzZXRSZXNlcnZlZDooZ2ludCkgbnJlc2VydmVkCnsKICAgIGd0a19wcmV2aWV3X3NldF9y ZXNlcnZlZCggbnJlc2VydmVkKTsKfQotICh2b2lkKSBzZXREaXRoZXI6KEdka1JnYkRpdGhlcikg ZGl0aGVyCnsKICAgIGd0a19wcmV2aWV3X3NldF9kaXRoZXIoZ3RrLCBkaXRoZXIpOwp9CisgKEdk a1Zpc3VhbCopIGdldFZpc3VhbAp7CiAgICByZXR1cm4gZ3RrX3ByZXZpZXdfZ2V0X3Zpc3VhbCgp Owp9CisgKEdka0NvbG9ybWFwKikgZ2V0Q21hcAp7CiAgICByZXR1cm4gZ3RrX3ByZXZpZXdfZ2V0 X2NtYXAoKTsKfQorIChHdGtQcmV2aWV3SW5mbyopIGdldEluZm8KewogICAgcmV0dXJuIGd0a19w cmV2aWV3X2dldF9pbmZvKCk7Cn0KKyAodm9pZCkgcmVzZXQKewogICAgZ3RrX3ByZXZpZXdfcmVz ZXQoKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRo ZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBM dWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtwcm9ncmVzcy5oIGJ5 IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGlj ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRl IDxHVG9vbEtpdC9HVEtQcm9ncmVzcy5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVu dC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1Byb2dyZXNzCisgKEd0a1R5cGUpIGdldFR5cGUKewog ICAgcmV0dXJuIGd0a19wcm9ncmVzc19nZXRfdHlwZSgpOwp9Ci0gKHZvaWQpIHNldFNob3dUZXh0 OihnaW50KSBzaG93X3RleHQKewogICAgZ3RrX3Byb2dyZXNzX3NldF9zaG93X3RleHQoZ3RrLCBz aG93X3RleHQpOwp9Ci0gKHZvaWQpIHNldFRleHRBbGlnbm1lbnQ6KGdmbG9hdCkgeF9hbGlnbiB5 QWxpZ246KGdmbG9hdCkgeV9hbGlnbgp7CiAgICBndGtfcHJvZ3Jlc3Nfc2V0X3RleHRfYWxpZ25t ZW50KGd0aywgeF9hbGlnbiAsIHlfYWxpZ24pOwp9Ci0gKHZvaWQpIHNldEZvcm1hdFN0cmluZzoo TlNTdHJpbmcgKikgZm9ybWF0CnsKICAgIGd0a19wcm9ncmVzc19zZXRfZm9ybWF0X3N0cmluZyhn dGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGZvcm1hdCkpOwp9Ci0gKHZvaWQpIHNldEFkanVzdG1l bnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfcHJvZ3Jlc3Nfc2V0X2Fk anVzdG1lbnQoZ3RrLCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAodm9p ZCkgY29uZmlndXJlOihnZmxvYXQpIHZhbHVlIG1pbjooZ2Zsb2F0KSBtaW4gbWF4OihnZmxvYXQp IG1heAp7CiAgICBndGtfcHJvZ3Jlc3NfY29uZmlndXJlKGd0aywgdmFsdWUgLCBtaW4gLCBtYXgp Owp9Ci0gKHZvaWQpIHNldFBlcmNlbnRhZ2U6KGdmbG9hdCkgcGVyY2VudGFnZQp7CiAgICBndGtf cHJvZ3Jlc3Nfc2V0X3BlcmNlbnRhZ2UoZ3RrLCBwZXJjZW50YWdlKTsKfQotICh2b2lkKSBzZXRW YWx1ZTooZ2Zsb2F0KSB2YWx1ZQp7CiAgICBndGtfcHJvZ3Jlc3Nfc2V0X3ZhbHVlKGd0aywgdmFs dWUpOwp9Ci0gKGdmbG9hdCkgZ2V0VmFsdWUKewogICAgcmV0dXJuIGd0a19wcm9ncmVzc19nZXRf dmFsdWUoZ3RrKTsKfQotICh2b2lkKSBzZXRBY3Rpdml0eU1vZGU6KGd1aW50KSBhY3Rpdml0eV9t b2RlCnsKICAgIGd0a19wcm9ncmVzc19zZXRfYWN0aXZpdHlfbW9kZShndGssIGFjdGl2aXR5X21v ZGUpOwp9Ci0gKE5TU3RyaW5nICopIGdldEN1cnJlbnRUZXh0CnsKICAgIHJldHVybiBndG9vbGtp dF9vYmpjX3N0cmluZyhndGtfcHJvZ3Jlc3NfZ2V0X2N1cnJlbnRfdGV4dChndGspKTsKfQotIChO U1N0cmluZyAqKSBnZXRUZXh0RnJvbVZhbHVlOihnZmxvYXQpIHZhbHVlCnsKICAgIHJldHVybiBn dG9vbGtpdF9vYmpjX3N0cmluZyhndGtfcHJvZ3Jlc3NfZ2V0X3RleHRfZnJvbV92YWx1ZShndGss IHZhbHVlKSk7Cn0KLSAoZ2Zsb2F0KSBnZXRDdXJyZW50UGVyY2VudGFnZQp7CiAgICByZXR1cm4g Z3RrX3Byb2dyZXNzX2dldF9jdXJyZW50X3BlcmNlbnRhZ2UoZ3RrKTsKfQotIChnZmxvYXQpIGdl dFBlcmNlbnRhZ2VGcm9tVmFsdWU6KGdmbG9hdCkgdmFsdWUKewogICAgcmV0dXJuIGd0a19wcm9n cmVzc19nZXRfcGVyY2VudGFnZV9mcm9tX3ZhbHVlKGd0aywgdmFsdWUpOwp9CkBlbmQKLyoKICog R1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBD b3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0 ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3Byb2dyZXNzYmFyLmggYnkgZ3RrZ2VuLgogKgogKiBU aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh bCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1By b2dyZXNzQmFyLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBZGp1c3RtZW50Lmg+CgpAaW1wbGVt ZW50YXRpb24gR1RLUHJvZ3Jlc3NCYXIKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4g Z3RrX3Byb2dyZXNzX2Jhcl9nZXRfdHlwZSgpOwp9CisgKGlkKSBwcm9ncmVzc0Jhcgp7CiAgICBy ZXR1cm4gW1soR1RLUHJvZ3Jlc3NCYXIgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2Vd Owp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfcHJvZ3Jl c3NfYmFyX25ldygpXTsKfQorIChpZCkgcHJvZ3Jlc3NCYXJXaXRoQWRqdXN0bWVudDooR1RLQWRq dXN0bWVudCAqKSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtQcm9ncmVzc0JhciAqKVtz ZWxmIGFsbG9jXSBpbml0V2l0aEFkanVzdG1lbnQ6YWRqdXN0bWVudF0gYXV0b3JlbGVhc2VdOwp9 Ci0gKGlkKSBpbml0V2l0aEFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7 CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3Byb2dyZXNzX2Jhcl9uZXdfd2l0aF9h ZGp1c3RtZW50KCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCldOwp9Ci0gKHZvaWQp IHNldEJhclN0eWxlOihHdGtQcm9ncmVzc0JhclN0eWxlKSBzdHlsZQp7CiAgICBndGtfcHJvZ3Jl c3NfYmFyX3NldF9iYXJfc3R5bGUoZ3RrLCBzdHlsZSk7Cn0KLSAodm9pZCkgc2V0RGlzY3JldGVC bG9ja3M6KGd1aW50KSBibG9ja3MKewogICAgZ3RrX3Byb2dyZXNzX2Jhcl9zZXRfZGlzY3JldGVf YmxvY2tzKGd0aywgYmxvY2tzKTsKfQotICh2b2lkKSBzZXRBY3Rpdml0eVN0ZXA6KGd1aW50KSBz dGVwCnsKICAgIGd0a19wcm9ncmVzc19iYXJfc2V0X2FjdGl2aXR5X3N0ZXAoZ3RrLCBzdGVwKTsK fQotICh2b2lkKSBzZXRBY3Rpdml0eUJsb2NrczooZ3VpbnQpIGJsb2Nrcwp7CiAgICBndGtfcHJv Z3Jlc3NfYmFyX3NldF9hY3Rpdml0eV9ibG9ja3MoZ3RrLCBibG9ja3MpOwp9Ci0gKHZvaWQpIHNl dE9yaWVudGF0aW9uOihHdGtQcm9ncmVzc0Jhck9yaWVudGF0aW9uKSBvcmllbnRhdGlvbgp7CiAg ICBndGtfcHJvZ3Jlc3NfYmFyX3NldF9vcmllbnRhdGlvbihndGssIG9yaWVudGF0aW9uKTsKfQot ICh2b2lkKSB1cGRhdGU6KGdmbG9hdCkgcGVyY2VudGFnZQp7CiAgICBndGtfcHJvZ3Jlc3NfYmFy X3VwZGF0ZShndGssIHBlcmNlbnRhZ2UpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm cm9tIGd0a3JhZGlvYnV0dG9uLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAq IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1JhZGlvQnV0dG9uLmg+CgpAaW1w bGVtZW50YXRpb24gR1RLUmFkaW9CdXR0b24KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1 cm4gZ3RrX3JhZGlvX2J1dHRvbl9nZXRfdHlwZSgpOwp9CisgKGlkKSByYWRpb0J1dHRvbldpdGhH cm91cDooR1NMaXN0ICopIGdyb3VwCnsKICAgIHJldHVybiBbWyhHVEtSYWRpb0J1dHRvbiAqKVtz ZWxmIGFsbG9jXSBpbml0V2l0aEdyb3VwOmdyb3VwXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGlu aXRXaXRoR3JvdXA6KEdTTGlzdCAqKSBncm91cAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH dGs6Z3RrX3JhZGlvX2J1dHRvbl9uZXcoIGdyb3VwKV07Cn0KKyAoaWQpIHJhZGlvQnV0dG9uRnJv bVdpZGdldFdpdGhHcm91cDooR1RLUmFkaW9CdXR0b24gKikgZ3JvdXAKewogICAgcmV0dXJuIFtb KEdUS1JhZGlvQnV0dG9uICopW3NlbGYgYWxsb2NdIGluaXRGcm9tV2lkZ2V0V2l0aEdyb3VwOmdy b3VwXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRGcm9tV2lkZ2V0V2l0aEdyb3VwOihHVEtS YWRpb0J1dHRvbiAqKSBncm91cAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3Jh ZGlvX2J1dHRvbl9uZXdfZnJvbV93aWRnZXQoIGdyb3VwID8gZ3JvdXAtPmd0ayA6IDApXTsKfQor IChpZCkgcmFkaW9CdXR0b25XaXRoTGFiZWw6KEdTTGlzdCAqKSBncm91cCBsYWJlbDooTlNTdHJp bmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtbKEdUS1JhZGlvQnV0dG9uICopW3NlbGYgYWxsb2Nd IGluaXRXaXRoTGFiZWw6Z3JvdXAgbGFiZWw6bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkg aW5pdFdpdGhMYWJlbDooR1NMaXN0ICopIGdyb3VwIGxhYmVsOihOU1N0cmluZyAqKSBsYWJlbAp7 CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3JhZGlvX2J1dHRvbl9uZXdfd2l0aF9s YWJlbCggZ3JvdXAgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQorIChpZCkgcmFk aW9CdXR0b25XaXRoTGFiZWxGcm9tV2lkZ2V0OihHVEtSYWRpb0J1dHRvbiAqKSBncm91cCBsYWJl bDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtbKEdUS1JhZGlvQnV0dG9uICopW3Nl bGYgYWxsb2NdIGluaXRXaXRoTGFiZWxGcm9tV2lkZ2V0Omdyb3VwIGxhYmVsOmxhYmVsXSBhdXRv cmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWxGcm9tV2lkZ2V0OihHVEtSYWRpb0J1dHRv biAqKSBncm91cCBsYWJlbDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtzZWxmIGlu aXRXaXRoR3RrOmd0a19yYWRpb19idXR0b25fbmV3X3dpdGhfbGFiZWxfZnJvbV93aWRnZXQoIGdy b3VwICA/IGdyb3VwIC0+Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggbGFiZWwpKV07Cn0K LSAoR1NMaXN0KikgZ3JvdXAKewogICAgcmV0dXJuIGd0a19yYWRpb19idXR0b25fZ3JvdXAoZ3Rr KTsKfQotICh2b2lkKSBzZXRHcm91cDooR1NMaXN0ICopIGdyb3VwCnsKICAgIGd0a19yYWRpb19i dXR0b25fc2V0X2dyb3VwKGd0aywgZ3JvdXApOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmpl Y3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5 OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxs eSBmcm9tIGd0a3JhZGlvbWVudWl0ZW0uaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5 IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLUmFkaW9NZW51SXRlbS5o PgoKQGltcGxlbWVudGF0aW9uIEdUS1JhZGlvTWVudUl0ZW0KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7 CiAgICByZXR1cm4gZ3RrX3JhZGlvX21lbnVfaXRlbV9nZXRfdHlwZSgpOwp9CisgKGlkKSByYWRp b01lbnVJdGVtV2l0aEdyb3VwOihHU0xpc3QgKikgZ3JvdXAKewogICAgcmV0dXJuIFtbKEdUS1Jh ZGlvTWVudUl0ZW0gKilbc2VsZiBhbGxvY10gaW5pdFdpdGhHcm91cDpncm91cF0gYXV0b3JlbGVh c2VdOwp9Ci0gKGlkKSBpbml0V2l0aEdyb3VwOihHU0xpc3QgKikgZ3JvdXAKewogICAgcmV0dXJu IFtzZWxmIGluaXRXaXRoR3RrOmd0a19yYWRpb19tZW51X2l0ZW1fbmV3KCBncm91cCldOwp9Cisg KGlkKSByYWRpb01lbnVJdGVtV2l0aExhYmVsOihHU0xpc3QgKikgZ3JvdXAgbGFiZWw6KE5TU3Ry aW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhHVEtSYWRpb01lbnVJdGVtICopW3NlbGYgYWxs b2NdIGluaXRXaXRoTGFiZWw6Z3JvdXAgbGFiZWw6bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChp ZCkgaW5pdFdpdGhMYWJlbDooR1NMaXN0ICopIGdyb3VwIGxhYmVsOihOU1N0cmluZyAqKSBsYWJl bAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3JhZGlvX21lbnVfaXRlbV9uZXdf d2l0aF9sYWJlbCggZ3JvdXAgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQotIChH U0xpc3QqKSBncm91cAp7CiAgICByZXR1cm4gZ3RrX3JhZGlvX21lbnVfaXRlbV9ncm91cChndGsp Owp9Ci0gKHZvaWQpIHNldEdyb3VwOihHU0xpc3QgKikgZ3JvdXAKewogICAgZ3RrX3JhZGlvX21l bnVfaXRlbV9zZXRfZ3JvdXAoZ3RrLCBncm91cCk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh bGx5IGZyb20gZ3RrcmFuZ2UuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNl IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICog dmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLUmFuZ2UuaD4KI2luY2x1ZGUgPEdU b29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtSYW5nZQorIChHdGtU eXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfcmFuZ2VfZ2V0X3R5cGUoKTsKfQotIChHVEtB ZGp1c3RtZW50KikgZ2V0QWRqdXN0bWVudAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0 a19yYW5nZV9nZXRfYWRqdXN0bWVudChndGspLCAwKTsKfQotICh2b2lkKSBzZXRVcGRhdGVQb2xp Y3k6KEd0a1VwZGF0ZVR5cGUpIHBvbGljeQp7CiAgICBndGtfcmFuZ2Vfc2V0X3VwZGF0ZV9wb2xp Y3koZ3RrLCBwb2xpY3kpOwp9Ci0gKHZvaWQpIHNldEFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQg KikgYWRqdXN0bWVudAp7CiAgICBndGtfcmFuZ2Vfc2V0X2FkanVzdG1lbnQoZ3RrLCBhZGp1c3Rt ZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgZHJhd0JhY2tncm91bmQKewog ICAgZ3RrX3JhbmdlX2RyYXdfYmFja2dyb3VuZChndGspOwp9Ci0gKHZvaWQpIGNsZWFyQmFja2dy b3VuZAp7CiAgICBndGtfcmFuZ2VfY2xlYXJfYmFja2dyb3VuZChndGspOwp9Ci0gKHZvaWQpIGRy YXdUcm91Z2gKewogICAgZ3RrX3JhbmdlX2RyYXdfdHJvdWdoKGd0ayk7Cn0KLSAodm9pZCkgZHJh d1NsaWRlcgp7CiAgICBndGtfcmFuZ2VfZHJhd19zbGlkZXIoZ3RrKTsKfQotICh2b2lkKSBkcmF3 U3RlcEZvcncKewogICAgZ3RrX3JhbmdlX2RyYXdfc3RlcF9mb3J3KGd0ayk7Cn0KLSAodm9pZCkg ZHJhd1N0ZXBCYWNrCnsKICAgIGd0a19yYW5nZV9kcmF3X3N0ZXBfYmFjayhndGspOwp9Ci0gKHZv aWQpIHNsaWRlclVwZGF0ZQp7CiAgICBndGtfcmFuZ2Vfc2xpZGVyX3VwZGF0ZShndGspOwp9Ci0g KGdpbnQpIHRyb3VnaENsaWNrOihnaW50KSB4IHk6KGdpbnQpIHkganVtcFBlcmM6KGdmbG9hdCAq KSBqdW1wX3BlcmMKewogICAgcmV0dXJuIGd0a19yYW5nZV90cm91Z2hfY2xpY2soZ3RrLCB4ICwg eSAsIGp1bXBfcGVyYyk7Cn0KLSAodm9pZCkgZGVmYXVsdEhzbGlkZXJVcGRhdGUKewogICAgZ3Rr X3JhbmdlX2RlZmF1bHRfaHNsaWRlcl91cGRhdGUoZ3RrKTsKfQotICh2b2lkKSBkZWZhdWx0VnNs aWRlclVwZGF0ZQp7CiAgICBndGtfcmFuZ2VfZGVmYXVsdF92c2xpZGVyX3VwZGF0ZShndGspOwp9 Ci0gKGdpbnQpIGRlZmF1bHRIdHJvdWdoQ2xpY2s6KGdpbnQpIHggeTooZ2ludCkgeSBqdW1wUGVy YzooZ2Zsb2F0ICopIGp1bXBfcGVyYwp7CiAgICByZXR1cm4gZ3RrX3JhbmdlX2RlZmF1bHRfaHRy b3VnaF9jbGljayhndGssIHggLCB5ICwganVtcF9wZXJjKTsKfQotIChnaW50KSBkZWZhdWx0VnRy b3VnaENsaWNrOihnaW50KSB4IHk6KGdpbnQpIHkganVtcFBlcmM6KGdmbG9hdCAqKSBqdW1wX3Bl cmMKewogICAgcmV0dXJuIGd0a19yYW5nZV9kZWZhdWx0X3Z0cm91Z2hfY2xpY2soZ3RrLCB4ICwg eSAsIGp1bXBfcGVyYyk7Cn0KLSAodm9pZCkgZGVmYXVsdEhtb3Rpb246KGdpbnQpIHhkZWx0YSB5 ZGVsdGE6KGdpbnQpIHlkZWx0YQp7CiAgICBndGtfcmFuZ2VfZGVmYXVsdF9obW90aW9uKGd0aywg eGRlbHRhICwgeWRlbHRhKTsKfQotICh2b2lkKSBkZWZhdWx0Vm1vdGlvbjooZ2ludCkgeGRlbHRh IHlkZWx0YTooZ2ludCkgeWRlbHRhCnsKICAgIGd0a19yYW5nZV9kZWZhdWx0X3Ztb3Rpb24oZ3Rr LCB4ZGVsdGEgLCB5ZGVsdGEpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBp bnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTks IDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0 a3J1bGVyLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4x IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgog Ki8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1J1bGVyLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLUnVs ZXIKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3J1bGVyX2dldF90eXBlKCk7 Cn0KLSAodm9pZCkgc2V0TWV0cmljOihHdGtNZXRyaWNUeXBlKSBtZXRyaWMKewogICAgZ3RrX3J1 bGVyX3NldF9tZXRyaWMoZ3RrLCBtZXRyaWMpOwp9Ci0gKHZvaWQpIHNldFJhbmdlOihnZmxvYXQp IGxvd2VyIHVwcGVyOihnZmxvYXQpIHVwcGVyIHBvc2l0aW9uOihnZmxvYXQpIHBvc2l0aW9uIG1h eFNpemU6KGdmbG9hdCkgbWF4X3NpemUKewogICAgZ3RrX3J1bGVyX3NldF9yYW5nZShndGssIGxv d2VyICwgdXBwZXIgLCBwb3NpdGlvbiAsIG1heF9zaXplKTsKfQotICh2b2lkKSBkcmF3VGlja3MK ewogICAgZ3RrX3J1bGVyX2RyYXdfdGlja3MoZ3RrKTsKfQotICh2b2lkKSBkcmF3UG9zCnsKICAg IGd0a19ydWxlcl9kcmF3X3BvcyhndGspOwp9CiNkZWZpbmUgZ3RrCSgoR3RrUnVsZXIgKikgZ3Rr KQotICh2b2lkKSBzZXRQb3NpdGlvbjooZ2Zsb2F0KSBwb3NpdGlvbgp7CiAgICBndGstPnBvc2l0 aW9uID0gcG9zaXRpb247Cn0KLSAoZ2Zsb2F0KSBwb3NpdGlvbgp7CiAgICByZXR1cm4gZ3RrLT5w b3NpdGlvbjsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBp bnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTks IDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0 a3NjYWxlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4x IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgog Ki8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1NjYWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLU2Nh bGUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3NjYWxlX2dldF90eXBlKCk7 Cn0KLSAodm9pZCkgc2V0RGlnaXRzOihnaW50KSBkaWdpdHMKewogICAgZ3RrX3NjYWxlX3NldF9k aWdpdHMoZ3RrLCBkaWdpdHMpOwp9Ci0gKHZvaWQpIHNldERyYXdWYWx1ZTooZ2Jvb2xlYW4pIGRy YXdfdmFsdWUKewogICAgZ3RrX3NjYWxlX3NldF9kcmF3X3ZhbHVlKGd0aywgZHJhd192YWx1ZSk7 Cn0KLSAodm9pZCkgc2V0VmFsdWVQb3M6KEd0a1Bvc2l0aW9uVHlwZSkgcG9zCnsKICAgIGd0a19z Y2FsZV9zZXRfdmFsdWVfcG9zKGd0aywgcG9zKTsKfQotIChnaW50KSBnZXRWYWx1ZVdpZHRoCnsK ICAgIHJldHVybiBndGtfc2NhbGVfZ2V0X3ZhbHVlX3dpZHRoKGd0ayk7Cn0KLSAodm9pZCkgZHJh d1ZhbHVlCnsKICAgIGd0a19zY2FsZV9kcmF3X3ZhbHVlKGd0ayk7Cn0KLSAodm9pZCkgc2V0RG91 YmxlVmFsdWU6KGRvdWJsZSkgdmFsdWUKewogICAgR3RrQWRqdXN0bWVudCAqYWRqdXN0bWVudCA9 IGd0a19yYW5nZV9nZXRfYWRqdXN0bWVudChndGspOwogICAgZ2Zsb2F0IG5ld192YWx1ZSA9IHZh bHVlOwoKICAgIGlmIChhZGp1c3RtZW50LT52YWx1ZSAhPSBuZXdfdmFsdWUpCglndGtfYWRqdXN0 bWVudF9zZXRfdmFsdWUoYWRqdXN0bWVudCwgbmV3X3ZhbHVlKTsKfQoKLSAoZG91YmxlKSBkb3Vi bGVWYWx1ZQp7CiAgICByZXR1cm4gZ3RrX3JhbmdlX2dldF9hZGp1c3RtZW50KGd0ayktPnZhbHVl Owp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJ TVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdp ZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3Njcm9sbGJhci5oIGJ5IGd0 a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg TGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5z ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxH VG9vbEtpdC9HVEtTY3JvbGxiYXIuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtTY3JvbGxiYXIKKyAo R3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3Njcm9sbGJhcl9nZXRfdHlwZSgpOwp9 CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3Njcm9sbGVkd2luZG93LmggYnkg Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg PEdUb29sS2l0L0dUS1Njcm9sbGVkV2luZG93Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRn ZXQuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlv biBHVEtTY3JvbGxlZFdpbmRvdworIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtf c2Nyb2xsZWRfd2luZG93X2dldF90eXBlKCk7Cn0KKyAoaWQpIHNjcm9sbGVkV2luZG93V2l0aEhh ZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3RtZW50IHZhZGp1c3RtZW50OihHVEtB ZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtTY3JvbGxlZFdpbmRv dyAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aEhhZGp1c3RtZW50OmhhZGp1c3RtZW50IHZhZGp1c3Rt ZW50OnZhZGp1c3RtZW50XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoSGFkanVzdG1l bnQ6KEdUS0FkanVzdG1lbnQgKikgaGFkanVzdG1lbnQgdmFkanVzdG1lbnQ6KEdUS0FkanVzdG1l bnQgKikgdmFkanVzdG1lbnQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19zY3Jv bGxlZF93aW5kb3dfbmV3KCBoYWRqdXN0bWVudCAgPyBoYWRqdXN0bWVudCAtPmd0ayA6IDAsIHZh ZGp1c3RtZW50ID8gdmFkanVzdG1lbnQtPmd0ayA6IDApXTsKfQotICh2b2lkKSBzZXRIYWRqdXN0 bWVudDooR1RLQWRqdXN0bWVudCAqKSBoYWRqdXN0bWVudAp7CiAgICBndGtfc2Nyb2xsZWRfd2lu ZG93X3NldF9oYWRqdXN0bWVudChndGssIGhhZGp1c3RtZW50ID8gaGFkanVzdG1lbnQtPmd0ayA6 IDApOwp9Ci0gKHZvaWQpIHNldFZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3Rt ZW50CnsKICAgIGd0a19zY3JvbGxlZF93aW5kb3dfc2V0X3ZhZGp1c3RtZW50KGd0aywgaGFkanVz dG1lbnQgPyBoYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAoR1RLQWRqdXN0bWVudCopIGdldEhh ZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Njcm9sbGVkX3dpbmRv d19nZXRfaGFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAoR1RLQWRqdXN0bWVudCopIGdldFZhZGp1 c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Njcm9sbGVkX3dpbmRvd19n ZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0UG9saWN5OihHdGtQb2xpY3lU eXBlKSBoc2Nyb2xsYmFyX3BvbGljeSB2c2Nyb2xsYmFyUG9saWN5OihHdGtQb2xpY3lUeXBlKSB2 c2Nyb2xsYmFyX3BvbGljeQp7CiAgICBndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3koZ3Rr LCBoc2Nyb2xsYmFyX3BvbGljeSAsIHZzY3JvbGxiYXJfcG9saWN5KTsKfQotICh2b2lkKSBzZXRQ bGFjZW1lbnQ6KEd0a0Nvcm5lclR5cGUpIHdpbmRvd19wbGFjZW1lbnQKewogICAgZ3RrX3Njcm9s bGVkX3dpbmRvd19zZXRfcGxhY2VtZW50KGd0aywgd2luZG93X3BsYWNlbWVudCk7Cn0KLSAodm9p ZCkgYWRkV2l0aFZpZXdwb3J0OihHVEtXaWRnZXQgKikgY2hpbGQKewogICAgZ3RrX3Njcm9sbGVk X3dpbmRvd19hZGRfd2l0aF92aWV3cG9ydChndGssIGNoaWxkID8gY2hpbGQtPmd0ayA6IDApOwp9 CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3NlcGFyYXRvci5oIGJ5IGd0a2dl bi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVz c2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwg b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9v bEtpdC9HVEtTZXBhcmF0b3IuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtTZXBhcmF0b3IKKyAoR3Rr VHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3NlcGFyYXRvcl9nZXRfdHlwZSgpOwp9CkBl bmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9v bGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgog KiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3NvY2tldC5oIGJ5IGd0a2dlbi4KICoK ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H VEtTb2NrZXQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtTb2NrZXQKKyAoaWQpIHNvY2tldAp7CiAg ICByZXR1cm4gW1soR1RLU29ja2V0ICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsK fQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3NvY2tldF9u ZXcoKV07Cn0KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3NvY2tldF9nZXRf dHlwZSgpOwp9Ci0gKHZvaWQpIHN0ZWFsOihndWludDMyKSB3aWQKewogICAgZ3RrX3NvY2tldF9z dGVhbChndGssIHdpZCk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVy ZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAw MCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrc3Bp bmJ1dHRvbi5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIu MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K ICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtTcGluQnV0dG9uLmg+CiNpbmNsdWRlIDxHVG9vbEtp dC9HVEtBZGp1c3RtZW50Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLU3BpbkJ1dHRvbgorIChHdGtU eXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfc3Bpbl9idXR0b25fZ2V0X3R5cGUoKTsKfQot ICh2b2lkKSBjb25maWd1cmU6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudCBjbGltYlJhdGU6 KGdmbG9hdCkgY2xpbWJfcmF0ZSBkaWdpdHM6KGd1aW50KSBkaWdpdHMKewogICAgZ3RrX3NwaW5f YnV0dG9uX2NvbmZpZ3VyZShndGssIGFkanVzdG1lbnQgID8gYWRqdXN0bWVudCAtPmd0ayA6IDAs IGNsaW1iX3JhdGUgLCBkaWdpdHMpOwp9CisgKGlkKSBzcGluQnV0dG9uV2l0aEFkanVzdG1lbnQ6 KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudCBjbGltYlJhdGU6KGdmbG9hdCkgY2xpbWJfcmF0 ZSBkaWdpdHM6KGd1aW50KSBkaWdpdHMKewogICAgcmV0dXJuIFtbKEdUS1NwaW5CdXR0b24gKilb c2VsZiBhbGxvY10gaW5pdFdpdGhBZGp1c3RtZW50OmFkanVzdG1lbnQgY2xpbWJSYXRlOmNsaW1i X3JhdGUgZGlnaXRzOmRpZ2l0c10gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aEFkanVz dG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudCBjbGltYlJhdGU6KGdmbG9hdCkgY2xp bWJfcmF0ZSBkaWdpdHM6KGd1aW50KSBkaWdpdHMKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRo R3RrOmd0a19zcGluX2J1dHRvbl9uZXcoIGFkanVzdG1lbnQgID8gYWRqdXN0bWVudCAtPmd0ayA6 IDAsIGNsaW1iX3JhdGUgLCBkaWdpdHMpXTsKfQotICh2b2lkKSBzZXRBZGp1c3RtZW50OihHVEtB ZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgZ3RrX3NwaW5fYnV0dG9uX3NldF9hZGp1c3Rt ZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0gKEdUS0FkanVz dG1lbnQqKSBnZXRBZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Nw aW5fYnV0dG9uX2dldF9hZGp1c3RtZW50KGd0ayksIDApOwp9Ci0gKHZvaWQpIHNldERpZ2l0czoo Z3VpbnQpIGRpZ2l0cwp7CiAgICBndGtfc3Bpbl9idXR0b25fc2V0X2RpZ2l0cyhndGssIGRpZ2l0 cyk7Cn0KLSAoZ2Zsb2F0KSBnZXRWYWx1ZUFzRmxvYXQKewogICAgcmV0dXJuIGd0a19zcGluX2J1 dHRvbl9nZXRfdmFsdWVfYXNfZmxvYXQoZ3RrKTsKfQotIChnaW50KSBnZXRWYWx1ZUFzSW50CnsK ICAgIHJldHVybiBndGtfc3Bpbl9idXR0b25fZ2V0X3ZhbHVlX2FzX2ludChndGspOwp9Ci0gKHZv aWQpIHNldFZhbHVlOihnZmxvYXQpIHZhbHVlCnsKICAgIGd0a19zcGluX2J1dHRvbl9zZXRfdmFs dWUoZ3RrLCB2YWx1ZSk7Cn0KLSAodm9pZCkgc2V0VXBkYXRlUG9saWN5OihHdGtTcGluQnV0dG9u VXBkYXRlUG9saWN5KSBwb2xpY3kKewogICAgZ3RrX3NwaW5fYnV0dG9uX3NldF91cGRhdGVfcG9s aWN5KGd0aywgcG9saWN5KTsKfQotICh2b2lkKSBzZXROdW1lcmljOihnYm9vbGVhbikgbnVtZXJp Ywp7CiAgICBndGtfc3Bpbl9idXR0b25fc2V0X251bWVyaWMoZ3RrLCBudW1lcmljKTsKfQotICh2 b2lkKSBzcGluOihHdGtTcGluVHlwZSkgZGlyZWN0aW9uIGluY3JlbWVudDooZ2Zsb2F0KSBpbmNy ZW1lbnQKewogICAgZ3RrX3NwaW5fYnV0dG9uX3NwaW4oZ3RrLCBkaXJlY3Rpb24gLCBpbmNyZW1l bnQpOwp9Ci0gKHZvaWQpIHNldFdyYXA6KGdib29sZWFuKSB3cmFwCnsKICAgIGd0a19zcGluX2J1 dHRvbl9zZXRfd3JhcChndGssIHdyYXApOwp9Ci0gKHZvaWQpIHNldFNoYWRvd1R5cGU6KEd0a1No YWRvd1R5cGUpIHNoYWRvd190eXBlCnsKICAgIGd0a19zcGluX2J1dHRvbl9zZXRfc2hhZG93X3R5 cGUoZ3RrLCBzaGFkb3dfdHlwZSk7Cn0KLSAodm9pZCkgc2V0U25hcFRvVGlja3M6KGdib29sZWFu KSBzbmFwX3RvX3RpY2tzCnsKICAgIGd0a19zcGluX2J1dHRvbl9zZXRfc25hcF90b190aWNrcyhn dGssIHNuYXBfdG9fdGlja3MpOwp9Ci0gKHZvaWQpIHVwZGF0ZQp7CiAgICBndGtfc3Bpbl9idXR0 b25fdXBkYXRlKGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVy ZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAw MCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrc3Rh dHVzYmFyLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4x IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgog Ki8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1N0YXR1c2Jhci5oPgoKQGltcGxlbWVudGF0aW9uIEdU S1N0YXR1c2JhcgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfc3RhdHVzYmFy X2dldF90eXBlKCk7Cn0KKyAoaWQpIHN0YXR1c2Jhcgp7CiAgICByZXR1cm4gW1soR1RLU3RhdHVz YmFyICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAg ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3N0YXR1c2Jhcl9uZXcoKV07Cn0KLSAoZ3Vp bnQpIGdldENvbnRleHRJZDooTlNTdHJpbmcgKikgY29udGV4dF9kZXNjcmlwdGlvbgp7CiAgICBy ZXR1cm4gZ3RrX3N0YXR1c2Jhcl9nZXRfY29udGV4dF9pZChndGssZ3Rvb2xraXRfdXRmOF9zdHJp bmcoIGNvbnRleHRfZGVzY3JpcHRpb24pKTsKfQotIChndWludCkgcHVzaDooZ3VpbnQpIGNvbnRl eHRfaWQgdGV4dDooTlNTdHJpbmcgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX3N0YXR1c2Jhcl9w dXNoKGd0aywgY29udGV4dF9pZCAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRleHQpKTsKfQotICh2 b2lkKSBwb3A6KGd1aW50KSBjb250ZXh0X2lkCnsKICAgIGd0a19zdGF0dXNiYXJfcG9wKGd0aywg Y29udGV4dF9pZCk7Cn0KLSAodm9pZCkgcmVtb3ZlOihndWludCkgY29udGV4dF9pZCBtZXNzYWdl SWQ6KGd1aW50KSBtZXNzYWdlX2lkCnsKICAgIGd0a19zdGF0dXNiYXJfcmVtb3ZlKGd0aywgY29u dGV4dF9pZCAsIG1lc3NhZ2VfaWQpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5 OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t IGd0a3N0eWxlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24g Mi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RL U3R5bGUKKyAoaWQpIHN0eWxlCnsKICAgIHJldHVybiBbWyhHVEtTdHlsZSAqKVtzZWxmIGFsbG9j XSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxmIGlu aXRXaXRoR3RrOmd0a19zdHlsZV9uZXcoKV07Cn0KLSAoR1RLU3R5bGUqKSBjb3B5CnsKICAgIHJl dHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3N0eWxlX2NvcHkoZ3RrKSwgIkdUS1N0eWxlIik7Cn0K LSAoR1RLU3R5bGUqKSBhdHRhY2g6KEdka1dpbmRvdyAqKSB3aW5kb3cKewogICAgcmV0dXJuIGd0 b29sa2l0X29iamVjdChndGtfc3R5bGVfYXR0YWNoKGd0aywgd2luZG93KSwgIkdUS1N0eWxlIik7 Cn0KLSAodm9pZCkgZGV0YWNoCnsKICAgIGd0a19zdHlsZV9kZXRhY2goZ3RrKTsKfQotIChHVEtT dHlsZSopIHJlZgp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19zdHlsZV9yZWYoZ3Rr KSwgIkdUS1N0eWxlIik7Cn0KLSAodm9pZCkgdW5yZWYKewogICAgZ3RrX3N0eWxlX3VucmVmKGd0 ayk7Cn0KLSAodm9pZCkgc2V0QmFja2dyb3VuZDooR2RrV2luZG93ICopIHdpbmRvdyBzdGF0ZVR5 cGU6KEd0a1N0YXRlVHlwZSkgc3RhdGVfdHlwZQp7CiAgICBndGtfc3R5bGVfc2V0X2JhY2tncm91 bmQoZ3RrLCB3aW5kb3cgLCBzdGF0ZV90eXBlKTsKfQotICh2b2lkKSBhcHBseURlZmF1bHRCYWNr Z3JvdW5kOihHZGtXaW5kb3cgKikgd2luZG93IHNldEJnOihnYm9vbGVhbikgc2V0X2JnIHN0YXRl VHlwZTooR3RrU3RhdGVUeXBlKSBzdGF0ZV90eXBlIGFyZWE6KEdka1JlY3RhbmdsZSAqKSBhcmVh IHg6KGdpbnQpIHggeTooZ2ludCkgeSB3aWR0aDooZ2ludCkgd2lkdGggaGVpZ2h0OihnaW50KSBo ZWlnaHQKewogICAgZ3RrX3N0eWxlX2FwcGx5X2RlZmF1bHRfYmFja2dyb3VuZChndGssIHdpbmRv dyAsIHNldF9iZyAsIHN0YXRlX3R5cGUgLCBhcmVhICwgeCAsIHkgLCB3aWR0aCAsIGhlaWdodCk7 Cn0KI2RlZmluZSBndGsJKChHdGtTdHlsZSAqKSBndGspCiAtIChvbmV3YXkgdm9pZCkgcmVsZWFz ZQp7CiAgICB1bnNpZ25lZCByZWZfY291bnQgPSBndGsgPyBndGstPnJlZl9jb3VudCA6IDE7Cgoj aWZkZWYgREVCVUcKICAgIGlmIChyZWZfY291bnQgPT0gMCkgZ19lcnJvcigicmVmX2NvdW50ID09 IDAgaW4gIiBfX0ZJTEVfXyAiIChyZWxlYXNlKSIpOwojZW5kaWYKICAgIGlmIChndGspIFtzZWxm IHVucmVmXTsKICAgIGlmIChyZWZfY291bnQgPT0gMSkgW3NlbGYgZGVhbGxvY107Cn0KCiAtIChp ZCkgcmV0YWluCnsKICAgIGlmIChndGspIFtzZWxmIHJlZl07CiAgICByZXR1cm4gc2VsZjsKfQoK IC0gKHVuc2lnbmVkKSByZXRhaW5Db3VudAp7CiAgICByZXR1cm4gZ3RrID8gZ3RrLT5yZWZfY291 bnQgOiAxOwp9CiN1bmRlZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGlu dGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwg MjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rr dGFibGUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVGFibGUuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dp ZGdldC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1RhYmxlCisgKEd0a1R5cGUpIGdldFR5cGUKewog ICAgcmV0dXJuIGd0a190YWJsZV9nZXRfdHlwZSgpOwp9CisgKGlkKSB0YWJsZVdpdGhSb3dzOihn dWludCkgcm93cyBjb2x1bW5zOihndWludCkgY29sdW1ucyBob21vZ2VuZW91czooZ2Jvb2xlYW4p IGhvbW9nZW5lb3VzCnsKICAgIHJldHVybiBbWyhHVEtUYWJsZSAqKVtzZWxmIGFsbG9jXSBpbml0 V2l0aFJvd3M6cm93cyBjb2x1bW5zOmNvbHVtbnMgaG9tb2dlbmVvdXM6aG9tb2dlbmVvdXNdIGF1 dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhSb3dzOihndWludCkgcm93cyBjb2x1bW5zOihn dWludCkgY29sdW1ucyBob21vZ2VuZW91czooZ2Jvb2xlYW4pIGhvbW9nZW5lb3VzCnsKICAgIHJl dHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdGFibGVfbmV3KCByb3dzICwgY29sdW1ucyAsIGhv bW9nZW5lb3VzKV07Cn0KLSAodm9pZCkgcmVzaXplOihndWludCkgcm93cyBjb2x1bW5zOihndWlu dCkgY29sdW1ucwp7CiAgICBndGtfdGFibGVfcmVzaXplKGd0aywgcm93cyAsIGNvbHVtbnMpOwp9 Ci0gKHZvaWQpIGF0dGFjaDooR1RLV2lkZ2V0ICopIGNoaWxkIGxlZnRBdHRhY2g6KGd1aW50KSBs ZWZ0X2F0dGFjaCByaWdodEF0dGFjaDooZ3VpbnQpIHJpZ2h0X2F0dGFjaCB0b3BBdHRhY2g6KGd1 aW50KSB0b3BfYXR0YWNoIGJvdHRvbUF0dGFjaDooZ3VpbnQpIGJvdHRvbV9hdHRhY2ggeG9wdGlv bnM6KEd0a0F0dGFjaE9wdGlvbnMpIHhvcHRpb25zIHlvcHRpb25zOihHdGtBdHRhY2hPcHRpb25z KSB5b3B0aW9ucyB4cGFkZGluZzooZ3VpbnQpIHhwYWRkaW5nIHlwYWRkaW5nOihndWludCkgeXBh ZGRpbmcKewogICAgZ3RrX3RhYmxlX2F0dGFjaChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDog MCwgbGVmdF9hdHRhY2ggLCByaWdodF9hdHRhY2ggLCB0b3BfYXR0YWNoICwgYm90dG9tX2F0dGFj aCAsIHhvcHRpb25zICwgeW9wdGlvbnMgLCB4cGFkZGluZyAsIHlwYWRkaW5nKTsKfQotICh2b2lk KSBhdHRhY2hEZWZhdWx0czooR1RLV2lkZ2V0ICopIHdpZGdldCBsZWZ0QXR0YWNoOihndWludCkg bGVmdF9hdHRhY2ggcmlnaHRBdHRhY2g6KGd1aW50KSByaWdodF9hdHRhY2ggdG9wQXR0YWNoOihn dWludCkgdG9wX2F0dGFjaCBib3R0b21BdHRhY2g6KGd1aW50KSBib3R0b21fYXR0YWNoCnsKICAg IGd0a190YWJsZV9hdHRhY2hfZGVmYXVsdHMoZ3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDog MCwgbGVmdF9hdHRhY2ggLCByaWdodF9hdHRhY2ggLCB0b3BfYXR0YWNoICwgYm90dG9tX2F0dGFj aCk7Cn0KLSAodm9pZCkgc2V0Um93OihndWludCkgcm93IHNwYWNpbmc6KGd1aW50KSBzcGFjaW5n CnsKICAgIGd0a190YWJsZV9zZXRfcm93X3NwYWNpbmcoZ3RrLCByb3cgLCBzcGFjaW5nKTsKfQot ICh2b2lkKSBzZXRDb2w6KGd1aW50KSBjb2x1bW4gc3BhY2luZzooZ3VpbnQpIHNwYWNpbmcKewog ICAgZ3RrX3RhYmxlX3NldF9jb2xfc3BhY2luZyhndGssIGNvbHVtbiAsIHNwYWNpbmcpOwp9Ci0g KHZvaWQpIHNldFJvd1NwYWNpbmdzOihndWludCkgc3BhY2luZwp7CiAgICBndGtfdGFibGVfc2V0 X3Jvd19zcGFjaW5ncyhndGssIHNwYWNpbmcpOwp9Ci0gKHZvaWQpIHNldENvbFNwYWNpbmdzOihn dWludCkgc3BhY2luZwp7CiAgICBndGtfdGFibGVfc2V0X2NvbF9zcGFjaW5ncyhndGssIHNwYWNp bmcpOwp9Ci0gKHZvaWQpIHNldEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dlbmVvdXMKewog ICAgZ3RrX3RhYmxlX3NldF9ob21vZ2VuZW91cyhndGssIGhvbW9nZW5lb3VzKTsKfQojZGVmaW5l IGd0awkoKEd0a1RhYmxlICopIGd0aykKLSAoZ2ludCkgcm93cwp7CiAgICByZXR1cm4gZ3RrLT5u cm93czsKfQotIChnaW50KSBjb2x1bW5zCnsKICAgIHJldHVybiBndGstPm5jb2xzOwp9CiN1bmRl ZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUg R0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVk d2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrdGVhcm9mZm1lbnVpdGVt LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRo ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2lu Y2x1ZGUgPEdUb29sS2l0L0dUS1RlYXJvZmZNZW51SXRlbS5oPgoKQGltcGxlbWVudGF0aW9uIEdU S1RlYXJvZmZNZW51SXRlbQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfdGVh cm9mZl9tZW51X2l0ZW1fZ2V0X3R5cGUoKTsKfQorIChpZCkgdGVhcm9mZk1lbnVJdGVtCnsKICAg IHJldHVybiBbWyhHVEtUZWFyb2ZmTWVudUl0ZW0gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3Jl bGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtf dGVhcm9mZl9tZW51X2l0ZW1fbmV3KCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm cm9tIGd0a3RleHQuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lv biAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVGV4dC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQv R1RLQWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1RleHQKKyAoR3RrVHlwZSkgZ2V0 VHlwZQp7CiAgICByZXR1cm4gZ3RrX3RleHRfZ2V0X3R5cGUoKTsKfQorIChpZCkgdGV4dFdpdGhI YWRqOihHVEtBZGp1c3RtZW50ICopIGhhZGogdmFkajooR1RLQWRqdXN0bWVudCAqKSB2YWRqCnsK ICAgIHJldHVybiBbWyhHVEtUZXh0ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoSGFkajpoYWRqIHZh ZGo6dmFkal0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aEhhZGo6KEdUS0FkanVzdG1l bnQgKikgaGFkaiB2YWRqOihHVEtBZGp1c3RtZW50ICopIHZhZGoKewogICAgcmV0dXJuIFtzZWxm IGluaXRXaXRoR3RrOmd0a190ZXh0X25ldyggaGFkaiAgPyBoYWRqIC0+Z3RrIDogMCwgdmFkaiA/ IHZhZGotPmd0ayA6IDApXTsKfQotICh2b2lkKSBzZXRFZGl0YWJsZTooZ2Jvb2xlYW4pIGVkaXRh YmxlCnsKICAgIGd0a190ZXh0X3NldF9lZGl0YWJsZShndGssIGVkaXRhYmxlKTsKfQotICh2b2lk KSBzZXRXb3JkV3JhcDooZ2ludCkgd29yZF93cmFwCnsKICAgIGd0a190ZXh0X3NldF93b3JkX3dy YXAoZ3RrLCB3b3JkX3dyYXApOwp9Ci0gKHZvaWQpIHNldExpbmVXcmFwOihnaW50KSBsaW5lX3dy YXAKewogICAgZ3RrX3RleHRfc2V0X2xpbmVfd3JhcChndGssIGxpbmVfd3JhcCk7Cn0KLSAodm9p ZCkgc2V0QWRqdXN0bWVudHM6KEdUS0FkanVzdG1lbnQgKikgaGFkaiB2YWRqOihHVEtBZGp1c3Rt ZW50ICopIHZhZGoKewogICAgZ3RrX3RleHRfc2V0X2FkanVzdG1lbnRzKGd0aywgaGFkaiAgPyBo YWRqIC0+Z3RrIDogMCwgdmFkaiA/IHZhZGotPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNldFBvaW50 OihndWludCkgaW5kZXgKewogICAgZ3RrX3RleHRfc2V0X3BvaW50KGd0aywgaW5kZXgpOwp9Ci0g KGd1aW50KSBnZXRQb2ludAp7CiAgICByZXR1cm4gZ3RrX3RleHRfZ2V0X3BvaW50KGd0ayk7Cn0K LSAoZ3VpbnQpIGdldExlbmd0aAp7CiAgICByZXR1cm4gZ3RrX3RleHRfZ2V0X2xlbmd0aChndGsp Owp9Ci0gKHZvaWQpIGZyZWV6ZQp7CiAgICBndGtfdGV4dF9mcmVlemUoZ3RrKTsKfQotICh2b2lk KSB0aGF3CnsKICAgIGd0a190ZXh0X3RoYXcoZ3RrKTsKfQotICh2b2lkKSBpbnNlcnQ6KEdka0Zv bnQgKikgZm9udCBmb3JlOihHZGtDb2xvciAqKSBmb3JlIGJhY2s6KEdka0NvbG9yICopIGJhY2sg Y2hhcnM6KE5TU3RyaW5nICopIGNoYXJzIGxlbmd0aDooZ2ludCkgbGVuZ3RoCnsKICAgIGd0a190 ZXh0X2luc2VydChndGssIGZvbnQgLCBmb3JlICwgYmFjayAsZ3Rvb2xraXRfdXRmOF9zdHJpbmco IGNoYXJzICksIGxlbmd0aCk7Cn0KLSAoZ2ludCkgYmFja3dhcmREZWxldGU6KGd1aW50KSBuY2hh cnMKewogICAgcmV0dXJuIGd0a190ZXh0X2JhY2t3YXJkX2RlbGV0ZShndGssIG5jaGFycyk7Cn0K LSAoZ2ludCkgZm9yd2FyZERlbGV0ZTooZ3VpbnQpIG5jaGFycwp7CiAgICByZXR1cm4gZ3RrX3Rl eHRfZm9yd2FyZF9kZWxldGUoZ3RrLCBuY2hhcnMpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBP YmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMp IDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGlj YWxseSBmcm9tIGd0a3RpcHNxdWVyeS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtUaXBzUXVlcnkuaD4KI2lu Y2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1RpcHNRdWVy eQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfdGlwc19xdWVyeV9nZXRfdHlw ZSgpOwp9CisgKGlkKSB0aXBzUXVlcnkKewogICAgcmV0dXJuIFtbKEdUS1RpcHNRdWVyeSAqKVtz ZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJu IFtzZWxmIGluaXRXaXRoR3RrOmd0a190aXBzX3F1ZXJ5X25ldygpXTsKfQotICh2b2lkKSBzdGFy dFF1ZXJ5CnsKICAgIGd0a190aXBzX3F1ZXJ5X3N0YXJ0X3F1ZXJ5KGd0ayk7Cn0KLSAodm9pZCkg c3RvcFF1ZXJ5CnsKICAgIGd0a190aXBzX3F1ZXJ5X3N0b3BfcXVlcnkoZ3RrKTsKfQotICh2b2lk KSBzZXRDYWxsZXI6KEdUS1dpZGdldCAqKSBjYWxsZXIKewogICAgZ3RrX3RpcHNfcXVlcnlfc2V0 X2NhbGxlcihndGssIGNhbGxlciA/IGNhbGxlci0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgc2V0TGFi ZWxzOihOU1N0cmluZyAqKSBsYWJlbF9pbmFjdGl2ZSBsYWJlbE5vVGlwOihOU1N0cmluZyAqKSBs YWJlbF9ub190aXAKewogICAgZ3RrX3RpcHNfcXVlcnlfc2V0X2xhYmVscyhndGssZ3Rvb2xraXRf dXRmOF9zdHJpbmcoIGxhYmVsX2luYWN0aXZlICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVs X25vX3RpcCkpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2Ug dG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVs bWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3RvZ2dsZWJ1 dHRvbi5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBv ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICov CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtUb2dnbGVCdXR0b24uaD4KCkBpbXBsZW1lbnRhdGlvbiBH VEtUb2dnbGVCdXR0b24KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3RvZ2ds ZV9idXR0b25fZ2V0X3R5cGUoKTsKfQorIChpZCkgdG9nZ2xlQnV0dG9uCnsKICAgIHJldHVybiBb WyhHVEtUb2dnbGVCdXR0b24gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0g KGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdG9nZ2xlX2J1dHRv bl9uZXcoKV07Cn0KKyAoaWQpIHRvZ2dsZUJ1dHRvbldpdGhMYWJlbDooTlNTdHJpbmcgKikgbGFi ZWwKewogICAgcmV0dXJuIFtbKEdUS1RvZ2dsZUJ1dHRvbiAqKVtzZWxmIGFsbG9jXSBpbml0V2l0 aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6KE5TU3Ry aW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdG9nZ2xlX2J1 dHRvbl9uZXdfd2l0aF9sYWJlbChndG9vbGtpdF91dGY4X3N0cmluZyggbGFiZWwpKV07Cn0KLSAo dm9pZCkgc2V0TW9kZTooZ2Jvb2xlYW4pIGRyYXdfaW5kaWNhdG9yCnsKICAgIGd0a190b2dnbGVf YnV0dG9uX3NldF9tb2RlKGd0aywgZHJhd19pbmRpY2F0b3IpOwp9Ci0gKHZvaWQpIHNldEFjdGl2 ZTooZ2Jvb2xlYW4pIGlzX2FjdGl2ZQp7CiAgICBndGtfdG9nZ2xlX2J1dHRvbl9zZXRfYWN0aXZl KGd0aywgaXNfYWN0aXZlKTsKfQotIChnYm9vbGVhbikgZ2V0QWN0aXZlCnsKICAgIHJldHVybiBn dGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlKGd0ayk7Cn0KLSAodm9pZCkgdG9nZ2xlZAp7CiAg ICBndGtfdG9nZ2xlX2J1dHRvbl90b2dnbGVkKGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAt IE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAo YykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0 aWNhbGx5IGZyb20gZ3RrdG9vbGJhci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtUb29sYmFyLmg+CiNpbmNs dWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtUb29sYmFyCisg KEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a190b29sYmFyX2dldF90eXBlKCk7Cn0K KyAoaWQpIHRvb2xiYXJXaXRoT3JpZW50YXRpb246KEd0a09yaWVudGF0aW9uKSBvcmllbnRhdGlv biBzdHlsZTooR3RrVG9vbGJhclN0eWxlKSBzdHlsZQp7CiAgICByZXR1cm4gW1soR1RLVG9vbGJh ciAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9yaWVudGF0aW9uOm9yaWVudGF0aW9uIHN0eWxlOnN0 eWxlXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoT3JpZW50YXRpb246KEd0a09yaWVu dGF0aW9uKSBvcmllbnRhdGlvbiBzdHlsZTooR3RrVG9vbGJhclN0eWxlKSBzdHlsZQp7CiAgICBy ZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3Rvb2xiYXJfbmV3KCBvcmllbnRhdGlvbiAsIHN0 eWxlKV07Cn0KLSAoR1RLV2lkZ2V0KikgYXBwZW5kSXRlbTooTlNTdHJpbmcgKikgdGV4dCB0b29s dGlwVGV4dDooTlNTdHJpbmcgKikgdG9vbHRpcF90ZXh0IHRvb2x0aXBQcml2YXRlVGV4dDooTlNT dHJpbmcgKikgdG9vbHRpcF9wcml2YXRlX3RleHQgaWNvbjooR1RLV2lkZ2V0ICopIGljb24gY2Fs bGJhY2s6KEd0a1NpZ25hbEZ1bmMpIGNhbGxiYWNrIHVzZXJEYXRhOihncG9pbnRlcikgdXNlcl9k YXRhCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Rvb2xiYXJfYXBwZW5kX2l0ZW0o Z3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRv b2x0aXBfdGV4dCApLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0b29sdGlwX3ByaXZhdGVfdGV4dCAp LCBpY29uICA/IGljb24gLT5ndGsgOiAwLCBjYWxsYmFjayAsIHVzZXJfZGF0YSksIDApOwp9Ci0g KEdUS1dpZGdldCopIHByZXBlbmRJdGVtOihOU1N0cmluZyAqKSB0ZXh0IHRvb2x0aXBUZXh0OihO U1N0cmluZyAqKSB0b29sdGlwX3RleHQgdG9vbHRpcFByaXZhdGVUZXh0OihOU1N0cmluZyAqKSB0 b29sdGlwX3ByaXZhdGVfdGV4dCBpY29uOihHVEtXaWRnZXQgKikgaWNvbiBjYWxsYmFjazooR3Rr U2lnbmFsRnVuYykgY2FsbGJhY2sgdXNlckRhdGE6KGdwb2ludGVyKSB1c2VyX2RhdGEKewogICAg cmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfdG9vbGJhcl9wcmVwZW5kX2l0ZW0oZ3RrLGd0b29s a2l0X3V0Zjhfc3RyaW5nKCB0ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfdGV4 dCApLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0b29sdGlwX3ByaXZhdGVfdGV4dCApLCBpY29uICA/ IGljb24gLT5ndGsgOiAwLCBjYWxsYmFjayAsIHVzZXJfZGF0YSksIDApOwp9Ci0gKEdUS1dpZGdl dCopIGluc2VydEl0ZW06KE5TU3RyaW5nICopIHRleHQgdG9vbHRpcFRleHQ6KE5TU3RyaW5nICop IHRvb2x0aXBfdGV4dCB0b29sdGlwUHJpdmF0ZVRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfcHJp dmF0ZV90ZXh0IGljb246KEdUS1dpZGdldCAqKSBpY29uIGNhbGxiYWNrOihHdGtTaWduYWxGdW5j KSBjYWxsYmFjayB1c2VyRGF0YTooZ3BvaW50ZXIpIHVzZXJfZGF0YSBwb3NpdGlvbjooZ2ludCkg cG9zaXRpb24KewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfdG9vbGJhcl9pbnNlcnRf aXRlbShndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRleHQgKSxndG9vbGtpdF91dGY4X3N0cmlu ZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJpdmF0ZV90 ZXh0ICksIGljb24gID8gaWNvbiAtPmd0ayA6IDAsIGNhbGxiYWNrICwgdXNlcl9kYXRhICwgcG9z aXRpb24pLCAwKTsKfQotICh2b2lkKSBhcHBlbmRTcGFjZQp7CiAgICBndGtfdG9vbGJhcl9hcHBl bmRfc3BhY2UoZ3RrKTsKfQotICh2b2lkKSBwcmVwZW5kU3BhY2UKewogICAgZ3RrX3Rvb2xiYXJf cHJlcGVuZF9zcGFjZShndGspOwp9Ci0gKHZvaWQpIGluc2VydFNwYWNlOihnaW50KSBwb3NpdGlv bgp7CiAgICBndGtfdG9vbGJhcl9pbnNlcnRfc3BhY2UoZ3RrLCBwb3NpdGlvbik7Cn0KLSAoR1RL V2lkZ2V0KikgYXBwZW5kRWxlbWVudDooR3RrVG9vbGJhckNoaWxkVHlwZSkgdHlwZSB3aWRnZXQ6 KEdUS1dpZGdldCAqKSB3aWRnZXQgdGV4dDooTlNTdHJpbmcgKikgdGV4dCB0b29sdGlwVGV4dDoo TlNTdHJpbmcgKikgdG9vbHRpcF90ZXh0IHRvb2x0aXBQcml2YXRlVGV4dDooTlNTdHJpbmcgKikg dG9vbHRpcF9wcml2YXRlX3RleHQgaWNvbjooR1RLV2lkZ2V0ICopIGljb24gY2FsbGJhY2s6KEd0 a1NpZ25hbEZ1bmMpIGNhbGxiYWNrIHVzZXJEYXRhOihncG9pbnRlcikgdXNlcl9kYXRhCnsKICAg IHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Rvb2xiYXJfYXBwZW5kX2VsZW1lbnQoZ3RrLCB0 eXBlICwgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6IDAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRl eHQgKSxndG9vbGtpdF91dGY4X3N0cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9z dHJpbmcoIHRvb2x0aXBfcHJpdmF0ZV90ZXh0ICksIGljb24gID8gaWNvbiAtPmd0ayA6IDAsIGNh bGxiYWNrICwgdXNlcl9kYXRhKSwgMCk7Cn0KLSAoR1RLV2lkZ2V0KikgcHJlcGVuZEVsZW1lbnQ6 KEd0a1Rvb2xiYXJDaGlsZFR5cGUpIHR5cGUgd2lkZ2V0OihHVEtXaWRnZXQgKikgd2lkZ2V0IHRl eHQ6KE5TU3RyaW5nICopIHRleHQgdG9vbHRpcFRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfdGV4 dCB0b29sdGlwUHJpdmF0ZVRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfcHJpdmF0ZV90ZXh0IGlj b246KEdUS1dpZGdldCAqKSBpY29uIGNhbGxiYWNrOihHdGtTaWduYWxGdW5jKSBjYWxsYmFjayB1 c2VyRGF0YTooZ3BvaW50ZXIpIHVzZXJfZGF0YQp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0 KGd0a190b29sYmFyX3ByZXBlbmRfZWxlbWVudChndGssIHR5cGUgLCB3aWRnZXQgID8gd2lkZ2V0 IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4dCApLGd0b29sa2l0X3V0Zjhfc3Ry aW5nKCB0b29sdGlwX3RleHQgKSxndG9vbGtpdF91dGY4X3N0cmluZyggdG9vbHRpcF9wcml2YXRl X3RleHQgKSwgaWNvbiAgPyBpY29uIC0+Z3RrIDogMCwgY2FsbGJhY2sgLCB1c2VyX2RhdGEpLCAw KTsKfQotIChHVEtXaWRnZXQqKSBpbnNlcnRFbGVtZW50OihHdGtUb29sYmFyQ2hpbGRUeXBlKSB0 eXBlIHdpZGdldDooR1RLV2lkZ2V0ICopIHdpZGdldCB0ZXh0OihOU1N0cmluZyAqKSB0ZXh0IHRv b2x0aXBUZXh0OihOU1N0cmluZyAqKSB0b29sdGlwX3RleHQgdG9vbHRpcFByaXZhdGVUZXh0OihO U1N0cmluZyAqKSB0b29sdGlwX3ByaXZhdGVfdGV4dCBpY29uOihHVEtXaWRnZXQgKikgaWNvbiBj YWxsYmFjazooR3RrU2lnbmFsRnVuYykgY2FsbGJhY2sgdXNlckRhdGE6KGdwb2ludGVyKSB1c2Vy X2RhdGEgcG9zaXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpl Y3QoZ3RrX3Rvb2xiYXJfaW5zZXJ0X2VsZW1lbnQoZ3RrLCB0eXBlICwgd2lkZ2V0ICA/IHdpZGdl dCAtPmd0ayA6IDAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRleHQgKSxndG9vbGtpdF91dGY4X3N0 cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJpdmF0 ZV90ZXh0ICksIGljb24gID8gaWNvbiAtPmd0ayA6IDAsIGNhbGxiYWNrICwgdXNlcl9kYXRhICwg cG9zaXRpb24pLCAwKTsKfQotICh2b2lkKSBhcHBlbmRXaWRnZXQ6KEdUS1dpZGdldCAqKSB3aWRn ZXQgdG9vbHRpcFRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfdGV4dCB0b29sdGlwUHJpdmF0ZVRl eHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfcHJpdmF0ZV90ZXh0CnsKICAgIGd0a190b29sYmFyX2Fw cGVuZF93aWRnZXQoZ3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4 X3N0cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJp dmF0ZV90ZXh0KSk7Cn0KLSAodm9pZCkgcHJlcGVuZFdpZGdldDooR1RLV2lkZ2V0ICopIHdpZGdl dCB0b29sdGlwVGV4dDooTlNTdHJpbmcgKikgdG9vbHRpcF90ZXh0IHRvb2x0aXBQcml2YXRlVGV4 dDooTlNTdHJpbmcgKikgdG9vbHRpcF9wcml2YXRlX3RleHQKewogICAgZ3RrX3Rvb2xiYXJfcHJl cGVuZF93aWRnZXQoZ3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4 X3N0cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJp dmF0ZV90ZXh0KSk7Cn0KLSAodm9pZCkgaW5zZXJ0V2lkZ2V0OihHVEtXaWRnZXQgKikgd2lkZ2V0 IHRvb2x0aXBUZXh0OihOU1N0cmluZyAqKSB0b29sdGlwX3RleHQgdG9vbHRpcFByaXZhdGVUZXh0 OihOU1N0cmluZyAqKSB0b29sdGlwX3ByaXZhdGVfdGV4dCBwb3NpdGlvbjooZ2ludCkgcG9zaXRp b24KewogICAgZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldChndGssIHdpZGdldCAgPyB3aWRnZXQg LT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0b29sdGlwX3RleHQgKSxndG9vbGtpdF91 dGY4X3N0cmluZyggdG9vbHRpcF9wcml2YXRlX3RleHQgKSwgcG9zaXRpb24pOwp9Ci0gKHZvaWQp IHNldE9yaWVudGF0aW9uOihHdGtPcmllbnRhdGlvbikgb3JpZW50YXRpb24KewogICAgZ3RrX3Rv b2xiYXJfc2V0X29yaWVudGF0aW9uKGd0aywgb3JpZW50YXRpb24pOwp9Ci0gKHZvaWQpIHNldFN0 eWxlOihHdGtUb29sYmFyU3R5bGUpIHN0eWxlCnsKICAgIGd0a190b29sYmFyX3NldF9zdHlsZShn dGssIHN0eWxlKTsKfQotICh2b2lkKSBzZXRTcGFjZVNpemU6KGdpbnQpIHNwYWNlX3NpemUKewog ICAgZ3RrX3Rvb2xiYXJfc2V0X3NwYWNlX3NpemUoZ3RrLCBzcGFjZV9zaXplKTsKfQotICh2b2lk KSBzZXRTcGFjZVN0eWxlOihHdGtUb29sYmFyU3BhY2VTdHlsZSkgc3BhY2Vfc3R5bGUKewogICAg Z3RrX3Rvb2xiYXJfc2V0X3NwYWNlX3N0eWxlKGd0aywgc3BhY2Vfc3R5bGUpOwp9Ci0gKHZvaWQp IHNldFRvb2x0aXBzOihnaW50KSBlbmFibGUKewogICAgZ3RrX3Rvb2xiYXJfc2V0X3Rvb2x0aXBz KGd0aywgZW5hYmxlKTsKfQotICh2b2lkKSBzZXRCdXR0b25SZWxpZWY6KEd0a1JlbGllZlN0eWxl KSByZWxpZWYKewogICAgZ3RrX3Rvb2xiYXJfc2V0X2J1dHRvbl9yZWxpZWYoZ3RrLCByZWxpZWYp Owp9Ci0gKEd0a1JlbGllZlN0eWxlKSBnZXRCdXR0b25SZWxpZWYKewogICAgcmV0dXJuIGd0a190 b29sYmFyX2dldF9idXR0b25fcmVsaWVmKGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh bGx5IGZyb20gZ3RrdG9vbHRpcHMuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK ICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh dGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVG9vbHRpcHMuaD4KI2luY2x1 ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1Rvb2x0aXBzCisg KEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a190b29sdGlwc19nZXRfdHlwZSgpOwp9 CisgKGlkKSB0b29sdGlwcwp7CiAgICByZXR1cm4gW1soR1RLVG9vbHRpcHMgKilbc2VsZiBhbGxv Y10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBp bml0V2l0aEd0azpndGtfdG9vbHRpcHNfbmV3KCldOwp9Ci0gKHZvaWQpIGVuYWJsZQp7CiAgICBn dGtfdG9vbHRpcHNfZW5hYmxlKGd0ayk7Cn0KLSAodm9pZCkgZGlzYWJsZQp7CiAgICBndGtfdG9v bHRpcHNfZGlzYWJsZShndGspOwp9Ci0gKHZvaWQpIHNldERlbGF5OihndWludCkgZGVsYXkKewog ICAgZ3RrX3Rvb2x0aXBzX3NldF9kZWxheShndGssIGRlbGF5KTsKfQotICh2b2lkKSBzZXRUaXA6 KEdUS1dpZGdldCAqKSB3aWRnZXQgdGlwVGV4dDooTlNTdHJpbmcgKikgdGlwX3RleHQgdGlwUHJp dmF0ZTooTlNTdHJpbmcgKikgdGlwX3ByaXZhdGUKewogICAgZ3RrX3Rvb2x0aXBzX3NldF90aXAo Z3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggdGlw X3RleHQgKSxndG9vbGtpdF91dGY4X3N0cmluZyggdGlwX3ByaXZhdGUpKTsKfQotICh2b2lkKSBz ZXRDb2xvcnM6KEdka0NvbG9yICopIGJhY2tncm91bmQgZm9yZWdyb3VuZDooR2RrQ29sb3IgKikg Zm9yZWdyb3VuZAp7CiAgICBndGtfdG9vbHRpcHNfc2V0X2NvbG9ycyhndGssIGJhY2tncm91bmQg LCBmb3JlZ3JvdW5kKTsKfQorIChHdGtUb29sdGlwc0RhdGEqKSBkYXRhR2V0OihHVEtXaWRnZXQg Kikgd2lkZ2V0CnsKICAgIHJldHVybiBndGtfdG9vbHRpcHNfZGF0YV9nZXQoIHdpZGdldCA/IHdp ZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgZm9yY2VXaW5kb3cKewogICAgZ3RrX3Rvb2x0aXBz X2ZvcmNlX3dpbmRvdyhndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBp bnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTks IDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0 a3RyZWUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVHJlZS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lk Z2V0Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVHJlZQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAg IHJldHVybiBndGtfdHJlZV9nZXRfdHlwZSgpOwp9CisgKGlkKSB0cmVlCnsKICAgIHJldHVybiBb WyhHVEtUcmVlICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5p dAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3RyZWVfbmV3KCldOwp9Ci0gKHZv aWQpIGFwcGVuZDooR1RLV2lkZ2V0ICopIHRyZWVfaXRlbQp7CiAgICBndGtfdHJlZV9hcHBlbmQo Z3RrLCB0cmVlX2l0ZW0gPyB0cmVlX2l0ZW0tPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHByZXBlbmQ6 KEdUS1dpZGdldCAqKSB0cmVlX2l0ZW0KewogICAgZ3RrX3RyZWVfcHJlcGVuZChndGssIHRyZWVf aXRlbSA/IHRyZWVfaXRlbS0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgaW5zZXJ0OihHVEtXaWRnZXQg KikgdHJlZV9pdGVtIHBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfdHJlZV9pbnNl cnQoZ3RrLCB0cmVlX2l0ZW0gID8gdHJlZV9pdGVtIC0+Z3RrIDogMCwgcG9zaXRpb24pOwp9Ci0g KHZvaWQpIHJlbW92ZUl0ZW1zOihOU0FycmF5ICopIGl0ZW1zCnsKICAgIGd0a190cmVlX3JlbW92 ZV9pdGVtcyhndGssZ3Rvb2xraXRfYXJyYXlfdG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSBj bGVhckl0ZW1zOihnaW50KSBzdGFydCBlbmQ6KGdpbnQpIGVuZAp7CiAgICBndGtfdHJlZV9jbGVh cl9pdGVtcyhndGssIHN0YXJ0ICwgZW5kKTsKfQotICh2b2lkKSBzZWxlY3RJdGVtOihnaW50KSBp dGVtCnsKICAgIGd0a190cmVlX3NlbGVjdF9pdGVtKGd0aywgaXRlbSk7Cn0KLSAodm9pZCkgdW5z ZWxlY3RJdGVtOihnaW50KSBpdGVtCnsKICAgIGd0a190cmVlX3Vuc2VsZWN0X2l0ZW0oZ3RrLCBp dGVtKTsKfQotICh2b2lkKSBzZWxlY3RDaGlsZDooR1RLV2lkZ2V0ICopIHRyZWVfaXRlbQp7CiAg ICBndGtfdHJlZV9zZWxlY3RfY2hpbGQoZ3RrLCB0cmVlX2l0ZW0gPyB0cmVlX2l0ZW0tPmd0ayA6 IDApOwp9Ci0gKHZvaWQpIHVuc2VsZWN0Q2hpbGQ6KEdUS1dpZGdldCAqKSB0cmVlX2l0ZW0Kewog ICAgZ3RrX3RyZWVfdW5zZWxlY3RfY2hpbGQoZ3RrLCB0cmVlX2l0ZW0gPyB0cmVlX2l0ZW0tPmd0 ayA6IDApOwp9Ci0gKGdpbnQpIGNoaWxkUG9zaXRpb246KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAg ICByZXR1cm4gZ3RrX3RyZWVfY2hpbGRfcG9zaXRpb24oZ3RrLCBjaGlsZCA/IGNoaWxkLT5ndGsg OiAwKTsKfQotICh2b2lkKSBzZXRTZWxlY3Rpb25Nb2RlOihHdGtTZWxlY3Rpb25Nb2RlKSBtb2Rl CnsKICAgIGd0a190cmVlX3NldF9zZWxlY3Rpb25fbW9kZShndGssIG1vZGUpOwp9Ci0gKHZvaWQp IHNldFZpZXdNb2RlOihHdGtUcmVlVmlld01vZGUpIG1vZGUKewogICAgZ3RrX3RyZWVfc2V0X3Zp ZXdfbW9kZShndGssIG1vZGUpOwp9Ci0gKHZvaWQpIHNldFZpZXdMaW5lczooZ3VpbnQpIGZsYWcK ewogICAgZ3RrX3RyZWVfc2V0X3ZpZXdfbGluZXMoZ3RrLCBmbGFnKTsKfQojZGVmaW5lIGd0awko KEd0a1RyZWUgKikgZ3RrKQotIChOU0FycmF5ICopIHNlbGVjdGlvbgp7CiAgICByZXR1cm4gZ3Rv b2xraXRfbGlzdF90b19hcnJheShndGstPnNlbGVjdGlvbik7Cn0KI3VuZGVmIGd0awpAZW5kCi8q CiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQK ICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2Vu ZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt0cmVlaXRlbS5oIGJ5IGd0a2dlbi4KICoKICog VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy YWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtU cmVlSXRlbS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CgpAaW1wbGVtZW50YXRp b24gR1RLVHJlZUl0ZW0KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3RyZWVf aXRlbV9nZXRfdHlwZSgpOwp9CisgKGlkKSB0cmVlSXRlbQp7CiAgICByZXR1cm4gW1soR1RLVHJl ZUl0ZW0gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsK ICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdHJlZV9pdGVtX25ldygpXTsKfQorIChp ZCkgdHJlZUl0ZW1XaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhH VEtUcmVlSXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFz ZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVy biBbc2VsZiBpbml0V2l0aEd0azpndGtfdHJlZV9pdGVtX25ld193aXRoX2xhYmVsKGd0b29sa2l0 X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQotICh2b2lkKSBzZXRTdWJ0cmVlOihHVEtXaWRnZXQg Kikgc3VidHJlZQp7CiAgICBndGtfdHJlZV9pdGVtX3NldF9zdWJ0cmVlKGd0aywgc3VidHJlZSA/ IHN1YnRyZWUtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHJlbW92ZVN1YnRyZWUKewogICAgZ3RrX3Ry ZWVfaXRlbV9yZW1vdmVfc3VidHJlZShndGspOwp9Ci0gKHZvaWQpIHNlbGVjdAp7CiAgICBndGtf dHJlZV9pdGVtX3NlbGVjdChndGspOwp9Ci0gKHZvaWQpIGRlc2VsZWN0CnsKICAgIGd0a190cmVl X2l0ZW1fZGVzZWxlY3QoZ3RrKTsKfQotICh2b2lkKSBleHBhbmQKewogICAgZ3RrX3RyZWVfaXRl bV9leHBhbmQoZ3RrKTsKfQotICh2b2lkKSBjb2xsYXBzZQp7CiAgICBndGtfdHJlZV9pdGVtX2Nv bGxhcHNlKGd0ayk7Cn0KI2RlZmluZSBndGsJKChHdGtUcmVlSXRlbSAqKSBndGspCi0gKEdUS1dp ZGdldCAqKSBzdWJ0cmVlCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5zdWJ0cmVl KTsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZh Y2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAg IEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3ZiYm94 LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRo ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2lu Y2x1ZGUgPEdUb29sS2l0L0dUS1ZCdXR0b25Cb3guaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtWQnV0 dG9uQm94CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192YnV0dG9uX2JveF9n ZXRfdHlwZSgpOwp9CisgKGlkKSB2QnV0dG9uQm94CnsKICAgIHJldHVybiBbWyhHVEtWQnV0dG9u Qm94ICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAg ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3ZidXR0b25fYm94X25ldygpXTsKfQorIChn aW50KSBnZXRTcGFjaW5nRGVmYXVsdAp7CiAgICByZXR1cm4gZ3RrX3ZidXR0b25fYm94X2dldF9z cGFjaW5nX2RlZmF1bHQoKTsKfQorICh2b2lkKSBzZXRTcGFjaW5nRGVmYXVsdDooZ2ludCkgc3Bh Y2luZwp7CiAgICBndGtfdmJ1dHRvbl9ib3hfc2V0X3NwYWNpbmdfZGVmYXVsdCggc3BhY2luZyk7 Cn0KKyAoR3RrQnV0dG9uQm94U3R5bGUpIGdldExheW91dERlZmF1bHQKewogICAgcmV0dXJuIGd0 a192YnV0dG9uX2JveF9nZXRfbGF5b3V0X2RlZmF1bHQoKTsKfQorICh2b2lkKSBzZXRMYXlvdXRE ZWZhdWx0OihHdGtCdXR0b25Cb3hTdHlsZSkgbGF5b3V0CnsKICAgIGd0a192YnV0dG9uX2JveF9z ZXRfbGF5b3V0X2RlZmF1bHQoIGxheW91dCk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVj dGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5 OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5 IGZyb20gZ3RrdmJveC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJz aW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy c2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtWQm94Lmg+CgpAaW1wbGVtZW50YXRpb24g R1RLVkJveAorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfdmJveF9nZXRfdHlw ZSgpOwp9CisgKGlkKSB2Qm94V2l0aEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dlbmVvdXMg c3BhY2luZzooZ2ludCkgc3BhY2luZwp7CiAgICByZXR1cm4gW1soR1RLVkJveCAqKVtzZWxmIGFs bG9jXSBpbml0V2l0aEhvbW9nZW5lb3VzOmhvbW9nZW5lb3VzIHNwYWNpbmc6c3BhY2luZ10gYXV0 b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dl bmVvdXMgc3BhY2luZzooZ2ludCkgc3BhY2luZwp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH dGs6Z3RrX3Zib3hfbmV3KCBob21vZ2VuZW91cyAsIHNwYWNpbmcpXTsKfQpAZW5kCi8qCiAqIEdU b29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29w eXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVk IGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2aWV3cG9ydC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBs aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi bGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtWaWV3cG9y dC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9u IEdUS1ZpZXdwb3J0CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192aWV3cG9y dF9nZXRfdHlwZSgpOwp9CisgKGlkKSB2aWV3cG9ydFdpdGhIYWRqdXN0bWVudDooR1RLQWRqdXN0 bWVudCAqKSBoYWRqdXN0bWVudCB2YWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAqKSB2YWRqdXN0 bWVudAp7CiAgICByZXR1cm4gW1soR1RLVmlld3BvcnQgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhI YWRqdXN0bWVudDpoYWRqdXN0bWVudCB2YWRqdXN0bWVudDp2YWRqdXN0bWVudF0gYXV0b3JlbGVh c2VdOwp9Ci0gKGlkKSBpbml0V2l0aEhhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1 c3RtZW50IHZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJl dHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdmlld3BvcnRfbmV3KCBoYWRqdXN0bWVudCAgPyBo YWRqdXN0bWVudCAtPmd0ayA6IDAsIHZhZGp1c3RtZW50ID8gdmFkanVzdG1lbnQtPmd0ayA6IDAp XTsKfQotIChHVEtBZGp1c3RtZW50KikgZ2V0SGFkanVzdG1lbnQKewogICAgcmV0dXJuIGd0b29s a2l0X29iamVjdChndGtfdmlld3BvcnRfZ2V0X2hhZGp1c3RtZW50KGd0ayksIDApOwp9Ci0gKEdU S0FkanVzdG1lbnQqKSBnZXRWYWRqdXN0bWVudAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0 KGd0a192aWV3cG9ydF9nZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0SGFk anVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfdmlld3BvcnRf c2V0X2hhZGp1c3RtZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9 Ci0gKHZvaWQpIHNldFZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewog ICAgZ3RrX3ZpZXdwb3J0X3NldF92YWRqdXN0bWVudChndGssIGFkanVzdG1lbnQgPyBhZGp1c3Rt ZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRTaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSB0 eXBlCnsKICAgIGd0a192aWV3cG9ydF9zZXRfc2hhZG93X3R5cGUoZ3RrLCB0eXBlKTsKfQpAZW5k Ci8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xr aXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICog R2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2cGFuZWQuaCBieSBndGtnZW4uCiAqCiAq IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l cmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RL VlBhbmVkLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVlBhbmVkCisgKEd0a1R5cGUpIGdldFR5cGUK ewogICAgcmV0dXJuIGd0a192cGFuZWRfZ2V0X3R5cGUoKTsKfQorIChpZCkgdlBhbmVkCnsKICAg IHJldHVybiBbWyhHVEtWUGFuZWQgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9 Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdnBhbmVkX25l dygpXTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRo ZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBM dWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2cnVsZXIuaCBieSBn dGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8 R1Rvb2xLaXQvR1RLVlJ1bGVyLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVlJ1bGVyCisgKEd0a1R5 cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192cnVsZXJfZ2V0X3R5cGUoKTsKfQorIChpZCkg dlJ1bGVyCnsKICAgIHJldHVybiBbWyhHVEtWUnVsZXIgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0 b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpn dGtfdnJ1bGVyX25ldygpXTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50 ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAy MDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2 c2NhbGUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVlNjYWxlLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtB ZGp1c3RtZW50Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVlNjYWxlCisgKEd0a1R5cGUpIGdldFR5 cGUKewogICAgcmV0dXJuIGd0a192c2NhbGVfZ2V0X3R5cGUoKTsKfQorIChpZCkgdlNjYWxlV2l0 aEFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICByZXR1cm4gW1so R1RLVlNjYWxlICopW3NlbGYgYWxsb2NdIGluaXRXaXRoQWRqdXN0bWVudDphZGp1c3RtZW50XSBh dXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoQWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAq KSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdnNjYWxlX25l dyggYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApXTsKfQpAZW5kCi8qCiAqIEdUb29s S2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJp Z2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1 dG9tYXRpY2FsbHkgZnJvbSBndGt2c2Nyb2xsYmFyLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxp YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAq IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs aWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1ZTY3JvbGxi YXIuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlv biBHVEtWU2Nyb2xsYmFyCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192c2Ny b2xsYmFyX2dldF90eXBlKCk7Cn0KKyAoaWQpIHZTY3JvbGxiYXJXaXRoQWRqdXN0bWVudDooR1RL QWRqdXN0bWVudCAqKSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtWU2Nyb2xsYmFyICop W3NlbGYgYWxsb2NdIGluaXRXaXRoQWRqdXN0bWVudDphZGp1c3RtZW50XSBhdXRvcmVsZWFzZV07 Cn0KLSAoaWQpIGluaXRXaXRoQWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAqKSBhZGp1c3RtZW50 CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdnNjcm9sbGJhcl9uZXcoIGFkanVz dG1lbnQgPyBhZGp1c3RtZW50LT5ndGsgOiAwKV07Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh bGx5IGZyb20gZ3RrdnNlcGFyYXRvci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtWU2VwYXJhdG9yLmg+CgpA aW1wbGVtZW50YXRpb24gR1RLVlNlcGFyYXRvcgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJl dHVybiBndGtfdnNlcGFyYXRvcl9nZXRfdHlwZSgpOwp9CisgKGlkKSB2U2VwYXJhdG9yCnsKICAg IHJldHVybiBbWyhHVEtWU2VwYXJhdG9yICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNl XTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3ZzZXBh cmF0b3JfbmV3KCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZh Y2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAg IEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3dpZGdl dC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0 aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNp bmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FjY2Vs R3JvdXAuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KI2luY2x1ZGUgPEdU b29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLV2lkZ2V0CisgKEd0a1R5cGUp IGdldFR5cGUKewogICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3R5cGUoKTsKfQorIChpZCkgd2lk Z2V0dldpdGhUeXBlOihHdGtUeXBlKSB0eXBlIG5BcmdzOihndWludCkgbmFyZ3MgYXJnczooR3Rr QXJnICopIGFyZ3MKewogICAgcmV0dXJuIFtbKEdUS1dpZGdldCAqKVtzZWxmIGFsbG9jXSBpbml0 dldpdGhUeXBlOnR5cGUgbkFyZ3M6bmFyZ3MgYXJnczphcmdzXSBhdXRvcmVsZWFzZV07Cn0KLSAo aWQpIGluaXR2V2l0aFR5cGU6KEd0a1R5cGUpIHR5cGUgbkFyZ3M6KGd1aW50KSBuYXJncyBhcmdz OihHdGtBcmcgKikgYXJncwp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3dpZGdl dF9uZXd2KCB0eXBlICwgbmFyZ3MgLCBhcmdzKV07Cn0KLSAodm9pZCkgcmVmCnsKICAgIGd0a193 aWRnZXRfcmVmKGd0ayk7Cn0KLSAodm9pZCkgdW5yZWYKewogICAgZ3RrX3dpZGdldF91bnJlZihn dGspOwp9Ci0gKHZvaWQpIGRlc3Ryb3kKewogICAgZ3RrX3dpZGdldF9kZXN0cm95KGd0ayk7Cn0K LSAodm9pZCkgZGVzdHJveWVkOihHVEtXaWRnZXQgKiopIHdpZGdldF9wb2ludGVyCnsKICAgIEd0 a1dpZGdldCAqX291dHZhbF8xOwogICAgZ3RrX3dpZGdldF9kZXN0cm95ZWQoZ3RrLCZfb3V0dmFs XzEpOwogICAgKiB3aWRnZXRfcG9pbnRlciA9IGd0b29sa2l0X29iamVjdChfb3V0dmFsXzEsIDAp Owp9Ci0gKHZvaWQpIGdldDooR3RrQXJnICopIGFyZwp7CiAgICBndGtfd2lkZ2V0X2dldChndGss IGFyZyk7Cn0KLSAodm9pZCkgZ2V0djooZ3VpbnQpIG5hcmdzIGFyZ3M6KEd0a0FyZyAqKSBhcmdz CnsKICAgIGd0a193aWRnZXRfZ2V0dihndGssIG5hcmdzICwgYXJncyk7Cn0KLSAodm9pZCkgc2V0 djooZ3VpbnQpIG5hcmdzIGFyZ3M6KEd0a0FyZyAqKSBhcmdzCnsKICAgIGd0a193aWRnZXRfc2V0 dihndGssIG5hcmdzICwgYXJncyk7Cn0KLSAodm9pZCkgdW5wYXJlbnQKewogICAgZ3RrX3dpZGdl dF91bnBhcmVudChndGspOwp9Ci0gKHZvaWQpIHNob3cKewogICAgZ3RrX3dpZGdldF9zaG93KGd0 ayk7Cn0KLSAodm9pZCkgc2hvd05vdwp7CiAgICBndGtfd2lkZ2V0X3Nob3dfbm93KGd0ayk7Cn0K LSAodm9pZCkgaGlkZQp7CiAgICBndGtfd2lkZ2V0X2hpZGUoZ3RrKTsKfQotICh2b2lkKSBzaG93 QWxsCnsKICAgIGd0a193aWRnZXRfc2hvd19hbGwoZ3RrKTsKfQotICh2b2lkKSBoaWRlQWxsCnsK ICAgIGd0a193aWRnZXRfaGlkZV9hbGwoZ3RrKTsKfQotICh2b2lkKSBtYXAKewogICAgZ3RrX3dp ZGdldF9tYXAoZ3RrKTsKfQotICh2b2lkKSB1bm1hcAp7CiAgICBndGtfd2lkZ2V0X3VubWFwKGd0 ayk7Cn0KLSAodm9pZCkgcmVhbGl6ZQp7CiAgICBndGtfd2lkZ2V0X3JlYWxpemUoZ3RrKTsKfQot ICh2b2lkKSB1bnJlYWxpemUKewogICAgZ3RrX3dpZGdldF91bnJlYWxpemUoZ3RrKTsKfQotICh2 b2lkKSBxdWV1ZURyYXcKewogICAgZ3RrX3dpZGdldF9xdWV1ZV9kcmF3KGd0ayk7Cn0KLSAodm9p ZCkgcXVldWVEcmF3QXJlYTooZ2ludCkgeCB5OihnaW50KSB5IHdpZHRoOihnaW50KSB3aWR0aCBo ZWlnaHQ6KGdpbnQpIGhlaWdodAp7CiAgICBndGtfd2lkZ2V0X3F1ZXVlX2RyYXdfYXJlYShndGss IHggLCB5ICwgd2lkdGggLCBoZWlnaHQpOwp9Ci0gKHZvaWQpIHF1ZXVlQ2xlYXIKewogICAgZ3Rr X3dpZGdldF9xdWV1ZV9jbGVhcihndGspOwp9Ci0gKHZvaWQpIHF1ZXVlQ2xlYXJBcmVhOihnaW50 KSB4IHk6KGdpbnQpIHkgd2lkdGg6KGdpbnQpIHdpZHRoIGhlaWdodDooZ2ludCkgaGVpZ2h0CnsK ICAgIGd0a193aWRnZXRfcXVldWVfY2xlYXJfYXJlYShndGssIHggLCB5ICwgd2lkdGggLCBoZWln aHQpOwp9Ci0gKHZvaWQpIHF1ZXVlUmVzaXplCnsKICAgIGd0a193aWRnZXRfcXVldWVfcmVzaXpl KGd0ayk7Cn0KLSAodm9pZCkgZHJhdzooR2RrUmVjdGFuZ2xlICopIGFyZWEKewogICAgZ3RrX3dp ZGdldF9kcmF3KGd0aywgYXJlYSk7Cn0KLSAodm9pZCkgZHJhd0ZvY3VzCnsKICAgIGd0a193aWRn ZXRfZHJhd19mb2N1cyhndGspOwp9Ci0gKHZvaWQpIGRyYXdEZWZhdWx0CnsKICAgIGd0a193aWRn ZXRfZHJhd19kZWZhdWx0KGd0ayk7Cn0KLSAodm9pZCkgc2l6ZVJlcXVlc3Q6KEd0a1JlcXVpc2l0 aW9uICopIHJlcXVpc2l0aW9uCnsKICAgIGd0a193aWRnZXRfc2l6ZV9yZXF1ZXN0KGd0aywgcmVx dWlzaXRpb24pOwp9Ci0gKHZvaWQpIHNpemVBbGxvY2F0ZTooR3RrQWxsb2NhdGlvbiAqKSBhbGxv Y2F0aW9uCnsKICAgIGd0a193aWRnZXRfc2l6ZV9hbGxvY2F0ZShndGssIGFsbG9jYXRpb24pOwp9 Ci0gKHZvaWQpIGdldENoaWxkUmVxdWlzaXRpb246KEd0a1JlcXVpc2l0aW9uICopIHJlcXVpc2l0 aW9uCnsKICAgIGd0a193aWRnZXRfZ2V0X2NoaWxkX3JlcXVpc2l0aW9uKGd0aywgcmVxdWlzaXRp b24pOwp9Ci0gKHZvaWQpIGFkZEFjY2VsZXJhdG9yOihOU1N0cmluZyAqKSBhY2NlbF9zaWduYWwg YWNjZWxHcm91cDooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9ncm91cCBhY2NlbEtleTooZ3VpbnQp IGFjY2VsX2tleSBhY2NlbE1vZHM6KGd1aW50KSBhY2NlbF9tb2RzIGFjY2VsRmxhZ3M6KEd0a0Fj Y2VsRmxhZ3MpIGFjY2VsX2ZsYWdzCnsKICAgIGd0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yKGd0 ayxndG9vbGtpdF91dGY4X3N0cmluZyggYWNjZWxfc2lnbmFsICksIGFjY2VsX2dyb3VwICA/IGFj Y2VsX2dyb3VwIC0+Z3RrIDogMCwgYWNjZWxfa2V5ICwgYWNjZWxfbW9kcyAsIGFjY2VsX2ZsYWdz KTsKfQotICh2b2lkKSByZW1vdmVBY2NlbGVyYXRvcjooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9n cm91cCBhY2NlbEtleTooZ3VpbnQpIGFjY2VsX2tleSBhY2NlbE1vZHM6KGd1aW50KSBhY2NlbF9t b2RzCnsKICAgIGd0a193aWRnZXRfcmVtb3ZlX2FjY2VsZXJhdG9yKGd0aywgYWNjZWxfZ3JvdXAg ID8gYWNjZWxfZ3JvdXAgLT5ndGsgOiAwLCBhY2NlbF9rZXkgLCBhY2NlbF9tb2RzKTsKfQotICh2 b2lkKSByZW1vdmVBY2NlbGVyYXRvcnM6KE5TU3RyaW5nICopIGFjY2VsX3NpZ25hbCB2aXNpYmxl T25seTooZ2Jvb2xlYW4pIHZpc2libGVfb25seQp7CiAgICBndGtfd2lkZ2V0X3JlbW92ZV9hY2Nl bGVyYXRvcnMoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBhY2NlbF9zaWduYWwgKSwgdmlzaWJs ZV9vbmx5KTsKfQotIChndWludCkgYWNjZWxlcmF0b3JTaWduYWw6KEdUS0FjY2VsR3JvdXAgKikg YWNjZWxfZ3JvdXAgYWNjZWxLZXk6KGd1aW50KSBhY2NlbF9rZXkgYWNjZWxNb2RzOihndWludCkg YWNjZWxfbW9kcwp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9hY2NlbGVyYXRvcl9zaWduYWwoZ3Rr LCBhY2NlbF9ncm91cCAgPyBhY2NlbF9ncm91cCAtPmd0ayA6IDAsIGFjY2VsX2tleSAsIGFjY2Vs X21vZHMpOwp9Ci0gKHZvaWQpIGxvY2tBY2NlbGVyYXRvcnMKewogICAgZ3RrX3dpZGdldF9sb2Nr X2FjY2VsZXJhdG9ycyhndGspOwp9Ci0gKHZvaWQpIHVubG9ja0FjY2VsZXJhdG9ycwp7CiAgICBn dGtfd2lkZ2V0X3VubG9ja19hY2NlbGVyYXRvcnMoZ3RrKTsKfQotIChnYm9vbGVhbikgYWNjZWxl cmF0b3JzTG9ja2VkCnsKICAgIHJldHVybiBndGtfd2lkZ2V0X2FjY2VsZXJhdG9yc19sb2NrZWQo Z3RrKTsKfQotIChnaW50KSBldmVudDooR2RrRXZlbnQgKikgZXZlbnQKewogICAgcmV0dXJuIGd0 a193aWRnZXRfZXZlbnQoZ3RrLCBldmVudCk7Cn0KLSAoZ2Jvb2xlYW4pIGFjdGl2YXRlCnsKICAg IHJldHVybiBndGtfd2lkZ2V0X2FjdGl2YXRlKGd0ayk7Cn0KLSAoZ2Jvb2xlYW4pIHNldFNjcm9s bEFkanVzdG1lbnRzOihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3RtZW50IHZhZGp1c3RtZW50OihH VEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJldHVybiBndGtfd2lkZ2V0X3NldF9z Y3JvbGxfYWRqdXN0bWVudHMoZ3RrLCBoYWRqdXN0bWVudCAgPyBoYWRqdXN0bWVudCAtPmd0ayA6 IDAsIHZhZGp1c3RtZW50ID8gdmFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHJlcGFy ZW50OihHVEtXaWRnZXQgKikgbmV3X3BhcmVudAp7CiAgICBndGtfd2lkZ2V0X3JlcGFyZW50KGd0 aywgbmV3X3BhcmVudCA/IG5ld19wYXJlbnQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHBvcHVwOihn aW50KSB4IHk6KGdpbnQpIHkKewogICAgZ3RrX3dpZGdldF9wb3B1cChndGssIHggLCB5KTsKfQot IChnaW50KSBpbnRlcnNlY3Q6KEdka1JlY3RhbmdsZSAqKSBhcmVhIGludGVyc2VjdGlvbjooR2Rr UmVjdGFuZ2xlICopIGludGVyc2VjdGlvbgp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9pbnRlcnNl Y3QoZ3RrLCBhcmVhICwgaW50ZXJzZWN0aW9uKTsKfQotICh2b2lkKSBncmFiRm9jdXMKewogICAg Z3RrX3dpZGdldF9ncmFiX2ZvY3VzKGd0ayk7Cn0KLSAodm9pZCkgZ3JhYkRlZmF1bHQKewogICAg Z3RrX3dpZGdldF9ncmFiX2RlZmF1bHQoZ3RrKTsKfQotICh2b2lkKSBzZXROYW1lOihOU1N0cmlu ZyAqKSBuYW1lCnsKICAgIGd0a193aWRnZXRfc2V0X25hbWUoZ3RrLGd0b29sa2l0X3V0Zjhfc3Ry aW5nKCBuYW1lKSk7Cn0KLSAoTlNTdHJpbmcgKikgZ2V0TmFtZQp7CiAgICByZXR1cm4gZ3Rvb2xr aXRfb2JqY19zdHJpbmcoZ3RrX3dpZGdldF9nZXRfbmFtZShndGspKTsKfQotICh2b2lkKSBzZXRT dGF0ZTooR3RrU3RhdGVUeXBlKSBzdGF0ZQp7CiAgICBndGtfd2lkZ2V0X3NldF9zdGF0ZShndGss IHN0YXRlKTsKfQotICh2b2lkKSBzZXRTZW5zaXRpdmU6KGdib29sZWFuKSBzZW5zaXRpdmUKewog ICAgZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGd0aywgc2Vuc2l0aXZlKTsKfQotICh2b2lkKSBz ZXRBcHBQYWludGFibGU6KGdib29sZWFuKSBhcHBfcGFpbnRhYmxlCnsKICAgIGd0a193aWRnZXRf c2V0X2FwcF9wYWludGFibGUoZ3RrLCBhcHBfcGFpbnRhYmxlKTsKfQotICh2b2lkKSBzZXRQYXJl bnQ6KEdUS1dpZGdldCAqKSBwYXJlbnQKewogICAgZ3RrX3dpZGdldF9zZXRfcGFyZW50KGd0aywg cGFyZW50ID8gcGFyZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRQYXJlbnRXaW5kb3c6KEdk a1dpbmRvdyAqKSBwYXJlbnRfd2luZG93CnsKICAgIGd0a193aWRnZXRfc2V0X3BhcmVudF93aW5k b3coZ3RrLCBwYXJlbnRfd2luZG93KTsKfQotIChHZGtXaW5kb3cgKikgZ2V0UGFyZW50V2luZG93 CnsKICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9wYXJlbnRfd2luZG93KGd0ayk7Cn0KLSAodm9p ZCkgc2V0VXBvc2l0aW9uOihnaW50KSB4IHk6KGdpbnQpIHkKewogICAgZ3RrX3dpZGdldF9zZXRf dXBvc2l0aW9uKGd0aywgeCAsIHkpOwp9Ci0gKHZvaWQpIHNldFVzaXplOihnaW50KSB3aWR0aCBo ZWlnaHQ6KGdpbnQpIGhlaWdodAp7CiAgICBndGtfd2lkZ2V0X3NldF91c2l6ZShndGssIHdpZHRo ICwgaGVpZ2h0KTsKfQotICh2b2lkKSBzZXRFdmVudHM6KGdpbnQpIGV2ZW50cwp7CiAgICBndGtf d2lkZ2V0X3NldF9ldmVudHMoZ3RrLCBldmVudHMpOwp9Ci0gKHZvaWQpIGFkZEV2ZW50czooZ2lu dCkgZXZlbnRzCnsKICAgIGd0a193aWRnZXRfYWRkX2V2ZW50cyhndGssIGV2ZW50cyk7Cn0KLSAo dm9pZCkgc2V0RXh0ZW5zaW9uRXZlbnRzOihHZGtFeHRlbnNpb25Nb2RlKSBtb2RlCnsKICAgIGd0 a193aWRnZXRfc2V0X2V4dGVuc2lvbl9ldmVudHMoZ3RrLCBtb2RlKTsKfQotIChHZGtFeHRlbnNp b25Nb2RlKSBnZXRFeHRlbnNpb25FdmVudHMKewogICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X2V4 dGVuc2lvbl9ldmVudHMoZ3RrKTsKfQotIChHVEtXaWRnZXQqKSBnZXRUb3BsZXZlbAp7CiAgICBy ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a193aWRnZXRfZ2V0X3RvcGxldmVsKGd0ayksIDApOwp9 Ci0gKEdUS1dpZGdldCopIGdldEFuY2VzdG9yOihHdGtUeXBlKSB3aWRnZXRfdHlwZQp7CiAgICBy ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a193aWRnZXRfZ2V0X2FuY2VzdG9yKGd0aywgd2lkZ2V0 X3R5cGUpLCAwKTsKfQotIChHZGtDb2xvcm1hcCopIGdldENvbG9ybWFwCnsKICAgIHJldHVybiBn dGtfd2lkZ2V0X2dldF9jb2xvcm1hcChndGspOwp9Ci0gKEdka1Zpc3VhbCopIGdldFZpc3VhbAp7 CiAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfdmlzdWFsKGd0ayk7Cn0KLSAodm9pZCkgc2V0Q29s b3JtYXA6KEdka0NvbG9ybWFwICopIGNvbG9ybWFwCnsKICAgIGd0a193aWRnZXRfc2V0X2NvbG9y bWFwKGd0aywgY29sb3JtYXApOwp9Ci0gKHZvaWQpIHNldFZpc3VhbDooR2RrVmlzdWFsICopIHZp c3VhbAp7CiAgICBndGtfd2lkZ2V0X3NldF92aXN1YWwoZ3RrLCB2aXN1YWwpOwp9Ci0gKGdpbnQp IGdldEV2ZW50cwp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfZXZlbnRzKGd0ayk7Cn0KLSAo dm9pZCkgZ2V0UG9pbnRlcjooZ2ludCAqKSB4IHk6KGdpbnQgKikgeQp7CiAgICBndGtfd2lkZ2V0 X2dldF9wb2ludGVyKGd0aywgeCAsIHkpOwp9Ci0gKGdpbnQpIGlzQW5jZXN0b3I6KEdUS1dpZGdl dCAqKSBhbmNlc3Rvcgp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9pc19hbmNlc3RvcihndGssIGFu Y2VzdG9yID8gYW5jZXN0b3ItPmd0ayA6IDApOwp9Ci0gKGdpbnQpIGhpZGVPbkRlbGV0ZQp7CiAg ICByZXR1cm4gZ3RrX3dpZGdldF9oaWRlX29uX2RlbGV0ZShndGspOwp9Ci0gKHZvaWQpIHNldFN0 eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfd2lkZ2V0X3NldF9zdHlsZShndGssIHN0 eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNldFJjU3R5bGUKewogICAgZ3RrX3dp ZGdldF9zZXRfcmNfc3R5bGUoZ3RrKTsKfQotICh2b2lkKSBlbnN1cmVTdHlsZQp7CiAgICBndGtf d2lkZ2V0X2Vuc3VyZV9zdHlsZShndGspOwp9Ci0gKEdUS1N0eWxlKikgZ2V0U3R5bGUKewogICAg cmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfd2lkZ2V0X2dldF9zdHlsZShndGspLCAiR1RLU3R5 bGUiKTsKfQotICh2b2lkKSByZXN0b3JlRGVmYXVsdFN0eWxlCnsKICAgIGd0a193aWRnZXRfcmVz dG9yZV9kZWZhdWx0X3N0eWxlKGd0ayk7Cn0KLSAodm9pZCkgbW9kaWZ5U3R5bGU6KEd0a1JjU3R5 bGUgKikgc3R5bGUKewogICAgZ3RrX3dpZGdldF9tb2RpZnlfc3R5bGUoZ3RrLCBzdHlsZSk7Cn0K LSAodm9pZCkgc2V0Q29tcG9zaXRlTmFtZTooTlNTdHJpbmcgKikgbmFtZQp7CiAgICBndGtfd2lk Z2V0X3NldF9jb21wb3NpdGVfbmFtZShndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIG5hbWUpKTsK fQotIChOU1N0cmluZyAqKSBnZXRDb21wb3NpdGVOYW1lCnsKICAgIHJldHVybiBndG9vbGtpdF9v YmpjX3N0cmluZyhndGtfd2lkZ2V0X2dldF9jb21wb3NpdGVfbmFtZShndGspKTsKfQotICh2b2lk KSByZXNldFJjU3R5bGVzCnsKICAgIGd0a193aWRnZXRfcmVzZXRfcmNfc3R5bGVzKGd0ayk7Cn0K KyAodm9pZCkgcHVzaFN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfd2lkZ2V0X3B1 c2hfc3R5bGUoIHN0eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9CisgKHZvaWQpIHB1c2hDb2xvcm1h cDooR2RrQ29sb3JtYXAgKikgY21hcAp7CiAgICBndGtfd2lkZ2V0X3B1c2hfY29sb3JtYXAoIGNt YXApOwp9CisgKHZvaWQpIHB1c2hWaXN1YWw6KEdka1Zpc3VhbCAqKSB2aXN1YWwKewogICAgZ3Rr X3dpZGdldF9wdXNoX3Zpc3VhbCggdmlzdWFsKTsKfQorICh2b2lkKSBwdXNoQ29tcG9zaXRlQ2hp bGQKewogICAgZ3RrX3dpZGdldF9wdXNoX2NvbXBvc2l0ZV9jaGlsZCgpOwp9CisgKHZvaWQpIHBv cENvbXBvc2l0ZUNoaWxkCnsKICAgIGd0a193aWRnZXRfcG9wX2NvbXBvc2l0ZV9jaGlsZCgpOwp9 CisgKHZvaWQpIHBvcFN0eWxlCnsKICAgIGd0a193aWRnZXRfcG9wX3N0eWxlKCk7Cn0KKyAodm9p ZCkgcG9wQ29sb3JtYXAKewogICAgZ3RrX3dpZGdldF9wb3BfY29sb3JtYXAoKTsKfQorICh2b2lk KSBwb3BWaXN1YWwKewogICAgZ3RrX3dpZGdldF9wb3BfdmlzdWFsKCk7Cn0KKyAodm9pZCkgc2V0 RGVmYXVsdFN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfd2lkZ2V0X3NldF9kZWZh dWx0X3N0eWxlKCBzdHlsZSA/IHN0eWxlLT5ndGsgOiAwKTsKfQorICh2b2lkKSBzZXREZWZhdWx0 Q29sb3JtYXA6KEdka0NvbG9ybWFwICopIGNvbG9ybWFwCnsKICAgIGd0a193aWRnZXRfc2V0X2Rl ZmF1bHRfY29sb3JtYXAoIGNvbG9ybWFwKTsKfQorICh2b2lkKSBzZXREZWZhdWx0VmlzdWFsOihH ZGtWaXN1YWwgKikgdmlzdWFsCnsKICAgIGd0a193aWRnZXRfc2V0X2RlZmF1bHRfdmlzdWFsKCB2 aXN1YWwpOwp9CisgKEdUS1N0eWxlKikgZ2V0RGVmYXVsdFN0eWxlCnsKICAgIHJldHVybiBndG9v bGtpdF9vYmplY3QoZ3RrX3dpZGdldF9nZXRfZGVmYXVsdF9zdHlsZSgpLCAiR1RLU3R5bGUiKTsK fQorIChHZGtDb2xvcm1hcCopIGdldERlZmF1bHRDb2xvcm1hcAp7CiAgICByZXR1cm4gZ3RrX3dp ZGdldF9nZXRfZGVmYXVsdF9jb2xvcm1hcCgpOwp9CisgKEdka1Zpc3VhbCopIGdldERlZmF1bHRW aXN1YWwKewogICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X2RlZmF1bHRfdmlzdWFsKCk7Cn0KLSAo dm9pZCkgc2hhcGVDb21iaW5lTWFzazooR2RrQml0bWFwICopIHNoYXBlX21hc2sgb2Zmc2V0WDoo Z2ludCkgb2Zmc2V0X3ggb2Zmc2V0WTooZ2ludCkgb2Zmc2V0X3kKewogICAgZ3RrX3dpZGdldF9z aGFwZV9jb21iaW5lX21hc2soZ3RrLCBzaGFwZV9tYXNrICwgb2Zmc2V0X3ggLCBvZmZzZXRfeSk7 Cn0KLSAodm9pZCkgcGF0aDooZ3VpbnQgKikgcGF0aF9sZW5ndGggcGF0aDooTlNTdHJpbmcgKiop IHBhdGggcGF0aFJldmVyc2VkOihOU1N0cmluZyAqKikgcGF0aF9yZXZlcnNlZAp7CiAgICBjaGFy ICpfb3V0dmFsXzI7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBndGtfd2lkZ2V0X3BhdGgoZ3Rr LCBwYXRoX2xlbmd0aCAsJl9vdXR2YWxfMSwmX291dHZhbF8yKTsKICAgICogcGF0aCAgPSBndG9v bGtpdF9vYmpjX3N0cmluZyhfb3V0dmFsXzEpOwogICAgKiBwYXRoX3JldmVyc2VkID0gZ3Rvb2xr aXRfb2JqY19zdHJpbmcoX291dHZhbF8yKTsKfQotICh2b2lkKSBjbGFzc1BhdGg6KGd1aW50ICop IHBhdGhfbGVuZ3RoIHBhdGg6KE5TU3RyaW5nICoqKSBwYXRoIHBhdGhSZXZlcnNlZDooTlNTdHJp bmcgKiopIHBhdGhfcmV2ZXJzZWQKewogICAgY2hhciAqX291dHZhbF8yOwogICAgY2hhciAqX291 dHZhbF8xOwogICAgZ3RrX3dpZGdldF9jbGFzc19wYXRoKGd0aywgcGF0aF9sZW5ndGggLCZfb3V0 dmFsXzEsJl9vdXR2YWxfMik7CiAgICAqIHBhdGggID0gZ3Rvb2xraXRfb2JqY19zdHJpbmcoX291 dHZhbF8xKTsKICAgICogcGF0aF9yZXZlcnNlZCA9IGd0b29sa2l0X29iamNfc3RyaW5nKF9vdXR2 YWxfMik7Cn0KI2RlZmluZSBndGsJKChHdGtXaWRnZXQgKikgZ3RrKQotIChHVEtXaWRnZXQgKikg Z2V0UGFyZW50CnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5wYXJlbnQpOwp9Ci0g KEdka1dpbmRvdyAqKSBnZXRXaW5kb3cKewogICAgcmV0dXJuIGd0ay0+d2luZG93Owp9CiN1bmRl ZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUg R0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVk d2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrd2luZG93LmggYnkgZ3Rr Z2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM ZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdU b29sS2l0L0dUS1dpbmRvdy5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CiNpbmNs dWRlIDxHVG9vbEtpdC9HVEtBY2NlbEdyb3VwLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLV2luZG93 CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a193aW5kb3dfZ2V0X3R5cGUoKTsK fQorIChpZCkgd2luZG93V2l0aFR5cGU6KEd0a1dpbmRvd1R5cGUpIHR5cGUKewogICAgcmV0dXJu IFtbKEdUS1dpbmRvdyAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFR5cGU6dHlwZV0gYXV0b3JlbGVh c2VdOwp9Ci0gKGlkKSBpbml0V2l0aFR5cGU6KEd0a1dpbmRvd1R5cGUpIHR5cGUKewogICAgcmV0 dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a193aW5kb3dfbmV3KCB0eXBlKV07Cn0KLSAodm9pZCkg c2V0VGl0bGU6KE5TU3RyaW5nICopIHRpdGxlCnsKICAgIGd0a193aW5kb3dfc2V0X3RpdGxlKGd0 ayxndG9vbGtpdF91dGY4X3N0cmluZyggdGl0bGUpKTsKfQotICh2b2lkKSBzZXRXbWNsYXNzOihO U1N0cmluZyAqKSB3bWNsYXNzX25hbWUgd21jbGFzc0NsYXNzOihOU1N0cmluZyAqKSB3bWNsYXNz X2NsYXNzCnsKICAgIGd0a193aW5kb3dfc2V0X3dtY2xhc3MoZ3RrLGd0b29sa2l0X3V0Zjhfc3Ry aW5nKCB3bWNsYXNzX25hbWUgKSxndG9vbGtpdF91dGY4X3N0cmluZyggd21jbGFzc19jbGFzcykp Owp9Ci0gKHZvaWQpIHNldFBvbGljeTooZ2ludCkgYWxsb3dfc2hyaW5rIGFsbG93R3JvdzooZ2lu dCkgYWxsb3dfZ3JvdyBhdXRvU2hyaW5rOihnaW50KSBhdXRvX3Nocmluawp7CiAgICBndGtfd2lu ZG93X3NldF9wb2xpY3koZ3RrLCBhbGxvd19zaHJpbmsgLCBhbGxvd19ncm93ICwgYXV0b19zaHJp bmspOwp9Ci0gKHZvaWQpIGFkZEFjY2VsR3JvdXA6KEdUS0FjY2VsR3JvdXAgKikgYWNjZWxfZ3Jv dXAKewogICAgZ3RrX3dpbmRvd19hZGRfYWNjZWxfZ3JvdXAoZ3RrLCBhY2NlbF9ncm91cCA/IGFj Y2VsX2dyb3VwLT5ndGsgOiAwKTsKfQotICh2b2lkKSByZW1vdmVBY2NlbEdyb3VwOihHVEtBY2Nl bEdyb3VwICopIGFjY2VsX2dyb3VwCnsKICAgIGd0a193aW5kb3dfcmVtb3ZlX2FjY2VsX2dyb3Vw KGd0aywgYWNjZWxfZ3JvdXAgPyBhY2NlbF9ncm91cC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgc2V0 UG9zaXRpb246KEd0a1dpbmRvd1Bvc2l0aW9uKSBwb3NpdGlvbgp7CiAgICBndGtfd2luZG93X3Nl dF9wb3NpdGlvbihndGssIHBvc2l0aW9uKTsKfQotIChnaW50KSBhY3RpdmF0ZUZvY3VzCnsKICAg IHJldHVybiBndGtfd2luZG93X2FjdGl2YXRlX2ZvY3VzKGd0ayk7Cn0KLSAoZ2ludCkgYWN0aXZh dGVEZWZhdWx0CnsKICAgIHJldHVybiBndGtfd2luZG93X2FjdGl2YXRlX2RlZmF1bHQoZ3RrKTsK fQotICh2b2lkKSBzZXRUcmFuc2llbnRGb3I6KEdUS1dpbmRvdyAqKSBwYXJlbnQKewogICAgZ3Rr X3dpbmRvd19zZXRfdHJhbnNpZW50X2ZvcihndGssIHBhcmVudCA/IHBhcmVudC0+Z3RrIDogMCk7 Cn0KLSAodm9pZCkgc2V0R2VvbWV0cnlIaW50czooR1RLV2lkZ2V0ICopIGdlb21ldHJ5X3dpZGdl dCBnZW9tZXRyeTooR2RrR2VvbWV0cnkgKikgZ2VvbWV0cnkgZ2VvbU1hc2s6KEdka1dpbmRvd0hp bnRzKSBnZW9tX21hc2sKewogICAgZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHMoZ3RrLCBn ZW9tZXRyeV93aWRnZXQgID8gZ2VvbWV0cnlfd2lkZ2V0IC0+Z3RrIDogMCwgZ2VvbWV0cnkgLCBn ZW9tX21hc2spOwp9Ci0gKHZvaWQpIHNldERlZmF1bHRTaXplOihnaW50KSB3aWR0aCBoZWlnaHQ6 KGdpbnQpIGhlaWdodAp7CiAgICBndGtfd2luZG93X3NldF9kZWZhdWx0X3NpemUoZ3RrLCB3aWR0 aCAsIGhlaWdodCk7Cn0KLSAodm9pZCkgc2V0TW9kYWw6KGdib29sZWFuKSBtb2RhbAp7CiAgICBn dGtfd2luZG93X3NldF9tb2RhbChndGssIG1vZGFsKTsKfQojaW5jbHVkZSA8Rm91bmRhdGlvbi9O U0F1dG9yZWxlYXNlUG9vbC5oPgojaW5jbHVkZSA8Rm91bmRhdGlvbi9OU05vdGlmaWNhdGlvbi5o PgoKCk5TU3RyaW5nICpHVEtXaW5kb3dEaWRCZWNvbWVNYWluTm90aWZpY2F0aW9uID0gQCJHVEtX aW5kb3dEaWRCZWNvbWVNYWluIjsKTlNTdHJpbmcgKkdUS1dpbmRvd0RpZFJlc2lnbk1haW5Ob3Rp ZmljYXRpb24gPSBAIkdUS1dpbmRvd0RpZFJlc2lnbk1haW4iOwpOU1N0cmluZyAqR1RLV2luZG93 V2lsbENsb3NlTm90aWZpY2F0aW9uID0gQCJHVEtXaW5kb3dXaWxsQ2xvc2UiOwpOU1N0cmluZyAq R1RLV2luZG93V2lsbE9wZW5Ob3RpZmljYXRpb24gPSBAIkdUS1dpbmRvd1dpbGxPcGVuIjsKCnN0 YXRpYyBnaW50IGZvY3VzX2luX3dpbmRvdyAoR3RrV2lkZ2V0ICp3aW4sIEdka0V2ZW50ICpldmVu dCwgR1RLV2luZG93ICpzZWxmKQp7CiAgICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtOU0F1 dG9yZWxlYXNlUG9vbCBuZXddOwoKICAgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENl bnRlcl0gcG9zdE5vdGlmaWNhdGlvbk5hbWU6CglHVEtXaW5kb3dEaWRCZWNvbWVNYWluTm90aWZp Y2F0aW9uIG9iamVjdDpzZWxmXTsKICAgIFtwb29sIHJlbGVhc2VdOwogICAgcmV0dXJuIE5POwp9 CgpzdGF0aWMgZ2ludCBmb2N1c19vdXRfd2luZG93IChHdGtXaWRnZXQgKndpbiwgR2RrRXZlbnQg KmV2ZW50LCBHVEtXaW5kb3cgKnNlbGYpCnsKICAgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0g W05TQXV0b3JlbGVhc2VQb29sIG5ld107CgogICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZh dWx0Q2VudGVyXSBwb3N0Tm90aWZpY2F0aW9uTmFtZToKCUdUS1dpbmRvd0RpZFJlc2lnbk1haW5O b3RpZmljYXRpb24gb2JqZWN0OnNlbGZdOwogICAgW3Bvb2wgcmVsZWFzZV07CiAgICByZXR1cm4g Tk87Cn0KCnN0YXRpYyBnaW50IGRlbGV0ZV93aW5kb3cgKEd0a1dpZGdldCAqd2luLCBHZGtFdmVu dCAqZXZlbnQsIEdUS1dpbmRvdyAqc2VsZikKewogICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wg PSBbTlNBdXRvcmVsZWFzZVBvb2wgbmV3XTsKICAgIGlkIGRlbGVnYXRlID0gW3NlbGYgZGVsZWdh dGVdOwogICAgZ2ludCByZXN1bHQgPSBOTzsKCiAgICBpZiAoW2RlbGVnYXRlIHJlc3BvbmRzVG9T ZWxlY3RvcjpAc2VsZWN0b3Iod2luZG93U2hvdWxkQ2xvc2U6KV0gJiYKCVtkZWxlZ2F0ZSB3aW5k b3dTaG91bGRDbG9zZTpzZWxmXSA9PSBOTykgcmVzdWx0ID0gWUVTOwogICAgW3Bvb2wgcmVsZWFz ZV07CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgdm9pZCBkZXN0cm95X3dpbmRvdyAoR3Rr V2lkZ2V0ICp3aW4sIEdUS1dpbmRvdyAqc2VsZikKewogICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBv b2wgPSBbTlNBdXRvcmVsZWFzZVBvb2wgbmV3XTsKCiAgICBbW05TTm90aWZpY2F0aW9uQ2VudGVy IGRlZmF1bHRDZW50ZXJdIHBvc3ROb3RpZmljYXRpb25OYW1lOgoJR1RLV2luZG93V2lsbENsb3Nl Tm90aWZpY2F0aW9uIG9iamVjdDpzZWxmXTsKICAgIFtwb29sIHJlbGVhc2VdOwp9CgogLSAoaWQp IGluaXRXaXRoR3RrOihncG9pbnRlcikgX2d0awp7CiAgICBbc3VwZXIgaW5pdFdpdGhHdGs6X2d0 a107CgogICAgZ3RrX3NpZ25hbF9jb25uZWN0KF9ndGssICJmb2N1c19pbl9ldmVudCIsCgkJCShH dGtTaWduYWxGdW5jKSBmb2N1c19pbl93aW5kb3csIHNlbGYpOwogICAgZ3RrX3NpZ25hbF9jb25u ZWN0KF9ndGssICJmb2N1c19vdXRfZXZlbnQiLAoJCQkoR3RrU2lnbmFsRnVuYykgZm9jdXNfb3V0 X3dpbmRvdywgc2VsZik7CiAgICBndGtfc2lnbmFsX2Nvbm5lY3QoX2d0aywgImRlc3Ryb3kiLCAo R3RrU2lnbmFsRnVuYykgZGVzdHJveV93aW5kb3csIHNlbGYpOwoKICAgIFtbTlNOb3RpZmljYXRp b25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcG9zdE5vdGlmaWNhdGlvbk5hbWU6CglHVEtXaW5kb3dX aWxsT3Blbk5vdGlmaWNhdGlvbiBvYmplY3Q6c2VsZl07CgogICAgW3NlbGYgcmVmXTsJCS8vIGZp cnN0IHJlZmVyZW5jZSBpcyBtaXNzaW5nIChkdWUgdG8gZmxvYXRpbmcgZmxhZykKICAgIHJldHVy biAgc2VsZjsJLy8gYXZvaWQgYnVnIGluIG9iamNkb2MKfQoKLyoKICogU2V0IHRoZSBkZWxlZ2F0 ZSBvYmplY3Qgb2YgdGhpcyB3aW5kb3cgb3IgdW5zZXQgaXQgKGlmIC9kZWxlZ2F0ZS8KICogaXMg fG5pbHwpLiBJZiB0aGUgZGVsZWdhdGUgaW1wbGVtZW50cyBzb21lIG9mIHRoZSBtZXRob2RzIGRl c2NyaWJlZAogKiBpbiB0aGUgcHJvdG9jb2wgQHByb3RvKEdUS1dpbmRvd0RlbGVnYXRlKSwgaXQg d2lsbCBiZSBub3RpZmllZCBieQogKiB0aGUgd2luZG93IG9uIHRoZSBjb3JyZXNwb25kaW5nIGV2 ZW50cy4KICovCi0gKHZvaWQpIHNldERlbGVnYXRlOihpZCkgb2JqZWN0CnsKICAgIE5TTm90aWZp Y2F0aW9uQ2VudGVyICpjZW50ZXIgPSBbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRl cl07CgogICAgaWYgKGRlbGVnYXRlKSBbY2VudGVyIHJlbW92ZU9ic2VydmVyOmRlbGVnYXRlIG5h bWU6bmlsIG9iamVjdDpzZWxmXTsKICAgIGRlbGVnYXRlID0gb2JqZWN0OwoKICAgIGlmIChbb2Jq ZWN0IHJlc3BvbmRzVG9TZWxlY3RvcjpAc2VsZWN0b3Iod2luZG93RGlkQmVjb21lTWFpbjopXSkK CVtjZW50ZXIgYWRkT2JzZXJ2ZXI6b2JqZWN0IHNlbGVjdG9yOkBzZWxlY3Rvcih3aW5kb3dEaWRC ZWNvbWVNYWluOikKCQluYW1lOkdUS1dpbmRvd0RpZEJlY29tZU1haW5Ob3RpZmljYXRpb24gb2Jq ZWN0OnNlbGZdOwogICAgaWYgKFtvYmplY3QgcmVzcG9uZHNUb1NlbGVjdG9yOkBzZWxlY3Rvcih3 aW5kb3dEaWRSZXNpZ25NYWluOildKQoJW2NlbnRlciBhZGRPYnNlcnZlcjpvYmplY3Qgc2VsZWN0 b3I6QHNlbGVjdG9yKHdpbmRvd0RpZFJlc2lnbk1haW46KQoJCW5hbWU6R1RLV2luZG93RGlkUmVz aWduTWFpbk5vdGlmaWNhdGlvbiBvYmplY3Q6c2VsZl07CiAgICBpZiAoW29iamVjdCByZXNwb25k c1RvU2VsZWN0b3I6QHNlbGVjdG9yKHdpbmRvd1dpbGxDbG9zZTopXSkKCVtjZW50ZXIgYWRkT2Jz ZXJ2ZXI6b2JqZWN0IHNlbGVjdG9yOkBzZWxlY3Rvcih3aW5kb3dXaWxsQ2xvc2U6KQoJCW5hbWU6 R1RLV2luZG93V2lsbENsb3NlTm90aWZpY2F0aW9uIG9iamVjdDpzZWxmXTsKCiAgICBpZiAoaGFu ZGxlcl9pZCA9PSAwICYmCglbb2JqZWN0IHJlc3BvbmRzVG9TZWxlY3RvcjpAc2VsZWN0b3Iod2lu ZG93U2hvdWxkQ2xvc2U6KV0pCgloYW5kbGVyX2lkID0gZ3RrX3NpZ25hbF9jb25uZWN0KGd0aywg ImRlbGV0ZV9ldmVudCIsCgkJCQkJKEd0a1NpZ25hbEZ1bmMpIGRlbGV0ZV93aW5kb3csIHNlbGYp Owp9CgovKgogKiBSZXR1cm4gdGhpcyB3aW5kb3cncyBkZWxlZ2F0ZSBvYmplY3QuCiAqLwotIChp ZCkgZGVsZWdhdGUKewogICAgcmV0dXJuIGRlbGVnYXRlOwp9CgovKgogKiBTZW5kIGEgL2RlbGV0 ZV9ldmVudC8gc2lnbmFsIHRvIHRoaXMgd2luZG93LCBpLmUuIGFjdCBhcyBpZiB0aGUgdXNlcgog KiBoYWQgY2xvc2VkIHRoZSByZWNlaXZlciB2aWEgdGhlIHdpbmRvdyBtYW5hZ2VyLiBUaGUgL3Nl bmRlci8gcGFyYW1ldGVyCiAqIGlzIGlnbm9yZWQuPHA+CiAqIElmIHRoZSBkZWxlZ2F0ZSBpbXBs ZW1lbnRzIHRoZSBtZXRob2Q6CiAqIDxwcmU+CiAqIC0gKEJPT0wpIHdpbmRvd1Nob3VsZENsb3Nl OihHVEtXaW5kb3cgKikgc2VuZGVyPC9wcmU+CiAqCiAqIHRoaXMgbWVzc2FnZSBpcyBzZW50IHRv IHRoZSBkZWxlZ2F0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgd2luZG93CiAqIHNob3VsZCBh Y3R1YWxseSBiZSBjbG9zZWQuIElmIGl0IHJldHVybnMgfFlFU3wsIHRoaXMgbWV0aG9kIHdpbGwg cG9zdAogKiB0aGUgR1RLV2luZG93V2lsbENsb3NlTm90aWZpY2F0aW9uIHRvIHRoZSBkZWZhdWx0 IG5vdGlmaWNhdGlvbiBjZW50ZXIKICogYW5kIGNsb3NlIHRoZSB3aW5kb3cuCiAqIEBzZWUgLWRl c3Ryb3kKICovCi0gKHZvaWQpIHBlcmZvcm1DbG9zZTooaWQpIHNlbmRlcgp7CiAgICBHZGtFdmVu dCBldmVudCA9IHsgR0RLX0RFTEVURSB9OwogICAgZ2ludCByZXN1bHQ7CgogICAgZXZlbnQuYW55 LndpbmRvdyA9ICgoR3RrV2lkZ2V0ICopIGd0ayktPndpbmRvdzsKICAgIGd0a19zaWduYWxfZW1p dF9ieV9uYW1lKGd0aywgImRlbGV0ZV9ldmVudCIsICZldmVudCwgJnJlc3VsdCk7Cn0KCiNkZWZp bmUgZ3RrCSgoR3RrV2luZG93ICopIGd0aykKLSAoTlNTdHJpbmcgKikgdGl0bGUKewogICAgcmV0 dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0ay0+dGl0bGUpOwp9Ci0gKEdUS1dpZGdldCAqKSBm b2N1c1dpZGdldAp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+Zm9jdXNfd2lkZ2V0 KTsKfQotIChHVEtXaWRnZXQgKikgZGVmYXVsdFdpZGdldAp7CiAgICByZXR1cm4gR1RPT0xLSVRf T0JKRUNUKGd0ay0+ZGVmYXVsdF93aWRnZXQpOwp9CiN1bmRlZiBndGsKQGVuZAo= >From tromey@gcc.gnu.org Sun Apr 01 00:00:00 2001 From: tromey@gcc.gnu.org To: tromey@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org Subject: Re: java/2280 Date: Sun, 01 Apr 2001 00:00:00 -0000 Message-id: <20010313235602.7839.qmail@sourceware.cygnus.com> X-SW-Source: 2001-q1/msg02306.html Content-length: 759 The following reply was made to PR java/2280; it has been noted by GNATS. From: tromey@gcc.gnu.org To: gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org, praun@inf.ethz.ch, tromey@gcc.gnu.org Cc: Subject: Re: java/2280 Date: 13 Mar 2001 23:55:04 -0000 Synopsis: gcj -C does not translate Java 'finally' correctly Responsible-Changed-From-To: unassigned->tromey Responsible-Changed-By: tromey Responsible-Changed-When: Tue Mar 13 15:55:04 2001 Responsible-Changed-Why: This is mine. State-Changed-From-To: open->analyzed State-Changed-By: tromey State-Changed-When: Tue Mar 13 15:55:04 2001 State-Changed-Why: This is the same as 2216. A patch should go in soon. http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=2280&database=gcc
next reply other threads:[~2001-04-01 0:00 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2001-04-01 0:00 gdr [this message] 2001-04-29 4:56 c++/1772 lerdsuwa
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20010125194602.1708.qmail@sourceware.cygnus.com \ --to=gdr@gcc.gnu.org \ --cc=gcc-prs@gcc.gnu.org \ --cc=nobody@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).