From mboxrd@z Thu Jan 1 00:00:00 1970 From: seefeld@sympatico.ca To: gcc-gnats@gcc.gnu.org Cc: seefeld@sympatico.ca Subject: c++/3277: compiler segfaults compiling attached file Date: Tue, 19 Jun 2001 19:56:00 -0000 Message-id: <20010620025508.8788.qmail@sourceware.cygnus.com> X-SW-Source: 2001-06/msg00807.html List-Id: >Number: 3277 >Category: c++ >Synopsis: compiler segfaults compiling attached file >Confidential: no >Severity: serious >Priority: high >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Tue Jun 19 19:56:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Stefan Seefeld >Release: gcc 3.0 >Organization: >Environment: bash$ g++ -v Reading specs from /usr/local/gcc-3.0/lib/gcc-lib/i686-pc-linux-gnu/3.0/specs Configured with: ../gcc-3.0/configure --enable-shared --enable-threads --prefix=/usr/local/gcc-3.0 Thread model: posix gcc version 3.0 the system is based on RH 6.2, with linux kernel 2.4.2, glibc 2.1 >Description: the compiler segfaults while processing the attached file. The command is: bash$ g++ -I../../include -I/home/stefan/Berlin/Berlin/include -D_REENTRANT -I/home/stefan/Berlin/Berlin/include/Command -pipe -fPIC -c /home/stefan/Berlin/Berlin/src/Command/TelltaleImpl.cc -o TelltaleImpl.o In file included from /home/stefan/Berlin/Berlin/src/Command/TelltaleImpl.cc:22: /home/stefan/Berlin/Berlin/include/Command/TelltaleImpl.hh:56: Internal error: Segmentation fault Please submit a full bug report, with preprocessed source if appropriate. See for instructions. The preprocessed file is attached... >How-To-Repeat: see description >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="TelltaleImpl.i" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="TelltaleImpl.i" IyAyMiAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vc3JjL0NvbW1hbmQvVGVsbHRhbGVJbXBs LmNjIgojIDEgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQ29tbWFuZC9UZWxs dGFsZUltcGwuaGgiIDEKIyAyNiAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9D b21tYW5kL1RlbGx0YWxlSW1wbC5oaCIKIyAxICIuLi8uLi9pbmNsdWRlL1dhcnNhdy9jb25maWcu aGgiIDEKIyAyNyAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9Db21tYW5kL1Rl bGx0YWxlSW1wbC5oaCIgMgojIDEgIi4uLy4uL2luY2x1ZGUvV2Fyc2F3L1RlbGx0YWxlLmhoIiAx CiMgMTAgIi4uLy4uL2luY2x1ZGUvV2Fyc2F3L1RlbGx0YWxlLmhoIgojIDEgIi91c3IvbG9jYWwv aW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAxIDMKIyAyNTUgIi91c3IvbG9jYWwvaW5jbHVkZS9v bW5pT1JCMy9DT1JCQS5oIiAzCiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlJ bnRlcm5hbC5oIiAxIDMKIyAxMzkgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50 ZXJuYWwuaCIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxp bnV4LWdudS8zLjAvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMTQ3ICIvdXNyL2xvY2FsL2djYy0z LjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1ZGUvc3RkZGVmLmgiIDMK dHlwZWRlZiBpbnQgcHRyZGlmZl90OwojIDE5OSAiL3Vzci9sb2NhbC9nY2MtMy4wL2xpYi9nY2Mt bGliL2k2ODYtcGMtbGludXgtZ251LzMuMC9pbmNsdWRlL3N0ZGRlZi5oIiAzCnR5cGVkZWYgdW5z aWduZWQgaW50IHNpemVfdDsKIyAxNDAgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5p SW50ZXJuYWwuaCIgMiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvc3RyaW5ncy5oIiAxIDMKIyAyMiAi L3Vzci9pbmNsdWRlL3N0cmluZ3MuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAx IDMKIyAyNTAgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL3N5 cy9jZGVmcy5oIiAxIDMKIyAyNTEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKIyAyNzgg Ii91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2dudS9zdHVicy5o IiAxIDMKIyAyNzkgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKIyAyMyAiL3Vzci9pbmNs dWRlL3N0cmluZ3MuaCIgMiAzCgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9saWIvZ2NjLWxpYi9p Njg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMjUgIi91c3IvaW5j bHVkZS9zdHJpbmdzLmgiIDIgMwoKZXh0ZXJuICJDIiB7CgoKZXh0ZXJuIGludCBiY21wIChfX2Nv bnN0IHZvaWQgKiBfX3MxLCBfX2NvbnN0IHZvaWQgKiBfX3MyLCBzaXplX3QgX19uKSB0aHJvdyAo KTsKCgpleHRlcm4gdm9pZCBiY29weSAoX19jb25zdCB2b2lkICogX19zcmMsIHZvaWQgKiBfX2Rl c3QsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCmV4dGVybiB2b2lkIGJ6ZXJvICh2b2lkICogX19z LCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBmZnMgKGludCBfX2kpIHRocm93 ICgpOwoKCmV4dGVybiBjaGFyICppbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRo cm93ICgpOwoKCmV4dGVybiBjaGFyICpyaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19j KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHN0cmNhc2VjbXAgKF9fY29uc3QgY2hhciAqX19zMSwg X19jb25zdCBjaGFyICpfX3MyKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHN0cm5jYXNlY21wIChf X2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikgdGhyb3cg KCk7CgoKfQojIDE0MyAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5o IiAyIDMKIyAxICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDEgMwojIDI2ICIvdXNyL2luY2x1ZGUv c3RyaW5nLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiMgMjcgIi91c3Iv aW5jbHVkZS9zdHJpbmcuaCIgMiAzCgpleHRlcm4gIkMiIHsKCgoKCiMgMSAiL3Vzci9sb2NhbC9n Y2MtMy4wL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzMuMC9pbmNsdWRlL3N0ZGRlZi5o IiAxIDMKIyAzNCAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAyIDMKCgoKZXh0ZXJuIHZvaWQgKiBt ZW1jcHkgKHZvaWQgKiBfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB2b2lkICogX19yZXN0cmlj dCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCmV4dGVybiB2b2lkICogbWVtbW92ZSAo dm9pZCAqIF9fZGVzdCwgX19jb25zdCB2b2lkICogX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgp OwoKCgoKCgpleHRlcm4gdm9pZCAqIG1lbWNjcHkgKHZvaWQgKiBfX2Rlc3QsIF9fY29uc3Qgdm9p ZCAqIF9fc3JjLCBpbnQgX19jLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gdm9p ZCAqIG1lbXNldCAodm9pZCAqIF9fcywgaW50IF9fYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoK ZXh0ZXJuIGludCBtZW1jbXAgKF9fY29uc3Qgdm9pZCAqIF9fczEsIF9fY29uc3Qgdm9pZCAqIF9f czIsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgpleHRlcm4gdm9pZCAqIG1lbWNociAoX19jb25z dCB2b2lkICogX19zLCBpbnQgX19jLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCmV4dGVybiB2 b2lkICogcmF3bWVtY2hyIChfX2NvbnN0IHZvaWQgKiBfX3MsIGludCBfX2MpIHRocm93ICgpOwoK CgoKZXh0ZXJuIGNoYXIgKnN0cmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX3NyYykgdGhyb3cgKCk7CgoKZXh0ZXJuIGNoYXIgKnN0cm5jcHkg KGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMs IHNpemVfdCBfX24pIHRocm93ICgpOwoKCgpleHRlcm4gY2hhciAqc3RyY2F0IChjaGFyICpfX3Jl c3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKSB0aHJvdyAoKTsK CgpleHRlcm4gY2hhciAqc3RybmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCmV4dGVybiBp bnQgc3RyY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikgdGhyb3cg KCk7CgpleHRlcm4gaW50IHN0cm5jbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFy ICpfX3MyLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHN0cmNvbGwgKF9fY29u c3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKSB0aHJvdyAoKTsKCmV4dGVybiBzaXpl X3Qgc3RyeGZybSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0 cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRl L3hsb2NhbGUuaCIgMSAzCiMgMjggIi91c3IvaW5jbHVkZS94bG9jYWxlLmgiIDMKdHlwZWRlZiBz dHJ1Y3QgX19sb2NhbGVfc3RydWN0CnsKICBzdHJ1Y3QgbG9jYWxlX2RhdGEgKl9fbG9jYWxlc1s2 XTsKCgogIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCAqX19jdHlwZV9iOwogIGNvbnN0IGludCAq X19jdHlwZV90b2xvd2VyOwogIGNvbnN0IGludCAqX19jdHlwZV90b3VwcGVyOwp9ICpfX2xvY2Fs ZV90OwojIDEwMCAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAyIDMKCgpleHRlcm4gaW50IF9fc3Ry Y29sbF9sIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgX19sb2NhbGVf dCBfX2wpIHRocm93ICgpOwoKCmV4dGVybiBzaXplX3QgX19zdHJ4ZnJtX2wgKGNoYXIgKl9fZGVz dCwgX19jb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBfX2wpIHRocm93 ICgpOwoKCgoKCmV4dGVybiBjaGFyICpfX3N0cmR1cCAoX19jb25zdCBjaGFyICpfX3MpIHRocm93 ICgpOwpleHRlcm4gY2hhciAqc3RyZHVwIChfX2NvbnN0IGNoYXIgKl9fcykgdGhyb3cgKCk7CgoK CgoKCmV4dGVybiBjaGFyICpzdHJuZHVwIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzaXplX3Qg X19uKSB0aHJvdyAoKTsKIyAxNDYgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwpleHRlcm4gY2hh ciAqc3RyY2hyIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgdGhyb3cgKCk7CgpleHRlcm4g Y2hhciAqc3RycmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpOwoKCgoK ZXh0ZXJuIGNoYXIgKnN0cmNocm51bCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93 ICgpOwoKCgoKZXh0ZXJuIHNpemVfdCBzdHJjc3BuIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25z dCBjaGFyICpfX3JlamVjdCkgdGhyb3cgKCk7CgoKZXh0ZXJuIHNpemVfdCBzdHJzcG4gKF9fY29u c3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KSB0aHJvdyAoKTsKCmV4dGVybiBj aGFyICpzdHJwYnJrIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkg dGhyb3cgKCk7CgpleHRlcm4gY2hhciAqc3Ryc3RyIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ss IF9fY29uc3QgY2hhciAqX19uZWVkbGUpIHRocm93ICgpOwoKCgpleHRlcm4gY2hhciAqX19zdHJj YXNlc3RyIChfX2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssIF9fY29uc3QgY2hhciAqX19uZWVkbGUp IHRocm93ICgpOwoKZXh0ZXJuIGNoYXIgKnN0cmNhc2VzdHIgKF9fY29uc3QgY2hhciAqX19oYXlz dGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gY2hhciAq c3RydG9rIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9f ZGVsaW0pIHRocm93ICgpOwoKCgoKZXh0ZXJuIGNoYXIgKl9fc3RydG9rX3IgKGNoYXIgKl9fcmVz dHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSwgY2hhciAqKl9fcmVz dHJpY3QgX19zYXZlX3B0cikgdGhyb3cgKCk7CgoKCmV4dGVybiBjaGFyICpzdHJ0b2tfciAoY2hh ciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltLCBjaGFy ICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKSB0aHJvdyAoKTsKIyAxOTQgIi91c3IvaW5jbHVkZS9z dHJpbmcuaCIgMwpleHRlcm4gdm9pZCAqIG1lbW1lbSAoX19jb25zdCB2b2lkICogX19oYXlzdGFj aywgc2l6ZV90IF9faGF5c3RhY2tsZW4sIF9fY29uc3Qgdm9pZCAqIF9fbmVlZGxlLCBzaXplX3Qg X19uZWVkbGVsZW4pIHRocm93ICgpOwoKCgoKZXh0ZXJuIHZvaWQgKiBfX21lbXBjcHkgKHZvaWQg KiBfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB2b2lkICogX19yZXN0cmljdCBfX3NyYywgc2l6 ZV90IF9fbikgdGhyb3cgKCk7CgpleHRlcm4gdm9pZCAqIG1lbXBjcHkgKHZvaWQgKiBfX3Jlc3Ry aWN0IF9fZGVzdCwgX19jb25zdCB2b2lkICogX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikg dGhyb3cgKCk7CgoKCgoKZXh0ZXJuIHNpemVfdCBzdHJsZW4gKF9fY29uc3QgY2hhciAqX19zKSB0 aHJvdyAoKTsKCgoKCmV4dGVybiBzaXplX3Qgc3RybmxlbiAoX19jb25zdCBjaGFyICpfX3N0cmlu Zywgc2l6ZV90IF9fbWF4bGVuKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBjaGFyICpzdHJlcnJvciAo aW50IF9fZXJybnVtKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGNoYXIgKl9fc3RyZXJyb3JfciAoaW50 IF9fZXJybnVtLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSB0aHJvdyAoKTsKZXh0ZXJu IGNoYXIgKnN0cmVycm9yX3IgKGludCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1 ZmxlbikgdGhyb3cgKCk7CgoKCgpleHRlcm4gdm9pZCBfX2J6ZXJvICh2b2lkICogX19zLCBzaXpl X3QgX19uKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIHZvaWQgYmNvcHkgKF9fY29uc3Qgdm9pZCAqIF9f c3JjLCB2b2lkICogX19kZXN0LCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gdm9pZCBi emVybyAodm9pZCAqIF9fcywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBiY21w IChfX2NvbnN0IHZvaWQgKiBfX3MxLCBfX2NvbnN0IHZvaWQgKiBfX3MyLCBzaXplX3QgX19uKSB0 aHJvdyAoKTsKCgpleHRlcm4gY2hhciAqaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19j KSB0aHJvdyAoKTsKCgpleHRlcm4gY2hhciAqcmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50 IF9fYykgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgX19mZnMgKGludCBfX2kpIHRocm93ICgpIF9f YXR0cmlidXRlX18gKChjb25zdCkpOwpleHRlcm4gaW50IGZmcyAoaW50IF9faSkgdGhyb3cgKCkg X19hdHRyaWJ1dGVfXyAoKGNvbnN0KSk7CgoKCgpleHRlcm4gaW50IGZmc2wgKGxvbmcgaW50IF9f bCkgdGhyb3cgKCkgX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSk7CgpfX2V4dGVuc2lvbl9fIGV4dGVy biBpbnQgZmZzbGwgKGxvbmcgbG9uZyBpbnQgX19sbCkgdGhyb3cgKCkKICAgICBfX2F0dHJpYnV0 ZV9fICgoY29uc3QpKTsKCgoKCmV4dGVybiBpbnQgX19zdHJjYXNlY21wIChfX2NvbnN0IGNoYXIg Kl9fczEsIF9fY29uc3QgY2hhciAqX19zMikgdGhyb3cgKCk7CmV4dGVybiBpbnQgc3RyY2FzZWNt cCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpIHRocm93ICgpOwoKCmV4 dGVybiBpbnQgc3RybmNhc2VjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpf X3MyLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGludCBfX3N0cmNhc2VjbXBf bCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIF9fbG9jYWxlX3QgX19s b2MpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX19zdHJuY2FzZWNtcF9sIChfX2NvbnN0IGNoYXIg Kl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBfX2xvYykg dGhyb3cgKCk7CgoKCgoKCmV4dGVybiBjaGFyICpzdHJzZXAgKGNoYXIgKipfX3Jlc3RyaWN0IF9f c3RyaW5ncCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0pIHRocm93ICgpOwoKCgoK CmV4dGVybiBpbnQgc3RydmVyc2NtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIg Kl9fczIpIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICpzdHJzaWduYWwgKGludCBfX3NpZykgdGhy b3cgKCk7CgoKZXh0ZXJuIGNoYXIgKl9fc3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwg X19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKSB0aHJvdyAoKTsKCmV4dGVybiBjaGFyICpz dHBjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3Qg X19zcmMpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGNoYXIgKl9fc3RwbmNweSAoY2hhciAqX19yZXN0 cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikg dGhyb3cgKCk7CgpleHRlcm4gY2hhciAqc3RwbmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3Qs IF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoK CmV4dGVybiBjaGFyICpzdHJmcnkgKGNoYXIgKl9fc3RyaW5nKSB0aHJvdyAoKTsKCgpleHRlcm4g dm9pZCAqIG1lbWZyb2IgKHZvaWQgKiBfX3MsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgoKCgpl eHRlcm4gY2hhciAqYmFzZW5hbWUgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgdGhyb3cgKCk7 CiMgMzUwICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMKfQojIDE0NCAiL3Vzci9sb2NhbC9pbmNs dWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyIDMKCgoKIyAxICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaXRocmVhZC5oIiAxIDMKIyA0MiAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbml0aHJlYWQu aCIgMwpjbGFzcyBvbW5pX211dGV4OwpjbGFzcyBvbW5pX2NvbmRpdGlvbjsKY2xhc3Mgb21uaV9z ZW1hcGhvcmU7CmNsYXNzIG9tbmlfdGhyZWFkOwojIDEzMCAiL3Vzci9sb2NhbC9pbmNsdWRlL29t bml0aHJlYWQuaCIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pdGhyZWFkL3Bvc2l4Lmgi IDEgMwojIDM4ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaXRocmVhZC9wb3NpeC5oIiAzCiMgMSAi L3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMSAzCiMgMTggIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgi IDMKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiMgMTkgIi91c3IvaW5jbHVkZS9w dGhyZWFkLmgiIDIgMwoKIyAxICIvdXNyL2luY2x1ZGUvc2NoZWQuaCIgMSAzCiMgMjMgIi91c3Iv aW5jbHVkZS9zY2hlZC5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMwojIDI0 ICIvdXNyL2luY2x1ZGUvc2NoZWQuaCIgMiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90eXBl cy5oIiAxIDMKIyAyNiAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMwojIDEgIi91c3IvaW5j bHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAyNyAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMiAz CgoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUv My4wL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDMwICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5o IiAyIDMKCgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191X2NoYXI7CnR5cGVkZWYgdW5zaWduZWQg c2hvcnQgX191X3Nob3J0Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VfaW50Owp0eXBlZGVmIHVu c2lnbmVkIGxvbmcgX191X2xvbmc7CgpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9u ZyBsb25nIGludCBfX3VfcXVhZF90OwpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIGlu dCBfX3F1YWRfdDsKIyA0OSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMwp0eXBlZGVmIHNp Z25lZCBjaGFyIF9faW50OF90Owp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191aW50OF90Owp0eXBl ZGVmIHNpZ25lZCBzaG9ydCBpbnQgX19pbnQxNl90Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGlu dCBfX3VpbnQxNl90Owp0eXBlZGVmIHNpZ25lZCBpbnQgX19pbnQzMl90Owp0eXBlZGVmIHVuc2ln bmVkIGludCBfX3VpbnQzMl90OwoKX19leHRlbnNpb25fXyB0eXBlZGVmIHNpZ25lZCBsb25nIGxv bmcgaW50IF9faW50NjRfdDsKX19leHRlbnNpb25fXyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9u ZyBpbnQgX191aW50NjRfdDsKCnR5cGVkZWYgX19xdWFkX3QgKl9fcWFkZHJfdDsKCnR5cGVkZWYg X191X3F1YWRfdCBfX2Rldl90Owp0eXBlZGVmIF9fdV9pbnQgX191aWRfdDsKdHlwZWRlZiBfX3Vf aW50IF9fZ2lkX3Q7CnR5cGVkZWYgX191X2xvbmcgX19pbm9fdDsKdHlwZWRlZiBfX3VfaW50IF9f bW9kZV90Owp0eXBlZGVmIF9fdV9pbnQgX19ubGlua190Owp0eXBlZGVmIGxvbmcgaW50IF9fb2Zm X3Q7CnR5cGVkZWYgX19xdWFkX3QgX19sb2ZmX3Q7CnR5cGVkZWYgaW50IF9fcGlkX3Q7CnR5cGVk ZWYgaW50IF9fc3NpemVfdDsKdHlwZWRlZiBsb25nIGludCBfX3JsaW1fdDsKdHlwZWRlZiBfX3F1 YWRfdCBfX3JsaW02NF90Owp0eXBlZGVmIF9fdV9pbnQgX19pZF90OwoKdHlwZWRlZiBzdHJ1Y3QK ICB7CiAgICBpbnQgX192YWxbMl07CiAgfSBfX2ZzaWRfdDsKCgp0eXBlZGVmIGludCBfX2RhZGRy X3Q7CnR5cGVkZWYgY2hhciAqX19jYWRkcl90Owp0eXBlZGVmIGxvbmcgaW50IF9fdGltZV90Owp0 eXBlZGVmIGxvbmcgaW50IF9fc3dibGtfdDsKCnR5cGVkZWYgbG9uZyBpbnQgX19jbG9ja190OwoK CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX19mZF9tYXNrOwojIDEwMCAiL3Vzci9pbmNsdWRl L2JpdHMvdHlwZXMuaCIgMwp0eXBlZGVmIHN0cnVjdAogIHsKCgoKICAgIF9fZmRfbWFzayBmZHNf Yml0c1sxMDI0IC8gKDggKiBzaXplb2YgKF9fZmRfbWFzaykpXTsKCgoKCgogIH0gX19mZF9zZXQ7 CgoKdHlwZWRlZiBpbnQgX19rZXlfdDsKCgp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfX2lw Y19waWRfdDsKCgoKCgp0eXBlZGVmIGxvbmcgaW50IF9fYmxrY250X3Q7CnR5cGVkZWYgX19xdWFk X3QgX19ibGtjbnQ2NF90OwoKCnR5cGVkZWYgX191X2xvbmcgX19mc2Jsa2NudF90Owp0eXBlZGVm IF9fdV9xdWFkX3QgX19mc2Jsa2NudDY0X3Q7CgoKdHlwZWRlZiBfX3VfbG9uZyBfX2ZzZmlsY250 X3Q7CnR5cGVkZWYgX191X3F1YWRfdCBfX2ZzZmlsY250NjRfdDsKCgp0eXBlZGVmIF9fdV9sb25n IF9faW5vNjRfdDsKCgp0eXBlZGVmIF9fbG9mZl90IF9fb2ZmNjRfdDsKCgp0eXBlZGVmIGxvbmcg aW50IF9fdF9zY2FsYXJfdDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX3RfdXNjYWxhcl90 OwoKCnR5cGVkZWYgaW50IF9faW50cHRyX3Q7CgoKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3B0 aHJlYWR0eXBlcy5oIiAxIDMKIyAyMyAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgi IDMKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIiAxIDMKIyA2OCAiL3Vzci9pbmNsdWRl L2JpdHMvc2NoZWQuaCIgMwpzdHJ1Y3QgX19zY2hlZF9wYXJhbQogIHsKICAgIGludCBzY2hlZF9w cmlvcml0eTsKICB9OwojIDI0ICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaCIgMiAz CgoKc3RydWN0IF9wdGhyZWFkX2Zhc3Rsb2NrCnsKICBsb25nIGludCBfX3N0YXR1czsKICBpbnQg X19zcGlubG9jazsKfTsKCgoKdHlwZWRlZiBzdHJ1Y3QgX3B0aHJlYWRfZGVzY3Jfc3RydWN0ICpf cHRocmVhZF9kZXNjcjsKCgoKCgp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IF9fZGV0YWNoc3RhdGU7 CiAgaW50IF9fc2NoZWRwb2xpY3k7CiAgc3RydWN0IF9fc2NoZWRfcGFyYW0gX19zY2hlZHBhcmFt OwogIGludCBfX2luaGVyaXRzY2hlZDsKICBpbnQgX19zY29wZTsKICBzaXplX3QgX19ndWFyZHNp emU7CiAgaW50IF9fc3RhY2thZGRyX3NldDsKICB2b2lkICpfX3N0YWNrYWRkcjsKICBzaXplX3Qg X19zdGFja3NpemU7Cn0gcHRocmVhZF9hdHRyX3Q7CgoKCnR5cGVkZWYgc3RydWN0CnsKICBzdHJ1 Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19jX2xvY2s7CiAgX3B0aHJlYWRfZGVzY3IgX19jX3dhaXRp bmc7Cn0gcHRocmVhZF9jb25kX3Q7CgoKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19kdW1teTsK fSBwdGhyZWFkX2NvbmRhdHRyX3Q7CgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgcHRocmVhZF9rZXlf dDsKCgoKCgp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IF9fbV9yZXNlcnZlZDsKICBpbnQgX19tX2Nv dW50OwogIF9wdGhyZWFkX2Rlc2NyIF9fbV9vd25lcjsKICBpbnQgX19tX2tpbmQ7CiAgc3RydWN0 IF9wdGhyZWFkX2Zhc3Rsb2NrIF9fbV9sb2NrOwp9IHB0aHJlYWRfbXV0ZXhfdDsKCgoKdHlwZWRl ZiBzdHJ1Y3QKewogIGludCBfX211dGV4a2luZDsKfSBwdGhyZWFkX211dGV4YXR0cl90OwoKCgp0 eXBlZGVmIGludCBwdGhyZWFkX29uY2VfdDsKCgoKCnR5cGVkZWYgc3RydWN0IF9wdGhyZWFkX3J3 bG9ja190CnsKICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19yd19sb2NrOwogIGludCBfX3J3 X3JlYWRlcnM7CiAgX3B0aHJlYWRfZGVzY3IgX19yd193cml0ZXI7CiAgX3B0aHJlYWRfZGVzY3Ig X19yd19yZWFkX3dhaXRpbmc7CiAgX3B0aHJlYWRfZGVzY3IgX19yd193cml0ZV93YWl0aW5nOwog IGludCBfX3J3X2tpbmQ7CiAgaW50IF9fcndfcHNoYXJlZDsKfSBwdGhyZWFkX3J3bG9ja190OwoK Cgp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IF9fbG9ja2tpbmQ7CiAgaW50IF9fcHNoYXJlZDsKfSBw dGhyZWFkX3J3bG9ja2F0dHJfdDsKCgoKCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgcHRocmVh ZF90OwojIDE1MSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMiAzCiMgMjcgIi91c3IvaW5j bHVkZS9zY2hlZC5oIiAyIDMKCgojIDEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDEgMwojIDgzICIv dXNyL2luY2x1ZGUvdGltZS5oIiAzCnN0cnVjdCB0aW1lc3BlYwogIHsKICAgIGxvbmcgaW50IHR2 X3NlYzsKICAgIGxvbmcgaW50IHR2X25zZWM7CiAgfTsKIyAzMCAiL3Vzci9pbmNsdWRlL3NjaGVk LmgiIDIgMwoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIgMSAzCiMgNDcgIi91c3Iv aW5jbHVkZS9iaXRzL3NjaGVkLmgiIDMKc3RydWN0IHNjaGVkX3BhcmFtCiAgewogICAgaW50IHNj aGVkX3ByaW9yaXR5OwogIH07CgpleHRlcm4gIkMiIHsKCgoKZXh0ZXJuIGludCBjbG9uZSAoaW50 ICgqX19mbikgKHZvaWQgKl9fYXJnKSwgdm9pZCAqX19jaGlsZF9zdGFjaywgaW50IF9fZmxhZ3Ms IHZvaWQgKl9fYXJnKSB0aHJvdyAoKTsKCgoKfQojIDMzICIvdXNyL2luY2x1ZGUvc2NoZWQuaCIg MiAzCgpleHRlcm4gIkMiIHsKCgpleHRlcm4gaW50IF9fc2NoZWRfc2V0cGFyYW0gKF9fcGlkX3Qg X19waWQsIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAoKTsKCmV4 dGVybiBpbnQgc2NoZWRfc2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIF9fY29uc3Qgc3RydWN0IHNj aGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBfX3NjaGVkX2dldHBh cmFtIChfX3BpZF90IF9fcGlkLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pIHRocm93ICgp OwpleHRlcm4gaW50IHNjaGVkX2dldHBhcmFtIChfX3BpZF90IF9fcGlkLCBzdHJ1Y3Qgc2NoZWRf cGFyYW0gKl9fcGFyYW0pIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX19zY2hlZF9zZXRzY2hlZHVs ZXIgKF9fcGlkX3QgX19waWQsIGludCBfX3BvbGljeSwgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFy YW0gKl9fcGFyYW0pIHRocm93ICgpOwoKZXh0ZXJuIGludCBzY2hlZF9zZXRzY2hlZHVsZXIgKF9f cGlkX3QgX19waWQsIGludCBfX3BvbGljeSwgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9f cGFyYW0pIHRocm93ICgpOwoKCgpleHRlcm4gaW50IF9fc2NoZWRfZ2V0c2NoZWR1bGVyIChfX3Bp ZF90IF9fcGlkKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBzY2hlZF9nZXRzY2hlZHVsZXIgKF9fcGlk X3QgX19waWQpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX19zY2hlZF95aWVsZCAodm9pZCkgdGhy b3cgKCk7CmV4dGVybiBpbnQgc2NoZWRfeWllbGQgKHZvaWQpIHRocm93ICgpOwoKCmV4dGVybiBp bnQgX19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4IChpbnQgX19hbGdvcml0aG0pIHRocm93ICgpOwpl eHRlcm4gaW50IHNjaGVkX2dldF9wcmlvcml0eV9tYXggKGludCBfX2FsZ29yaXRobSkgdGhyb3cg KCk7CgoKZXh0ZXJuIGludCBfX3NjaGVkX2dldF9wcmlvcml0eV9taW4gKGludCBfX2FsZ29yaXRo bSkgdGhyb3cgKCk7CmV4dGVybiBpbnQgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAoaW50IF9fYWxn b3JpdGhtKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IF9fc2NoZWRfcnJfZ2V0X2ludGVydmFsIChf X3BpZF90IF9fcGlkLCBzdHJ1Y3QgdGltZXNwZWMgKl9fdCkgdGhyb3cgKCk7CmV4dGVybiBpbnQg c2NoZWRfcnJfZ2V0X2ludGVydmFsIChfX3BpZF90IF9fcGlkLCBzdHJ1Y3QgdGltZXNwZWMgKl9f dCkgdGhyb3cgKCk7Cgp9CiMgMjEgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwojIDEgIi91 c3IvaW5jbHVkZS90aW1lLmgiIDEgMwojIDI4ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCiMgMSAi L3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMwojIDI5ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAy IDMKCmV4dGVybiAiQyIgewoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1s aWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDM5ICIvdXNy L2luY2x1ZGUvdGltZS5oIiAyIDMKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90aW1lLmgiIDEg MwojIDQzICIvdXNyL2luY2x1ZGUvdGltZS5oIiAyIDMKIyA1NyAiL3Vzci9pbmNsdWRlL3RpbWUu aCIgMwojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDEgMwojIDU4ICIvdXNyL2luY2x1 ZGUvdGltZS5oIiAyIDMKCgp0eXBlZGVmIF9fY2xvY2tfdCBjbG9ja190OwoKCgoKCgoKIyAxICIv dXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIyA2OSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIg MiAzCgoKdHlwZWRlZiBfX3RpbWVfdCB0aW1lX3Q7CiMgOTUgIi91c3IvaW5jbHVkZS90aW1lLmgi IDMKc3RydWN0IHRtCnsKICBpbnQgdG1fc2VjOwogIGludCB0bV9taW47CiAgaW50IHRtX2hvdXI7 CiAgaW50IHRtX21kYXk7CiAgaW50IHRtX21vbjsKICBpbnQgdG1feWVhcjsKICBpbnQgdG1fd2Rh eTsKICBpbnQgdG1feWRheTsKICBpbnQgdG1faXNkc3Q7CgoKICBsb25nIGludCB0bV9nbXRvZmY7 CiAgX19jb25zdCBjaGFyICp0bV96b25lOwoKCgoKfTsKCgoKCmV4dGVybiBjbG9ja190IGNsb2Nr ICh2b2lkKSB0aHJvdyAoKTsKCgpleHRlcm4gdGltZV90IHRpbWUgKHRpbWVfdCAqX190aW1lcikg dGhyb3cgKCk7CgoKZXh0ZXJuIGRvdWJsZSBkaWZmdGltZSAodGltZV90IF9fdGltZTEsIHRpbWVf dCBfX3RpbWUwKSB0aHJvdyAoKQogICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCgpl eHRlcm4gdGltZV90IG1rdGltZSAoc3RydWN0IHRtICpfX3RwKSB0aHJvdyAoKTsKCgoKCgpleHRl cm4gc2l6ZV90IHN0cmZ0aW1lIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4c2l6 ZSwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfX2NvbnN0IHN0cnVjdCB0bSAq X19yZXN0cmljdCBfX3RwKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGNoYXIgKnN0cnB0aW1lIChf X2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2ZtdCwgc3RydWN0IHRtICpfX3RwKSB0 aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIHN0cnVjdCB0bSAqZ210aW1lIChfX2NvbnN0IHRpbWVfdCAq X190aW1lcikgdGhyb3cgKCk7CgoKCmV4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZSAoX19jb25z dCB0aW1lX3QgKl9fdGltZXIpIHRocm93ICgpOwoKCgoKZXh0ZXJuIHN0cnVjdCB0bSAqX19nbXRp bWVfciAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwgc3RydWN0IHRtICpfX3Jl c3RyaWN0IF9fdHApIHRocm93ICgpOwoKZXh0ZXJuIHN0cnVjdCB0bSAqZ210aW1lX3IgKF9fY29u c3QgdGltZV90ICpfX3Jlc3RyaWN0IF9fdGltZXIsIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3Rw KSB0aHJvdyAoKTsKCgoKCmV4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZV9yIChfX2NvbnN0IHRp bWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgdGhy b3cgKCk7CgoKCgoKZXh0ZXJuIGNoYXIgKmFzY3RpbWUgKF9fY29uc3Qgc3RydWN0IHRtICpfX3Rw KSB0aHJvdyAoKTsKCgpleHRlcm4gY2hhciAqY3RpbWUgKF9fY29uc3QgdGltZV90ICpfX3RpbWVy KSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGNoYXIgKmFzY3RpbWVfciAoX19jb25zdCBzdHJ1Y3Qg dG0gKl9fcmVzdHJpY3QgX190cCwgY2hhciAqX19yZXN0cmljdCBfX2J1ZikgdGhyb3cgKCk7CgoK CmV4dGVybiBjaGFyICpjdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVy LCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gY2hhciAqX190 em5hbWVbMl07CmV4dGVybiBpbnQgX19kYXlsaWdodDsKZXh0ZXJuIGxvbmcgaW50IF9fdGltZXpv bmU7CgoKCgpleHRlcm4gY2hhciAqdHpuYW1lWzJdOwoKCgpleHRlcm4gdm9pZCB0enNldCAodm9p ZCkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgZGF5bGlnaHQ7CmV4dGVybiBsb25nIGludCB0aW1l em9uZTsKCgoKCgpleHRlcm4gaW50IHN0aW1lIChfX2NvbnN0IHRpbWVfdCAqX193aGVuKSB0aHJv dyAoKTsKIyAyMjggIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKZXh0ZXJuIHRpbWVfdCB0aW1lZ20g KHN0cnVjdCB0bSAqX190cCkgdGhyb3cgKCk7CgoKZXh0ZXJuIHRpbWVfdCB0aW1lbG9jYWwgKHN0 cnVjdCB0bSAqX190cCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBkeXNpemUgKGludCBfX3llYXIp IHRocm93ICgpOwoKCgoKCmV4dGVybiBpbnQgbmFub3NsZWVwIChfX2NvbnN0IHN0cnVjdCB0aW1l c3BlYyAqX19yZXF1ZXN0ZWRfdGltZSwgc3RydWN0IHRpbWVzcGVjICpfX3JlbWFpbmluZykgdGhy b3cgKCk7CiMgMjU3ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCmV4dGVybiBpbnQgZ2V0ZGF0ZV9l cnI7CgoKCgoKZXh0ZXJuIHN0cnVjdCB0bSAqZ2V0ZGF0ZSAoX19jb25zdCBjaGFyICpfX3N0cmlu ZykgdGhyb3cgKCk7CiMgMjcyICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCmV4dGVybiBpbnQgZ2V0 ZGF0ZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsIHN0cnVjdCB0bSAqX19y ZXN0cmljdCBfX3Jlc2J1ZnApIHRocm93ICgpOwoKCgoKfQojIDIyICIvdXNyL2luY2x1ZGUvcHRo cmVhZC5oIiAyIDMKCgojIDEgIi91c3IvaW5jbHVkZS9zaWduYWwuaCIgMSAzCiMgMjkgIi91c3Iv aW5jbHVkZS9zaWduYWwuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAz MCAiL3Vzci9pbmNsdWRlL3NpZ25hbC5oIiAyIDMKCmV4dGVybiAiQyIgewoKIyAxICIvdXNyL2lu Y2x1ZGUvYml0cy9zaWdzZXQuaCIgMSAzCiMgMjMgIi91c3IvaW5jbHVkZS9iaXRzL3NpZ3NldC5o IiAzCnR5cGVkZWYgaW50IF9fc2lnX2F0b21pY190OwoKCgoKdHlwZWRlZiBzdHJ1Y3QKICB7CiAg ICB1bnNpZ25lZCBsb25nIGludCBfX3ZhbFsoMTAyNCAvICg4ICogc2l6ZW9mICh1bnNpZ25lZCBs b25nIGludCkpKV07CiAgfSBfX3NpZ3NldF90OwojIDM0ICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgi IDIgMwojIDQ5ICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgiIDMKdHlwZWRlZiBfX3NpZ3NldF90IHNp Z3NldF90OwojIDM2MiAiL3Vzci9pbmNsdWRlL3NpZ25hbC5oIiAzCn0KIyAyNSAiL3Vzci9pbmNs dWRlL3B0aHJlYWQuaCIgMiAzCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgi IDEgMwojIDI2ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAyIDMKCgpleHRlcm4gIkMiIHsKIyA0 OSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwplbnVtCnsKICBQVEhSRUFEX0NSRUFURV9KT0lO QUJMRSwKCiAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQKCn07CgplbnVtCnsKICBQVEhSRUFEX0lO SEVSSVRfU0NIRUQsCgogIFBUSFJFQURfRVhQTElDSVRfU0NIRUQKCn07CgplbnVtCnsKICBQVEhS RUFEX1NDT1BFX1NZU1RFTSwKCiAgUFRIUkVBRF9TQ09QRV9QUk9DRVNTCgp9OwoKZW51bQp7CiAg UFRIUkVBRF9NVVRFWF9GQVNUX05QLAogIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLAogIFBU SFJFQURfTVVURVhfRVJST1JDSEVDS19OUAoKICAsCiAgUFRIUkVBRF9NVVRFWF9OT1JNQUwgPSBQ VEhSRUFEX01VVEVYX0ZBU1RfTlAsCiAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgPSBQVEhSRUFE X01VVEVYX1JFQ1VSU0lWRV9OUCwKICBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0sgPSBQVEhSRUFE X01VVEVYX0VSUk9SQ0hFQ0tfTlAsCiAgUFRIUkVBRF9NVVRFWF9ERUZBVUxUID0gUFRIUkVBRF9N VVRFWF9OT1JNQUwKCn07CgplbnVtCnsKICBQVEhSRUFEX1BST0NFU1NfUFJJVkFURSwKCiAgUFRI UkVBRF9QUk9DRVNTX1NIQVJFRAoKfTsKCgplbnVtCnsKICBQVEhSRUFEX1JXTE9DS19QUkVGRVJf UkVBREVSX05QLAogIFBUSFJFQURfUldMT0NLX1BSRUZFUl9XUklURVJfTlAsCiAgUFRIUkVBRF9S V0xPQ0tfUFJFRkVSX1dSSVRFUl9OT05SRUNVUlNJVkVfTlAsCiAgUFRIUkVBRF9SV0xPQ0tfREVG QVVMVF9OUCA9IFBUSFJFQURfUldMT0NLX1BSRUZFUl9XUklURVJfTlAKfTsKCgoKCgoKc3RydWN0 IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyCnsKICB2b2lkICgqX19yb3V0aW5lKSAodm9pZCAqKTsK ICB2b2lkICpfX2FyZzsKICBpbnQgX19jYW5jZWx0eXBlOwogIHN0cnVjdCBfcHRocmVhZF9jbGVh bnVwX2J1ZmZlciAqX19wcmV2Owp9OwoKCgplbnVtCnsKICBQVEhSRUFEX0NBTkNFTF9FTkFCTEUs CgogIFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUKCn07CmVudW0KewogIFBUSFJFQURfQ0FOQ0VMX0RF RkVSUkVELAoKICBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMKCn07CiMgMTQxICIvdXNyL2lu Y2x1ZGUvcHRocmVhZC5oIiAzCmV4dGVybiBpbnQgcHRocmVhZF9jcmVhdGUgKHB0aHJlYWRfdCAq X190aHJlYWQsIF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgdm9pZCAqKCpfX3N0YXJ0 X3JvdXRpbmUpICh2b2lkICopLCB2b2lkICpfX2FyZykgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIHB0 aHJlYWRfdCBwdGhyZWFkX3NlbGYgKHZvaWQpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVh ZF9lcXVhbCAocHRocmVhZF90IF9fdGhyZWFkMSwgcHRocmVhZF90IF9fdGhyZWFkMikgdGhyb3cg KCk7CgoKZXh0ZXJuIHZvaWQgcHRocmVhZF9leGl0ICh2b2lkICpfX3JldHZhbCkgdGhyb3cgKCkg X19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2pv aW4gKHB0aHJlYWRfdCBfX3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKSB0aHJvdyAoKTsKCgoK CgpleHRlcm4gaW50IHB0aHJlYWRfZGV0YWNoIChwdGhyZWFkX3QgX190aCkgdGhyb3cgKCk7CgoK CgoKCgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9pbml0IChwdGhyZWFkX2F0dHJfdCAqX19hdHRy KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9kZXN0cm95IChwdGhyZWFkX2F0 dHJfdCAqX19hdHRyKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRkZXRh Y2hzdGF0ZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9fZGV0YWNoc3RhdGUpIHRocm93 ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRkZXRhY2hzdGF0ZSAoX19jb25zdCBw dGhyZWFkX2F0dHJfdCAqX19hdHRyLCBpbnQgKl9fZGV0YWNoc3RhdGUpIHRocm93ICgpOwoKCgpl eHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtIChwdGhyZWFkX2F0dHJfdCAqX19h dHRyLCBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgdGhyb3cgKCk7CgoKCmV4 dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHNjaGVkcGFyYW0gKF9fY29uc3QgcHRocmVhZF9hdHRy X3QgKl9fYXR0ciwgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAoKTsKCgoKZXh0 ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgKHB0aHJlYWRfYXR0cl90ICpfX2F0 dHIsIGludCBfX3BvbGljeSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dl dHNjaGVkcG9saWN5IChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCAqX19wb2xp Y3kpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQg KHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCBfX2luaGVyaXQpIHRocm93ICgpOwoKCgpleHRl cm4gaW50IHB0aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQgKF9fY29uc3QgcHRocmVhZF9hdHRy X3QgKl9fYXR0ciwgaW50ICpfX2luaGVyaXQpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJl YWRfYXR0cl9zZXRzY29wZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9fc2NvcGUpIHRo cm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHNjb3BlIChfX2NvbnN0IHB0aHJl YWRfYXR0cl90ICpfX2F0dHIsIGludCAqX19zY29wZSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gaW50 IHB0aHJlYWRfYXR0cl9zZXRndWFyZHNpemUgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIHNpemVf dCBfX2d1YXJkc2l6ZSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGd1 YXJkc2l6ZSAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBzaXplX3QgKl9fZ3VhcmRz aXplKSB0aHJvdyAoKTsKCgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrYWRk ciAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgdm9pZCAqX19zdGFja2FkZHIpIHRocm93ICgpOwoK CgpleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzdGFja2FkZHIgKF9fY29uc3QgcHRocmVhZF9h dHRyX3QgKl9fYXR0ciwgdm9pZCAqKl9fc3RhY2thZGRyKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4g aW50IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIHNp emVfdCBfX3N0YWNrc2l6ZSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dl dHN0YWNrc2l6ZSAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLCBzaXplX3QgKl9fc3Rh Y2tzaXplKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGludCBwdGhyZWFkX3NldHNjaGVkcGFyYW0g KHB0aHJlYWRfdCBfX3RhcmdldF90aHJlYWQsIGludCBfX3BvbGljeSwgX19jb25zdCBzdHJ1Y3Qg c2NoZWRfcGFyYW0gKl9fcGFyYW0pIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfZ2V0 c2NoZWRwYXJhbSAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwgaW50ICpfX3BvbGljeSwgc3Ry dWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gaW50IHB0aHJl YWRfZ2V0Y29uY3VycmVuY3kgKHZvaWQpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9z ZXRjb25jdXJyZW5jeSAoaW50IF9fbGV2ZWwpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gaW50IF9f cHRocmVhZF9tdXRleF9pbml0IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsIF9fY29uc3QgcHRo cmVhZF9tdXRleGF0dHJfdCAqX19tdXRleF9hdHRyKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgcHRo cmVhZF9tdXRleF9pbml0IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsIF9fY29uc3QgcHRocmVh ZF9tdXRleGF0dHJfdCAqX19tdXRleF9hdHRyKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBfX3B0 aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAoKTsK ZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRl eCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAocHRocmVh ZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3Ry eWxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBf X3B0aHJlYWRfbXV0ZXhfbG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSB0aHJvdyAoKTsK ZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2xvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkg dGhyb3cgKCk7CgoKZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrIChwdGhyZWFkX211 dGV4X3QgKl9fbXV0ZXgpIHRocm93ICgpOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfdW5sb2Nr IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gaW50IF9f cHRocmVhZF9tdXRleGF0dHJfaW5pdCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKSB0aHJv dyAoKTsKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9pbml0IChwdGhyZWFkX211dGV4YXR0 cl90ICpfX2F0dHIpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9k ZXN0cm95IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIpIHRocm93ICgpOwpleHRlcm4gaW50 IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cikg dGhyb3cgKCk7CgoKCgoKZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKHB0 aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwgaW50IF9fa2luZCkgdGhyb3cgKCk7CgpleHRlcm4g aW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0 ciwgaW50IF9fa2luZCkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJf Z2V0dHlwZSAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsIGludCAqX19raW5k KSB0aHJvdyAoKTsKIyAzMjMgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDMKZXh0ZXJuIGludCBw dGhyZWFkX2NvbmRfaW5pdCAocHRocmVhZF9jb25kX3QgKl9fY29uZCwgX19jb25zdCBwdGhyZWFk X2NvbmRhdHRyX3QgKl9fY29uZF9hdHRyKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFk X2NvbmRfZGVzdHJveSAocHRocmVhZF9jb25kX3QgKl9fY29uZCkgdGhyb3cgKCk7CgoKZXh0ZXJu IGludCBwdGhyZWFkX2NvbmRfc2lnbmFsIChwdGhyZWFkX2NvbmRfdCAqX19jb25kKSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IHB0aHJlYWRfY29uZF9icm9hZGNhc3QgKHB0aHJlYWRfY29uZF90ICpf X2NvbmQpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfY29uZF93YWl0IChwdGhyZWFk X2NvbmRfdCAqX19jb25kLCBwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpIHRocm93ICgpOwoKCgoK CgpleHRlcm4gaW50IHB0aHJlYWRfY29uZF90aW1lZHdhaXQgKHB0aHJlYWRfY29uZF90ICpfX2Nv bmQsIHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9f YWJzdGltZSkgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kYXR0cl9pbml0 IChwdGhyZWFkX2NvbmRhdHRyX3QgKl9fYXR0cikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhy ZWFkX2NvbmRhdHRyX2Rlc3Ryb3kgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyKSB0aHJvdyAo KTsKCgoKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfaW5pdCAocHRocmVhZF9yd2xvY2tf dCAqX19yd2xvY2ssIF9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0cikgdGhyb3cg KCk7CgoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfZGVzdHJveSAocHRocmVhZF9yd2xvY2tf dCAqX19yd2xvY2spIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfcmRsb2Nr IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhy ZWFkX3J3bG9ja190cnlyZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3dybG9jayAocHRocmVhZF9yd2xvY2tfdCAq X19yd2xvY2spIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2Nr IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwdGhy ZWFkX3J3bG9ja191bmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKSB0aHJvdyAoKTsK CgoKCgpleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9pbml0IChwdGhyZWFkX3J3bG9ja2F0 dHJfdCAqX19hdHRyKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9k ZXN0cm95IChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19hdHRyKSB0aHJvdyAoKTsKCgpleHRlcm4g aW50IHB0aHJlYWRfcndsb2NrYXR0cl9nZXRwc2hhcmVkIChfX2NvbnN0IHB0aHJlYWRfcndsb2Nr YXR0cl90ICpfX2F0dHIsIGludCAqX19wc2hhcmVkKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBpbnQg cHRocmVhZF9yd2xvY2thdHRyX3NldHBzaGFyZWQgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0 dHIsIGludCBfX3BzaGFyZWQpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfcndsb2Nr YXR0cl9nZXRraW5kX25wIChfX2NvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIsIGlu dCAqX19wcmVmKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX3Nl dGtpbmRfbnAgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIsIGludCBfX3ByZWYpIHRocm93 ICgpOwojIDQyMCAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwpleHRlcm4gaW50IF9fcHRocmVh ZF9rZXlfY3JlYXRlIChwdGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZGVzdHJfZnVuY3Rp b24pICh2b2lkICopKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgcHRocmVhZF9rZXlfY3JlYXRlIChw dGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZGVzdHJfZnVuY3Rpb24pICh2b2lkICopKSB0 aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2tleV9kZWxldGUgKHB0aHJlYWRfa2V5X3Qg X19rZXkpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX19wdGhyZWFkX3NldHNwZWNpZmljIChwdGhy ZWFkX2tleV90IF9fa2V5LCBfX2NvbnN0IHZvaWQgKl9fcG9pbnRlcikgdGhyb3cgKCk7CgpleHRl cm4gaW50IHB0aHJlYWRfc2V0c3BlY2lmaWMgKHB0aHJlYWRfa2V5X3QgX19rZXksIF9fY29uc3Qg dm9pZCAqX19wb2ludGVyKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIHZvaWQgKl9fcHRocmVhZF9nZXRz cGVjaWZpYyAocHRocmVhZF9rZXlfdCBfX2tleSkgdGhyb3cgKCk7CmV4dGVybiB2b2lkICpwdGhy ZWFkX2dldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5KSB0aHJvdyAoKTsKIyA0NDUgIi91 c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDMKZXh0ZXJuIGludCBfX3B0aHJlYWRfb25jZSAocHRocmVh ZF9vbmNlX3QgKl9fb25jZV9jb250cm9sLCB2b2lkICgqX19pbml0X3JvdXRpbmUpICh2b2lkKSkg dGhyb3cgKCk7CgpleHRlcm4gaW50IHB0aHJlYWRfb25jZSAocHRocmVhZF9vbmNlX3QgKl9fb25j ZV9jb250cm9sLCB2b2lkICgqX19pbml0X3JvdXRpbmUpICh2b2lkKSkgdGhyb3cgKCk7CgoKCgoK CgpleHRlcm4gaW50IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUgKGludCBfX3N0YXRlLCBpbnQgKl9f b2xkc3RhdGUpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAo aW50IF9fdHlwZSwgaW50ICpfX29sZHR5cGUpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHRocmVh ZF9jYW5jZWwgKHB0aHJlYWRfdCBfX3RocmVhZCkgdGhyb3cgKCk7CgoKCgpleHRlcm4gdm9pZCBw dGhyZWFkX3Rlc3RjYW5jZWwgKHZvaWQpIHRocm93ICgpOwojIDQ4MSAiL3Vzci9pbmNsdWRlL3B0 aHJlYWQuaCIgMwpleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2ggKHN0cnVjdCBfcHRo cmVhZF9jbGVhbnVwX2J1ZmZlciAqX19idWZmZXIsIHZvaWQgKCpfX3JvdXRpbmUpICh2b2lkICop LCB2b2lkICpfX2FyZykgdGhyb3cgKCk7CiMgNDkxICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAz CmV4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51 cF9idWZmZXIgKl9fYnVmZmVyLCBpbnQgX19leGVjdXRlKSB0aHJvdyAoKTsKIyA1MDIgIi91c3Iv aW5jbHVkZS9wdGhyZWFkLmgiIDMKZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2Rl ZmVyIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKl9fYnVmZmVyLCB2b2lkICgqX19y b3V0aW5lKSAodm9pZCAqKSwgdm9pZCAqX19hcmcpIHRocm93ICgpOwojIDUxMyAiL3Vzci9pbmNs dWRlL3B0aHJlYWQuaCIgMwpleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3Jl IChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKl9fYnVmZmVyLCBpbnQgX19leGVjdXRl KSB0aHJvdyAoKTsKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvc2lndGhyZWFkLmgiIDEgMwoj IDMxICIvdXNyL2luY2x1ZGUvYml0cy9zaWd0aHJlYWQuaCIgMwpleHRlcm4gaW50IHB0aHJlYWRf c2lnbWFzayAoaW50IF9faG93LCBfX2NvbnN0IF9fc2lnc2V0X3QgKl9fbmV3bWFzaywgX19zaWdz ZXRfdCAqX19vbGRtYXNrKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBwdGhyZWFkX2tpbGwgKHB0 aHJlYWRfdCBfX3RocmVhZCwgaW50IF9fc2lnbm8pIHRocm93ICgpOwojIDUxOSAiL3Vzci9pbmNs dWRlL3B0aHJlYWQuaCIgMiAzCiMgNTM0ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCmV4dGVy biBpbnQgX19wdGhyZWFkX2F0Zm9yayAodm9pZCAoKl9fcHJlcGFyZSkgKHZvaWQpLCB2b2lkICgq X19wYXJlbnQpICh2b2lkKSwgdm9pZCAoKl9fY2hpbGQpICh2b2lkKSkgdGhyb3cgKCk7CgoKZXh0 ZXJuIGludCBwdGhyZWFkX2F0Zm9yayAodm9pZCAoKl9fcHJlcGFyZSkgKHZvaWQpLCB2b2lkICgq X19wYXJlbnQpICh2b2lkKSwgdm9pZCAoKl9fY2hpbGQpICh2b2lkKSkgdGhyb3cgKCk7CgoKCgoK CmV4dGVybiB2b2lkIHB0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wICh2b2lkKSB0aHJvdyAo KTsKCgoKZXh0ZXJuIHZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUgKHZvaWQpIHRocm93ICgpOwoK fQojIDM5ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaXRocmVhZC9wb3NpeC5oIiAyIDMKCgoKCmV4 dGVybiAiQyIgdm9pZCogb21uaV90aHJlYWRfd3JhcHBlcih2b2lkKiBwdHIpOwojIDEzMSAiL3Vz ci9sb2NhbC9pbmNsdWRlL29tbml0aHJlYWQuaCIgMiAzCiMgMTc3ICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaXRocmVhZC5oIiAzCmNsYXNzIG9tbmlfdGhyZWFkX2ZhdGFsIHsKcHVibGljOgogICAg aW50IGVycm9yOwogICAgb21uaV90aHJlYWRfZmF0YWwoaW50IGUgPSAwKSA6IGVycm9yKGUpIHt9 Cn07CgoKCgoKCgpjbGFzcyBvbW5pX3RocmVhZF9pbnZhbGlkIHt9OwojIDE5OCAiL3Vzci9sb2Nh bC9pbmNsdWRlL29tbml0aHJlYWQuaCIgMwpjbGFzcyBvbW5pX211dGV4IHsKCnB1YmxpYzoKICAg IG9tbmlfbXV0ZXgodm9pZCk7CiAgICB+b21uaV9tdXRleCh2b2lkKTsKCiAgICB2b2lkIGxvY2so dm9pZCk7CiAgICB2b2lkIHVubG9jayh2b2lkKTsKICAgIHZvaWQgYWNxdWlyZSh2b2lkKSB7IGxv Y2soKTsgfQogICAgdm9pZCByZWxlYXNlKHZvaWQpIHsgdW5sb2NrKCk7IH0KCgoKICAgIGZyaWVu ZCBjbGFzcyBvbW5pX2NvbmRpdGlvbjsKCnByaXZhdGU6CgogICAgb21uaV9tdXRleChjb25zdCBv bW5pX211dGV4Jik7CiAgICBvbW5pX211dGV4JiBvcGVyYXRvcj0oY29uc3Qgb21uaV9tdXRleCYp OwoKcHJpdmF0ZToKICAgIHB0aHJlYWRfbXV0ZXhfdCBwb3NpeF9tdXRleDsKfTsKIyAyNDEgIi91 c3IvbG9jYWwvaW5jbHVkZS9vbW5pdGhyZWFkLmgiIDMKY2xhc3Mgb21uaV9tdXRleF9sb2NrIHsK ICAgIG9tbmlfbXV0ZXgmIG11dGV4OwpwdWJsaWM6CiAgICBvbW5pX211dGV4X2xvY2sob21uaV9t dXRleCYgbSkgOiBtdXRleChtKSB7IG11dGV4LmxvY2soKTsgfQogICAgfm9tbmlfbXV0ZXhfbG9j ayh2b2lkKSB7IG11dGV4LnVubG9jaygpOyB9CnByaXZhdGU6CgogICAgb21uaV9tdXRleF9sb2Nr KGNvbnN0IG9tbmlfbXV0ZXhfbG9jayYpOwogICAgb21uaV9tdXRleF9sb2NrJiBvcGVyYXRvcj0o Y29uc3Qgb21uaV9tdXRleF9sb2NrJik7Cn07CiMgMjU5ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21u aXRocmVhZC5oIiAzCmNsYXNzIG9tbmlfY29uZGl0aW9uIHsKCiAgICBvbW5pX211dGV4KiBtdXRl eDsKCnB1YmxpYzoKICAgIG9tbmlfY29uZGl0aW9uKG9tbmlfbXV0ZXgqIG0pOwoKCgoKICAgIH5v bW5pX2NvbmRpdGlvbih2b2lkKTsKCiAgICB2b2lkIHdhaXQodm9pZCk7CgoKCgoKICAgIGludCB0 aW1lZHdhaXQodW5zaWduZWQgbG9uZyBzZWNzLCB1bnNpZ25lZCBsb25nIG5hbm9zZWNzID0gMCk7 CgoKCgoKCiAgICB2b2lkIHNpZ25hbCh2b2lkKTsKCgoKCiAgICB2b2lkIGJyb2FkY2FzdCh2b2lk KTsKCgoKcHJpdmF0ZToKCiAgICBvbW5pX2NvbmRpdGlvbihjb25zdCBvbW5pX2NvbmRpdGlvbiYp OwogICAgb21uaV9jb25kaXRpb24mIG9wZXJhdG9yPShjb25zdCBvbW5pX2NvbmRpdGlvbiYpOwoK cHJpdmF0ZToKICAgIHB0aHJlYWRfY29uZF90IHBvc2l4X2NvbmQ7Cn07CiMgMzA5ICIvdXNyL2xv Y2FsL2luY2x1ZGUvb21uaXRocmVhZC5oIiAzCmNsYXNzIG9tbmlfc2VtYXBob3JlIHsKCnB1Ymxp YzoKICAgIG9tbmlfc2VtYXBob3JlKHVuc2lnbmVkIGludCBpbml0aWFsID0gMSk7CiAgICB+b21u aV9zZW1hcGhvcmUodm9pZCk7CgogICAgdm9pZCB3YWl0KHZvaWQpOwoKCgogICAgaW50IHRyeXdh aXQodm9pZCk7CgoKCiAgICB2b2lkIHBvc3Qodm9pZCk7CgoKCnByaXZhdGU6CgogICAgb21uaV9z ZW1hcGhvcmUoY29uc3Qgb21uaV9zZW1hcGhvcmUmKTsKICAgIG9tbmlfc2VtYXBob3JlJiBvcGVy YXRvcj0oY29uc3Qgb21uaV9zZW1hcGhvcmUmKTsKCnByaXZhdGU6CiAgICBvbW5pX211dGV4IG07 IG9tbmlfY29uZGl0aW9uIGM7IGludCB2YWx1ZTsKfTsKCgoKCgpjbGFzcyBvbW5pX3NlbWFwaG9y ZV9sb2NrIHsKICAgIG9tbmlfc2VtYXBob3JlJiBzZW07CnB1YmxpYzoKICAgIG9tbmlfc2VtYXBo b3JlX2xvY2sob21uaV9zZW1hcGhvcmUmIHMpIDogc2VtKHMpIHsgc2VtLndhaXQoKTsgfQogICAg fm9tbmlfc2VtYXBob3JlX2xvY2sodm9pZCkgeyBzZW0ucG9zdCgpOyB9CnByaXZhdGU6CgogICAg b21uaV9zZW1hcGhvcmVfbG9jayhjb25zdCBvbW5pX3NlbWFwaG9yZV9sb2NrJik7CiAgICBvbW5p X3NlbWFwaG9yZV9sb2NrJiBvcGVyYXRvcj0oY29uc3Qgb21uaV9zZW1hcGhvcmVfbG9jayYpOwp9 OwojIDM1OCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbml0aHJlYWQuaCIgMwpjbGFzcyBvbW5pX3Ro cmVhZCB7CgpwdWJsaWM6CgogICAgZW51bSBwcmlvcml0eV90IHsKICAgICAgICBQUklPUklUWV9M T1csCiAgICAgICAgUFJJT1JJVFlfTk9STUFMLAogICAgICAgIFBSSU9SSVRZX0hJR0gKICAgIH07 CgogICAgZW51bSBzdGF0ZV90IHsKICAgICAgICBTVEFURV9ORVcsCgogICAgICAgIFNUQVRFX1JV Tk5JTkcsCiAgICAgICAgU1RBVEVfVEVSTUlOQVRFRAoKICAgIH07CgoKCgoKCgogICAgb21uaV90 aHJlYWQodm9pZCAoKmZuKSh2b2lkKiksIHZvaWQqIGFyZyA9IF9fbnVsbCwKICAgICAgICAgICAg ICAgIHByaW9yaXR5X3QgcHJpID0gUFJJT1JJVFlfTk9STUFMKTsKICAgIG9tbmlfdGhyZWFkKHZv aWQqICgqZm4pKHZvaWQqKSwgdm9pZCogYXJnID0gX19udWxsLAogICAgICAgICAgICAgICAgcHJp b3JpdHlfdCBwcmkgPSBQUklPUklUWV9OT1JNQUwpOwoKCgoKCgoKICAgIHZvaWQgc3RhcnQodm9p ZCk7CgoKCnByb3RlY3RlZDoKCiAgICBvbW5pX3RocmVhZCh2b2lkKiBhcmcgPSBfX251bGwsIHBy aW9yaXR5X3QgcHJpID0gUFJJT1JJVFlfTk9STUFMKTsKCgoKCiAgICB2b2lkIHN0YXJ0X3VuZGV0 YWNoZWQodm9pZCk7CgoKCgogICAgdmlydHVhbCB+b21uaV90aHJlYWQodm9pZCk7CgoKCgoKCgpw dWJsaWM6CgogICAgdm9pZCBqb2luKHZvaWQqKik7CgoKCgoKICAgIHZvaWQgc2V0X3ByaW9yaXR5 KHByaW9yaXR5X3QpOwoKCiAgICBzdGF0aWMgb21uaV90aHJlYWQqIGNyZWF0ZSh2b2lkICgqZm4p KHZvaWQqKSwgdm9pZCogYXJnID0gX19udWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcHJpb3JpdHlfdCBwcmkgPSBQUklPUklUWV9OT1JNQUwpOwogICAgc3RhdGljIG9tbmlfdGhy ZWFkKiBjcmVhdGUodm9pZCogKCpmbikodm9pZCopLCB2b2lkKiBhcmcgPSBfX251bGwsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eV90IHByaSA9IFBSSU9SSVRZX05PUk1B TCk7CgoKCgoKICAgIHN0YXRpYyB2b2lkIGV4aXQodm9pZCogcmV0dXJuX3ZhbHVlID0gX19udWxs KTsKCgogICAgc3RhdGljIG9tbmlfdGhyZWFkKiBzZWxmKHZvaWQpOwoKCgoKICAgIHN0YXRpYyB2 b2lkIHlpZWxkKHZvaWQpOwoKCiAgICBzdGF0aWMgdm9pZCBzbGVlcCh1bnNpZ25lZCBsb25nIHNl Y3MsIHVuc2lnbmVkIGxvbmcgbmFub3NlY3MgPSAwKTsKCgogICAgc3RhdGljIHZvaWQgZ2V0X3Rp bWUodW5zaWduZWQgbG9uZyogYWJzX3NlYywgdW5zaWduZWQgbG9uZyogYWJzX25zZWMsCiAgICAg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHJlbF9zZWMgPSAwLCB1bnNpZ25lZCBs b25nIHJlbF9uc2VjPTApOwoKCgoKCiAgICBzdGF0aWMgdm9pZCBzdGFja3NpemUodW5zaWduZWQg bG9uZyBzeik7CiAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGFja3NpemUoKTsKCgoKCnByaXZh dGU6CgogICAgdmlydHVhbCB2b2lkIHJ1bih2b2lkKiBhcmcpIHt9CiAgICB2aXJ0dWFsIHZvaWQq IHJ1bl91bmRldGFjaGVkKHZvaWQqIGFyZykgeyByZXR1cm4gX19udWxsOyB9CgoKCgogICAgdm9p ZCBjb21tb25fY29uc3RydWN0b3Iodm9pZCogYXJnLCBwcmlvcml0eV90IHByaSwgaW50IGRldCk7 CgoKICAgIG9tbmlfbXV0ZXggbXV0ZXg7CgoKCiAgICBzdGF0ZV90IF9zdGF0ZTsKICAgIHByaW9y aXR5X3QgX3ByaW9yaXR5OwoKICAgIHN0YXRpYyBvbW5pX211dGV4KiBuZXh0X2lkX211dGV4Owog ICAgc3RhdGljIGludCBuZXh0X2lkOwogICAgaW50IF9pZDsKCiAgICB2b2lkICgqZm5fdm9pZCko dm9pZCopOwogICAgdm9pZCogKCpmbl9yZXQpKHZvaWQqKTsKICAgIHZvaWQqIHRocmVhZF9hcmc7 CiAgICBpbnQgZGV0YWNoZWQ7CgpwdWJsaWM6CgogICAgcHJpb3JpdHlfdCBwcmlvcml0eSh2b2lk KSB7CgoKCiAgICAgICAgb21uaV9tdXRleF9sb2NrIGwobXV0ZXgpOwogICAgICAgIHJldHVybiBf cHJpb3JpdHk7CiAgICB9CgogICAgc3RhdGVfdCBzdGF0ZSh2b2lkKSB7CgoKCiAgICAgICAgb21u aV9tdXRleF9sb2NrIGwobXV0ZXgpOwogICAgICAgIHJldHVybiBfc3RhdGU7CiAgICB9CgogICAg aW50IGlkKHZvaWQpIHsgcmV0dXJuIF9pZDsgfQoKCgoKCgogICAgY2xhc3MgaW5pdF90IHsKICAg ICAgICBzdGF0aWMgaW50IGNvdW50OwogICAgcHVibGljOgogICAgICAgIGluaXRfdCh2b2lkKTsK ICAgIH07CgogICAgZnJpZW5kIGNsYXNzIGluaXRfdDsKCnByaXZhdGU6CiAgICBwdGhyZWFkX3Qg cG9zaXhfdGhyZWFkOyBzdGF0aWMgaW50IHBvc2l4X3ByaW9yaXR5KHByaW9yaXR5X3QpOyBmcmll bmQgdm9pZCogb21uaV90aHJlYWRfd3JhcHBlcih2b2lkKiBwdHIpOwp9OwoKCnN0YXRpYyBvbW5p X3RocmVhZDo6aW5pdF90IG9tbmlfdGhyZWFkX2luaXQ7CiMgMTQ4ICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9v bW5pT1JCMy9DT1JCQV9zeXNkZXAuaCIgMSAzCiMgMTQ5ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21u aU9SQjMvb21uaUludGVybmFsLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JC My9DT1JCQV9iYXNldHlwZXMuaCIgMSAzCiMgNzUgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JC My9DT1JCQV9iYXNldHlwZXMuaCIgMwp0eXBlZGVmIGJvb2wgX0NPUkJBX0Jvb2xlYW47CgoKCgp0 eXBlZGVmIHVuc2lnbmVkIGNoYXIgX0NPUkJBX0NoYXI7Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIg X0NPUkJBX09jdGV0OwoKdHlwZWRlZiBzaG9ydCBfQ09SQkFfU2hvcnQ7Cgp0eXBlZGVmIHVuc2ln bmVkIHNob3J0IF9DT1JCQV9VU2hvcnQ7CgoKdHlwZWRlZiBsb25nIF9DT1JCQV9Mb25nOwoKdHlw ZWRlZiB1bnNpZ25lZCBsb25nIF9DT1JCQV9VTG9uZzsKIyAxMDEgIi91c3IvbG9jYWwvaW5jbHVk ZS9vbW5pT1JCMy9DT1JCQV9iYXNldHlwZXMuaCIgMwp0eXBlZGVmIGxvbmcgbG9uZyBfQ09SQkFf TG9uZ0xvbmc7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9DT1JCQV9VTG9uZ0xvbmc7CiMg MTExICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkFfYmFzZXR5cGVzLmgiIDMKdHlw ZWRlZiBmbG9hdCBfQ09SQkFfRmxvYXQ7CnR5cGVkZWYgZG91YmxlIF9DT1JCQV9Eb3VibGU7CiMg MTc3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkFfYmFzZXR5cGVzLmgiIDMKZXh0 ZXJuIHZvaWQgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwpleHRlcm4gdm9pZCBf Q09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKZXh0ZXJuIHZvaWQgX0NPUkJBX21hcnNoYWxfZXJy b3IoKTsKZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIF9DT1JCQV91c2VfbmlsX3B0cl9hc19uaWxfb2Jq cmVmKCk7CmV4dGVybiB2b2lkIF9DT1JCQV9udWxsX3N0cmluZ19wdHIoX0NPUkJBX0Jvb2xlYW4p OwpleHRlcm4gdm9pZCBfQ09SQkFfaW52b2tlZF9uaWxfcHNldWRvX3JlZigpOwpleHRlcm4gdm9p ZCBfQ09SQkFfaW52b2tlZF9uaWxfb2JqcmVmKCk7CmV4dGVybiBfQ09SQkFfQm9vbGVhbgpfQ09S QkFfdXNlX25pbF9wdHJfYXNfbmlsX3BzZXVkb19vYmpyZWYoY29uc3QgY2hhciogb2JqVHlwZSk7 CmV4dGVybiB2b2lkIF9DT1JCQV9iYWRfcGFyYW1fZnJlZWJ1ZigpOwojIDE1MCAiL3Vzci9sb2Nh bC9pbmNsdWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2lu Y2x1ZGUvb21uaU9SQjMvc2VxdGVtcGxhdGVzLmgiIDEgMwojIDkzICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaU9SQjMvc2VxdGVtcGxhdGVzLmgiIDMKY2xhc3MgTmV0QnVmZmVyZWRTdHJlYW07CmNs YXNzIE1lbUJ1ZmZlcmVkU3RyZWFtOwoKCgoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBfQ09S QkFfU2VxdWVuY2UgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU2VxdWVuY2U8VD4gVF9zZXE7 CgogIGlubGluZSBfQ09SQkFfVUxvbmcgbWF4aW11bSgpIGNvbnN0IHsgcmV0dXJuIHBkX21heDsg fQogIGlubGluZSBfQ09SQkFfVUxvbmcgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gcGRfbGVuOyB9 CiAgaW5saW5lIHZvaWQgbGVuZ3RoKF9DT1JCQV9VTG9uZyBsZW4pCiAgewogICAgaWYgKHBkX2Jv dW5kZWQgJiYgbGVuID4gcGRfbWF4KSB7CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigp OwoKICAgIH0KCiAgICBpZiAobGVuKSB7CgoKICAgICAgaWYgKCFwZF9idWYgfHwgbGVuID4gcGRf bWF4KSB7CiAgICAgICAgY29weWJ1ZmZlcigoKGxlbiA+IHBkX21heCkgPyBsZW4gOiBwZF9tYXgp KTsKICAgICAgfQogICAgfQoKICAgIHBkX2xlbiA9IGxlbjsKICB9CiAgaW5saW5lIFQgJm9wZXJh dG9yW10gKF9DT1JCQV9VTG9uZyBpbmRleCkgewogICAgaWYgKGluZGV4ID49IHBkX2xlbikgX0NP UkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICByZXR1cm4gcGRfYnVmW2luZGV4XTsKICB9CiAg aW5saW5lIGNvbnN0IFQmIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpbmRleCkgY29uc3Qgewog ICAgaWYgKGluZGV4ID49IHBkX2xlbikgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICBy ZXR1cm4gcGRfYnVmW2luZGV4XTsKICB9CiAgc3RhdGljIGlubGluZSBUKiBhbGxvY2J1ZihfQ09S QkFfVUxvbmcgbmVsZW1zKSB7CiAgICBUKiB0bXAgPSAwOwogICAgaWYgKG5lbGVtcykgewogICAg ICB0bXAgPSBuZXcgVFtuZWxlbXNdOwogICAgfQogICAgcmV0dXJuIHRtcDsKICB9CiAgc3RhdGlj IGlubGluZSB2b2lkIGZyZWVidWYoVCAqIGIpIHsKICAgIGlmIChiKSBkZWxldGUgW10gYjsKICB9 CgoKICBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3Jl bDsgfQoKICBpbmxpbmUgVCogZ2V0X2J1ZmZlcihfQ09SQkFfQm9vbGVhbiBvcnBoYW4gPSAwKSB7 CiAgICBpZiAocGRfbWF4ICYmICFwZF9idWYpIHsKICAgICAgY29weWJ1ZmZlcihwZF9tYXgpOwog ICAgfQogICAgaWYgKCFvcnBoYW4pIHsKICAgICAgcmV0dXJuIHBkX2J1ZjsKICAgIH0KICAgIGVs c2UgewogICAgICBpZiAoIXBkX3JlbCkKICAgICAgICByZXR1cm4gMDsKICAgICAgZWxzZSB7CiAg ICAgICAgVCogdG1wID0gcGRfYnVmOwogICAgICAgIHBkX2J1ZiA9IDA7CiAgICAgICAgaWYgKCFw ZF9ib3VuZGVkKSB7CiAgICAgICAgICBwZF9tYXggPSAwOwogICAgICAgIH0KICAgICAgICBwZF9s ZW4gPSAwOwogICAgICAgIHBkX3JlbCA9IDE7CiAgICAgICAgcmV0dXJuIHRtcDsKICAgICAgfQog ICAgfQogIH0KCiAgaW5saW5lIGNvbnN0IFQqIGdldF9idWZmZXIoKSBjb25zdCB7CiAgICBpZiAo cGRfbWF4ICYmICFwZF9idWYpIHsKCiAgICAgIFRfc2VxKiBzID0gY29uc3RfY2FzdDxUX3NlcSo+ KHRoaXMpOwoKCgogICAgICBzLT5jb3B5YnVmZmVyKHBkX21heCk7CiAgICB9CiAgICByZXR1cm4g cGRfYnVmOwogIH0KCiAgaW5saW5lIH5fQ09SQkFfU2VxdWVuY2UoKSB7CiAgICBpZiAocGRfcmVs ICYmIHBkX2J1ZikgZnJlZWJ1ZihwZF9idWYpOwogICAgcGRfYnVmID0gMDsKICB9CgoKICBpbmxp bmUgVCogTlBfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHBkX2J1ZjsgfQogIGlubGluZSB2b2lkIE5Q X25vcmVsZWFzZSgpIHsgcGRfcmVsID0gMDsgfQoKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAo TmV0QnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChO ZXRCdWZmZXJlZFN0cmVhbSAmcyk7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZl cmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVy ZWRTdHJlYW0gJnMpOwoKcHJvdGVjdGVkOgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2UoKSA6IHBk X21heCgwKSwgcGRfbGVuKDApLCBwZF9yZWwoMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcGRfYm91bmRlZCgwKSwgcGRfYnVmKDApIHsgfQoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNl KF9DT1JCQV9VTG9uZyBtYXgsIF9DT1JCQV9Cb29sZWFuIGJvdW5kZWQ9MCkgOgogICAgcGRfbWF4 KG1heCksIHBkX2xlbigwKSwgcGRfcmVsKDEpLCBwZF9ib3VuZGVkKGJvdW5kZWQpLCBwZF9idWYo MCkge30KCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZShjb25zdCBfQ09SQkFfU2VxdWVuY2U8VD4m IHMpCiAgICAgICAgICAgICAgOiBwZF9tYXgocy5wZF9tYXgpLAogICAgICAgICAgICAgICAgcGRf bGVuKDApLAogICAgICAgICAgICAgICAgcGRfcmVsKDEpLAogICAgICAgICAgICAgICAgcGRfYm91 bmRlZChzLnBkX2JvdW5kZWQpLCBwZF9idWYoMCkgewogICAgbGVuZ3RoKHMucGRfbGVuKTsKICAg IGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaSA8IHBkX2xlbjsgaSsrKSB7CiAgICAgIHBkX2J1Zltp XSA9IHMucGRfYnVmW2ldOwogICAgfQogIH0KCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZShfQ09S QkFfVUxvbmcgbWF4LAogICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX1VMb25nIGxlbiwK ICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAg ICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBf Q09SQkFfQm9vbGVhbiBib3VuZGVkID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgKQogICAg ICA6IHBkX21heChtYXgpLAogICAgICAgIHBkX2xlbihsZW4pLAogICAgICAgIHBkX3JlbChyZWxl YXNlKSwKICAgICAgICBwZF9ib3VuZGVkKGJvdW5kZWQpLAogICAgICAgIHBkX2J1Zih2YWx1ZSkK ICB7CiAgICBpZiAobGVuID4gbWF4IHx8IChsZW4gJiYgIXZhbHVlKSkgewogICAgICBfQ09SQkFf Ym91bmRfY2hlY2tfZXJyb3IoKTsKCiAgICB9CiAgfQoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNl PFQ+ICZvcGVyYXRvcj0gKGNvbnN0IF9DT1JCQV9TZXF1ZW5jZTxUPiAmcykKICB7CiAgICBsZW5n dGgocy5wZF9sZW4pOwogICAgZm9yICh1bnNpZ25lZCBsb25nIGk9MDsgaSA8IHBkX2xlbjsgaSsr KSB7CiAgICAgIHBkX2J1ZltpXSA9IHMucGRfYnVmW2ldOwogICAgfQogICAgcmV0dXJuICp0aGlz OwogIH0KCgoKICBpbmxpbmUgdm9pZCByZXBsYWNlKF9DT1JCQV9VTG9uZyBtYXgsIF9DT1JCQV9V TG9uZyBsZW4sIFQqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBy ZWxlYXNlID0gMCkgewogICAgaWYgKGxlbiA+IG1heCB8fCAobGVuICYmICFkYXRhKSkgewogICAg ICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKCiAgICB9CiAgICBpZiAocGRfcmVsICYmIHBk X2J1ZikgewogICAgICBmcmVlYnVmKHBkX2J1Zik7CiAgICB9CiAgICBwZF9tYXggPSBtYXg7CiAg ICBwZF9sZW4gPSBsZW47CiAgICBwZF9idWYgPSBkYXRhOwogICAgcGRfcmVsID0gcmVsZWFzZTsK ICB9CgoKcHJpdmF0ZToKCiAgdm9pZCBjb3B5YnVmZmVyKF9DT1JCQV9VTG9uZyBuZXdtYXgpIHsK CgoKICAgIFQqIG5ld2J1ZiA9IGFsbG9jYnVmKG5ld21heCk7CiAgICBpZiAoIW5ld2J1Zikgewog ICAgICBfQ09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7CgogICAgfQogICAgZm9yICh1 bnNpZ25lZCBsb25nIGk9MDsgaSA8IHBkX2xlbjsgaSsrKSB7CiAgICAgICBuZXdidWZbaV0gPSBw ZF9idWZbaV07CiAgICB9CiAgICBpZiAocGRfcmVsICYmIHBkX2J1ZikgewogICAgICBmcmVlYnVm KHBkX2J1Zik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcGRfcmVsID0gMTsKICAgIH0KICAgIHBk X2J1ZiA9IG5ld2J1ZjsKICAgIHBkX21heCA9IG5ld21heDsKICB9CgogIF9DT1JCQV9VTG9uZyBw ZF9tYXg7CiAgX0NPUkJBX1VMb25nIHBkX2xlbjsKICBfQ09SQkFfQm9vbGVhbiBwZF9yZWw7CiAg X0NPUkJBX0Jvb2xlYW4gcGRfYm91bmRlZDsKICBUICpwZF9idWY7Cn07CgoKCgoKdGVtcGxhdGUg PGNsYXNzIFQ+CmNsYXNzIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2UgOiBwdWJsaWMgX0NPUkJB X1NlcXVlbmNlPFQ+IHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1NlcXVlbmNlPFQ+IEJhc2VU IDsKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZSgpIHt9CiAgaW5saW5lIF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2UoX0NPUkJBX1VMb25nIG1heCkgOiBfQ09SQkFfU2VxdWVuY2U8 VD4obWF4KSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlKGNvbnN0IF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2U8VD4mIHMpCiAgICAgOiBfQ09SQkFfU2VxdWVuY2U8VD4ocykg e30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZShfQ09SQkFfVUxvbmcgbWF4LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4sCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApCiAgICAgOiBfQ09S QkFfU2VxdWVuY2U8VD4obWF4LGxlbix2YWx1ZSxyZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlPFQ+ICZvcGVyYXRvcj0gKGNvbnN0IF9DT1JCQV9VbmJvdW5kZWRf U2VxdWVuY2U8VD4gJnMpIHsKICAgIF9DT1JCQV9TZXF1ZW5jZTxUPjo6b3BlcmF0b3I9IChzKTsK ICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSB+X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5j ZSgpIHt9CgoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbWF4LCBfQ09SQkFf VUxvbmcgbGVuLCBUKiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4g cmVsZWFzZSA9IDApIHsKICAgIF9DT1JCQV9TZXF1ZW5jZTxUPjo6cmVwbGFjZShtYXgsbGVuLGRh dGEscmVsZWFzZSk7CiAgfQoKICBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qg aW5pdGlhbG9mZnNldCkgY29uc3QgewogICAgc2l6ZV90IGFsaWduZWRzaXplID0gKChpbml0aWFs b2Zmc2V0KzMpICYgfigoaW50KTMpKStzaXplb2YoX0NPUkJBX1VMb25nKTsKICAgIGZvciAodW5z aWduZWQgbG9uZyBpPTA7IGkgPCBCYXNlVDo6bGVuZ3RoKCk7IGkrKykgewogICAgICBhbGlnbmVk c2l6ZSA9IEJhc2VUOjpOUF9kYXRhKClbaV0uX05QX2FsaWduZWRTaXplKGFsaWduZWRzaXplKTsK ICAgIH0KICAgIHJldHVybiBhbGlnbmVkc2l6ZTsKICB9Cn07CgoKCgoKdGVtcGxhdGUgPGNsYXNz IFQsaW50IGVsbVNpemUsaW50IGVsbUFsaWdubWVudD4KY2xhc3MgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50CiAgIDogcHVibGljIF9DT1JCQV9TZXF1ZW5jZTxUPgp7 CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9TZXF1ZW5jZTxUPiBCYXNlVCA7CiAgaW5saW5lIF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudCgpIHt9CiAgaW5saW5lIF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudChfQ09SQkFfVUxvbmcgbWF4 KQogICAgOiBfQ09SQkFfU2VxdWVuY2U8VD4obWF4KSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQgKGNvbnN0CiAgICAgICBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8VCxlbG1TaXplLGVsbUFsaWdubWVudD4mIHMp CiAgICA6IF9DT1JCQV9TZXF1ZW5jZTxUPihzKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4s CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICp2 YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgOiBfQ09SQkFfU2VxdWVuY2U8VD4obWF4 LGxlbix2YWx1ZSxyZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X3dfRml4U2l6ZUVsZW1lbnQ8VCxlbG1TaXplLGVsbUFsaWdubWVudD4gJgogICAgICBvcGVyYXRv cj0KICAgICAgICAoY29uc3QKICAgICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19G aXhTaXplRWxlbWVudDxULGVsbVNpemUsZWxtQWxpZ25tZW50PiAmCiAgICAgICAgIHMpCiAgewog ICAgX0NPUkJBX1NlcXVlbmNlPFQ+OjpvcGVyYXRvcj0gKHMpOwogICAgcmV0dXJuICp0aGlzOwog IH0KICBpbmxpbmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudCgp IHt9CgoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbWF4LCBfQ09SQkFfVUxv bmcgbGVuLCBUKiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVs ZWFzZSA9IDApIHsKICAgIF9DT1JCQV9TZXF1ZW5jZTxUPjo6cmVwbGFjZShtYXgsbGVuLGRhdGEs cmVsZWFzZSk7CiAgfQoKICBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5p dGlhbG9mZnNldCkgY29uc3QgewogICAgc2l6ZV90IGFsaWduZWRzaXplID0gKChpbml0aWFsb2Zm c2V0KzMpICYgfigoaW50KTMpKStzaXplb2YoX0NPUkJBX1VMb25nKTsKICAgIGlmIChCYXNlVDo6 bGVuZ3RoKCkpIHsKICAgICAgYWxpZ25lZHNpemUgPSAoKGFsaWduZWRzaXplKyhlbG1BbGlnbm1l bnQtMSkpICYgfihlbG1BbGlnbm1lbnQtMSkpOwogICAgICBhbGlnbmVkc2l6ZSArPSBCYXNlVDo6 bGVuZ3RoKCkgKiBlbG1TaXplOwogICAgfQogICAgcmV0dXJuIGFsaWduZWRzaXplOwogIH0KCiAg aW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsKICBp bmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogIGlubGluZSB2 b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZv aWQgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKTsKfTsKCgoKCgpjbGFzcyBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuCiAgIDogcHVibGljIF9DT1JCQV9VbmJvdW5k ZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxfQ09SQkFfQm9vbGVhbiwxLDE+CnsKcHVibGlj OgogIHR5cGVkZWYgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9D T1JCQV9Cb29sZWFuLDEsMT4gQmFzZVQgOwogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVl bmNlX19Cb29sZWFuKCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fQm9v bGVhbihfQ09SQkFfVUxvbmcgbWF4KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3df Rml4U2l6ZUVsZW1lbnQ8X0NPUkJBX0Jvb2xlYW4sMSwxPihtYXgpIHt9CiAgaW5saW5lIF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW4oX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBs ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf Q09SQkFfQm9vbGVhbiAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkKICAgIDogX0NPUkJB X1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9Cb29sZWFuLDEsMT4o bWF4LGxlbix2YWx1ZSxyZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVl bmNlX19Cb29sZWFuIChjb25zdAogICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fQm9v bGVhbiYgcykKICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50 PF9DT1JCQV9Cb29sZWFuLDEsMT4ocykge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZV9fQm9vbGVhbiYgb3BlcmF0b3I9IChjb25zdAogICAgICAgICAgICAgICAgIF9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW4mIHMpIHsKICAgICBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8X0NPUkJBX0Jvb2xlYW4sMSwxPjo6b3BlcmF0b3I9IChz KTsKICAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSB+X0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZV9fQm9vbGVhbigpIHt9CgogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJl ZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVk U3RyZWFtICZzKTsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0g JnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAm cyk7Cgp9OwoKCgoKCmNsYXNzIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0CiAgIDog cHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxfQ09SQkFf T2N0ZXQsMSwxPgp7CnB1YmxpYzoKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9f T2N0ZXQoKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldChfQ09S QkFfVUxvbmcgbWF4KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVs ZW1lbnQ8X0NPUkJBX09jdGV0LDEsMSA+KG1heCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV9fT2N0ZXQoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfT2N0ZXQg KnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2Vfd19GaXhTaXplRWxlbWVudDxfQ09SQkFfT2N0ZXQsMSwxID4obWF4LGxlbix2YWx1ZSxy ZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldCAoY29u c3QKICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0JiBzKQogICAgOiBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8X0NPUkJBX09jdGV0LDEsMSA+ KHMpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0JiBvcGVyYXRv cj0gKGNvbnN0CiAgICAgICAgICAgICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0 ZXQmIHMpIHsKICAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8 X0NPUkJBX09jdGV0LDEsMT46Om9wZXJhdG9yPSAocyk7CiAgICAgcmV0dXJuICp0aGlzOwogIH0K ICBpbmxpbmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0KCkge30KfTsKCgoKCgp0 ZW1wbGF0ZSA8Y2xhc3MgVCxpbnQgbWF4PgpjbGFzcyBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZSA6 IHB1YmxpYyBfQ09SQkFfU2VxdWVuY2U8VD4gewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU2Vx dWVuY2U8VD4gQmFzZVQgOwogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZSgpIDogX0NP UkJBX1NlcXVlbmNlPFQ+KG1heCwxKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5j ZShfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICp2 YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVs ZWFzZSA9IDApCiAgICAgICAgICAgIDogX0NPUkJBX1NlcXVlbmNlPFQ+KG1heCxsZW4sdmFsdWUs cmVsZWFzZSwxKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZShjb25zdCBfQ09S QkFfQm91bmRlZF9TZXF1ZW5jZTxULG1heD4mIHMpCiAgICAgICAgICAgIDogX0NPUkJBX1NlcXVl bmNlPFQ+KHMpIHt9CiAgaW5saW5lIH5fQ09SQkFfQm91bmRlZF9TZXF1ZW5jZSgpIHt9CiAgaW5s aW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlPFQsbWF4PiAmb3BlcmF0b3I9IChjb25zdCBfQ09S QkFfQm91bmRlZF9TZXF1ZW5jZTxULG1heD4gJnMpIHsKICAgIF9DT1JCQV9TZXF1ZW5jZTxUPjo6 b3BlcmF0b3I9IChzKTsKICAgIHJldHVybiAqdGhpczsKICB9CgoKICBpbmxpbmUgdm9pZCByZXBs YWNlKF9DT1JCQV9VTG9uZyBsZW4sIFQqIGRhdGEsX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDAp IHsKICAgIF9DT1JCQV9TZXF1ZW5jZTxUPjo6cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7 CiAgfQoKCiAgaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZz ZXQpIGNvbnN0IHsKICAgIHNpemVfdCBhbGlnbmVkc2l6ZSA9ICgoaW5pdGlhbG9mZnNldCszKSAm IH4oKGludCkzKSkrc2l6ZW9mKF9DT1JCQV9VTG9uZyk7CiAgICBmb3IgKHVuc2lnbmVkIGxvbmcg aT0wOyBpIDwgQmFzZVQ6Omxlbmd0aCgpOyBpKyspIHsKICAgICAgYWxpZ25lZHNpemUgPSBCYXNl VDo6TlBfZGF0YSgpW2ldLl9OUF9hbGlnbmVkU2l6ZShhbGlnbmVkc2l6ZSk7CiAgICB9CiAgICBy ZXR1cm4gYWxpZ25lZHNpemU7CiAgfQoKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxpbnQgbWF4 LGludCBlbG1TaXplLCBpbnQgZWxtQWxpZ25tZW50PgpjbGFzcyBfQ09SQkFfQm91bmRlZF9TZXF1 ZW5jZV93X0ZpeFNpemVFbGVtZW50CiAgOiBwdWJsaWMgX0NPUkJBX1NlcXVlbmNlPFQ+CnsKcHVi bGljOgogIHR5cGVkZWYgX0NPUkJBX1NlcXVlbmNlPFQ+IEJhc2VUIDsKICBpbmxpbmUgX0NPUkJB X0JvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudCgpIDogX0NPUkJBX1NlcXVlbmNlPFQ+ KG1heCwxKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVt ZW50KF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBUICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgOiBfQ09SQkFfU2VxdWVuY2U8VD4o bWF4LGxlbix2YWx1ZSxyZWxlYXNlLDEpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVl bmNlX3dfRml4U2l6ZUVsZW1lbnQoY29uc3QKICAgICAgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vf d19GaXhTaXplRWxlbWVudDxULG1heCxlbG1TaXplLGVsbUFsaWdubWVudD4mIHMpCiAgICA6IF9D T1JCQV9TZXF1ZW5jZTxUPihzKSB7fQogIGlubGluZSB+X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vf d19GaXhTaXplRWxlbWVudCgpIHt9CgogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93 X0ZpeFNpemVFbGVtZW50PFQsbWF4LGVsbVNpemUsZWxtQWxpZ25tZW50PiYgb3BlcmF0b3I9KGNv bnN0IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8VCxtYXgsZWxtU2l6 ZSxlbG1BbGlnbm1lbnQ+JiBzKSB7CiAgICBfQ09SQkFfU2VxdWVuY2U8VD46Om9wZXJhdG9yPSAo cyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCgogIGlubGluZSB2b2lkIHJlcGxhY2UoX0NPUkJB X1VMb25nIGxlbiwgVCogZGF0YSxfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkgewogICAgX0NP UkJBX1NlcXVlbmNlPFQ+OjpyZXBsYWNlKG1heCxsZW4sZGF0YSxyZWxlYXNlKTsKICB9CgoKICBp bmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Qg ewogICAgc2l6ZV90IGFsaWduZWRzaXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50KTMp KStzaXplb2YoX0NPUkJBX1VMb25nKTsKICAgIGlmIChCYXNlVDo6bGVuZ3RoKCkpIHsKICAgICAg YWxpZ25lZHNpemUgPSAoKGFsaWduZWRzaXplKyhlbG1BbGlnbm1lbnQtMSkpICYgfihlbG1BbGln bm1lbnQtMSkpOwogICAgICBhbGlnbmVkc2l6ZSArPSBCYXNlVDo6bGVuZ3RoKCkgKiBlbG1TaXpl OwogICAgfQogICAgcmV0dXJuIGFsaWduZWRzaXplOwogIH0KCiAgaW5saW5lIHZvaWQgb3BlcmF0 b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVyYXRv cjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChN ZW1CdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE1l bUJ1ZmZlcmVkU3RyZWFtICZzKTsKfTsKCgoKCgp0ZW1wbGF0ZSA8aW50IG1heD4KY2xhc3MgX0NP UkJBX0JvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW4KICAgOiBwdWJsaWMgX0NPUkJBX0JvdW5kZWRf U2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxfQ09SQkFfQm9vbGVhbixtYXgsMSwxPgp7CnB1Ymxp YzoKICB0eXBlZGVmIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8X0NP UkJBX0Jvb2xlYW4sbWF4LDEsMT4gQmFzZVQgOwogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1 ZW5jZV9fQm9vbGVhbigpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19Cb29s ZWFuKF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfQ09SQkFfQm9vbGVhbiAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkKICAgIDogQmFzZVQo bGVuLHZhbHVlLHJlbGVhc2UpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19C b29sZWFuKGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm91bmRl ZF9TZXF1ZW5jZV9fQm9vbGVhbjxtYXg+JiBzKQogICAgOiBfQ09SQkFfQm91bmRlZF9TZXF1ZW5j ZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9Cb29sZWFuLG1heCwxLDE+KHMpIHt9CiAgaW5saW5l IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuJiBvcGVyYXRvcj0gKGNvbnN0CiAgICAg ICAgICAgICAgICAgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW4mIHMpIHsKICAgICBC YXNlVDo6b3BlcmF0b3I9IChzKTsKICAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgfl9D T1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuKCkge30KCiAgaW5saW5lIHZvaWQgb3BlcmF0 b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVyYXRv cjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChN ZW1CdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE1l bUJ1ZmZlcmVkU3RyZWFtICZzKTsKCn07CgoKCgoKdGVtcGxhdGUgPGludCBtYXg+CmNsYXNzIF9D T1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19PY3RldAogICA6IHB1YmxpYyBfQ09SQkFfQm91bmRlZF9T ZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PF9DT1JCQV9PY3RldCxtYXgsMSwxPgp7CnB1YmxpYzoK ICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX09jdGV0KCkge30KICBpbmxpbmUgX0NP UkJBX0JvdW5kZWRfU2VxdWVuY2VfX09jdGV0KF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfT2N0ZXQgKnZhbHVlLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVs ZWFzZSA9IDApCiAgICA6IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8 X0NPUkJBX09jdGV0LG1heCwxLDE+KGxlbix2YWx1ZSxyZWxlYXNlKSB7fQogIGlubGluZSBfQ09S QkFfQm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQoY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX09jdGV0PG1heD4mIHMpCiAgICA6IF9D T1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8X0NPUkJBX09jdGV0LG1heCwx LDE+KHMpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19PY3RldCYgb3BlcmF0 b3I9IChjb25zdAogICAgICAgICAgICAgICAgIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19PY3Rl dCYgcykgewogICAgIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8X0NP UkJBX09jdGV0LG1heCwxLDE+OjpvcGVyYXRvcj0gKHMpOwogICAgIHJldHVybiAqdGhpczsKICB9 CiAgaW5saW5lIH5fQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQoKSB7fQp9OwoKCgoKCnRl bXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xhc3MgVGVsbSxpbnQgZGltZW5zaW9uPgpj bGFzcyBfQ09SQkFfU2VxdWVuY2VfQXJyYXkgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU2Vx dWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiBUX3NlcTsKCiAgaW5saW5lIF9D T1JCQV9VTG9uZyBtYXhpbXVtKCkgY29uc3QgeyByZXR1cm4gcGRfbWF4OyB9CiAgaW5saW5lIF9D T1JCQV9VTG9uZyBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBwZF9sZW47IH0KICBpbmxpbmUgdm9p ZCBsZW5ndGgoX0NPUkJBX1VMb25nIGxlbikKICB7CiAgICBpZiAocGRfYm91bmRlZCAmJiBsZW4g PiBwZF9tYXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CgogICAgfQoKICAg IGlmIChsZW4pIHsKCgogICAgICBpZiAoIXBkX2J1ZiB8fCBsZW4gPiBwZF9tYXgpIHsKICAgICAg ICBjb3B5YnVmZmVyKCgobGVuID4gcGRfbWF4KSA/IGxlbiA6IHBkX21heCkpOwogICAgICB9CiAg ICB9CgogICAgcGRfbGVuID0gbGVuOwoKICB9CgoKICBpbmxpbmUgVF9zbGljZSogb3BlcmF0b3Jb XSAoX0NPUkJBX1VMb25nIGluZGV4KQogIHsKICAgIGlmIChpbmRleCA+PSBwZF9sZW4pIF9DT1JC QV9ib3VuZF9jaGVja19lcnJvcigpOwogICAgcmV0dXJuIChUX3NsaWNlKikocGRfYnVmW2luZGV4 XSk7CiAgfQogIGlubGluZSBjb25zdCBUX3NsaWNlKiBvcGVyYXRvcltdIChfQ09SQkFfVUxvbmcg aW5kZXgpIGNvbnN0CiAgewogICAgaWYgKGluZGV4ID49IHBkX2xlbikgX0NPUkJBX2JvdW5kX2No ZWNrX2Vycm9yKCk7CiAgICByZXR1cm4gKGNvbnN0IFRfc2xpY2UqKShwZF9idWZbaW5kZXhdKTsK ICB9CiAgc3RhdGljIGlubGluZSBUKiBhbGxvY2J1ZihfQ09SQkFfVUxvbmcgbmVsZW1zKQogIHsK ICAgIGlmIChuZWxlbXMpIHJldHVybiBuZXcgVFtuZWxlbXNdOwogICAgZWxzZSByZXR1cm4gMDsK ICB9CiAgc3RhdGljIGlubGluZSB2b2lkIGZyZWVidWYoVCAqIGIpCiAgewogICAgaWYgKGIpIGRl bGV0ZSBbXSBiOwogICAgcmV0dXJuOwogIH0KCgogIGlubGluZSBfQ09SQkFfQm9vbGVhbiByZWxl YXNlKCkgY29uc3QgeyByZXR1cm4gcGRfcmVsOyB9CgogIGlubGluZSBUKiBnZXRfYnVmZmVyKF9D T1JCQV9Cb29sZWFuIG9ycGhhbiA9IDApIHsKICAgIGlmIChwZF9tYXggJiYgIXBkX2J1Zikgewog ICAgICBjb3B5YnVmZmVyKHBkX21heCk7CiAgICB9CiAgICBpZiAoIW9ycGhhbikgewogICAgICBy ZXR1cm4gcGRfYnVmOwogICAgfQogICAgZWxzZSB7CiAgICAgIGlmICghcGRfcmVsKQogICAgICAg IHJldHVybiAwOwogICAgICBlbHNlIHsKICAgICAgICBUKiB0bXAgPSBwZF9idWY7CiAgICAgICAg cGRfYnVmID0gMDsKICAgICAgICBpZiAoIXBkX2JvdW5kZWQpIHsKICAgICAgICAgIHBkX21heCA9 IDA7CiAgICAgICAgfQogICAgICAgIHBkX2xlbiA9IDA7CiAgICAgICAgcGRfcmVsID0gMTsKICAg ICAgICByZXR1cm4gdG1wOwogICAgICB9CiAgICB9CiAgfQoKICBpbmxpbmUgVCogZ2V0X2J1ZmZl cigpIGNvbnN0IHsKICAgIGlmIChwZF9tYXggJiYgIXBkX2J1ZikgewoKICAgICAgVF9zZXEqIHMg PSBjb25zdF9jYXN0PFRfc2VxKj4odGhpcyk7CgoKCiAgICAgIHMtPmNvcHlidWZmZXIocGRfbWF4 KTsKICAgIH0KICAgIHJldHVybiBwZF9idWY7CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9TZXF1ZW5j ZV9BcnJheSgpIHsKICAgIGlmIChwZF9yZWwgJiYgcGRfYnVmKSBmcmVlYnVmKHBkX2J1Zik7CiAg ICBwZF9idWYgPSAwOwogICAgcmV0dXJuOwogIH0KCgogIGlubGluZSBUICpOUF9kYXRhKCkgY29u c3QgeyByZXR1cm4gcGRfYnVmOyB9CiAgaW5saW5lIHZvaWQgTlBfbm9yZWxlYXNlKCkgeyBwZF9y ZWwgPSAwOyB9CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZz KSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMp OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7 CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKTsKCnByb3Rl Y3RlZDoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNlX0FycmF5KCkgOiBwZF9tYXgoMCksIHBkX2xl bigwKSwgcGRfcmVsKDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkX2Jv dW5kZWQoMCksIHBkX2J1ZigwKSB7IH0KCiAgaW5saW5lIF9DT1JCQV9TZXF1ZW5jZV9BcnJheShf Q09SQkFfVUxvbmcgbWF4LCBfQ09SQkFfQm9vbGVhbiBib3VuZGVkPTApIDoKICAgIHBkX21heCht YXgpLCBwZF9sZW4oMCksIHBkX3JlbCgxKSwgcGRfYm91bmRlZChib3VuZGVkKSwgcGRfYnVmKDAp IHt9CgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2VfQXJyYXkoY29uc3QgX0NPUkJBX1NlcXVlbmNl X0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4mIHMpCiAgICAgICAgICAgICAgOiBwZF9t YXgocy5wZF9tYXgpLAogICAgICAgICAgICAgICAgcGRfbGVuKDApLAogICAgICAgICAgICAgICAg cGRfcmVsKDEpLAogICAgICAgICAgICAgICAgcGRfYm91bmRlZChzLnBkX2JvdW5kZWQpLCBwZF9i dWYoMCkKICB7CiAgICBsZW5ndGgocy5wZF9sZW4pOwogICAgZm9yIChfQ09SQkFfVUxvbmcgaT0w OyBpIDwgcGRfbGVuOyBpKyspIHsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaj0wOyBqIDwgZGlt ZW5zaW9uOyBqKyspIHsKICAgICAgICAqKChUZWxtKikocGRfYnVmW2ldKSArIGopID0gKigoVGVs bSopKHMucGRfYnVmW2ldKSArIGopOwogICAgICB9CiAgICB9CiAgfQoKICBpbmxpbmUgX0NPUkJB X1NlcXVlbmNlX0FycmF5KF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg VCAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBy ZWxlYXNlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFu IGJvdW5kZWQgPSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgIDogcGRf bWF4KG1heCksCiAgICAgICAgcGRfbGVuKGxlbiksCiAgICAgICAgcGRfcmVsKHJlbGVhc2UpLAog ICAgICAgIHBkX2JvdW5kZWQoYm91bmRlZCksCiAgICAgICAgcGRfYnVmKHZhbHVlKQogIHsKICAg IGlmIChsZW4gPiBtYXggfHwgKGxlbiAmJiAhdmFsdWUpKSB7CiAgICAgIF9DT1JCQV9ib3VuZF9j aGVja19lcnJvcigpOwoKICAgIH0KICB9CgoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNlX0FycmF5 PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gJm9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX1NlcXVl bmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gJnMpCiAgewogICAgbGVuZ3RoKHMu cGRfbGVuKTsKICAgIGZvciAodW5zaWduZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKykgewog ICAgICBmb3IgKF9DT1JCQV9VTG9uZyBqPTA7IGogPCBkaW1lbnNpb247IGorKykgewogICAgICAg ICooKFRlbG0qKShwZF9idWZbaV0pICsgaikgPSAqKChUZWxtKikocy5wZF9idWZbaV0pICsgaik7 CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgoKICBpbmxpbmUgdm9pZCByZXBs YWNlKF9DT1JCQV9VTG9uZyBtYXgsIF9DT1JCQV9VTG9uZyBsZW4sIFQqIGRhdGEsCiAgICAgICAg ICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkgewogICAgaWYgKGxlbiA+ IG1heCB8fCAobGVuICYmICFkYXRhKSkgewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3Io KTsKCiAgICB9CiAgICBpZiAocGRfcmVsICYmIHBkX2J1ZikgewogICAgICBmcmVlYnVmKHBkX2J1 Zik7CiAgICB9CiAgICBwZF9tYXggPSBtYXg7CiAgICBwZF9sZW4gPSBsZW47CiAgICBwZF9idWYg PSBkYXRhOwogICAgcGRfcmVsID0gcmVsZWFzZTsKICB9CgoKcHJpdmF0ZToKCiAgdm9pZCBjb3B5 YnVmZmVyKF9DT1JCQV9VTG9uZyBuZXdtYXgpIHsKCgoKICAgIFQqIG5ld2J1ZiA9IGFsbG9jYnVm KG5ld21heCk7CiAgICBpZiAoIW5ld2J1ZikgewogICAgICBfQ09SQkFfbmV3X29wZXJhdG9yX3Jl dHVybl9udWxsKCk7CgogICAgfQogICAgZm9yICh1bnNpZ25lZCBsb25nIGk9MDsgaSA8IHBkX2xl bjsgaSsrKSB7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGo9MDsgaiA8IGRpbWVuc2lvbjsgaisr KSB7CiAgICAgICAgKigoVGVsbSopKG5ld2J1ZltpXSkgKyBqKSA9ICooKFRlbG0qKShwZF9idWZb aV0pICsgaik7CiAgICAgIH0KICAgIH0KICAgIGlmIChwZF9yZWwgJiYgcGRfYnVmKSB7CiAgICAg IGZyZWVidWYocGRfYnVmKTsKICAgIH0KICAgIGVsc2UgewogICAgICBwZF9yZWwgPSAxOwogICAg fQogICAgcGRfYnVmID0gbmV3YnVmOwogICAgcGRfbWF4ID0gbmV3bWF4OwogIH0KCiAgX0NPUkJB X1VMb25nIHBkX21heDsKICBfQ09SQkFfVUxvbmcgcGRfbGVuOwogIF9DT1JCQV9Cb29sZWFuIHBk X3JlbDsKICBfQ09SQkFfQm9vbGVhbiBwZF9ib3VuZGVkOwogIFQqIHBkX2J1ZjsKfTsKCgoKCgp0 ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbj4K Y2xhc3MgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheSA6IHB1YmxpYyBfQ09SQkFfU2Vx dWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiB7CnB1YmxpYzoKICB0eXBlZGVm IF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+IEJhc2VUIDsK ICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheSgpIHt9CiAgaW5saW5lIF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXkoX0NPUkJBX1VMb25nIG1heCkgOiBfQ09SQkFf U2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPihtYXgpIHt9CiAgaW5saW5l IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXkoY29uc3QgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+JiBzKQogICAgIDogX0NPUkJB X1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4ocykge30KICBpbmxpbmUg X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheShfQ09SQkFfVUxvbmcgbWF4LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4sCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDAp CiAgICAgOiBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiht YXgsbGVuLHZhbHVlLHJlbGVhc2UpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVu Y2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiAmb3BlcmF0b3I9IChjb25zdCBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gJnMp IHsKICAgIEJhc2VUOjpvcGVyYXRvcj0gKHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxp bmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXkoKSB7fQoKCgogIGlubGluZSB2b2lk IHJlcGxhY2UoX0NPUkJBX1VMb25nIG1heCwgX0NPUkJBX1VMb25nIGxlbiwgVCogZGF0YSwKICAg ICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBCYXNl VDo6cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQoKCgoKCgogIGlubGluZSBzaXpl X3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdCB7CiAgICBzaXpl X3QgYWxpZ25lZHNpemUgPSAoKGluaXRpYWxvZmZzZXQrMykgJiB+KChpbnQpMykpK3NpemVvZihf Q09SQkFfVUxvbmcpOwogICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOwogICAgICAgICBpIDwgQmFz ZVQ6Omxlbmd0aCgpOwogICAgICAgICBpKyspIHsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaj0w OyBqPGRpbWVuc2lvbjsgaisrKSB7CiAgICAgICAgYWxpZ25lZHNpemUgPSAoKFRlbG0qKShCYXNl VDo6TlBfZGF0YSgpW2ldKSArIGopLT5fTlBfYWxpZ25lZFNpemUoYWxpZ25lZHNpemUpOwogICAg ICB9CiAgICB9CiAgICByZXR1cm4gYWxpZ25lZHNpemU7CiAgfQp9OwoKCgoKCnRlbXBsYXRlIDxj bGFzcyBULGNsYXNzIFRfc2xpY2UsIGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbixpbnQgZWxtU2l6 ZSxpbnQgZWxtQWxpZ25tZW50PgpjbGFzcyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5 X3dfRml4U2l6ZUVsZW1lbnQKICAgOiBwdWJsaWMgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9z bGljZSxUZWxtLGRpbWVuc2lvbj4KewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU2VxdWVuY2Vf QXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiBCYXNlVCA7CiAgaW5saW5lIF9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudCgpIHt9CiAgaW5saW5lIF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudChfQ09SQkFfVUxv bmcgbWF4KQogICAgOiBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5z aW9uPihtYXgpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19G aXhTaXplRWxlbWVudCAoY29uc3QKICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJy YXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sZWxtU2l6ZSxlbG1B bGlnbm1lbnQ+JiBzKQogICAgOiBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0s ZGltZW5zaW9uPihzKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5 X3dfRml4U2l6ZUVsZW1lbnQoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4sCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBU ICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgOiBfQ09SQkFfU2VxdWVu Y2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPihtYXgsbGVuLHZhbHVlLHJlbGVhc2Up IHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxl bWVudDxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+ICYKICAg ICAgb3BlcmF0b3I9CiAgICAgICAgKGNvbnN0CiAgICAgICAgICBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLGVs bVNpemUsZWxtQWxpZ25tZW50PiAmCiAgICAgICAgIHMpCiAgewogICAgQmFzZVQ6Om9wZXJhdG9y PSAocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSB+X0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50KCkge30KCgoKICBpbmxpbmUgdm9pZCByZXBs YWNlKF9DT1JCQV9VTG9uZyBtYXgsIF9DT1JCQV9VTG9uZyBsZW4sIFQqIGRhdGEsCiAgICAgICAg ICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkgewogICAgQmFzZVQ6OnJl cGxhY2UobWF4LGxlbixkYXRhLHJlbGVhc2UpOwogIH0KCgoKCgoKICBpbmxpbmUgc2l6ZV90IF9O UF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3QgewogICAgc2l6ZV90IGFs aWduZWRzaXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50KTMpKStzaXplb2YoX0NPUkJB X1VMb25nKTsKICAgIGlmIChCYXNlVDo6bGVuZ3RoKCkpIHsKICAgICAgYWxpZ25lZHNpemUgPSAo KGFsaWduZWRzaXplKyhlbG1BbGlnbm1lbnQtMSkpICYgfihlbG1BbGlnbm1lbnQtMSkpOwogICAg ICBhbGlnbmVkc2l6ZSArPUJhc2VUOjpsZW5ndGgoKSAqCiAgICAgICAgZGltZW5zaW9uICogZWxt U2l6ZTsKICAgIH0KICAgIHJldHVybiBhbGlnbmVkc2l6ZTsKICB9CgogIGlubGluZSB2b2lkIG9w ZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3Bl cmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+ PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9 IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7Cn07CgoKCgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3Mg VF9zbGljZSwgaW50IGRpbWVuc2lvbj4KY2xhc3MgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9B cnJheV9fQm9vbGVhbgogICA6IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5 X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9Cb29sZWFuLGRpbWVuc2lvbiwxLDE+ CnsKcHVibGljOgogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29s ZWFuKCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVh bihfQ09SQkFfVUxvbmcgbWF4KQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5 X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9Cb29sZWFuLGRpbWVuc2lvbiwxLDE+ KG1heCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVh bihfQ09SQkFfVUxvbmcgbWF4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICp2YWx1ZSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jv b2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlf d19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5zaW9uLDEsMT4o bWF4LGxlbix2YWx1ZSxyZWxlYXNlKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVl bmNlX0FycmF5X19Cb29sZWFuIChjb25zdAogICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5j ZV9BcnJheV9fQm9vbGVhbjxULFRfc2xpY2UsZGltZW5zaW9uPiYgcykKICAgIDogX0NPUkJBX1Vu Ym91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxfQ09SQkFf Qm9vbGVhbixkaW1lbnNpb24sMSwxPihzKSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9zbGljZSxkaW1lbnNpb24+JgogICAgICBvcGVyYXRv cj0gKGNvbnN0CiAgICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVh bjxULFRfc2xpY2UsZGltZW5zaW9uPiYgcykgewogICAgICAgICAgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxfQ09SQkFfQm9vbGVhbixk aW1lbnNpb24sMSwxPjo6b3BlcmF0b3I9IChzKTsKICAgICAgICAgIHJldHVybiAqdGhpczsKICB9 CgogIGlubGluZSB+X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVhbigpIHt9 CgogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7 CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKTsKICBpbmxp bmUgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0OwogIGlubGlu ZSB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7Cgp9OwoKCgoKCnRlbXBs YXRlPGNsYXNzIFQsIGNsYXNzIFRfc2xpY2UsIGludCBkaW1lbnNpb24+CmNsYXNzIF9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0CiAgIDogcHVibGljIF9DT1JCQV9VbmJvdW5k ZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX09jdGV0 LGRpbWVuc2lvbiwxLDE+CnsKcHVibGljOgogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVl bmNlX0FycmF5X19PY3RldCgpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vf QXJyYXlfX09jdGV0KF9DT1JCQV9VTG9uZyBtYXgpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX09jdGV0LGRpbWVu c2lvbiwxLDE+KG1heCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJh eV9fT2N0ZXQoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX1VMb25nIGxlbiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9D T1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLF9DT1JCQV9PY3RldCxkaW1lbnNpb24s MSwxPihtYXgsbGVuLHZhbHVlLHJlbGVhc2UpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRf U2VxdWVuY2VfQXJyYXlfX09jdGV0IChjb25zdAogICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1 ZW5jZV9BcnJheV9fT2N0ZXQ8VCxUX3NsaWNlLGRpbWVuc2lvbj4mIHMpCiAgICA6IF9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJB X09jdGV0LGRpbWVuc2lvbiwxLDE+KHMpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfQXJyYXlfX09jdGV0PFQsVF9zbGljZSxkaW1lbnNpb24+JgogICAgICBvcGVyYXRvcj0g KGNvbnN0CiAgICAgICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fT2N0ZXQ8VCxU X3NsaWNlLGRpbWVuc2lvbj4mIHMpIHsKICAgICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVu Y2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsX0NPUkJBX09jdGV0LGRpbWVuc2lv biwxLDE+OjpvcGVyYXRvcj0gKHMpOwogICAgICAgICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5s aW5lIH5fQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X19PY3RldCgpIHt9Cn07CgoKCgoK dGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9zbGljZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24s aW50IG1heD4KY2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXkgOiBwdWJsaWMgX0NP UkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4gewpwdWJsaWM6CiAg dHlwZWRlZiBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPiBC YXNlVCA7CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5KCkgOiBfQ09SQkFf U2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPihtYXgsMSkge30KICBpbmxp bmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXkoX0NPUkJBX1VMb25nIGxlbiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqdmFsdWUsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAg ICAgICAgICA6IF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+ KG1heCxsZW4sdmFsdWUscmVsZWFzZSwxKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1 ZW5jZV9BcnJheShjb25zdCBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2Us VGVsbSxkaW1lbnNpb24sbWF4PiYgcykKICAgICAgICAgICAgOiBfQ09SQkFfU2VxdWVuY2VfQXJy YXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPihzKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRl ZF9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sbWF4PiAmb3BlcmF0b3I9 IChjb25zdCBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1l bnNpb24sbWF4PiAmcykgewogICAgQmFzZVQ6Om9wZXJhdG9yPSAocyk7CiAgICByZXR1cm4gKnRo aXM7CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5KCkge30KCgoK ICBpbmxpbmUgdm9pZCByZXBsYWNlKF9DT1JCQV9VTG9uZyBsZW4sIFQqIGRhdGEsX0NPUkJBX0Jv b2xlYW4gcmVsZWFzZSA9IDApIHsKICAgIEJhc2VUOjpyZXBsYWNlKG1heCxsZW4sZGF0YSxyZWxl YXNlKTsKICB9CgogIGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFs b2Zmc2V0KSBjb25zdCB7CiAgICBzaXplX3QgYWxpZ25lZHNpemUgPSAoKGluaXRpYWxvZmZzZXQr MykgJiB+KChpbnQpMykpK3NpemVvZihfQ09SQkFfVUxvbmcpOwogICAgZm9yIChfQ09SQkFfVUxv bmcgaT0wOyBpIDwgQmFzZVQ6Omxlbmd0aCgpOyBpKyspIHsKICAgICAgZm9yIChfQ09SQkFfVUxv bmcgaj0wOyBqIDwgZGltZW5zaW9uOyBqKyspIHsKICAgICAgICBhbGlnbmVkc2l6ZSA9ICgoVGVs bSopKEJhc2VUOjpOUF9kYXRhKClbaV0pK2opLT5fTlBfYWxpZ25lZFNpemUoYWxpZ25lZHNpemUp OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYWxpZ25lZHNpemU7CiAgfQp9OwoKCgoKCnRlbXBs YXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xhc3MgVGVsbSxpbnQgZGltZW5zaW9uLGludCBt YXgsaW50IGVsbVNpemUsIGludCBlbG1BbGlnbm1lbnQ+CmNsYXNzIF9DT1JCQV9Cb3VuZGVkX1Nl cXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQKICA6IHB1YmxpYyBfQ09SQkFfU2VxdWVuY2Vf QXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uPgp7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JC QV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+IEJhc2VUIDsKICBpbmxp bmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudCgpCiAgICA6 IF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+KG1heCwxKSB7 fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50 KF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFQqIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCkKICAgIDogX0NPUkJBX1NlcXVl bmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj4obWF4LGxlbix2YWx1ZSxyZWxlYXNl LDEpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVs ZW1lbnQoY29uc3QKICAgICAgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXpl RWxlbWVudDxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sbWF4LGVsbVNpemUsZWxtQWxpZ25tZW50 PiYgcykKICAgIDogX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lv bj4ocykge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXpl RWxlbWVudDxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sbWF4LGVsbVNpemUsZWxtQWxpZ25tZW50 PiYgb3BlcmF0b3I9KGNvbnN0IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6 ZUVsZW1lbnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLG1heCxlbG1TaXplLGVsbUFsaWdubWVu dD4mIHMpIHsKICAgIF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxkaW1lbnNp b24+OjpvcGVyYXRvcj0gKHMpOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIH5fQ09S QkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50KCkge30KCgoKICBpbmxp bmUgdm9pZCByZXBsYWNlKF9DT1JCQV9VTG9uZyBsZW4sIFQqIGRhdGEsX0NPUkJBX0Jvb2xlYW4g cmVsZWFzZSA9IDApIHsKICAgIF9DT1JCQV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsVGVsbSxk aW1lbnNpb24+OjpyZXBsYWNlKG1heCxsZW4sZGF0YSxyZWxlYXNlKTsKICB9CgoKICBpbmxpbmUg c2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3QgewogICAg c2l6ZV90IGFsaWduZWRzaXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50KTMpKStzaXpl b2YoX0NPUkJBX1VMb25nKTsKICAgIGlmIChCYXNlVDo6bGVuZ3RoKCkpIHsKICAgICAgYWxpZ25l ZHNpemUgPSAoKGFsaWduZWRzaXplKyhlbG1BbGlnbm1lbnQtMSkpICYgfihlbG1BbGlnbm1lbnQt MSkpOwogICAgICBhbGlnbmVkc2l6ZSArPSBCYXNlVDo6bGVuZ3RoKCkgKiBkaW1lbnNpb24gKiBl bG1TaXplOwogICAgfQogICAgcmV0dXJuIGFsaWduZWRzaXplOwogIH0KCiAgaW5saW5lIHZvaWQg b3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBv cGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogIGlubGluZSB2b2lkIG9wZXJhdG9y Pj49IChNZW1CdWZmZXJlZFN0cmVhbSAmcykgY29uc3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8 PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKTsKfTsKCgoKCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFz cyBUX3NsaWNlLCBpbnQgZGltZW5zaW9uLCBpbnQgbWF4PgpjbGFzcyBfQ09SQkFfQm91bmRlZF9T ZXF1ZW5jZV9BcnJheV9fQm9vbGVhbgogICA6IHB1YmxpYyBfQ09SQkFfQm91bmRlZF9TZXF1ZW5j ZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxfQ09SQkFfQm9vbGVhbixkaW1lbnNp b24sbWF4LDEsMT4KewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9B cnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxfQ09SQkFfQm9vbGVhbixkaW1lbnNpb24s bWF4LDEsMT4gQmFzZVQgOwogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9f Qm9vbGVhbigpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29s ZWFuKF9DT1JCQV9VTG9uZyBsZW4sIFQqIHZhbHVlLCBfQ09SQkFfQm9vbGVhbiByZWxlYXNlPTAp CiAgICA6IEJhc2VUIChsZW4sdmFsdWUscmVsZWFzZSkge30KICBpbmxpbmUgX0NPUkJBX0JvdW5k ZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW4oY29uc3QgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vf QXJyYXlfX0Jvb2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbixtYXg+JiBzKQogICAgOiBCYXNlVCAo cykge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW48VCxU X3NsaWNlLGRpbWVuc2lvbixtYXg+JgogICAgICBvcGVyYXRvcj0gKGNvbnN0CiAgICAgICAgX0NP UkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbixt YXg+JiBzKSB7CiAgICAgICAgICBCYXNlVCA6Om9wZXJhdG9yPSAocyk7CiAgICAgICAgICByZXR1 cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X19C b29sZWFuKCkge30KCiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFt ICZzKSBjb25zdDsKICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0g JnMpOwogIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmcykgY29u c3Q7CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKTsKCn07 CgoKCgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVF9zbGljZSwgaW50IGRpbWVuc2lvbiwgaW50 IG1heD4KY2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0CiAgIDogcHVi bGljIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3Ns aWNlLF9DT1JCQV9PY3RldCxkaW1lbnNpb24sbWF4LDEsMT4KewpwdWJsaWM6CiAgdHlwZWRlZiBf Q09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxf Q09SQkFfT2N0ZXQsZGltZW5zaW9uLG1heCwxLDE+IEJhc2VUIDsKICBpbmxpbmUgX0NPUkJBX0Jv dW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0KCkge30KICBpbmxpbmUgX0NPUkJBX0JvdW5kZWRf U2VxdWVuY2VfQXJyYXlfX09jdGV0KF9DT1JCQV9VTG9uZyBsZW4sIFQgKnZhbHVlLCBfQ09SQkFf Qm9vbGVhbiByZWxlYXNlID0gMCkKICAgIDogQmFzZVQgKGxlbix2YWx1ZSxyZWxlYXNlKSB7fQog IGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fT2N0ZXQoY29uc3QgX0NPUkJB X0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX09jdGV0PFQsVF9zbGljZSxkaW1lbnNpb24sbWF4PiYg cykKICAgIDogQmFzZVQgKHMpIHt9CiAgaW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0Fy cmF5X19PY3RldDxULFRfc2xpY2UsZGltZW5zaW9uLG1heD4mCiAgICAgIG9wZXJhdG9yPSAoY29u c3QKICAgICAgICBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fT2N0ZXQ8VCxUX3NsaWNl LGRpbWVuc2lvbixtYXg+JiBzKSB7CiAgICAgICAgICBCYXNlVCA6Om9wZXJhdG9yPSAocyk7CiAg ICAgICAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9Cb3VuZGVkX1NlcXVl bmNlX0FycmF5X19PY3RldCgpIHt9Cn07CgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBF bGVtVCwgY2xhc3MgVF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9TZXF1ZW5jZV9PYmpSZWYgewpwdWJs aWM6CiAgdHlwZWRlZiBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+IFRf c2VxOwoKICBpbmxpbmUgX0NPUkJBX1VMb25nIG1heGltdW0oKSBjb25zdCB7IHJldHVybiBwZF9t YXg7IH0KICBpbmxpbmUgX0NPUkJBX1VMb25nIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHBkX2xl bjsgfQogIGlubGluZSB2b2lkIGxlbmd0aChfQ09SQkFfVUxvbmcgbGVuKSB7CiAgICBpZiAocGRf Ym91bmRlZCAmJiBsZW4gPiBwZF9tYXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9y KCk7CgogICAgfQoKCiAgICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gbGVuOyBpIDwgcGRfbGVuOyBp KysgKQogICAgICBvcGVyYXRvcltdKGkpID0gVF9IZWxwZXI6Ol9uaWwoKTsKCiAgICBpZiAobGVu KSB7CgoKICAgICAgaWYgKCFwZF9kYXRhIHx8IGxlbiA+IHBkX21heCkgewogICAgICAgIGNvcHli dWZmZXIoKChsZW4gPiBwZF9tYXgpID8gbGVuIDogcGRfbWF4KSk7CiAgICAgIH0KICAgIH0KCiAg ICBwZF9sZW4gPSBsZW47CiAgfQoKICBpbmxpbmUgRWxlbVQgb3BlcmF0b3JbXSAoX0NPUkJBX1VM b25nIGkpIHsKICAgIGlmKCBpID49IHBkX2xlbiApIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigp OwogICAgcmV0dXJuIEVsZW1UKHBkX2RhdGFbaV0scGRfcmVsKTsKICB9CiAgaW5saW5lIGNvbnN0 IEVsZW1UIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpKSBjb25zdCB7CiAgICBpZiggaSA+PSBw ZF9sZW4gKSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVybiBFbGVtVChwZF9k YXRhW2ldLHBkX3JlbCk7CiAgfQoKCiAgdHlwZWRlZiBsb25nIHB0cl9hcml0aF90OwoKCgoKCgog IHN0YXRpYyBpbmxpbmUgVCoqIGFsbG9jYnVmKF9DT1JCQV9VTG9uZyBuZWxlbXMpIHsKICAgIGlm ICghbmVsZW1zKSByZXR1cm4gMDsKICAgIFQqKiBiID0gbmV3IFQqW25lbGVtcysyXTsKICAgIHB0 cl9hcml0aF90IGwgPSBuZWxlbXM7CiAgICBmb3IgKF9DT1JCQV9VTG9uZyBpID0gMjsgaSA8IG5l bGVtcysyOyBpKyspIHsKICAgICAgYltpXSA9IFRfSGVscGVyOjpfbmlsKCk7CiAgICB9CiAgICBi WzBdID0gKFQqKSAoKHB0cl9hcml0aF90KTB4NTM1MTRGNEFVKTsKICAgIGJbMV0gPSAoVCopIGw7 CiAgICByZXR1cm4gYisyOwogIH0KCiAgc3RhdGljIGlubGluZSB2b2lkIGZyZWVidWYoVCoqIGJ1 ZikgewogICAgaWYgKCFidWYpIHJldHVybjsKICAgIFQqKiBiID0gYnVmLTI7CiAgICBpZiAoKHB0 cl9hcml0aF90KWJbMF0gIT0gKChwdHJfYXJpdGhfdCkgMHg1MzUxNEY0QVUpKSB7CiAgICAgIF9D T1JCQV9iYWRfcGFyYW1fZnJlZWJ1ZigpOwogICAgICByZXR1cm47CiAgICB9CiAgICBwdHJfYXJp dGhfdCBsID0gKHB0cl9hcml0aF90KSBiWzFdOwogICAgZm9yIChfQ09SQkFfVUxvbmcgaSA9IDA7 IGkgPCAoX0NPUkJBX1VMb25nKSBsOyBpKyspIHsKICAgICAgaWYgKCFUX0hlbHBlcjo6aXNfbmls KGJ1ZltpXSkpCiAgICAgICAgVF9IZWxwZXI6OnJlbGVhc2UoYnVmW2ldKTsKICAgIH0KICAgIGJb MF0gPSAoVCopIDA7CiAgICBkZWxldGUgW10gYjsKICB9CgoKICBpbmxpbmUgX0NPUkJBX0Jvb2xl YW4gcmVsZWFzZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3JlbDsgfQoKICBpbmxpbmUgVCoqIGdldF9i dWZmZXIoX0NPUkJBX0Jvb2xlYW4gb3JwaGFuID0gMCkgewogICAgaWYgKHBkX21heCAmJiAhcGRf ZGF0YSkgewogICAgICBjb3B5YnVmZmVyKHBkX21heCk7CiAgICB9CiAgICBpZiAoIW9ycGhhbikg ewogICAgICByZXR1cm4gcGRfZGF0YTsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiAoIXBkX3Jl bCkKICAgICAgICByZXR1cm4gMDsKICAgICAgZWxzZSB7CiAgICAgICAgVCoqIHRtcCA9IHBkX2Rh dGE7CiAgICAgICAgcGRfZGF0YSA9IDA7CiAgICAgICAgaWYgKCFwZF9ib3VuZGVkKSB7CiAgICAg ICAgICBwZF9tYXggPSAwOwogICAgICAgIH0KICAgICAgICBwZF9sZW4gPSAwOwogICAgICAgIHBk X3JlbCA9IDE7CiAgICAgICAgcmV0dXJuIHRtcDsKICAgICAgfQogICAgfQogIH0KCiAgaW5saW5l IFQqY29uc3QgKiBnZXRfYnVmZmVyKCkgY29uc3QgewogICAgaWYgKHBkX21heCAmJiAhcGRfZGF0 YSkgewoKICAgICAgVF9zZXEqIHMgPSBjb25zdF9jYXN0PFRfc2VxKj4odGhpcyk7CgoKCiAgICAg IHMtPmNvcHlidWZmZXIocGRfbWF4KTsKICAgIH0KICAgIHJldHVybiBwZF9kYXRhOwogIH0KCiAg aW5saW5lIH5fQ09SQkFfU2VxdWVuY2VfT2JqUmVmKCkgewogICAgaWYgKHBkX3JlbCAmJiBwZF9k YXRhKSBmcmVlYnVmKHBkX2RhdGEpOwogICAgcGRfZGF0YSA9IDA7CiAgfQoKCgogIGlubGluZSBz aXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdCB7CiAgICBz aXplX3QgYWxpZ25lZHNpemUgPSAoKGluaXRpYWxvZmZzZXQrMykgJiB+KChpbnQpMykpK3NpemVv ZihfQ09SQkFfVUxvbmcpOwogICAgZm9yICh1bnNpZ25lZCBsb25nIGk9MDsgaSA8IGxlbmd0aCgp OyBpKyspIHsKICAgICAgYWxpZ25lZHNpemUgPSBUX0hlbHBlcjo6TlBfYWxpZ25lZFNpemUocGRf ZGF0YVtpXSxhbGlnbmVkc2l6ZSk7CiAgICB9CiAgICByZXR1cm4gYWxpZ25lZHNpemU7CiAgfQoK ICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpIGNvbnN0Owog IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAmcyk7CiAgaW5saW5l IHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICZzKSBjb25zdDsKICBpbmxpbmUg dm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMpOwoKcHJvdGVjdGVkOgogIGlu bGluZSBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmKCkKICAgIDogcGRfbWF4KDApLCBwZF9sZW4oMCks IHBkX3JlbCgxKSwgcGRfYm91bmRlZCgwKSwgcGRfZGF0YSgwKSB7fQoKICBpbmxpbmUgX0NPUkJB X1NlcXVlbmNlX09ialJlZihfQ09SQkFfVUxvbmcgbWF4LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIGJvdW5kZWQ9MCkKICAgIDogcGRfbWF4KG1heCksIHBk X2xlbigwKSwgcGRfcmVsKDEpLCBwZF9ib3VuZGVkKGJvdW5kZWQpLCBwZF9kYXRhKDApIHt9Cgog IGlubGluZSBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmKF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW4sCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFQqKiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfQ09SQkFfQm9vbGVhbiByZWxlYXNlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfQ09SQkFfQm9vbGVhbiBib3VuZGVkID0gMCkKICAgIDogcGRfbWF4KG1heCksIHBk X2xlbihsZW4pLCBwZF9yZWwocmVsZWFzZSksCiAgICAgIHBkX2JvdW5kZWQoYm91bmRlZCksIHBk X2RhdGEodmFsdWUpCiAgewogICAgaWYgKGxlbiA+IG1heCB8fCAobGVuICYmICF2YWx1ZSkpIHsK ICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CgogICAgfQogIH0KCiAgaW5saW5lIF9D T1JCQV9TZXF1ZW5jZV9PYmpSZWYoY29uc3QgVF9zZXEmIHMpCiAgICA6IHBkX21heChzLnBkX21h eCksIHBkX2xlbigwKSwgcGRfcmVsKDEpLAogICAgICBwZF9ib3VuZGVkKHMucGRfYm91bmRlZCks IHBkX2RhdGEoMCkgewogICAgbGVuZ3RoKHMucGRfbGVuKTsKICAgIGZvciggX0NPUkJBX1VMb25n IGkgPSAwOyBpIDwgcGRfbGVuOyBpKysgKQogICAgICBvcGVyYXRvcltdKGkpID0gc1tpXTsKICB9 CgogIGlubGluZSBUX3NlcSYgb3BlcmF0b3I9IChjb25zdCBUX3NlcSYgcykgewogICAgbGVuZ3Ro KHMucGRfbGVuKTsKICAgIGZvciggX0NPUkJBX1VMb25nIGkgPSAwOyBpIDwgcGRfbGVuOyBpKysg KQogICAgICBvcGVyYXRvcltdKGkpID0gc1tpXTsKICAgIHJldHVybiAqdGhpczsKICB9CgoKICBp bmxpbmUgdm9pZCByZXBsYWNlKF9DT1JCQV9VTG9uZyBtYXgsIF9DT1JCQV9VTG9uZyBsZW4sIFQq KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDAp IHsKICAgIGlmIChsZW4gPiBtYXggfHwgKGxlbiAmJiAhZGF0YSkpIHsKICAgICAgX0NPUkJBX2Jv dW5kX2NoZWNrX2Vycm9yKCk7CgogICAgfQogICAgaWYgKHBkX3JlbCAmJiBwZF9kYXRhKSB7CiAg ICAgIGZyZWVidWYocGRfZGF0YSk7CiAgICB9CiAgICBwZF9tYXggPSBtYXg7CiAgICBwZF9sZW4g PSBsZW47CiAgICBwZF9kYXRhID0gZGF0YTsKICAgIHBkX3JlbCA9IHJlbGVhc2U7CiAgfQoKCnBy aXZhdGU6CgogIHZvaWQgY29weWJ1ZmZlcihfQ09SQkFfVUxvbmcgbmV3bWF4KSB7CgoKCiAgICBU KiogbmV3ZGF0YSA9IGFsbG9jYnVmKG5ld21heCk7CiAgICBpZiAoIW5ld2RhdGEpIHsKICAgICAg X0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwoKICAgIH0KICAgIGZvciAodW5zaWdu ZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKykgewogICAgICBpZiAocGRfcmVsKSB7CiAgICAg ICAgbmV3ZGF0YVtpXSA9IHBkX2RhdGFbaV07CiAgICAgICAgcGRfZGF0YVtpXSA9IFRfSGVscGVy OjpfbmlsKCk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgVF9IZWxwZXI6OmR1cGxpY2F0 ZShwZF9kYXRhW2ldKTsKICAgICAgICBuZXdkYXRhW2ldID0gcGRfZGF0YVtpXTsKICAgICAgfQog ICAgfQogICAgaWYgKHBkX3JlbCAmJiBwZF9kYXRhKSB7CiAgICAgIGZyZWVidWYocGRfZGF0YSk7 CiAgICB9CiAgICBlbHNlIHsKICAgICAgcGRfcmVsID0gMTsKICAgIH0KICAgIHBkX2RhdGEgPSBu ZXdkYXRhOwogICAgcGRfbWF4ID0gbmV3bWF4OwogIH0KCiAgX0NPUkJBX1VMb25nIHBkX21heDsK ICBfQ09SQkFfVUxvbmcgcGRfbGVuOwogIF9DT1JCQV9Cb29sZWFuIHBkX3JlbDsKICBfQ09SQkFf Qm9vbGVhbiBwZF9ib3VuZGVkOwogIFQqKiBwZF9kYXRhOwp9OwoKCgoKCnRlbXBsYXRlIDxjbGFz cyBULCBjbGFzcyBFbGVtVCwgY2xhc3MgVF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9VbmJvdW5kZWRf U2VxdWVuY2VfT2JqUmVmIDogcHVibGljIF9DT1JCQV9TZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxU X0hlbHBlcj4gewpwdWJsaWM6CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2Jq UmVmKCkge30KICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9PYmpSZWYoX0NPUkJB X1VMb25nIG1heCkKICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9DT1JCQV9TZXF1ZW5jZV9P YmpSZWY8VCxFbGVtVCxUX0hlbHBlcj4obWF4KSB7fQogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlX09ialJlZihfQ09SQkFfVUxvbmcgbWF4LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfQ09SQkFfVUxvbmcgbGVuLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBUICoqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKQogICAgIDogX0NP UkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPihtYXgsbGVuLHZhbHVlLHJlbGVh c2UpIHt9CiAgaW5saW5lIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmKGNvbnN0IF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+JiBzKQogICAg IDogX0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPihzKSB7fQogIGlubGlu ZSB+X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9PYmpSZWYoKSB7fQogIGlubGluZSBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPiAmb3BlcmF0b3I9IChj b25zdCBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPiAm cykgewogICAgX0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRfSGVscGVyPjo6b3BlcmF0 b3I9IChzKTsKICAgIHJldHVybiAqdGhpczsKICB9CgoKICBpbmxpbmUgdm9pZCByZXBsYWNlKF9D T1JCQV9VTG9uZyBtYXgsIF9DT1JCQV9VTG9uZyBsZW4sIFQqKiBkYXRhLAogICAgICAgICAgICAg ICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApIHsKICAgIF9DT1JCQV9TZXF1ZW5j ZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj46OnJlcGxhY2UobWF4LGxlbixkYXRhLHJlbGVhc2Up OwogIH0KfTsKCgoKCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBFbGVtVCxjbGFzcyBUX0hlbHBl cixpbnQgbWF4PgpjbGFzcyBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9PYmpSZWYKICA6IHB1Ymxp YyBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+CnsKcHVibGljOgogIGlu bGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9PYmpSZWYoKSA6CiAgICAgICAgICAgICAgICAg ICAgICBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+KG1heCwxKXt9CiAg aW5saW5lIF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX09ialJlZihfQ09SQkFfVUxvbmcgbGVuLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAqKnZhbHVlLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9 IDApCiAgICAgOiBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+KG1heCxs ZW4sdmFsdWUscmVsZWFzZSwxKSB7fQogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9P YmpSZWYoY29uc3QgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxw ZXIsbWF4PiYgcykgOiBfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+KHMp IHt9CiAgaW5saW5lIH5fQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9PYmpSZWYoKSB7fQogIGlubGlu ZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcixtYXg+ICZv cGVyYXRvcj0gKGNvbnN0IF9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX09ialJlZjxULEVsZW1ULFRf SGVscGVyLG1heD4gJnMpIHsKICAgIF9DT1JCQV9TZXF1ZW5jZV9PYmpSZWY8VCxFbGVtVCxUX0hl bHBlcj46Om9wZXJhdG9yPSAocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5saW5lIHZv aWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbGVuLCBUKiogZGF0YSwKICAgICAgICAgICAgICAgICAg ICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBfQ09SQkFfU2VxdWVuY2VfT2Jq UmVmPFQsRWxlbVQsVF9IZWxwZXI+OjpyZXBsYWNlKG1heCxsZW4sZGF0YSxyZWxlYXNlKTsKICB9 Cn07CgoKdHlwZWRlZiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldCBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX09jdGV0OwojIDE1MSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIz L29tbmlJbnRlcm5hbC5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvR0lP UC5oIiAxIDMKIyA0OCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL0dJT1AuaCIgMwojIDEg Ii91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9DT1JCQV9zeXNkZXAuaCIgMSAzCiMgNDkgIi91 c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9HSU9QLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvaW5j bHVkZS9vbW5pT1JCMy9DT1JCQV9iYXNldHlwZXMuaCIgMSAzCiMgNTAgIi91c3IvbG9jYWwvaW5j bHVkZS9vbW5pT1JCMy9HSU9QLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JC My9JT1AuaCIgMSAzCiMgNjIgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9JT1AuaCIgMwpj bGFzcyBJT1AgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfVUxvbmcgUHJvZmlsZUlkOwogIHN0 YXRpYyBjb25zdCBQcm9maWxlSWQgVEFHX0lOVEVSTkVUX0lPUDsKICBzdGF0aWMgY29uc3QgUHJv ZmlsZUlkIFRBR19NVUxUSVBMRV9DT01QT05FTlRTOwoKICBzdHJ1Y3QgVGFnZ2VkUHJvZmlsZSB7 CiAgICBQcm9maWxlSWQgdGFnOwogICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9PY3RldCBw cm9maWxlX2RhdGE7CgoKICAgIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxv ZmZzZXQpIHsKICAgICAgc2l6ZV90IGFsaWduZWRzaXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYg figoaW50KTMpKQogICAgICAgICAgICAgKyBzaXplb2YoUHJvZmlsZUlkKTsKICAgICAgcmV0dXJu IHByb2ZpbGVfZGF0YS5fTlBfYWxpZ25lZFNpemUoYWxpZ25lZHNpemUpOwogICAgfQogICAgdm9p ZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogICAgdm9pZCBvcGVyYXRvcjw8 PSAoTmV0QnVmZmVyZWRTdHJlYW0gJnMpOwogICAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVy ZWRTdHJlYW0gJnMpOwogICAgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJnMp OwogIH07CgogIHR5cGVkZWYgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTxUYWdnZWRQcm9maWxl PiBUYWdnZWRQcm9maWxlTGlzdDsKCiAgY2xhc3MgVGFnZ2VkUHJvZmlsZUxpc3RfdmFyIHsKICBw dWJsaWM6CiAgICBUYWdnZWRQcm9maWxlTGlzdF92YXIoKSB7IF9wdHIgPSAwOyB9CiAgICBUYWdn ZWRQcm9maWxlTGlzdF92YXIoVGFnZ2VkUHJvZmlsZUxpc3QqIHApIHsgX3B0ciA9IHA7IH0KICAg IFRhZ2dlZFByb2ZpbGVMaXN0X3ZhcihUYWdnZWRQcm9maWxlTGlzdF92YXImIHApOwogICAgflRh Z2dlZFByb2ZpbGVMaXN0X3ZhcigpIHsgaWYgKF9wdHIpIGRlbGV0ZSBfcHRyOyB9CiAgICBUYWdn ZWRQcm9maWxlTGlzdF92YXImIG9wZXJhdG9yPSAoY29uc3QgVGFnZ2VkUHJvZmlsZUxpc3RfdmFy JiBwKSB7CiAgICAgIGlmIChwLl9wdHIpIHsKICAgICAgICBpZiAoIV9wdHIpIHsKICAgICAgICAg IF9wdHIgPSBuZXcgVGFnZ2VkUHJvZmlsZUxpc3Q7CiAgICAgICAgICBpZiAoIV9wdHIpIHsKICAg ICAgICAgICAgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwoKICAgICAgICAgIH0K ICAgICAgICB9CiAgICAgICAgKl9wdHIgPSAqcC5fcHRyOwogICAgICB9CiAgICAgIGVsc2Ugewog ICAgICAgIGlmIChfcHRyKSBkZWxldGUgX3B0cjsKICAgICAgICBfcHRyID0gMDsKICAgICAgfQog ICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBUYWdnZWRQcm9maWxlTGlzdF92YXImIG9wZXJh dG9yPSAoVGFnZ2VkUHJvZmlsZUxpc3QqIHApIHsKICAgICAgaWYgKF9wdHIpIGRlbGV0ZSBfcHRy OwogICAgICBfcHRyID0gcDsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgVGFnZ2VkUHJv ZmlsZSYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4KSB7CiAgICAgIHJldHVybiAoX3B0 ci0+TlBfZGF0YSgpKVtpbmRleF07CiAgICB9CiAgICBjb25zdCBUYWdnZWRQcm9maWxlJiBvcGVy YXRvcltdIChfQ09SQkFfVUxvbmcgaW5kZXgpIGNvbnN0IHsKICAgICAgcmV0dXJuIChfcHRyLT5O UF9kYXRhKCkpW2luZGV4XTsKICAgIH0KICAgIGlubGluZSBUYWdnZWRQcm9maWxlTGlzdCogb3Bl cmF0b3ItPigpIGNvbnN0IHsKICAgICAgcmV0dXJuIChUYWdnZWRQcm9maWxlTGlzdCopX3B0cjsK ICAgIH0KICAgIFRhZ2dlZFByb2ZpbGVMaXN0KiBfcHRyOwogIH07CgogIHN0cnVjdCBJT1Igewog ICAgX0NPUkJBX0NoYXIgKnR5cGVfaWQ7CiAgICBUYWdnZWRQcm9maWxlTGlzdCBwcm9maWxlczsK CgogICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgewogICAg ICBzaXplX3QgYWxpZ25lZHNpemUgPSAoKGluaXRpYWxvZmZzZXQrMykgJiB+KChpbnQpMykpCiAg ICAgICAgICAgICArIHNpemVvZihfQ09SQkFfVUxvbmcpOwogICAgICBhbGlnbmVkc2l6ZSArPSBz dHJsZW4oKGNvbnN0IGNoYXIgKil0eXBlX2lkKSArIDE7CiAgICAgIHJldHVybiBwcm9maWxlcy5f TlBfYWxpZ25lZFNpemUoYWxpZ25lZHNpemUpOwogICAgfQogIH07CgogIHR5cGVkZWYgX0NPUkJB X1VMb25nIENvbXBvbmVudElkOwoKICBzdHJ1Y3QgVGFnZ2VkQ29tcG9uZW50IHsKICAgIENvbXBv bmVudElkIHRhZzsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2N0ZXQgY29tcG9uZW50 X2RhdGE7CgoKICAgIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQp IHsKICAgICAgc2l6ZV90IGFsaWduZWRzaXplID0gKChpbml0aWFsb2Zmc2V0KzMpICYgfigoaW50 KTMpKQogICAgICAgICAgICAgKyBzaXplb2YoX0NPUkJBX1VMb25nKTsKICAgICAgcmV0dXJuIGNv bXBvbmVudF9kYXRhLl9OUF9hbGlnbmVkU2l6ZShhbGlnbmVkc2l6ZSk7CiAgICB9CiAgICB2b2lk IG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmcyk7CiAgICB2b2lkIG9wZXJhdG9yPDw9 IChOZXRCdWZmZXJlZFN0cmVhbSAmcyk7CiAgICB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJl ZFN0cmVhbSAmcyk7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7 CiAgfTsKCiAgdHlwZWRlZiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPFRhZ2dlZENvbXBvbmVu dD4gTXVsdGlwbGVDb21wb25lbnRQcm9maWxlOwoKICB0eXBlZGVmIF9DT1JCQV9VTG9uZyBTZXJ2 aWNlSUQ7CgogIHN0cnVjdCBTZXJ2aWNlQ29udGV4dCB7CiAgICBTZXJ2aWNlSUQgY29udGV4dF9p ZDsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0IGNvbnRleHRfZGF0YTsKCgog ICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgewogICAgICBz aXplX3QgYWxpZ25lZHNpemUgPSAoKGluaXRpYWxvZmZzZXQrMykgJiB+KChpbnQpMykpCiAgICAg ICAgICAgICArIHNpemVvZihfQ09SQkFfVUxvbmcpOwogICAgICByZXR1cm4gY29udGV4dF9kYXRh Ll9OUF9hbGlnbmVkU2l6ZShhbGlnbmVkc2l6ZSk7CiAgICB9CiAgICB2b2lkIG9wZXJhdG9yPj49 IChOZXRCdWZmZXJlZFN0cmVhbSAmcyk7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJl ZFN0cmVhbSAmcyk7CiAgICB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7 CiAgICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmcyk7CiAgfTsKCiAgdHlw ZWRlZiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPFNlcnZpY2VDb250ZXh0PiBTZXJ2aWNlQ29u dGV4dExpc3Q7CgogIHN0YXRpYyBjb25zdCBTZXJ2aWNlSUQgVHJhbnNhY3Rpb25TZXJ2aWNlOwoK CgogIHN0YXRpYyBfQ09SQkFfQ2hhciAqIGlvclRvRW5jYXBTdHIoY29uc3QgX0NPUkJBX0NoYXIg KnR5cGVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYWdn ZWRQcm9maWxlTGlzdCAqcHJvZmlsZXMpOwoKCgoKICBzdGF0aWMgdm9pZCBFbmNhcFN0clRvSW9y KGNvbnN0IF9DT1JCQV9DaGFyICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09S QkFfQ2hhciAqJnR5cGVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdnZWRQcm9m aWxlTGlzdCAqJnByb2ZpbGVzKTsKCgoKCgp9OwojIDUxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21u aU9SQjMvR0lPUC5oIiAyIDMKCgpjbGFzcyBHSU9QIHsKcHVibGljOgogIGVudW0gTXNnVHlwZSB7 CiAgICBSZXF1ZXN0ID0gMCwKICAgIFJlcGx5ID0gMSwKICAgIENhbmNlbFJlcXVlc3QgPSAyLAog ICAgTG9jYXRlUmVxdWVzdCA9IDMsCiAgICBMb2NhdGVSZXBseSA9IDQsCiAgICBDbG9zZUNvbm5l Y3Rpb24gPSA1LAogICAgTWVzc2FnZUVycm9yID0gNgogIH07CgogIHN0cnVjdCBWZXJzaW9uIHsK ICAgIF9DT1JCQV9DaGFyIG1ham9yOwogICAgX0NPUkJBX0NoYXIgbWlub3I7CiAgfTsKCiAgc3Ry dWN0IE1lc3NhZ2VIZWFkZXIgewogICAgX0NPUkJBX0NoYXIgbWFnaWMgWzRdOwogICAgVmVyc2lv biBHSU9QX3ZlcnNpb247CiAgICBfQ09SQkFfQm9vbGVhbiBieXRlX29yZGVyOwogICAgX0NPUkJB X09jdGV0IG1lc3NhZ2VfdHlwZTsKICAgIF9DT1JCQV9VTG9uZyBtZXNzYWdlX3NpemU7CiAgfTsK CiAgY2xhc3MgUmVxdWVzdEhlYWRlciB7CiAgcHVibGljOgogICAgSU9QOjpTZXJ2aWNlQ29udGV4 dExpc3Qgc2VydmljZV9jb250ZXh0OwogICAgX0NPUkJBX1VMb25nIHJlcXVlc3RfaWQ7CiAgICBf Q09SQkFfQm9vbGVhbiByZXNwb25zZV9leHBlY3RlZDsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfX09jdGV0IG9iamVjdF9rZXk7CiAgICBfQ09SQkFfQ2hhciogb3BlcmF0aW9uOwogICAg X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgcmVxdWVzdGluZ19wcmluY2lwYWw7CiAg fTsKCiAgZW51bSBSZXBseVN0YXR1c1R5cGUgewogICAgTk9fRVhDRVBUSU9OLAogICAgVVNFUl9F WENFUFRJT04sCiAgICBTWVNURU1fRVhDRVBUSU9OLAogICAgTE9DQVRJT05fRk9SV0FSRAogIH07 CgogIGNsYXNzIFJlcGx5SGVhZGVyIHsKICBwdWJsaWM6CiAgICBJT1A6OlNlcnZpY2VDb250ZXh0 TGlzdCBzZXJ2aWNlX2NvbnRleHQ7CiAgICBfQ09SQkFfVUxvbmcgcmVxdWVzdF9pZDsKICAgIFJl cGx5U3RhdHVzVHlwZSByZXBseV9zdGF0dXM7CiAgfTsKCiAgc3RydWN0IENhbmNlbFJlcXVlc3RI ZWFkZXIgewogICAgX0NPUkJBX1VMb25nIHJlcXVlc3RfaWQ7CiAgfTsKCiAgc3RydWN0IExvY2F0 ZVJlcXVlc3RIZWFkZXIgewogIHB1YmxpYzoKICAgIF9DT1JCQV9VTG9uZyByZXF1ZXN0X2lkOwog ICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgb2JqZWN0X2tleTsKICB9OwoKICBl bnVtIExvY2F0ZVN0YXR1c1R5cGUgewogICAgVU5LTk9XTl9PQkpFQ1QsCiAgICBPQkpFQ1RfSEVS RSwKICAgIE9CSkVDVF9GT1JXQVJECiAgfTsKCiAgc3RydWN0IExvY2F0ZVJlcGx5SGVhZGVyIHsK ICAgIF9DT1JCQV9VTG9uZyByZXF1ZXN0X2lkOwogICAgTG9jYXRlU3RhdHVzVHlwZSBsb2NhdGVf c3RhdHVzOwogIH07Cn07CiMgMTUyICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaUlu dGVybmFsLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9JSU9QLmgiIDEg MwojIDc2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvSUlPUC5oIiAzCmNsYXNzIElJT1Ag ewpwdWJsaWM6CgogIHN0cnVjdCBWZXJzaW9uIHsKICAgIF9DT1JCQV9DaGFyIG1ham9yOwogICAg X0NPUkJBX0NoYXIgbWlub3I7CiAgfTsKCgogIHN0YXRpYyBjb25zdCBfQ09SQkFfQ2hhciBjdXJy ZW50X21ham9yOwogIHN0YXRpYyBjb25zdCBfQ09SQkFfQ2hhciBjdXJyZW50X21pbm9yOwoKICBz dHJ1Y3QgUHJvZmlsZUJvZHkgewogICAgVmVyc2lvbiBpaW9wX3ZlcnNpb247CiAgICBfQ09SQkFf Q2hhciogaG9zdDsKICAgIF9DT1JCQV9VU2hvcnQgcG9ydDsKICAgIF9DT1JCQV9VbmJvdW5kZWRf U2VxdWVuY2VfT2N0ZXQgb2JqZWN0X2tleTsKCiAgICB+UHJvZmlsZUJvZHkoKSB7IGlmIChob3N0 KSBkZWxldGUgW10gaG9zdDsgfQogIH07CgogIHN0YXRpYyBjb25zdCBfQ09SQkFfVVNob3J0IERF RkFVTFRfQ09SQkFMT0NfUE9SVDsKfTsKIyAxNTMgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JC My9vbW5pSW50ZXJuYWwuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29t bmlPYmpLZXkuaCIgMSAzCiMgNDAgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT2Jq S2V5LmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDEgMwojIDQxICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvb21uaU9iaktleS5oIiAyIDMKCgpjbGFzcyBNZW1CdWZmZXJlZFN0 cmVhbTsKY2xhc3MgTmV0QnVmZmVyZWRTdHJlYW07CgoKCgoKCmNsYXNzIG9tbmlPYmpLZXkgewpw dWJsaWM6CiAgaW5saW5lIG9tbmlPYmpLZXkoKSA6IHBkX2tleShwZF9pbmxpbmVfYnVmKSwgcGRf c2l6ZSgwKSB7fQoKICBpbmxpbmUgb21uaU9iaktleShjb25zdCBfQ09SQkFfT2N0ZXQqIGtleSwg aW50IHNpemUpCiAgICA6IHBkX2tleShwZF9pbmxpbmVfYnVmKSwgcGRfc2l6ZShzaXplKSB7CiAg ICBpZiggc2l6ZSA+IDE0ICkgcGRfa2V5ID0gbmV3IF9DT1JCQV9PY3RldFtzaXplXTsKICAgIG1l bWNweShwZF9rZXksIGtleSwgc2l6ZSk7CiAgfQoKCiAgaW5saW5lIG9tbmlPYmpLZXkoX0NPUkJB X09jdGV0KiBrZXksIGludCBzaXplKQogICAgOiBwZF9rZXkoa2V5KSwgcGRfc2l6ZShzaXplKSB7 CiAgICBpZiggc2l6ZSA8PSAxNCApIHsKICAgICAgcGRfa2V5ID0gcGRfaW5saW5lX2J1ZjsKICAg ICAgbWVtY3B5KHBkX2tleSwga2V5LCBzaXplKTsKICAgICAgZGVsZXRlW10ga2V5OwogICAgfQog IH0KCgogIGlubGluZSBvbW5pT2JqS2V5KG9tbmlPYmpLZXkmIGssIGludCByZWxlYXNlKQogICAg OiBwZF9zaXplKGsucGRfc2l6ZSkgewogICAgaWYoIHBkX3NpemUgPD0gMTQgKSB7CiAgICAgIHBk X2tleSA9IHBkX2lubGluZV9idWY7CiAgICB9CiAgICBlbHNlIGlmKCByZWxlYXNlICkgewoKICAg ICAgcGRfa2V5ID0gay5wZF9rZXk7CiAgICAgIGsucGRfa2V5ID0gay5wZF9pbmxpbmVfYnVmOwog ICAgICBrLnBkX3NpemUgPSAwOwogICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlIHsKICAgICAg cGRfa2V5ID0gbmV3IF9DT1JCQV9PY3RldFtwZF9zaXplXTsKICAgIH0KICAgIG1lbWNweShwZF9r ZXksIGsucGRfa2V5LCBwZF9zaXplKTsKICB9CgoKCgogIGlubGluZSB+b21uaU9iaktleSgpIHsK ICAgIGlmKCBwZF9rZXkgIT0gcGRfaW5saW5lX2J1ZiApIGRlbGV0ZVtdIHBkX2tleTsKICB9Cgog IGlubGluZSBjb25zdCBfQ09SQkFfT2N0ZXQqIGtleSgpIGNvbnN0IHsgcmV0dXJuIHBkX2tleTsg fQogIGlubGluZSBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3NpemU7IH0KCiAgaW5saW5l IGludCBpc19lcXVhbChjb25zdCBfQ09SQkFfT2N0ZXQqIGtleSwgaW50IGtleXNpemUpIGNvbnN0 IHsKICAgIHJldHVybiBrZXlzaXplID09IHBkX3NpemUgJiYgIW1lbWNtcChrZXksIHBkX2tleSwg a2V5c2l6ZSk7CiAgfQoKICBpbmxpbmUgdm9pZCBzZXRfc2l6ZShpbnQgc2l6ZSkgewogICAgaWYo IHNpemUgPiBwZF9zaXplICYmIHNpemUgPiAxNCApIHsKICAgICAgaWYoIHBkX2tleSAhPSBwZF9p bmxpbmVfYnVmICkgZGVsZXRlW10gcGRfa2V5OwogICAgICBwZF9rZXkgPSBuZXcgX0NPUkJBX09j dGV0W3NpemVdOwogICAgfQogICAgcGRfc2l6ZSA9IHNpemU7CiAgfQogIGlubGluZSBfQ09SQkFf T2N0ZXQqIHdyaXRlX2tleSgpIHsgcmV0dXJuIHBkX2tleTsgfQoKICBpbmxpbmUgdm9pZCBjb3B5 KGNvbnN0IF9DT1JCQV9PY3RldCoga2V5LCBpbnQga2V5c2l6ZSkgewogICAgc2V0X3NpemUoa2V5 c2l6ZSk7CiAgICBtZW1jcHkocGRfa2V5LCBrZXksIGtleXNpemUpOwogIH0KCgoKCgoKCiAgaW5s aW5lIF9DT1JCQV9PY3RldCogcmV0dXJuX2tleSgpIHsKICAgIGlmKCBwZF9rZXkgIT0gcGRfaW5s aW5lX2J1ZiApIHsKICAgICAgX0NPUkJBX09jdGV0KiB0bXAgPSBwZF9rZXk7CiAgICAgIHBkX2tl eSA9IHBkX2lubGluZV9idWY7CiAgICAgIHBkX3NpemUgPSAwOwogICAgICByZXR1cm4gdG1wOwog ICAgfQogICAgX0NPUkJBX09jdGV0KiB0bXAgPSBuZXcgX0NPUkJBX09jdGV0W3BkX3NpemVdOwog ICAgbWVtY3B5KHRtcCwgcGRfa2V5LCBwZF9zaXplKTsKICAgIHJldHVybiB0bXA7CiAgfQoKcHJp dmF0ZToKICBfQ09SQkFfT2N0ZXQgcGRfaW5saW5lX2J1ZlsxNF07CiAgX0NPUkJBX09jdGV0KiBw ZF9rZXk7CiAgaW50IHBkX3NpemU7Cn07CiMgMTU0ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9S QjMvb21uaUludGVybmFsLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy90 cmFjZWR0aHJlYWQuaCIgMSAzCiMgNjAgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy90cmFj ZWR0aHJlYWQuaCIgMwp0eXBlZGVmIG9tbmlfbXV0ZXggb21uaV90cmFjZWRtdXRleDsKdHlwZWRl ZiBvbW5pX211dGV4X2xvY2sgb21uaV90cmFjZWRtdXRleF9sb2NrOwp0eXBlZGVmIG9tbmlfY29u ZGl0aW9uIG9tbmlfdHJhY2VkY29uZGl0aW9uOwojIDE0MyAiL3Vzci9sb2NhbC9pbmNsdWRlL29t bmlPUkIzL3RyYWNlZHRocmVhZC5oIiAzCmNsYXNzIG9tbmlfb3B0aW9uYWxfbG9jayB7CnB1Ymxp YzoKICBpbmxpbmUgb21uaV9vcHRpb25hbF9sb2NrKG9tbmlfdHJhY2VkbXV0ZXgmIG0sIGludCBs b2NrZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9ja2VkX29uX2V4aXQpCiAg ICA6IHBkX2xvY2tlZChsb2NrZWRfb25fZXhpdCksIHBkX20obSkKICAgIHsgaWYoICFsb2NrZWQg KSBwZF9tLmxvY2soKTsgfQoKICBpbmxpbmUgfm9tbmlfb3B0aW9uYWxfbG9jaygpIHsgaWYoICFw ZF9sb2NrZWQgKSBwZF9tLnVubG9jaygpOyB9Cgpwcml2YXRlOgogIG9tbmlfb3B0aW9uYWxfbG9j ayhjb25zdCBvbW5pX29wdGlvbmFsX2xvY2smKTsKICBvbW5pX29wdGlvbmFsX2xvY2smIG9wZXJh dG9yID0gKGNvbnN0IG9tbmlfb3B0aW9uYWxfbG9jayYpOwoKICBpbnQgcGRfbG9ja2VkOwogIG9t bmlfdHJhY2VkbXV0ZXgmIHBkX207Cn07CiMgMTU1ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9S QjMvb21uaUludGVybmFsLmgiIDIgMwoKCgpjbGFzcyBSb3BlOwpjbGFzcyBHSU9QX1M7CmNsYXNz IEdJT1BfQzsKY2xhc3Mgb21uaU9ialJlZjsKY2xhc3Mgb21uaVNlcnZhbnQ7CmNsYXNzIG9tbmlJ ZGVudGl0eTsKY2xhc3Mgb21uaUxvY2FsSWRlbnRpdHk7CmNsYXNzIG9tbmlPYmpBZGFwdGVyOwpj bGFzcyBOZXRCdWZmZXJlZFN0cmVhbTsKY2xhc3MgTWVtQnVmZmVyZWRTdHJlYW07CiMgMTc5ICIv dXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDMKZXh0ZXJuIGNvbnN0 IGNoYXIqIG9tbmlPUkJfM18wOwoKCiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3Jv cGUuaCIgMSAzCiMgMTA3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAzCmNs YXNzIFJvcGU7CmNsYXNzIEVuZHBvaW50OwpjbGFzcyBOZXRCdWZmZXJlZFN0cmVhbTsKY2xhc3Mg U3RyYW5kX2l0ZXJhdG9yOwpjbGFzcyBSb3BlX2l0ZXJhdG9yOwoKY2xhc3MgU3RyYW5kIHsKcHVi bGljOgoKICBTdHJhbmQoUm9wZSAqcik7CgoKCgoKCgogIHZpcnR1YWwgflN0cmFuZCgpOwoKCgoK CgoKICB2aXJ0dWFsIHNpemVfdCBNYXhNVFUoKSBjb25zdCA9IDA7CgoKICBzdHJ1Y3Qgc2J1ZiB7 CiAgICB2b2lkICpidWZmZXI7CiAgICBzaXplX3Qgc2l6ZTsKICB9OwoKICB2aXJ0dWFsIHNidWYg cmVjZWl2ZShzaXplX3Qgc2l6ZSxfQ09SQkFfQm9vbGVhbiBleGFjdGx5LAogICAgICAgICAgICAg ICAgICAgICAgIGludCBhbGlnbixfQ09SQkFfQm9vbGVhbiBzdGFydE1UVT0wKT0wOwojIDE3OCAi L3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIHZpcnR1YWwgdm9pZCBnaXZl YmFja19yZWNlaXZlZChzaXplX3QgbGVmdG92ZXIpPTA7CiMgMTkzICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaU9SQjMvcm9wZS5oIiAzCiAgdmlydHVhbCBzaXplX3QgbWF4X3JlY2VpdmVfYnVmZmVy X3NpemUoKT0wOwoKCgoKICB2aXJ0dWFsIHZvaWQgcmVjZWl2ZV9hbmRfY29weShzYnVmIGIsX0NP UkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCkgPSAwOwojIDIyMyAiL3Vzci9sb2NhbC9pbmNsdWRlL29t bmlPUkIzL3JvcGUuaCIgMwogIHZpcnR1YWwgdm9pZCBza2lwKHNpemVfdCBzaXplLF9DT1JCQV9C b29sZWFuIHN0YXJ0TVRVPTApID0gMDsKIyAyNDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JC My9yb3BlLmgiIDMKICB2aXJ0dWFsIHNidWYgcmVzZXJ2ZShzaXplX3Qgc2l6ZSxfQ09SQkFfQm9v bGVhbiBleGFjdGx5LGludCBhbGlnbiwKICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9v bGVhbiB0cmFuc21pdD0wLF9DT1JCQV9Cb29sZWFuIGVuZE1UVT0wKT0wOwojIDI3NSAiL3Vzci9s b2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIHZpcnR1YWwgc2J1ZiByZXNlcnZlX2Fu ZF9zdGFydE1UVShzaXplX3Qgc2l6ZSxfQ09SQkFfQm9vbGVhbiBleGFjdGx5LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24sX0NPUkJBX0Jvb2xlYW4gdHJhbnNt aXQ9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4g YXRfbW9zdF9vbmNlPTApPTA7CgoKCgogIHZpcnR1YWwgdm9pZCBnaXZlYmFja19yZXNlcnZlZChz aXplX3QgbGVmdG92ZXIsX0NPUkJBX0Jvb2xlYW4gdHJhbnNtaXQ9MCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gZW5kTVRVPTApPTA7CiMgMzA4ICIvdXNy L2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAzCiAgdmlydHVhbCBzaXplX3QgbWF4X3Jl c2VydmVfYnVmZmVyX3NpemUoKSA9IDA7CgoKCgogIHZpcnR1YWwgdm9pZCByZXNlcnZlX2FuZF9j b3B5KHNidWYgYixfQ09SQkFfQm9vbGVhbiB0cmFuc21pdD0wLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIGVuZE1UVT0wKSA9IDA7CiMgMzM4ICIvdXNyL2xv Y2FsL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAzCiAgaW5saW5lIF9DT1JCQV9VTG9uZyBzZXF1 ZW5jZU51bWJlcigpIHsgcmV0dXJuIHBkX3NlcU51bWJlcisrOyB9CiMgMzUwICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAzCiAgdm9pZCBzaHV0ZG93bigpOwojIDM2MiAiL3Vz ci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIHZpcnR1YWwgdm9pZCByZWFsX3No dXRkb3duKCkgPSAwOwojIDM3NCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIg MwogIHZvaWQgaW5jclJlZkNvdW50KF9DT1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleCA9IDAp OwojIDM4MyAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIHZvaWQgZGVj clJlZkNvdW50KF9DT1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleCA9IDApOwojIDM5MiAiL3Vz ci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIF9DT1JCQV9Cb29sZWFuIGlzX2lk bGUoX0NPUkJBX0Jvb2xlYW4gaGVsZF9yb3BlX211dGV4ID0gMCk7CiMgNDAzICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAzCiAgX0NPUkJBX0Jvb2xlYW4gaXNfdW51c2VkKF9D T1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleCA9IDApOwojIDQxNSAiL3Vzci9sb2NhbC9pbmNs dWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIGNsYXNzIFN5bmMgewoKICBwdWJsaWM6CiAgICBTeW5j KFN0cmFuZCAqcyxfQ09SQkFfQm9vbGVhbiBSZExvY2s9MSxfQ09SQkFfQm9vbGVhbiBXckxvY2s9 MSk7CiMgNDM3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAzCiAgICBTeW5j KFJvcGUgKnIsX0NPUkJBX0Jvb2xlYW4gUmRMb2NrPTEsX0NPUkJBX0Jvb2xlYW4gV3JMb2NrPTEp OwojIDQ0OSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwogICAgflN5bmMo KTsKIyA0NjggIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiIDMKICAgIF9DT1JC QV9Cb29sZWFuIGlzUmVVc2luZ0V4aXN0aW5nQ29ubmVjdGlvbigpIGNvbnN0OwojIDQ4MSAiL3Vz ci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIHByb3RlY3RlZDoKICAgIHZvaWQg UmRMb2NrKF9DT1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleD0wKTsKICAgIHZvaWQgV3JMb2Nr KF9DT1JCQV9Cb29sZWFuIGhlbGRfcm9wZV9tdXRleD0wKTsKICAgIHZvaWQgUmRVbmxvY2soX0NP UkJBX0Jvb2xlYW4gaGVsZF9yb3BlX211dGV4PTApOwogICAgdm9pZCBXclVubG9jayhfQ09SQkFf Qm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXg9MCk7CiMgNTA1ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21u aU9SQjMvcm9wZS5oIiAzCiAgcHVibGljOgogICAgc3RhdGljIGludCBjbGlja3NEZWNyQW5kR2V0 KFN0cmFuZCpzKTsKIyA1MTUgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiIDMK ICAgIHN0YXRpYyBpbnQgY2xpY2tzR2V0KFN0cmFuZCpzKTsKIyA1MjQgIi91c3IvbG9jYWwvaW5j bHVkZS9vbW5pT1JCMy9yb3BlLmgiIDMKICBwcm90ZWN0ZWQ6CiAgICB2b2lkIGNsaWNrc1NldChp bnQgY2xpY2tzLCBfQ09SQkFfQm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXg9MCk7CiMgNTM1ICIvdXNy L2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAzCiAgICBpbmxpbmUgU3RyYW5kICpnZXRf c3RyYW5kKCkgeyByZXR1cm4gcGRfc3RyYW5kOyB9CgoKCiAgICB2b2lkIHNldFN0cmFuZElzRHlp bmcoKTsKCgoKCiAgICBfQ09SQkFfQm9vbGVhbiBzdHJhbmRJc0R5aW5nKCk7CgoKCgogIHByaXZh dGU6CiAgICBTdHJhbmQqIGdldExvY2thYmxlU3RyYW5kKFJvcGUqIHJvcGUsIF9DT1JCQV9Cb29s ZWFuJiBzZWNvbmRIYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9v bGVhbiByZGxvY2ssIF9DT1JCQV9Cb29sZWFuIHdybG9jayk7CgoKCgoKICAgIFN0cmFuZCogZ2V0 TG9ja2VkU3RyYW5kKFJvcGUqIHJvcGUsIF9DT1JCQV9Cb29sZWFuJiBzZWNvbmRIYW5kLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmRsb2NrLCBfQ09SQkFfQm9v bGVhbiB3cmxvY2spOwoKCgoKICAgIFN0cmFuZCAqcGRfc3RyYW5kOwogICAgX0NPUkJBX0Jvb2xl YW4gcGRfc2Vjb25kSGFuZDsKICAgIFN5bmMoKTsKICB9OwoKICBpbmxpbmUgX0NPUkJBX0Jvb2xl YW4gX3N0cmFuZElzRHlpbmcoKSB7IHJldHVybiBwZF9keWluZzsgfQoKcHJvdGVjdGVkOgoKICBp bmxpbmUgdm9pZCBfc2V0U3RyYW5kSXNEeWluZygpIHsgcGRfZHlpbmcgPSAxOyB9CiAgaW5saW5l IF9DT1JCQV9Cb29sZWFuIGlzT3V0Z29pbmcoKTsKCiAgZnJpZW5kIGNsYXNzIFN5bmM7CiAgZnJp ZW5kIGNsYXNzIFN0cmFuZF9pdGVyYXRvcjsKICBmcmllbmQgY2xhc3MgUm9wZTsKICBmcmllbmQg Y2xhc3MgUm9wZV9pdGVyYXRvcjsKCnByaXZhdGU6CiAgb21uaV9jb25kaXRpb24gcGRfcmRjb25k OwogIGludCBwZF9yZF9ud2FpdGluZzsKCiAgb21uaV9jb25kaXRpb24gcGRfd3Jjb25kOwogIGlu dCBwZF93cl9ud2FpdGluZzsKCiAgaW50IHBkX3VzZUNvdW50OwoKCgogIFN0cmFuZCAqcGRfbmV4 dDsKICBSb3BlICpwZF9yb3BlOwogIF9DT1JCQV9Cb29sZWFuIHBkX2R5aW5nOwogIGludCBwZF9y ZWZjb3VudDsKICBfQ09SQkFfVUxvbmcgcGRfc2VxTnVtYmVyOwogIGludCBwZF9jbGlja3M7Cgpw dWJsaWM6CiAgU3RyYW5kICpwZF9yaXBwZXJfbmV4dDsKCgoKICBTdHJhbmQoKTsKICBTdHJhbmQo Y29uc3QgU3RyYW5kJik7CiAgU3RyYW5kICZvcGVyYXRvcj0oY29uc3QgU3RyYW5kJik7Cn07Cgp0 eXBlZGVmIFN0cmFuZDo6U3luYyBTdHJhbmRfU3luYzsKCmNsYXNzIEVuZHBvaW50IHsKcHVibGlj OgogIGlubGluZSBFbmRwb2ludChfQ09SQkFfQ2hhciAqcHJvdG9jb2wpIHsKICAgIHBkX3Byb3Rv Y29sbmFtZSA9IG5ldyBfQ09SQkFfQ2hhciBbc3RybGVuKChjaGFyICopcHJvdG9jb2wpKzFdOwog ICAgc3RyY3B5KChjaGFyICopcGRfcHJvdG9jb2xuYW1lLChjaGFyICopcHJvdG9jb2wpOwogICAg cmV0dXJuOwogIH0KCiAgaW5saW5lIEVuZHBvaW50KGNvbnN0IEVuZHBvaW50ICZlKSB7CiAgICBw ZF9wcm90b2NvbG5hbWUgPSBuZXcgX0NPUkJBX0NoYXIgW3N0cmxlbigoY2hhciAqKWUucGRfcHJv dG9jb2xuYW1lKSsxXTsKICAgIHN0cmNweSgoY2hhciAqKXBkX3Byb3RvY29sbmFtZSwoY2hhciAq KWUucGRfcHJvdG9jb2xuYW1lKTsKICAgIHJldHVybjsKICB9CgogIGlubGluZSBFbmRwb2ludCAm b3BlcmF0b3I9KGNvbnN0IEVuZHBvaW50ICZlKSB7CiAgICBkZWxldGUgW10gcGRfcHJvdG9jb2xu YW1lOwogICAgcGRfcHJvdG9jb2xuYW1lID0gbmV3IF9DT1JCQV9DaGFyIFtzdHJsZW4oKGNoYXIg KillLnBkX3Byb3RvY29sbmFtZSkrMV07CiAgICBzdHJjcHkoKGNoYXIgKilwZF9wcm90b2NvbG5h bWUsKGNoYXIgKillLnBkX3Byb3RvY29sbmFtZSk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICB2 aXJ0dWFsIH5FbmRwb2ludCgpOwoKICBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4gaXNfcHJvdG9jb2wo Y29uc3QgX0NPUkJBX0NoYXIgKm5hbWUpIGNvbnN0IHsKICAgIGlmIChzdHJjbXAoKGNvbnN0IGNo YXIgKiluYW1lLChjaGFyICopcGRfcHJvdG9jb2xuYW1lKSA9PSAwKSB7CiAgICAgIHJldHVybiAx OwogICAgfQogICAgZWxzZSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH0KCiAgaW5saW5lIF9D T1JCQV9DaGFyKiBwcm90b2NvbCgpIGNvbnN0IHsKICAgIHJldHVybiBwZF9wcm90b2NvbG5hbWU7 CiAgfQoKcHJpdmF0ZToKICBfQ09SQkFfQ2hhciAqIHBkX3Byb3RvY29sbmFtZTsKICBFbmRwb2lu dCgpOwp9OwoKY2xhc3MgRW5kcG9pbnRfdmFyIHsKcHVibGljOgogIGlubGluZSBFbmRwb2ludF92 YXIoKSA6IHBkX3AoMCkge30KICBpbmxpbmUgRW5kcG9pbnRfdmFyKEVuZHBvaW50KiBwKSA6IHBk X3AocCkge30KICBpbmxpbmUgfkVuZHBvaW50X3ZhcigpIHsgaWYgKHBkX3ApIGRlbGV0ZSBwZF9w OyB9CiAgaW5saW5lIEVuZHBvaW50X3ZhciYgb3BlcmF0b3I9KEVuZHBvaW50KiBwKSB7CiAgICBp ZiAocGRfcCkgZGVsZXRlIHBkX3A7CiAgICBwZF9wID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9 CiAgaW5saW5lIG9wZXJhdG9yIEVuZHBvaW50KigpIGNvbnN0IHsgcmV0dXJuIHBkX3A7IH0KcHJp dmF0ZToKICBFbmRwb2ludCogcGRfcDsKICBFbmRwb2ludF92YXImIG9wZXJhdG9yPShjb25zdCBF bmRwb2ludF92YXImKTsKfTsKCmNsYXNzIFN0cmFuZF9pdGVyYXRvciB7CnB1YmxpYzoKICBTdHJh bmRfaXRlcmF0b3IoY29uc3QgUm9wZSAqcixfQ09SQkFfQm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXgg PSAwKTsKIyA2NzggIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiIDMKICB+U3Ry YW5kX2l0ZXJhdG9yKCk7CiMgNjg3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5o IiAzCiAgU3RyYW5kICpvcGVyYXRvcigpICgpOwoKCgoKcHJpdmF0ZToKICBjb25zdCBSb3BlICpw ZF9yb3BlOwogIF9DT1JCQV9Cb29sZWFuIHBkX2xlYXZlX211dGV4OwogIF9DT1JCQV9Cb29sZWFu IHBkX2luaXRpYWxpc2VkOwogIFN0cmFuZCAqcGRfczsKICBTdHJhbmRfaXRlcmF0b3IoKTsKfTsK CmNsYXNzIEFuY2hvciB7CnB1YmxpYzoKICBBbmNob3IoKTsKICB+QW5jaG9yKCk7Cgpwcml2YXRl OgogIGZyaWVuZCBjbGFzcyBSb3BlOwogIGZyaWVuZCBjbGFzcyBSb3BlX2l0ZXJhdG9yOwoKICBv bW5pX211dGV4IHBkX2xvY2s7CiAgUm9wZSAqcGRfaGVhZDsKfTsKCgoKY2xhc3MgUm9wZSB7CnB1 YmxpYzoKICBSb3BlKEFuY2hvciAqYSwKICAgICAgIHVuc2lnbmVkIGludCBtYXhTdHJhbmRzKTsK CgoKCgoKCiAgdmlydHVhbCB+Um9wZSgpOwoKCgoKCgoKICB2aXJ0dWFsIHZvaWQgQ3V0U3RyYW5k cyhfQ09SQkFfQm9vbGVhbiBoZWxkX3JvcGVfbXV0ZXggPSAwKTsKIyA3NDMgIi91c3IvbG9jYWwv aW5jbHVkZS9vbW5pT1JCMy9yb3BlLmgiIDMKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2lu Y29taW5nKCkgY29uc3QgPSAwOwoKCgoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX291dGdv aW5nKCkgY29uc3QgPSAwOwoKCgoKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIHJlbW90ZV9pcyhF bmRwb2ludCAqJmUpID0gMDsKCgoKCgoKCiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiB0aGlzX2lz KEVuZHBvaW50IComZSkgPSAwOwoKCgoKCgogIHZvaWQgaW5jclJlZkNvdW50KF9DT1JCQV9Cb29s ZWFuIGhlbGRfYW5jaG9yX211dGV4ID0gMCk7CiMgNzc3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21u aU9SQjMvcm9wZS5oIiAzCiAgdm9pZCBkZWNyUmVmQ291bnQoX0NPUkJBX0Jvb2xlYW4gaGVsZF9h bmNob3JfbXV0ZXggPSAwKTsKIyA3ODYgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9yb3Bl LmgiIDMKICBfQ09SQkFfQm9vbGVhbiBpc19pZGxlKF9DT1JCQV9Cb29sZWFuIGhlbGRfYW5jaG9y X211dGV4ID0gMCk7CiMgNzk2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcm9wZS5oIiAz CiAgaW5saW5lIEFuY2hvciogYW5jaG9yKCkgY29uc3QgeyByZXR1cm4gcGRfYW5jaG9yOyB9Cgog IGZyaWVuZCBjbGFzcyBTdHJhbmQ7CiAgZnJpZW5kIGNsYXNzIFN0cmFuZF9pdGVyYXRvcjsKICBm cmllbmQgY2xhc3MgUm9wZV9pdGVyYXRvcjsKICBmcmllbmQgY2xhc3MgU3RyYW5kOjpTeW5jOwoK cHJvdGVjdGVkOgoKICBvbW5pX211dGV4IHBkX2xvY2s7CiAgb21uaV9jb25kaXRpb24gcGRfY29u ZDsKICBpbnQgcGRfY29uZF9jb3VudGVyOwoKICB2aXJ0dWFsIFN0cmFuZCogZ2V0U3RyYW5kKF9D T1JCQV9Cb29sZWFuJiBzZWNvbmRIYW5kKTsKIyA4MjkgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5p T1JCMy9yb3BlLmgiIDMKICB2aXJ0dWFsIFN0cmFuZCAqbmV3U3RyYW5kKCkgPSAwOwojIDg1MyAi L3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3JvcGUuaCIgMwpwcml2YXRlOgoKCiAgdW5zaWdu ZWQgaW50IHBkX21heFN0cmFuZHM7CgogIFN0cmFuZCAqcGRfaGVhZDsKICBSb3BlICpwZF9uZXh0 OwogIEFuY2hvciAqcGRfYW5jaG9yOwogIGludCBwZF9yZWZjb3VudDsKCiAgUm9wZSgpOwp9OwoK Y2xhc3MgUm9wZV92YXIgewpwdWJsaWM6CiAgaW5saW5lIFJvcGVfdmFyKCkgOiBfcHRyKDApIHt9 CgogIGlubGluZSBSb3BlX3ZhcihSb3BlKiBwKSB7IF9wdHIgPSBwOyB9CgogIGlubGluZSB+Um9w ZV92YXIoKSB7CiAgICBpZiAoX3B0cikKICAgICAgX3B0ci0+ZGVjclJlZkNvdW50KCk7CiAgfQoK ICBpbmxpbmUgUm9wZV92YXIoY29uc3QgUm9wZV92YXImIHApIHsKICAgIGlmIChwLl9wdHIpIHsK ICAgICAgcC5fcHRyLT5pbmNyUmVmQ291bnQoKTsKICAgIH0KICAgIF9wdHIgPSBwLl9wdHI7CiAg fQoKICBpbmxpbmUgUm9wZV92YXImIG9wZXJhdG9yPSAoY29uc3QgUm9wZV92YXImIHApIHsKICAg IGlmIChfcHRyKSB7CiAgICAgIF9wdHItPmRlY3JSZWZDb3VudCgpOwogICAgICBfcHRyID0gMDsK ICAgIH0KICAgIGlmIChwLl9wdHIpIHsKICAgICAgcC5fcHRyLT5pbmNyUmVmQ291bnQoKTsKICAg IH0KICAgIF9wdHIgPSBwLl9wdHI7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgUm9w ZV92YXImIG9wZXJhdG9yPSAoUm9wZSogcCkgewogICAgaWYgKF9wdHIpIHsKICAgICAgX3B0ci0+ ZGVjclJlZkNvdW50KCk7CiAgICAgIF9wdHIgPSAwOwogICAgfQogICAgX3B0ciA9IHA7CiAgICBy ZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgUm9wZSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0 dXJuIF9wdHI7IH0KCiAgaW5saW5lIG9wZXJhdG9yIFJvcGUqKCkgY29uc3QgeyByZXR1cm4gX3B0 cjsgfQoKICBSb3BlKiBfcHRyOwp9OwoKY2xhc3Mgcm9wZUZhY3Rvcnk7CgpjbGFzcyBSb3BlX2l0 ZXJhdG9yIHsKcHVibGljOgogIFJvcGVfaXRlcmF0b3IoY29uc3QgQW5jaG9yICphKTsKCgoKCgoK CiAgUm9wZV9pdGVyYXRvcihyb3BlRmFjdG9yeSogcmYpOwojIDkzMyAiL3Vzci9sb2NhbC9pbmNs dWRlL29tbmlPUkIzL3JvcGUuaCIgMwogIH5Sb3BlX2l0ZXJhdG9yKCk7CgoKCgoKCgogIFJvcGUg Km9wZXJhdG9yKCkgKCk7Cgpwcml2YXRlOgogIGNvbnN0IEFuY2hvciAqcGRfYW5jaG9yOwogIFJv cGUgKnBkX3I7CiAgUm9wZV9pdGVyYXRvcigpOwp9OwoKCmlubGluZQpfQ09SQkFfQm9vbGVhbgpT dHJhbmQ6OmlzT3V0Z29pbmcoKSB7CiAgcmV0dXJuIHBkX3JvcGUtPmlzX291dGdvaW5nKCk7Cn0K IyAxODMgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIgMiAzCgoK CgoKCmNsYXNzIG9tbmkgewoKcHVibGljOgoKCiAgdHlwZWRlZiBsb25nIHB0cl9hcml0aF90OwoK CgoKCgogIGVudW0gYWxpZ25tZW50X3QgeyBBTElHTl8xID0gMSwgQUxJR05fMiA9IDIsIEFMSUdO XzQgPSA0LCBBTElHTl84ID0gOCB9OwoKCiAgc3RhdGljIGNvbnN0IF9DT1JCQV9DaGFyIG15Qnl0 ZU9yZGVyOwogIHN0YXRpYyBvbW5pX3RyYWNlZG11dGV4KiBpbnRlcm5hbExvY2s7CiAgc3RhdGlj IG9tbmlfdHJhY2VkbXV0ZXgqIG9ianJlZl9yY19sb2NrOwoKICBzdGF0aWMgb21uaV90cmFjZWRt dXRleCogcG9SY0xvY2s7CgoKICBzdGF0aWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0 ZXQgbXlQcmluY2lwYWxJRDsKICBzdGF0aWMgY29uc3QgYWxpZ25tZW50X3QgbWF4X2FsaWdubWVu dDsKCgogIHN0YXRpYyBjb25zdCBjaGFyKmNvbnN0IGVtcHR5X3N0cmluZzsKCgoKICBzdGF0aWMg aW50IHJlbW90ZUludm9jYXRpb25Db3VudDsKICBzdGF0aWMgaW50IGxvY2FsSW52b2NhdGlvbkNv dW50OwoKCgoKCiAgc3RhdGljIGlubGluZSBwdHJfYXJpdGhfdCBhbGlnbl90byhwdHJfYXJpdGhf dCBwLCBhbGlnbm1lbnRfdCBhbGlnbikgewogICAgcmV0dXJuIChwICsgKChpbnQpIGFsaWduIC0g MSkpICYgfigoaW50KSBhbGlnbiAtIDEpOwogIH0KCiAgc3RhdGljIF9DT1JCQV9VTG9uZyBoYXNo KGNvbnN0IF9DT1JCQV9PY3RldCoga2V5LCBpbnQga2V5c2l6ZSk7CgoKCiAgc3RhdGljIGlubGlu ZSBjaGFyKiBhbGxvY1N0cmluZyhpbnQgbGVuKSB7IHJldHVybiBuZXcgY2hhcltsZW4gKyAxXTsg fQoKCgoKICBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZVN0cmluZyhjaGFyKiBzKSB7CiAgICBpZiAo cyAmJiBzICE9IGVtcHR5X3N0cmluZykgZGVsZXRlW10gczsKICB9CgoKICBzdGF0aWMgb21uaV90 cmFjZWRtdXRleCYgbmlsUmVmTG9jaygpOwoKCgoKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGVPYmpS ZWYob21uaU9ialJlZiopOwoKCiAgc3RhdGljIHZvaWQgcmVsZWFzZU9ialJlZihvbW5pT2JqUmVm Kik7CgoKICBzdGF0aWMgb21uaVNlcnZhbnQqIG9ialJlZlRvU2VydmFudChvbW5pT2JqUmVmKiBv YmopOwoKCgoKCgogIHN0YXRpYyBvbW5pTG9jYWxJZGVudGl0eSogbG9jYXRlSWRlbnRpdHkoY29u c3QgX0NPUkJBX09jdGV0KiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpbnQga2V5c2l6ZSwgX0NPUkJBX1VMb25nIGhhc2gsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBjcmVhdGVfZHVtbXkgPSAw KTsKCgoKCgoKICBzdGF0aWMgb21uaUxvY2FsSWRlbnRpdHkqIGFjdGl2YXRlT2JqZWN0KG9tbmlT ZXJ2YW50KiBzZXJ2YW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgb21uaU9iakFkYXB0ZXIqIGFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBvbW5pT2JqS2V5JiBrZXkpOwojIDI4MyAiL3Vzci9sb2NhbC9pbmNsdWRl L29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAzCiAgc3RhdGljIG9tbmlMb2NhbElkZW50aXR5KiBk ZWFjdGl2YXRlT2JqZWN0KGNvbnN0IF9DT1JCQV9PY3RldCoga2V5LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5c2l6ZSk7CiMgMzAyICIvdXNyL2xv Y2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDMKICBzdGF0aWMgb21uaU9ialJl ZiogY3JlYXRlT2JqUmVmKGNvbnN0IGNoYXIqIG1vc3REZXJpdmVkUmVwb0lkLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0UmVwb0lkLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCogcHJvZmls ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxl YXNlX3Byb2ZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jv b2xlYW4gbG9ja2VkKTsKCgoKCgoKCiAgc3RhdGljIG9tbmlPYmpSZWYqIGNyZWF0ZU9ialJlZihj b25zdCBjaGFyKiBtb3N0RGVyaXZlZFJlcG9JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IGNoYXIqIHRhcmdldFJlcG9JZCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG9tbmlMb2NhbElkZW50aXR5KiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqIHByb2ZpbGVzID0gMCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2VfcHJvZmlsZXMg PSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX09jdGV0KiBrZXkg PSAwKTsKIyAzMzEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIg MwogIHN0YXRpYyB2b2lkIHJldmVydFRvT3JpZ2luYWxQcm9maWxlKG9tbmlPYmpSZWYqIG9ianJl Zik7CgoKCgoKCgogIHN0YXRpYyB2b2lkIGxvY2F0aW9uRm9yd2FyZChvbW5pT2JqUmVmKiBvYmos IG9tbmlPYmpSZWYqIG5ld19sb2NhdGlvbik7CiMgMzQ5ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21u aU9SQjMvb21uaUludGVybmFsLmgiIDMKICBzdGF0aWMgdm9pZCBhc3NlcnRGYWlsKGNvbnN0IGNo YXIqIGZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyKiBleHApOwogIHN0YXRpYyB2b2lkIHVjaGVj a0ZhaWwoY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIqIGV4cCk7Cgp9OwoK CgoKCmNsYXNzIG9tbmlSb3BlQW5kS2V5IHsKcHVibGljOgogIGlubGluZSBvbW5pUm9wZUFuZEtl eShSb3BlKiByLCBjb25zdCBfQ09SQkFfT2N0ZXQqIGssIGludCBrc2l6ZSkKICAgIDogcGRfcm9w ZShyKSwgcGRfa2V5KGssIGtzaXplKQogICAgeyByLT5pbmNyUmVmQ291bnQoKTsgfQoKICBpbmxp bmUgb21uaVJvcGVBbmRLZXkoKSA6IHBkX3JvcGUoMCkge30KCiAgaW5saW5lIH5vbW5pUm9wZUFu ZEtleSgpIHsgaWYoIHBkX3JvcGUgKSBwZF9yb3BlLT5kZWNyUmVmQ291bnQoKTsgfQoKICBpbmxp bmUgUm9wZSogcm9wZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3JvcGU7IH0KICBpbmxpbmUgY29uc3Qg X0NPUkJBX09jdGV0KiBrZXkoKSBjb25zdCB7CiAgICByZXR1cm4gcGRfa2V5LmtleSgpOwogIH0K ICBpbmxpbmUgX0NPUkJBX1VMb25nIGtleXNpemUoKSBjb25zdCB7IHJldHVybiBwZF9rZXkuc2l6 ZSgpOyB9CgogIGlubGluZSB2b2lkIHJvcGUoUm9wZSogcikgeyBwZF9yb3BlID0gcjsgci0+aW5j clJlZkNvdW50KCk7IH0KICBpbmxpbmUgdm9pZCBrZXkoY29uc3QgX0NPUkJBX09jdGV0KiBrLCBp bnQga3NpemUpIHsgcGRfa2V5LmNvcHkoaywga3NpemUpOyB9Cgpwcml2YXRlOgogIG9tbmlSb3Bl QW5kS2V5JiBvcGVyYXRvcj0oY29uc3Qgb21uaVJvcGVBbmRLZXkmKTsKICBvbW5pUm9wZUFuZEtl eShjb25zdCBvbW5pUm9wZUFuZEtleSYpOwoKCiAgUm9wZSogcGRfcm9wZTsKICBvbW5pT2JqS2V5 IHBkX2tleTsKfTsKIyA0MDcgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJu YWwuaCIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9idWZmZXJlZFN0cmVhbS5o IiAxIDMKIyAxNjYgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9idWZmZXJlZFN0cmVhbS5o IiAzCmNsYXNzIE5ldEJ1ZmZlcmVkU3RyZWFtIDogcHVibGljIFN0cmFuZF9TeW5jIHsKcHVibGlj OgogIE5ldEJ1ZmZlcmVkU3RyZWFtKFN0cmFuZCAqcywKICAgICAgICAgICAgICAgICAgICBfQ09S QkFfQm9vbGVhbiBSZExvY2s9MSwKICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBX ckxvY2s9MSwKICAgICAgICAgICAgICAgICAgICBzaXplX3QgQnVmc2l6ZT0wKTsKICBOZXRCdWZm ZXJlZFN0cmVhbShSb3BlICpyLAogICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIFJk TG9jaz0xLAogICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIFdyTG9jaz0xLAogICAg ICAgICAgICAgICAgICAgIHNpemVfdCBCdWZzaXplPTApOwogIH5OZXRCdWZmZXJlZFN0cmVhbSgp OwoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9DaGFyIGEsIE5ldEJ1 ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFyICop IChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9DaGFy KSk7ICpwID0gYTsgfTsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NP UkJBX0NoYXImIGEsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9DaGFyICpw ID0gKF9DT1JCQV9DaGFyICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzEs c2l6ZW9mKF9DT1JCQV9DaGFyKSk7IGEgPSAqcDsgfTsKICB9CgoKCiAgZnJpZW5kIGlubGluZSB2 b2lkIG9wZXJhdG9yPj49IChfQ09SQkFfQm9vbGVhbiBiLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykg ewogICAgX0NPUkJBX0NoYXIgYyA9IGIgPyAxIDogMDsKICAgIHsgX0NPUkJBX0NoYXIgKnAgPSAo X0NPUkJBX0NoYXIgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fMSxzaXpl b2YoX0NPUkJBX0NoYXIpKTsgKnAgPSBjOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9w ZXJhdG9yPDw9IChfQ09SQkFfQm9vbGVhbiYgYiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAg IF9DT1JCQV9DaGFyIGM7CiAgICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFyICopIChz KS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9DaGFyKSk7 IGMgPSAqcDsgfTsKICAgIGIgPSBjID8gdHJ1ZSA6IGZhbHNlOwogIH0KCgoKICBmcmllbmQgaW5s aW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9TaG9ydCBhLCBOZXRCdWZmZXJlZFN0cmVhbSYg cykgewogICAgeyBfQ09SQkFfU2hvcnQgKnAgPSAoX0NPUkJBX1Nob3J0ICopIChzKS5hbGlnbl9h bmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzIsc2l6ZW9mKF9DT1JCQV9TaG9ydCkpOyAqcCA9IGE7 IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9TaG9ydCYg YSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIGlmIChzLlJkTWVzc2FnZUJ5dGVPcmRlcigp ICE9IG9tbmk6Om15Qnl0ZU9yZGVyKSB7CiAgICAgIF9DT1JCQV9TaG9ydCB0OwogICAgICB7IF9D T1JCQV9TaG9ydCAqcCA9IChfQ09SQkFfU2hvcnQgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMo b21uaTo6QUxJR05fMixzaXplb2YoX0NPUkJBX1Nob3J0KSk7IHQgPSAqcDsgfTsKICAgICAgYSA9 ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICB9CiAgICBl bHNlIHsKICAgICAgeyBfQ09SQkFfU2hvcnQgKnAgPSAoX0NPUkJBX1Nob3J0ICopIChzKS5hbGln bl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzIsc2l6ZW9mKF9DT1JCQV9TaG9ydCkpOyBhID0g KnA7IH07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0 b3I+Pj0gKF9DT1JCQV9VU2hvcnQgYSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NP UkJBX1VTaG9ydCAqcCA9IChfQ09SQkFfVVNob3J0ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVz KG9tbmk6OkFMSUdOXzIsc2l6ZW9mKF9DT1JCQV9VU2hvcnQpKTsgKnAgPSBhOyB9OwogIH0KCiAg ZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChfQ09SQkFfVVNob3J0JiBhLCBOZXRCdWZm ZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6 bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX1VTaG9ydCB0OwogICAgICB7IF9DT1JCQV9VU2hv cnQgKnAgPSAoX0NPUkJBX1VTaG9ydCAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpB TElHTl8yLHNpemVvZihfQ09SQkFfVVNob3J0KSk7IHQgPSAqcDsgfTsKICAgICAgYSA9ICgoKCh0 KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICB9CiAgICBlbHNlIHsK ICAgICAgeyBfQ09SQkFfVVNob3J0ICpwID0gKF9DT1JCQV9VU2hvcnQgKikgKHMpLmFsaWduX2Fu ZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fMixzaXplb2YoX0NPUkJBX1VTaG9ydCkpOyBhID0gKnA7 IH07CiAgICB9CiAgICByZXR1cm47CiAgfQoKCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9y Pj49IChfQ09SQkFfTG9uZyBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgeyBfQ09SQkFf TG9uZyAqcCA9IChfQ09SQkFfTG9uZyAqKSAocykuYWxpZ25fYW5kX3B1dF9ieXRlcyhvbW5pOjpB TElHTl80LHNpemVvZihfQ09SQkFfTG9uZykpOyAqcCA9IGE7IH07CiAgfQoKICBmcmllbmQgaW5s aW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9Mb25nJiBhLCBOZXRCdWZmZXJlZFN0cmVhbSYg cykgewogICAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIp IHsKICAgICAgX0NPUkJBX0xvbmcgdDsKICAgICAgeyBfQ09SQkFfTG9uZyAqcCA9IChfQ09SQkFf TG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihfQ09S QkFfTG9uZykpOyB0ID0gKnA7IH07CiAgICAgIGEgPSAoKCgodCkgJiAweGZmMDAwMDAwKSA+PiAy NCkgfCAoKCh0KSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodCkgJiAweDAwMDBmZjAwKSA8PCA4 KSB8ICgoKHQpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgIH0KICAgIGVsc2UgewogICAgICB7 IF9DT1JCQV9Mb25nICpwID0gKF9DT1JCQV9Mb25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVz KG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9Mb25nKSk7IGEgPSAqcDsgfTsKICAgIH0KICAg IHJldHVybjsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX1VM b25nIGEsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9VTG9uZyAqcCA9IChf Q09SQkFfVUxvbmcgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fNCxzaXpl b2YoX0NPUkJBX1VMb25nKSk7ICpwID0gYTsgfTsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBv cGVyYXRvcjw8PSAoX0NPUkJBX1VMb25nJiBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAg aWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAg X0NPUkJBX1VMb25nIHQ7CiAgICAgIHsgX0NPUkJBX1VMb25nICpwID0gKF9DT1JCQV9VTG9uZyAq KSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihfQ09SQkFfVUxv bmcpKTsgdCA9ICpwOyB9OwogICAgICBhID0gKCgoKHQpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwg KCgodCkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHQpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAo KCh0KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09S QkFfVUxvbmcgKnAgPSAoX0NPUkJBX1VMb25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9t bmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9VTG9uZykpOyBhID0gKnA7IH07CiAgICB9CiAgICBy ZXR1cm47CiAgfQoKCgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NPUkJBX0xv bmdMb25nIGEsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9Mb25nTG9uZyAq cCA9IChfQ09SQkFfTG9uZ0xvbmcgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJ R05fOCxzaXplb2YoX0NPUkJBX0xvbmdMb25nKSk7ICpwID0gYTsgfTsKICB9CgogIGZyaWVuZCBp bmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJBX0xvbmdMb25nJiBhLCBOZXRCdWZmZXJlZFN0 cmVhbSYgcykgewogICAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRl T3JkZXIpIHsKICAgICAgX0NPUkJBX0xvbmdMb25nIHQ7CiAgICAgIHsgX0NPUkJBX0xvbmdMb25n ICpwID0gKF9DT1JCQV9Mb25nTG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpB TElHTl84LHNpemVvZihfQ09SQkFfTG9uZ0xvbmcpKTsgdCA9ICpwOyB9OwogICAgICBhID0gKCgo KHQpICYgKDB4ZmYwMDAwMDAwMDAwMDAwMExMKSkgPj4gNTYpIHwgKCgodCkgJiAoMHgwMGZmMDAw MDAwMDAwMDAwTEwpKSA+PiA0MCkgfCAoKCh0KSAmICgweDAwMDBmZjAwMDAwMDAwMDBMTCkpID4+ IDI0KSB8ICgoKHQpICYgKDB4MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAoKCh0KSAmICgw eDAwMDAwMDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwgKCgodCkgJiAoMHgwMDAwMDAwMDAwZmYwMDAw TEwpKSA8PCAyNCkgfCAoKCh0KSAmICgweDAwMDAwMDAwMDAwMGZmMDBMTCkpIDw8IDQwKSB8ICgo KHQpICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkgPDwgNTYpKTsKICAgIH0KICAgIGVsc2Ugewog ICAgICB7IF9DT1JCQV9Mb25nTG9uZyAqcCA9IChfQ09SQkFfTG9uZ0xvbmcgKikgKHMpLmFsaWdu X2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX0xvbmdMb25nKSk7IGEg PSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVy YXRvcj4+PSAoX0NPUkJBX1VMb25nTG9uZyBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAg eyBfQ09SQkFfVUxvbmdMb25nICpwID0gKF9DT1JCQV9VTG9uZ0xvbmcgKikgKHMpLmFsaWduX2Fu ZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX1VMb25nTG9uZykpOyAqcCA9 IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9VTG9u Z0xvbmcmIGEsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBpZiAocy5SZE1lc3NhZ2VCeXRl T3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlcikgewogICAgICBfQ09SQkFfVUxvbmdMb25nIHQ7 CiAgICAgIHsgX0NPUkJBX1VMb25nTG9uZyAqcCA9IChfQ09SQkFfVUxvbmdMb25nICopIChzKS5h bGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JCQV9VTG9uZ0xvbmcp KTsgdCA9ICpwOyB9OwogICAgICBhID0gKCgoKHQpICYgKDB4ZmYwMDAwMDAwMDAwMDAwMExMKSkg Pj4gNTYpIHwgKCgodCkgJiAoMHgwMGZmMDAwMDAwMDAwMDAwTEwpKSA+PiA0MCkgfCAoKCh0KSAm ICgweDAwMDBmZjAwMDAwMDAwMDBMTCkpID4+IDI0KSB8ICgoKHQpICYgKDB4MDAwMDAwZmYwMDAw MDAwMExMKSkgPj4gOCkgfCAoKCh0KSAmICgweDAwMDAwMDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwg KCgodCkgJiAoMHgwMDAwMDAwMDAwZmYwMDAwTEwpKSA8PCAyNCkgfCAoKCh0KSAmICgweDAwMDAw MDAwMDAwMGZmMDBMTCkpIDw8IDQwKSB8ICgoKHQpICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkg PDwgNTYpKTsKICAgIH0KICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9VTG9uZ0xvbmcgKnAgPSAo X0NPUkJBX1VMb25nTG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl84 LHNpemVvZihfQ09SQkFfVUxvbmdMb25nKSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsK ICB9CgoKCgoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9GbG9hdCBh LCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgeyBfQ09SQkFfRmxvYXQgKnAgPSAoX0NPUkJB X0Zsb2F0ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9D T1JCQV9GbG9hdCkpOyAqcCA9IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0 b3I8PD0gKF9DT1JCQV9GbG9hdCYgYSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIGlmIChz LlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyKSB7CiAgICAgIF9DT1JC QV9GbG9hdCB0OwogICAgICB7IF9DT1JCQV9GbG9hdCAqcCA9IChfQ09SQkFfRmxvYXQgKikgKHMp LmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX0Zsb2F0KSk7 IHQgPSAqcDsgfTsKICAgICAgX0NPUkJBX1VMb25nIHRsMSA9ICooKF9DT1JCQV9VTG9uZyAqKSZ0 KTsKICAgICAgX0NPUkJBX1VMb25nIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQp IHwgKCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8 IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIGEgPSAqKChfQ09SQkFf RmxvYXQgKikgJnRsMik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09SQkFfRmxvYXQgKnAg PSAoX0NPUkJBX0Zsb2F0ICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQs c2l6ZW9mKF9DT1JCQV9GbG9hdCkpOyBhID0gKnA7IH07CiAgICB9CiAgICByZXR1cm47CiAgfQoK ICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9Eb3VibGUgYSwgTmV0QnVm ZmVyZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NPUkJBX0RvdWJsZSAqcCA9IChfQ09SQkFfRG91Ymxl ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JCQV9E b3VibGUpKTsgKnAgPSBhOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9 IChfQ09SQkFfRG91YmxlJiBhLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuUmRN ZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX0Rv dWJsZSB0OwogICAgICB7IF9DT1JCQV9Eb3VibGUgKnAgPSAoX0NPUkJBX0RvdWJsZSAqKSAocyku YWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfRG91YmxlKSk7 IHQgPSAqcDsgfTsKICAgICAgX0NPUkJBX1VMb25nIHRsMSA9ICgoX0NPUkJBX1VMb25nICopJnQp WzFdOwogICAgICBfQ09SQkFfVUxvbmcgdGwyID0gKCgoKHRsMSkgJiAweGZmMDAwMDAwKSA+PiAy NCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0bDEpICYgMHgwMDAwZmYwMCkg PDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgKChfQ09SQkFfVUxv bmcgKikmYSlbMF0gPSB0bDI7CiAgICAgIHRsMSA9ICgoX0NPUkJBX1VMb25nICopJnQpWzBdOwog ICAgICB0bDIgPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAw ZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAw eDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICAoKF9DT1JCQV9VTG9uZyAqKSZhKVsxXSA9IHRsMjsK ICAgIH0KICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9Eb3VibGUgKnAgPSAoX0NPUkJBX0RvdWJs ZSAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFf RG91YmxlKSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgoKCgoKCgogIHZvaWQg cHV0X2NoYXJfYXJyYXkoY29uc3QgX0NPUkJBX0NoYXIqIGIsIGludCBzaXplLAogICAgICAgICAg ICAgICAgICAgICAgICAgIG9tbmk6OmFsaWdubWVudF90IGFsaWduPW9tbmk6OkFMSUdOXzEsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCwKICAgICAg ICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBhdF9tb3N0X29uY2U9MCk7CgoKCgoK ICB2b2lkIGdldF9jaGFyX2FycmF5KF9DT1JCQV9DaGFyKiBiLGludCBzaXplLAogICAgICAgICAg ICAgICAgICAgICAgICAgIG9tbmk6OmFsaWdubWVudF90IGFsaWduPW9tbmk6OkFMSUdOXzEsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCk7CgoKCgoK ICB2b2lkIHNraXAoX0NPUkJBX1VMb25nIHNpemUsX0NPUkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCk7 CgoKCgogIHZvaWQgZmx1c2goX0NPUkJBX0Jvb2xlYW4gZW5kTVRVPTApOwoKCgogIHZvaWQgY29w eV9mcm9tKE1lbUJ1ZmZlcmVkU3RyZWFtJiwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAg b21uaTo6YWxpZ25tZW50X3QgYWxpZ249b21uaTo6QUxJR05fMSk7CiMgNDA1ICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvYnVmZmVyZWRTdHJlYW0uaCIgMwogIGlubGluZSBzaXplX3QgTWF4 TWVzc2FnZVNpemUoKSBjb25zdCB7IHJldHVybiBwZF9zdHJhbmQtPk1heE1UVSgpOyB9CgogIGlu bGluZSBzaXplX3QgV3JNZXNzYWdlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3dybXNnX3NpemU7 IH0KCgogIGlubGluZSBzaXplX3QgUmRNZXNzYWdlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3Jk bXNnX3NpemU7IH0KCgogIHNpemVfdCBSZE1lc3NhZ2VBbHJlYWR5UmVhZCgpIGNvbnN0OwoKCgog IHNpemVfdCBSZE1lc3NhZ2VVblJlYWQoKSBjb25zdDsKCgoKICBpbmxpbmUgX0NPUkJBX0Jvb2xl YW4gb3ZlcnJ1bihfQ09SQkFfVUxvbmcgbGVuKSBjb25zdCB7CiAgICByZXR1cm4gbGVuID4gKF9D T1JCQV9VTG9uZykgUmRNZXNzYWdlVW5SZWFkKCk7CiAgfQoKCgogIGlubGluZSBpbnQgcmRDdXJy ZW50QWxpZ25tZW50KCkgY29uc3QgewogICAgcmV0dXJuIGN1cnJlbnRfaW5iX2FsaWdubWVudCgp OwogIH0KCiAgc2l6ZV90IFdyTWVzc2FnZUFscmVhZHlXcml0dGVuKCkgY29uc3Q7CgoKCiAgc2l6 ZV90IFdyTWVzc2FnZVNwYWNlTGVmdCgpIGNvbnN0OwoKCgogIGlubGluZSBpbnQgd3JDdXJyZW50 QWxpZ25tZW50KCkgY29uc3QgewogICAgcmV0dXJuIGN1cnJlbnRfb3V0Yl9hbGlnbm1lbnQoKTsK ICB9CgogIGlubGluZSBfQ09SQkFfQ2hhciBSZE1lc3NhZ2VCeXRlT3JkZXIoKSBjb25zdCB7CiAg ICByZXR1cm4gcGRfcmRtc2dfYnl0ZV9vcmRlcjsKICB9Cgpwcm90ZWN0ZWQ6CiAgdm9pZCBSZExv Y2soKTsKICB2b2lkIFJkVW5sb2NrKCk7CiAgdm9pZCBXckxvY2soKTsKICB2b2lkIFdyVW5sb2Nr KCk7CgogIGlubGluZSBfQ09SQkFfTG9uZyBuZXdSZXF1ZXN0SUQoKSB7IHJldHVybiBwZF9zdHJh bmQtPnNlcXVlbmNlTnVtYmVyKCk7IH0KCiAgdm9pZCBXck1lc3NhZ2VTaXplKHNpemVfdCBtc2dz aXplKTsKCgogIHZvaWQgUmRNZXNzYWdlU2l6ZShzaXplX3QgbXNnc2l6ZSwgX0NPUkJBX0NoYXIg Ynl0ZW9yZGVyKTsKCgpwcml2YXRlOgogIFN0cmFuZCogcGRfc3RyYW5kOwogIHNpemVfdCBwZF9p ZGVhbF9idWZfc2l6ZTsKICB2b2lkKiBwZF9pbmJfZW5kOwogIHZvaWQqIHBkX291dGJfZW5kOwog IHZvaWQqIHBkX2luYl9ta3I7CiAgdm9pZCogcGRfb3V0Yl9ta3I7CiAgX0NPUkJBX0Jvb2xlYW4g cGRfUmRMb2NrOwogIF9DT1JCQV9Cb29sZWFuIHBkX1dyTG9jazsKCiAgc2l6ZV90IHBkX3JkbXNn X3NpemU7CiAgc2l6ZV90IHBkX3dybXNnX3NpemU7CiAgc2l6ZV90IHBkX3JlYWQ7CiAgc2l6ZV90 IHBkX3dyaXR0ZW47CiAgX0NPUkJBX0NoYXIgcGRfcmRtc2dfYnl0ZV9vcmRlcjsKCiAgdm9pZCBl bnN1cmVfcmRsb2NrZWQoKTsKICB2b2lkIGVuc3VyZV93cmxvY2tlZCgpOwogIHZvaWQgcmVzZXJ2 ZShzaXplX3QgbWluaW11bSxfQ09SQkFfQm9vbGVhbiBzdGFydE1UVT0wLAogICAgICAgICAgICAg ICBfQ09SQkFfQm9vbGVhbiBhdF9tb3N0X29uY2U9MCk7CiAgdm9pZCBnaXZlYmFja19yZXNlcnZl ZChfQ09SQkFfQm9vbGVhbiB0cmFuc21pdCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBf Q09SQkFfQm9vbGVhbiBlbmRNVFU9MCk7CiAgdm9pZCByZWNlaXZlKHNpemVfdCBtaW5pbXVtLF9D T1JCQV9Cb29sZWFuIHN0YXJ0TVRVPTApOwogIHZvaWQgZ2l2ZWJhY2tfcmVjZWl2ZWQoX0NPUkJB X0Jvb2xlYW4gc3RhcnRNVFU9MCk7CiAgaW50IGN1cnJlbnRfb3V0Yl9hbGlnbm1lbnQoKSBjb25z dDsKICBpbnQgY3VycmVudF9pbmJfYWxpZ25tZW50KCkgY29uc3Q7CiAgdm9pZCByZXdpbmRfb3V0 Yl9ta3IoaW50IG9sZGFsaWdubWVudCk7CiAgdm9pZCByZXdpbmRfaW5iX21rcihpbnQgb2xkYWxp Z25tZW50KTsKCiAgaW5saW5lIHZvaWQqIGFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6YWxpZ25t ZW50X3QgYWxpZ24sIHNpemVfdCBuYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX0NPUkJBX0Jvb2xlYW4gc3RhcnRNVFU9MCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBhdF9tb3N0X29uY2U9MCkKICB7CgoKCgogICAgaWYg KHN0YXJ0TVRVKSBnaXZlYmFja19yZXNlcnZlZCgxLDEpOwogICAgb21uaTo6cHRyX2FyaXRoX3Qg cDEgPW9tbmk6OmFsaWduX3RvKChvbW5pOjpwdHJfYXJpdGhfdClwZF9vdXRiX21rcixhbGlnbik7 CiAgICBvbW5pOjpwdHJfYXJpdGhfdCBwMiA9IHAxICsgbmJ5dGVzOwogICAgaWYoICh2b2lkKilw MiA+IHBkX291dGJfZW5kICkgewogICAgICByZXNlcnZlKHAyIC0gKG9tbmk6OnB0cl9hcml0aF90 KXBkX291dGJfbWtyLCBzdGFydE1UVSwgYXRfbW9zdF9vbmNlKTsKICAgICAgcDEgPSBvbW5pOjph bGlnbl90bygob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0Yl9ta3IsIGFsaWduKTsKICAgICAgcDIg PSBwMSArIG5ieXRlczsKICAgIH0KICAgIHBkX291dGJfbWtyID0gKHZvaWQqKSBwMjsKICAgIHJl dHVybiAodm9pZCopIHAxOwogIH0KCiAgaW5saW5lIHZvaWQgKmFsaWduX2FuZF9nZXRfYnl0ZXMo b21uaTo6YWxpZ25tZW50X3QgYWxpZ24sc2l6ZV90IG5ieXRlcywKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBzdGFydE1UVT0wKSB7CgoKCgogICAgaWYg KHN0YXJ0TVRVKSBnaXZlYmFja19yZWNlaXZlZCgxKTsKICAgIG9tbmk6OnB0cl9hcml0aF90IHAx ID0gb21uaTo6YWxpZ25fdG8oKG9tbmk6OnB0cl9hcml0aF90KXBkX2luYl9ta3IsYWxpZ24pOwog ICAgb21uaTo6cHRyX2FyaXRoX3QgcDIgPSBwMSArIG5ieXRlczsKICAgIGlmICgodm9pZCAqKXAy ID4gcGRfaW5iX2VuZCkgewogICAgICByZWNlaXZlKHAyIC0gKG9tbmk6OnB0cl9hcml0aF90KXBk X2luYl9ta3IsIHN0YXJ0TVRVKTsKICAgICAgcDEgPSBvbW5pOjphbGlnbl90bygob21uaTo6cHRy X2FyaXRoX3QpcGRfaW5iX21rciwgYWxpZ24pOwogICAgICBwMiA9IHAxICsgbmJ5dGVzOwogICAg fQogICAgcGRfaW5iX21rciA9ICh2b2lkKikgcDI7CiAgICByZXR1cm4gKHZvaWQqKSBwMTsKICB9 CgogIE5ldEJ1ZmZlcmVkU3RyZWFtKCk7CiAgTmV0QnVmZmVyZWRTdHJlYW0oY29uc3QgTmV0QnVm ZmVyZWRTdHJlYW0mKTsKICBOZXRCdWZmZXJlZFN0cmVhbSYgb3BlcmF0b3I9KGNvbnN0IE5ldEJ1 ZmZlcmVkU3RyZWFtJik7Cn07CgoKCgoKY2xhc3MgTWVtQnVmZmVyZWRTdHJlYW0gewpwdWJsaWM6 CiAgTWVtQnVmZmVyZWRTdHJlYW0oc2l6ZV90IGluaXRpYWxCdWZzaXplPTApOwogIH5NZW1CdWZm ZXJlZFN0cmVhbSgpOwoKICBNZW1CdWZmZXJlZFN0cmVhbShjb25zdCBNZW1CdWZmZXJlZFN0cmVh bSYpOwogIE1lbUJ1ZmZlcmVkU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgTWVtQnVmZmVyZWRTdHJl YW0mKTsKCiAgTWVtQnVmZmVyZWRTdHJlYW0odm9pZCogZGF0YWJ1ZmZlcik7CiAgTWVtQnVmZmVy ZWRTdHJlYW0odm9pZCogZGF0YWJ1ZmZlciwgc2l6ZV90IG1heExlbik7CgoKICBmcmllbmQgaW5s aW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9DaGFyIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBz KSB7CiAgICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFyICopIChzKS5hbGlnbl9hbmRf cHV0X2J5dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9DaGFyKSk7ICpwID0gYTsgfTsK ICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJBX0NoYXImIGEsIE1l bUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFy ICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9D aGFyKSk7IGEgPSAqcDsgfTsKICB9CgoKCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPj49 IChfQ09SQkFfQm9vbGVhbiBiLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgX0NPUkJBX0No YXIgYyA9IGIgPyAxIDogMDsKICAgIHsgX0NPUkJBX0NoYXIgKnAgPSAoX0NPUkJBX0NoYXIgKikg KHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fMSxzaXplb2YoX0NPUkJBX0NoYXIp KTsgKnAgPSBjOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChfQ09S QkFfQm9vbGVhbiYgYiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIF9DT1JCQV9DaGFyIGM7 CiAgICB7IF9DT1JCQV9DaGFyICpwID0gKF9DT1JCQV9DaGFyICopIChzKS5hbGlnbl9hbmRfZ2V0 X2J5dGVzKG9tbmk6OkFMSUdOXzEsc2l6ZW9mKF9DT1JCQV9DaGFyKSk7IGMgPSAqcDsgfTsKICAg IGIgPSBjID8gdHJ1ZSA6IGZhbHNlOwogIH0KCgoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0 b3I+Pj0gKF9DT1JCQV9TaG9ydCBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgeyBfQ09S QkFfU2hvcnQgKnAgPSAoX0NPUkJBX1Nob3J0ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9t bmk6OkFMSUdOXzIsc2l6ZW9mKF9DT1JCQV9TaG9ydCkpOyAqcCA9IGE7IH07CiAgfQoKICBmcmll bmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9TaG9ydCYgYSwgTWVtQnVmZmVyZWRT dHJlYW0mIHMpIHsKICAgIGlmIChzLmJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyKSB7 CiAgICAgIF9DT1JCQV9TaG9ydCB0OwogICAgICB7IF9DT1JCQV9TaG9ydCAqcCA9IChfQ09SQkFf U2hvcnQgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fMixzaXplb2YoX0NP UkJBX1Nob3J0KSk7IHQgPSAqcDsgfTsKICAgICAgYSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwg KCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09SQkFfU2hv cnQgKnAgPSAoX0NPUkJBX1Nob3J0ICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFM SUdOXzIsc2l6ZW9mKF9DT1JCQV9TaG9ydCkpOyBhID0gKnA7IH07CiAgICB9CiAgICByZXR1cm47 CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9VU2hvcnQgYSwg TWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NPUkJBX1VTaG9ydCAqcCA9IChfQ09SQkFf VVNob3J0ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzIsc2l6ZW9mKF9D T1JCQV9VU2hvcnQpKTsgKnAgPSBhOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJh dG9yPDw9IChfQ09SQkFfVVNob3J0JiBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYg KHMuYnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX1VTaG9y dCB0OwogICAgICB7IF9DT1JCQV9VU2hvcnQgKnAgPSAoX0NPUkJBX1VTaG9ydCAqKSAocykuYWxp Z25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl8yLHNpemVvZihfQ09SQkFfVVNob3J0KSk7IHQg PSAqcDsgfTsKICAgICAgYSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkgJiAw eGZmKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09SQkFfVVNob3J0ICpwID0gKF9DT1JC QV9VU2hvcnQgKikgKHMpLmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fMixzaXplb2Yo X0NPUkJBX1VTaG9ydCkpOyBhID0gKnA7IH07CiAgICB9CiAgICByZXR1cm47CiAgfQoKCiAgZnJp ZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPj49IChfQ09SQkFfTG9uZyBhLCBNZW1CdWZmZXJlZFN0 cmVhbSYgcykgewogICAgeyBfQ09SQkFfTG9uZyAqcCA9IChfQ09SQkFfTG9uZyAqKSAocykuYWxp Z25fYW5kX3B1dF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihfQ09SQkFfTG9uZykpOyAqcCA9 IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JCQV9Mb25n JiBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuYnl0ZU9yZGVyKCkgIT0gb21u aTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX0xvbmcgdDsKICAgICAgeyBfQ09SQkFfTG9u ZyAqcCA9IChfQ09SQkFfTG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElH Tl80LHNpemVvZihfQ09SQkFfTG9uZykpOyB0ID0gKnA7IH07CiAgICAgIGEgPSAoKCgodCkgJiAw eGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0KSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodCkgJiAw eDAwMDBmZjAwKSA8PCA4KSB8ICgoKHQpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgIH0KICAg IGVsc2UgewogICAgICB7IF9DT1JCQV9Mb25nICpwID0gKF9DT1JCQV9Mb25nICopIChzKS5hbGln bl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9Mb25nKSk7IGEgPSAq cDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRv cj4+PSAoX0NPUkJBX1VMb25nIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JC QV9VTG9uZyAqcCA9IChfQ09SQkFfVUxvbmcgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21u aTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX1VMb25nKSk7ICpwID0gYTsgfTsKICB9CgogIGZyaWVu ZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJBX1VMb25nJiBhLCBNZW1CdWZmZXJlZFN0 cmVhbSYgcykgewogICAgaWYgKHMuYnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsK ICAgICAgX0NPUkJBX1VMb25nIHQ7CiAgICAgIHsgX0NPUkJBX1VMb25nICpwID0gKF9DT1JCQV9V TG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl80LHNpemVvZihfQ09S QkFfVUxvbmcpKTsgdCA9ICpwOyB9OwogICAgICBhID0gKCgoKHQpICYgMHhmZjAwMDAwMCkgPj4g MjQpIHwgKCgodCkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHQpICYgMHgwMDAwZmYwMCkgPDwg OCkgfCAoKCh0KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAg eyBfQ09SQkFfVUxvbmcgKnAgPSAoX0NPUkJBX1VMb25nICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5 dGVzKG9tbmk6OkFMSUdOXzQsc2l6ZW9mKF9DT1JCQV9VTG9uZykpOyBhID0gKnA7IH07CiAgICB9 CiAgICByZXR1cm47CiAgfQoKCgogIGZyaWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoX0NP UkJBX0xvbmdMb25nIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICB7IF9DT1JCQV9Mb25n TG9uZyAqcCA9IChfQ09SQkFfTG9uZ0xvbmcgKikgKHMpLmFsaWduX2FuZF9wdXRfYnl0ZXMob21u aTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX0xvbmdMb25nKSk7ICpwID0gYTsgfTsKICB9CgogIGZy aWVuZCBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoX0NPUkJBX0xvbmdMb25nJiBhLCBNZW1CdWZm ZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6 bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX0xvbmdMb25nIHQ7CiAgICAgIHsgX0NPUkJBX0xv bmdMb25nICpwID0gKF9DT1JCQV9Mb25nTG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhv bW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfTG9uZ0xvbmcpKTsgdCA9ICpwOyB9OwogICAgICBh ID0gKCgoKHQpICYgKDB4ZmYwMDAwMDAwMDAwMDAwMExMKSkgPj4gNTYpIHwgKCgodCkgJiAoMHgw MGZmMDAwMDAwMDAwMDAwTEwpKSA+PiA0MCkgfCAoKCh0KSAmICgweDAwMDBmZjAwMDAwMDAwMDBM TCkpID4+IDI0KSB8ICgoKHQpICYgKDB4MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAoKCh0 KSAmICgweDAwMDAwMDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwgKCgodCkgJiAoMHgwMDAwMDAwMDAw ZmYwMDAwTEwpKSA8PCAyNCkgfCAoKCh0KSAmICgweDAwMDAwMDAwMDAwMGZmMDBMTCkpIDw8IDQw KSB8ICgoKHQpICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkgPDwgNTYpKTsKICAgIH0KICAgIGVs c2UgewogICAgICB7IF9DT1JCQV9Mb25nTG9uZyAqcCA9IChfQ09SQkFfTG9uZ0xvbmcgKikgKHMp LmFsaWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX0xvbmdMb25n KSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIGZyaWVuZCBpbmxpbmUgdm9p ZCBvcGVyYXRvcj4+PSAoX0NPUkJBX1VMb25nTG9uZyBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykg ewogICAgeyBfQ09SQkFfVUxvbmdMb25nICpwID0gKF9DT1JCQV9VTG9uZ0xvbmcgKikgKHMpLmFs aWduX2FuZF9wdXRfYnl0ZXMob21uaTo6QUxJR05fOCxzaXplb2YoX0NPUkJBX1VMb25nTG9uZykp OyAqcCA9IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKF9DT1JC QV9VTG9uZ0xvbmcmIGEsIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBpZiAocy5SZE1lc3Nh Z2VCeXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlcikgewogICAgICBfQ09SQkFfVUxvbmdM b25nIHQ7CiAgICAgIHsgX0NPUkJBX1VMb25nTG9uZyAqcCA9IChfQ09SQkFfVUxvbmdMb25nICop IChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JCQV9VTG9u Z0xvbmcpKTsgdCA9ICpwOyB9OwogICAgICBhID0gKCgoKHQpICYgKDB4ZmYwMDAwMDAwMDAwMDAw MExMKSkgPj4gNTYpIHwgKCgodCkgJiAoMHgwMGZmMDAwMDAwMDAwMDAwTEwpKSA+PiA0MCkgfCAo KCh0KSAmICgweDAwMDBmZjAwMDAwMDAwMDBMTCkpID4+IDI0KSB8ICgoKHQpICYgKDB4MDAwMDAw ZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAoKCh0KSAmICgweDAwMDAwMDAwZmYwMDAwMDBMTCkpIDw8 IDgpIHwgKCgodCkgJiAoMHgwMDAwMDAwMDAwZmYwMDAwTEwpKSA8PCAyNCkgfCAoKCh0KSAmICgw eDAwMDAwMDAwMDAwMGZmMDBMTCkpIDw8IDQwKSB8ICgoKHQpICYgKDB4MDAwMDAwMDAwMDAwMDBm ZkxMKSkgPDwgNTYpKTsKICAgIH0KICAgIGVsc2UgewogICAgICB7IF9DT1JCQV9VTG9uZ0xvbmcg KnAgPSAoX0NPUkJBX1VMb25nTG9uZyAqKSAocykuYWxpZ25fYW5kX2dldF9ieXRlcyhvbW5pOjpB TElHTl84LHNpemVvZihfQ09SQkFfVUxvbmdMb25nKSk7IGEgPSAqcDsgfTsKICAgIH0KICAgIHJl dHVybjsKICB9CgoKCgoKICBmcmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9G bG9hdCBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgeyBfQ09SQkFfRmxvYXQgKnAgPSAo X0NPUkJBX0Zsb2F0ICopIChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6 ZW9mKF9DT1JCQV9GbG9hdCkpOyAqcCA9IGE7IH07CiAgfQoKICBmcmllbmQgaW5saW5lIHZvaWQg b3BlcmF0b3I8PD0gKF9DT1JCQV9GbG9hdCYgYSwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAg IGlmIChzLmJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyKSB7CiAgICAgIF9DT1JCQV9G bG9hdCB0OwogICAgICB7IF9DT1JCQV9GbG9hdCAqcCA9IChfQ09SQkFfRmxvYXQgKikgKHMpLmFs aWduX2FuZF9nZXRfYnl0ZXMob21uaTo6QUxJR05fNCxzaXplb2YoX0NPUkJBX0Zsb2F0KSk7IHQg PSAqcDsgfTsKICAgICAgX0NPUkJBX1VMb25nIHRsMSA9ICooKF9DT1JCQV9VTG9uZyAqKSZ0KTsK ICAgICAgX0NPUkJBX1VMb25nIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwg KCgodGwxKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgp IHwgKCgodGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIGEgPSAqKChfQ09SQkFfRmxv YXQgKikgJnRsMik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgeyBfQ09SQkFfRmxvYXQgKnAgPSAo X0NPUkJBX0Zsb2F0ICopIChzKS5hbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OkFMSUdOXzQsc2l6 ZW9mKF9DT1JCQV9GbG9hdCkpOyBhID0gKnA7IH07CiAgICB9CiAgICByZXR1cm47CiAgfQoKICBm cmllbmQgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKF9DT1JCQV9Eb3VibGUgYSwgTWVtQnVmZmVy ZWRTdHJlYW0mIHMpIHsKICAgIHsgX0NPUkJBX0RvdWJsZSAqcCA9IChfQ09SQkFfRG91YmxlICop IChzKS5hbGlnbl9hbmRfcHV0X2J5dGVzKG9tbmk6OkFMSUdOXzgsc2l6ZW9mKF9DT1JCQV9Eb3Vi bGUpKTsgKnAgPSBhOyB9OwogIH0KCiAgZnJpZW5kIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChf Q09SQkFfRG91YmxlJiBhLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgaWYgKHMuYnl0ZU9y ZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIpIHsKICAgICAgX0NPUkJBX0RvdWJsZSB0OwogICAg ICB7IF9DT1JCQV9Eb3VibGUgKnAgPSAoX0NPUkJBX0RvdWJsZSAqKSAocykuYWxpZ25fYW5kX2dl dF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfRG91YmxlKSk7IHQgPSAqcDsgfTsK ICAgICAgX0NPUkJBX1VMb25nIHRsMSA9ICgoX0NPUkJBX1VMb25nICopJnQpWzFdOwogICAgICBf Q09SQkFfVUxvbmcgdGwyID0gKCgoKHRsMSkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEp ICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0 bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgKChfQ09SQkFfVUxvbmcgKikmYSlbMF0g PSB0bDI7CiAgICAgIHRsMSA9ICgoX0NPUkJBX1VMb25nICopJnQpWzBdOwogICAgICB0bDIgPSAo KCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4 KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8 PCAyNCkpOwogICAgICAoKF9DT1JCQV9VTG9uZyAqKSZhKVsxXSA9IHRsMjsKICAgIH0KICAgIGVs c2UgewogICAgICB7IF9DT1JCQV9Eb3VibGUgKnAgPSAoX0NPUkJBX0RvdWJsZSAqKSAocykuYWxp Z25fYW5kX2dldF9ieXRlcyhvbW5pOjpBTElHTl84LHNpemVvZihfQ09SQkFfRG91YmxlKSk7IGEg PSAqcDsgfTsKICAgIH0KICAgIHJldHVybjsKICB9CgoKCgoKCgogIHZvaWQgcHV0X2NoYXJfYXJy YXkoY29uc3QgX0NPUkJBX0NoYXIqIHNyYyxpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAg IG9tbmk6OmFsaWdubWVudF90IGFsaWduPW9tbmk6OkFMSUdOXzEpOwogIHZvaWQgZ2V0X2NoYXJf YXJyYXkoX0NPUkJBX0NoYXIqIGRzdCwgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICBv bW5pOjphbGlnbm1lbnRfdCBhbGlnbj1vbW5pOjpBTElHTl8xKTsKCiAgZnJpZW5kIGNsYXNzIE5l dEJ1ZmZlcmVkU3RyZWFtOwoKICB2b2lkIGNvcHlfZnJvbShNZW1CdWZmZXJlZFN0cmVhbSYgZnJv bSwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgb21uaTo6YWxpZ25tZW50X3QgYWxpZ249 b21uaTo6QUxJR05fMSk7CiAgdm9pZCBjb3B5X2Zyb20oTmV0QnVmZmVyZWRTdHJlYW0mIGZyb20s IHNpemVfdCBzaXplLAogICAgICAgICAgICAgICAgIG9tbmk6OmFsaWdubWVudF90IGFsaWduPW9t bmk6OkFMSUdOXzEpOwoKCgoKICBpbmxpbmUgdm9pZCByZXdpbmRfaW5fbWtyKCkgewogICAgcGRf aW5fbWtyID0gc3RhcnRvZnN0cmVhbSgpOwogIH0KICBpbmxpbmUgdm9pZCByZXdpbmRfaW5vdXRf bWtyKCkgewogICAgcmV3aW5kX2luX21rcigpOwogICAgcGRfb3V0X21rciA9IHBkX2luX21rcjsK ICB9CgogIGlubGluZSBfQ09SQkFfQ2hhciBieXRlT3JkZXIoKSBjb25zdCB7CiAgICByZXR1cm4g X0NPUkJBX0NoYXIocGRfYnl0ZV9vcmRlcik7CiAgfQoKICBpbmxpbmUgdm9pZCBieXRlT3JkZXIo X0NPUkJBX0NoYXIgYikgewogICAgcGRfYnl0ZV9vcmRlciA9IGIgPyAxIDogMDsKICB9CgogIGlu bGluZSBfQ09SQkFfQ2hhciBSZE1lc3NhZ2VCeXRlT3JkZXIoKSBjb25zdCB7CiAgICByZXR1cm4g Ynl0ZU9yZGVyKCk7CiAgfQoKICBpbmxpbmUgc2l6ZV90IGFscmVhZHlSZWFkKCkgY29uc3Qgewog ICAgaWYgKHBkX2luX21rciA8IHBkX291dF9ta3IpCiAgICAgIHJldHVybiAoKG9tbmk6OnB0cl9h cml0aF90KXBkX2luX21rciAtCiAgICAgICAgICAgICAgKG9tbmk6OnB0cl9hcml0aF90KXN0YXJ0 b2ZzdHJlYW0oKSk7CiAgICBlbHNlCiAgICAgIHJldHVybiAoKG9tbmk6OnB0cl9hcml0aF90KXBk X291dF9ta3IgLQogICAgICAgICAgICAgIChvbW5pOjpwdHJfYXJpdGhfdClzdGFydG9mc3RyZWFt KCkpOwogIH0KCiAgaW5saW5lIHNpemVfdCBSZE1lc3NhZ2VBbHJlYWR5UmVhZCgpIGNvbnN0IHsK ICAgIHJldHVybiBhbHJlYWR5UmVhZCgpOwogIH0KCiAgaW5saW5lIHNpemVfdCB1blJlYWQoKSBj b25zdCB7CiAgICBpZiAocGRfaW5fbWtyIDwgcGRfb3V0X21rcikKICAgICAgcmV0dXJuICgob21u aTo6cHRyX2FyaXRoX3QpcGRfb3V0X21rciAtCiAgICAgICAgICAgICAgKG9tbmk6OnB0cl9hcml0 aF90KXBkX2luX21rcik7CiAgICBlbHNlCiAgICAgIHJldHVybiAwOwogIH0KCiAgaW5saW5lIHNp emVfdCBSZE1lc3NhZ2VVblJlYWQoKSBjb25zdCB7CiAgICByZXR1cm4gdW5SZWFkKCk7CiAgfQoK ICBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4gb3ZlcnJ1bihfQ09SQkFfVUxvbmcgbGVuKSBjb25zdCB7 CiAgICByZXR1cm4gbGVuID4gKF9DT1JCQV9VTG9uZykgdW5SZWFkKCk7CiAgfQoKICBpbmxpbmUg aW50IHJkQ3VycmVudEFsaWdubWVudCgpIGNvbnN0IHsKICAgIGludCBhbGlnbj0oKG9tbmk6OnB0 cl9hcml0aF90KXBkX2luX21rciAmICgoaW50KW9tbmk6Om1heF9hbGlnbm1lbnQgLSAxKSk7CiAg ICByZXR1cm4gKChhbGlnbik/IGFsaWduOihpbnQpb21uaTo6bWF4X2FsaWdubWVudCk7CiAgfQoK ICBpbmxpbmUgc2l6ZV90IGFscmVhZHlXcml0dGVuKCkgY29uc3QgewogICAgcmV0dXJuICgob21u aTo6cHRyX2FyaXRoX3QpcGRfb3V0X21rciAtCiAgICAgICAgICAgIChvbW5pOjpwdHJfYXJpdGhf dClzdGFydG9mc3RyZWFtKCkpOwogIH0KCiAgaW5saW5lIHNpemVfdCBXck1lc3NhZ2VBbHJlYWR5 V3JpdHRlbigpIGNvbnN0IHsKICAgIHJldHVybiAoKG9tbmk6OnB0cl9hcml0aF90KXBkX291dF9t a3IgLQogICAgICAgICAgICAob21uaTo6cHRyX2FyaXRoX3Qpc3RhcnRvZnN0cmVhbSgpKTsKICB9 CgogIGlubGluZSBpbnQgd3JDdXJyZW50QWxpZ25tZW50KCkgY29uc3QgewogICAgaW50IGFsaWdu PSgob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0X21rciAmICgoaW50KW9tbmk6Om1heF9hbGlnbm1l bnQgLSAxKSk7CiAgICByZXR1cm4gKChhbGlnbik/YWxpZ246KGludClvbW5pOjptYXhfYWxpZ25t ZW50KTsKICB9CgogIHZvaWQgc2tpcChfQ09SQkFfVUxvbmcgc2l6ZSk7CgogIGlubGluZSB2b2lk KiBkYXRhKCkgY29uc3QgeyByZXR1cm4gcGRfaW5fbWtyOyB9Cgpwcml2YXRlOgoKCgogIF9DT1JC QV9Cb29sZWFuIHBkX2V4dGVybmFsX2J1ZmZlcjsKICB2b2lkKiBwZF9idWZwOwogIHZvaWQqIHBk X2J1ZmVuZDsKICB2b2lkKiBwZF9pbl9ta3I7CiAgdm9pZCogcGRfb3V0X21rcjsKICBzdGF0aWMg Y29uc3QgaW50IHBkX2lubGluZV9idWZfc2l6ZTsKICBjaGFyIHBkX2J1ZmZlclszMl07CiAgX0NP UkJBX0Jvb2xlYW4gcGRfYnl0ZV9vcmRlcjsKCiAgaW5saW5lIHZvaWQqIGFsaWduX2FuZF9wdXRf Ynl0ZXMob21uaTo6YWxpZ25tZW50X3QgYWxpZ24sIHNpemVfdCBuYnl0ZXMpCiAgewogICAgaWYo IHBkX2V4dGVybmFsX2J1ZmZlciApIHdyaXRlX3RvX3JlYWRvbmx5X2Vycm9yKCIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvYnVmZmVyZWRTdHJlYW0uaCIsIDgyMyk7CgogICAgb21uaTo6cHRy X2FyaXRoX3QgcDEgPSBvbW5pOjphbGlnbl90bygob21uaTo6cHRyX2FyaXRoX3QpcGRfb3V0X21r cixhbGlnbik7CiAgICBvbW5pOjpwdHJfYXJpdGhfdCBwMiA9IHAxICsgbmJ5dGVzOwogICAgaWYo ICh2b2lkKilwMiA+IHBkX2J1ZmVuZCApIHsKICAgICAgZ3JvdyhwMiAtIChvbW5pOjpwdHJfYXJp dGhfdClwZF9vdXRfbWtyKTsKICAgICAgcDEgPSBvbW5pOjphbGlnbl90bygob21uaTo6cHRyX2Fy aXRoX3QpcGRfb3V0X21rciwgYWxpZ24pOwogICAgICBwMiA9IHAxICsgbmJ5dGVzOwogICAgfQog ICAgcGRfb3V0X21rciA9ICh2b2lkKikgcDI7CiAgICByZXR1cm4gKHZvaWQqKSBwMTsKICB9Cgog IGlubGluZSB2b2lkKiBhbGlnbl9hbmRfZ2V0X2J5dGVzKG9tbmk6OmFsaWdubWVudF90IGFsaWdu LHNpemVfdCBuYnl0ZXMpIHsKICAgIG9tbmk6OnB0cl9hcml0aF90IHAxID0gb21uaTo6YWxpZ25f dG8oKG9tbmk6OnB0cl9hcml0aF90KXBkX2luX21rciwgYWxpZ24pOwogICAgcGRfaW5fbWtyID0g KHZvaWQqKSAocDEgKyBuYnl0ZXMpOwogICAgaWYoIHBkX2luX21rciA+IHBkX291dF9ta3IgKSBv dmVycnVuX2Vycm9yKCk7CiAgICByZXR1cm4gKHZvaWQqKSBwMTsKICB9CgogIHZvaWQqIHN0YXJ0 b2ZzdHJlYW0oKSBjb25zdDsKICBpbmxpbmUgc2l6ZV90IHNpemUoKSB7CiAgICByZXR1cm4gKG9t bmk6OnB0cl9hcml0aF90KSBwZF9idWZlbmQgLSAob21uaTo6cHRyX2FyaXRoX3QpIHN0YXJ0b2Zz dHJlYW0oKTsKICB9CiAgdm9pZCBncm93KHNpemVfdCBtaW5pbXVtKTsKICB2b2lkIGNvcHkoY29u c3QgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICB2b2lkIG92ZXJydW5fZXJyb3IoKTsKICB2b2lkIHdy aXRlX3RvX3JlYWRvbmx5X2Vycm9yKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKTsKfTsKCgoK Cgp0ZW1wbGF0ZSA8Y2xhc3MgYnVmX3Q+CmlubGluZSB2b2lkCkNkclN0cmVhbUhlbHBlcl91bm1h cnNoYWxBcnJheVNob3J0KGJ1Zl90JiBzLCBfQ09SQkFfU2hvcnQqIGEsIGludCBsZW5ndGgpCnsK ICBzLmdldF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopIGEsIGxlbmd0aCAqIDIsIG9tbmk6OkFM SUdOXzIpOwoKICBpZiggcy5SZE1lc3NhZ2VCeXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRl ciApCiAgICBmb3IoIGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkKICAgICAgYVtpXSA9ICgo KChhW2ldKSAmIDB4ZmYpIDw8IDgpIHwgKCgoYVtpXSkgPj4gOCkgJiAweGZmKSk7Cn0KCgp0ZW1w bGF0ZSA8Y2xhc3MgYnVmX3Q+CmlubGluZSB2b2lkCkNkclN0cmVhbUhlbHBlcl91bm1hcnNoYWxB cnJheVVTaG9ydChidWZfdCYgcywgX0NPUkJBX1VTaG9ydCogYSwgaW50IGxlbmd0aCkKewogIHMu Z2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKikgYSwgbGVuZ3RoICogMiwgb21uaTo6QUxJR05f Mik7CgogIGlmKCBzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkK ICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKQogICAgICBhW2ldID0gKCgoKGFb aV0pICYgMHhmZikgPDwgOCkgfCAoKChhW2ldKSA+PiA4KSAmIDB4ZmYpKTsKfQoKCnRlbXBsYXRl IDxjbGFzcyBidWZfdD4KaW5saW5lIHZvaWQKQ2RyU3RyZWFtSGVscGVyX3VubWFyc2hhbEFycmF5 TG9uZyhidWZfdCYgcywgX0NPUkJBX0xvbmcqIGEsIGludCBsZW5ndGgpCnsKICBzLmdldF9jaGFy X2FycmF5KChfQ09SQkFfQ2hhciopIGEsIGxlbmd0aCAqIDQsIG9tbmk6OkFMSUdOXzQpOwoKICBp Ziggcy5SZE1lc3NhZ2VCeXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5dGVPcmRlciApCiAgICBmb3Io IGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkKICAgICAgYVtpXSA9ICgoKChhW2ldKSAmIDB4 ZmYwMDAwMDApID4+IDI0KSB8ICgoKGFbaV0pICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKChhW2ld KSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgoYVtpXSkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwp9 CgoKdGVtcGxhdGUgPGNsYXNzIGJ1Zl90PgppbmxpbmUgdm9pZApDZHJTdHJlYW1IZWxwZXJfdW5t YXJzaGFsQXJyYXlVTG9uZyhidWZfdCYgcywgX0NPUkJBX1VMb25nKiBhLCBpbnQgbGVuZ3RoKQp7 CiAgcy5nZXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKSBhLCBsZW5ndGggKiA0LCBvbW5pOjpB TElHTl80KTsKCiAgaWYoIHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3Jk ZXIgKQogICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApCiAgICAgIGFbaV0gPSAo KCgoYVtpXSkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKChhW2ldKSAmIDB4MDBmZjAwMDApID4+ IDgpIHwgKCgoYVtpXSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKGFbaV0pICYgMHgwMDAwMDBm ZikgPDwgMjQpKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBidWZfdD4KaW5saW5lIHZvaWQKQ2RyU3Ry ZWFtSGVscGVyX3VubWFyc2hhbEFycmF5RmxvYXQoYnVmX3QmIHMsIF9DT1JCQV9GbG9hdCogYSwg aW50IGxlbmd0aCkKewogIHMuZ2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKikgYSwgbGVuZ3Ro ICogNCwgb21uaTo6QUxJR05fNCk7CgogIGlmKCBzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9t bmk6Om15Qnl0ZU9yZGVyICkKICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKSB7 CiAgICAgIF9DT1JCQV9VTG9uZyB0bXAgPSAoKCgoKiAoX0NPUkJBX1VMb25nKikgKGEgKyBpKSkg JiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCgqIChfQ09SQkFfVUxvbmcqKSAoYSArIGkpKSAmIDB4 MDBmZjAwMDApID4+IDgpIHwgKCgoKiAoX0NPUkJBX1VMb25nKikgKGEgKyBpKSkgJiAweDAwMDBm ZjAwKSA8PCA4KSB8ICgoKCogKF9DT1JCQV9VTG9uZyopIChhICsgaSkpICYgMHgwMDAwMDBmZikg PDwgMjQpKTsKICAgICAgYVtpXSA9ICogKF9DT1JCQV9GbG9hdCopICZ0bXA7CiAgICB9Cn0KCgp0 ZW1wbGF0ZSA8Y2xhc3MgYnVmX3Q+CmlubGluZSB2b2lkCkNkclN0cmVhbUhlbHBlcl91bm1hcnNo YWxBcnJheURvdWJsZShidWZfdCYgcywgX0NPUkJBX0RvdWJsZSogYSwgaW50IGxlbmd0aCkKewog IHMuZ2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKikgYSwgbGVuZ3RoICogOCwgb21uaTo6QUxJ R05fOCk7CgogIGlmKCBzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVy ICkKICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKSB7CiAgICAgIF9DT1JCQV9V TG9uZyB0bXAwID0gKCgoKCgoX0NPUkJBX1VMb25nKikgKGEgKyBpKSlbMF0pICYgMHhmZjAwMDAw MCkgPj4gMjQpIHwgKCgoKChfQ09SQkFfVUxvbmcqKSAoYSArIGkpKVswXSkgJiAweDAwZmYwMDAw KSA+PiA4KSB8ICgoKCgoX0NPUkJBX1VMb25nKikgKGEgKyBpKSlbMF0pICYgMHgwMDAwZmYwMCkg PDwgOCkgfCAoKCgoKF9DT1JCQV9VTG9uZyopIChhICsgaSkpWzBdKSAmIDB4MDAwMDAwZmYpIDw8 IDI0KSk7CiAgICAgIF9DT1JCQV9VTG9uZyB0bXAxID0gKCgoKCgoX0NPUkJBX1VMb25nKikgKGEg KyBpKSlbMV0pICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgoKChfQ09SQkFfVUxvbmcqKSAoYSAr IGkpKVsxXSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKCgoX0NPUkJBX1VMb25nKikgKGEgKyBp KSlbMV0pICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCgoKF9DT1JCQV9VTG9uZyopIChhICsgaSkp WzFdKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgICgoX0NPUkJBX1VMb25nKikgKGEgKyBp KSlbMV0gPSB0bXAwOwogICAgICAoKF9DT1JCQV9VTG9uZyopIChhICsgaSkpWzBdID0gdG1wMTsK ICAgIH0KfQoKCnRlbXBsYXRlIDxjbGFzcyBidWZfdD4KaW5saW5lIHZvaWQKQ2RyU3RyZWFtSGVs cGVyX3VubWFyc2hhbEFycmF5TG9uZ0xvbmcoYnVmX3QmIHMsIF9DT1JCQV9Mb25nTG9uZyogYSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkKewogIHMu Z2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKikgYSwgbGVuZ3RoICogOCwgb21uaTo6QUxJR05f OCk7CgogIGlmKCBzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkK ICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKQogICAgICBhW2ldID0gKCgoKGFb aV0pICYgKDB4ZmYwMDAwMDAwMDAwMDAwMExMKSkgPj4gNTYpIHwgKCgoYVtpXSkgJiAoMHgwMGZm MDAwMDAwMDAwMDAwTEwpKSA+PiA0MCkgfCAoKChhW2ldKSAmICgweDAwMDBmZjAwMDAwMDAwMDBM TCkpID4+IDI0KSB8ICgoKGFbaV0pICYgKDB4MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAo KChhW2ldKSAmICgweDAwMDAwMDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwgKCgoYVtpXSkgJiAoMHgw MDAwMDAwMDAwZmYwMDAwTEwpKSA8PCAyNCkgfCAoKChhW2ldKSAmICgweDAwMDAwMDAwMDAwMGZm MDBMTCkpIDw8IDQwKSB8ICgoKGFbaV0pICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkgPDwgNTYp KTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBidWZfdD4KaW5saW5lIHZvaWQKQ2RyU3RyZWFtSGVscGVy X3VubWFyc2hhbEFycmF5VUxvbmdMb25nKGJ1Zl90JiBzLCBfQ09SQkFfVUxvbmdMb25nKiBhLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkKewogIHMu Z2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKikgYSwgbGVuZ3RoICogOCwgb21uaTo6QUxJR05f OCk7CgogIGlmKCBzLlJkTWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICkK ICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKQogICAgICBhW2ldID0gKCgoKGFb aV0pICYgKDB4ZmYwMDAwMDAwMDAwMDAwMExMKSkgPj4gNTYpIHwgKCgoYVtpXSkgJiAoMHgwMGZm MDAwMDAwMDAwMDAwTEwpKSA+PiA0MCkgfCAoKChhW2ldKSAmICgweDAwMDBmZjAwMDAwMDAwMDBM TCkpID4+IDI0KSB8ICgoKGFbaV0pICYgKDB4MDAwMDAwZmYwMDAwMDAwMExMKSkgPj4gOCkgfCAo KChhW2ldKSAmICgweDAwMDAwMDAwZmYwMDAwMDBMTCkpIDw8IDgpIHwgKCgoYVtpXSkgJiAoMHgw MDAwMDAwMDAwZmYwMDAwTEwpKSA8PCAyNCkgfCAoKChhW2ldKSAmICgweDAwMDAwMDAwMDAwMGZm MDBMTCkpIDw8IDQwKSB8ICgoKGFbaV0pICYgKDB4MDAwMDAwMDAwMDAwMDBmZkxMKSkgPDwgNTYp KTsKfQojIDk3MyAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL2J1ZmZlcmVkU3RyZWFtLmgi IDMKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSB2b2lkCl9DT1JCQV9TZXF1ZW5jZTxUPjo6b3Bl cmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgOjpvcGVyYXRvcj4+PShf Q09SQkFfVUxvbmcocGRfbGVuKSwgcyk7CiAgZm9yKCBpbnQgaSA9IDA7IGkgPCAoaW50KXBkX2xl bjsgaSsrICkKICAgIHBkX2J1ZltpXSA+Pj0gczsKfQoKCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxp bmUgdm9pZApfQ09SQkFfU2VxdWVuY2U8VD46Om9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVh bSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAgaWYgKGwgPiBzLlJkTWVzc2Fn ZVVuUmVhZCgpIHx8IChwZF9ib3VuZGVkICYmIGwgPiBwZF9tYXgpKSB7CiAgICBfQ09SQkFfbWFy c2hhbF9lcnJvcigpOwoKICB9CiAgbGVuZ3RoKGwpOwogIGZvciggX0NPUkJBX1VMb25nIGkgPSAw OyBpIDwgbDsgaSsrICkKICAgIHBkX2J1ZltpXSA8PD0gczsKfQoKCnRlbXBsYXRlIDxjbGFzcyBU PgppbmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2U8VD46Om9wZXJhdG9yPj49IChNZW1CdWZmZXJl ZFN0cmVhbSYgcykgY29uc3QKewogIHBkX2xlbiA+Pj0gczsKICBmb3IgKGludCBpPTA7IGk8KGlu dClwZF9sZW47IGkrKykKICAgIHBkX2J1ZltpXSA+Pj0gczsKfQoKCnRlbXBsYXRlIDxjbGFzcyBU PgppbmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2U8VD46Om9wZXJhdG9yPDw9IChNZW1CdWZmZXJl ZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAgaWYgKHMudW5SZWFk KCkgPCBsIHx8IChwZF9ib3VuZGVkICYmIGwgPiBwZF9tYXgpKSB7CiAgICBfQ09SQkFfbWFyc2hh bF9lcnJvcigpOwoKICB9CiAgbGVuZ3RoKGwpOwogIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxs OyBpKyspCiAgICBwZF9idWZbaV0gPDw9IHM7Cn0KCnRlbXBsYXRlIDxjbGFzcyBULGludCBlbG1T aXplLGludCBlbG1BbGlnbm1lbnQ+CmlubGluZQp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVu Y2Vfd19GaXhTaXplRWxlbWVudDxULGVsbVNpemUsZWxtQWxpZ25tZW50Pjo6b3BlcmF0b3I+Pj0g KE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgX0NPUkJBX1VMb25nIGwgPSBCYXNlVDo6 bGVuZ3RoKCk7CiAgbCA+Pj0gczsKICBpZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFs aWdubWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsKICAgIF9DT1JCQV9VTG9uZyBwYWRkaW5n ID0gMDsKICAgIGlmIChzLndyQ3VycmVudEFsaWdubWVudCgpICE9IChpbnQpb21uaTo6QUxJR05f OCkKICAgICAgcGFkZGluZyA+Pj0gczsKICB9CiAgcy5wdXRfY2hhcl9hcnJheSgoX0NPUkJBX0No YXIqKUJhc2VUOjpOUF9kYXRhKCksKGludClsKmVsbVNpemUpOwp9CgoKdGVtcGxhdGUgPGNsYXNz IFQsaW50IGVsbVNpemUsaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJBX1VuYm91 bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PFQsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+Ojpv cGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBs IDw8PSBzOwogIGlmIChsKmVsbVNpemUgPiBzLlJkTWVzc2FnZVVuUmVhZCgpKSB7CiAgICBfQ09S QkFfbWFyc2hhbF9lcnJvcigpOwoKICB9CiAgQmFzZVQ6Omxlbmd0aChsKTsKICBpZiAobD09MCkg cmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsK ICAgIGlmIChzLnJkQ3VycmVudEFsaWdubWVudCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkKICAg ICAgcy5za2lwKHNpemVvZihfQ09SQkFfVUxvbmcpKTsKICB9CiAgcy5nZXRfY2hhcl9hcnJheSgo X0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRhKCksKGludClsKmVsbVNpemUpOwogIGlmIChzLlJk TWVzc2FnZUJ5dGVPcmRlcigpICE9IG9tbmk6Om15Qnl0ZU9yZGVyICYmIGVsbUFsaWdubWVudCAh PSAxKSB7CiAgICBpZiAoZWxtU2l6ZSA9PSAyKSB7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9 MDsgaTxsOyBpKyspIHsKICAgICAgICBfQ09SQkFfVVNob3J0IHQgPSAoKF9DT1JCQV9VU2hvcnQq KUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5Q X2RhdGEoKSlbaV0gPSAoKCgodCkgJiAweGZmKSA8PCA4KSB8ICgoKHQpID4+IDgpICYgMHhmZikp OwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChlbG1TaXplID09IDQpIHsKICAgICAgZm9yIChf Q09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9DT1JCQV9VTG9uZyB0ID0gKChf Q09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25n KilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgo KHQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0KSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgo dCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChlbG1T aXplID09IDgpIHsKICAgICAgbCAqPSAyOwogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8 bDsgaSs9MikgewogICAgICAgIF9DT1JCQV9VTG9uZyB0bDEgPSAoKF9DT1JCQV9VTG9uZyopQmFz ZVQ6Ok5QX2RhdGEoKSlbaSsxXTsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwyID0gKCgoKHRsMSkg JiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0 bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsK ICAgICAgICB0bDEgPSAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAg ICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gdGwyOwogICAgICAgICgo X0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpKzFdID0gKCgoKHRsMSkgJiAweGZmMDAw MDAwKSA+PiAyNCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0bDEpICYgMHgw MDAwZmYwMCkgPDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgfQog ICAgfQogIH0KfQoKCnRlbXBsYXRlIDxjbGFzcyBULGludCBlbG1TaXplLGludCBlbG1BbGlnbm1l bnQ+CmlubGluZQp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVu dDxULGVsbVNpemUsZWxtQWxpZ25tZW50Pjo6b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFt JiBzKSBjb25zdAp7CiAgX0NPUkJBX1VMb25nIGwgPSBCYXNlVDo6bGVuZ3RoKCk7CiAgbCA+Pj0g czsKICBpZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9PSAoaW50KW9t bmk6OkFMSUdOXzgpIHsKICAgIF9DT1JCQV9VTG9uZyBwYWRkaW5nID0gMDsKICAgIGlmIChzLndy Q3VycmVudEFsaWdubWVudCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkKICAgICAgcGFkZGluZyA+ Pj0gczsKICB9CiAgcy5wdXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRh KCksKGludClsKmVsbVNpemUpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsaW50IGVsbVNpemUsaW50 IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0Zp eFNpemVFbGVtZW50PFQsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcjw8PSAoTWVtQnVm ZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8PSBzOwogIGlmIChzLnVu UmVhZCgpIDwgKGwqZWxtU2l6ZSkpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0K ICBCYXNlVDo6bGVuZ3RoKGwpOwogIGlmIChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQpZWxtQWxp Z25tZW50ID09IChpbnQpb21uaTo6QUxJR05fOCkgewogICAgaWYgKHMucmRDdXJyZW50QWxpZ25t ZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84KQogICAgICBzLnNraXAoc2l6ZW9mKF9DT1JCQV9V TG9uZykpOwogIH0KICBzLmdldF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2Rh dGEoKSwoaW50KWwqZWxtU2l6ZSk7CiAgaWYgKHMuYnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRl T3JkZXIgJiYgZWxtQWxpZ25tZW50ICE9IDEpIHsKICAgIGlmIChlbG1TaXplID09IDIpIHsKICAg ICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9DT1JCQV9VU2hv cnQgdCA9ICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChf Q09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgp IHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNp emUgPT0gNCkgewogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICAg ICAgX0NPUkJBX1VMb25nIHQgPSAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07 CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gKCgoKHQpICYg MHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodCkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHQpICYg MHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIH0K ICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gOCkgewogICAgICBsICo9IDI7CiAgICAgIGZv ciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKz0yKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHRs MSA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpKzFdOwogICAgICAgIF9DT1JC QV9VTG9uZyB0bDIgPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAw eDAwZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkg JiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICAgIHRsMSA9ICgoX0NPUkJBX1VMb25nKilCYXNl VDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEo KSlbaV0gPSB0bDI7CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2kr MV0gPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAw KSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAw MGZmKSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgfQp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsaW50 IG1heCxpbnQgZWxtU2l6ZSwgaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJBX0Jv dW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDxULG1heCxlbG1TaXplLGVsbUFsaWdubWVu dD46Om9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JCQV9V TG9uZyBsID0gQmFzZVQ6Omxlbmd0aCgpOwogIGwgPj49IHM7CiAgaWYgKGw9PTApIHJldHVybjsK ICBpZiAoKGludCllbG1BbGlnbm1lbnQgPT0gKGludClvbW5pOjpBTElHTl84KSB7CiAgICBfQ09S QkFfVUxvbmcgcGFkZGluZyA9IDA7CiAgICBpZiAocy53ckN1cnJlbnRBbGlnbm1lbnQoKSAhPSAo aW50KW9tbmk6OkFMSUdOXzgpCiAgICAgIHBhZGRpbmcgPj49IHM7CiAgfQogIHMucHV0X2NoYXJf YXJyYXkoKF9DT1JCQV9DaGFyKilCYXNlVDo6TlBfZGF0YSgpLChpbnQpbCplbG1TaXplKTsKfQoK CnRlbXBsYXRlIDxjbGFzcyBULGludCBtYXgsaW50IGVsbVNpemUsIGludCBlbG1BbGlnbm1lbnQ+ CmlubGluZQp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8VCxt YXgsZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0m IHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8PSBzOwogIGlmIChsKmVsbVNpemUgPiBzLlJk TWVzc2FnZVVuUmVhZCgpIHx8IGwgPiBtYXgpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7 CgogIH0KCiAgQmFzZVQ6Omxlbmd0aChsKTsKICBpZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50 KWVsbUFsaWdubWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsKICAgIGlmIChzLnJkQ3VycmVu dEFsaWdubWVudCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkKICAgICAgcy5za2lwKHNpemVvZihf Q09SQkFfVUxvbmcpKTsKICB9CiAgcy5nZXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VU OjpOUF9kYXRhKCksKGludClsKmVsbVNpemUpOwogIGlmIChzLlJkTWVzc2FnZUJ5dGVPcmRlcigp ICE9IG9tbmk6Om15Qnl0ZU9yZGVyICYmIGVsbUFsaWdubWVudCAhPSAxKSB7CiAgICBpZiAoZWxt U2l6ZSA9PSAyKSB7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAg ICAgICBfQ09SQkFfVVNob3J0IHQgPSAoKF9DT1JCQV9VU2hvcnQqKUJhc2VUOjpOUF9kYXRhKCkp W2ldOwogICAgICAgICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSAoKCgo dCkgJiAweGZmKSA8PCA4KSB8ICgoKHQpID4+IDgpICYgMHhmZikpOwogICAgICB9CiAgICB9CiAg ICBlbHNlIGlmIChlbG1TaXplID09IDQpIHsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBp PGw7IGkrKykgewogICAgICAgIF9DT1JCQV9VTG9uZyB0ID0gKChfQ09SQkFfVUxvbmcqKUJhc2VU OjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgp KVtpXSA9ICgoKCh0KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHQpICYgMHgwMGZmMDAwMCkg Pj4gOCkgfCAoKCh0KSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodCkgJiAweDAwMDAwMGZmKSA8 PCAyNCkpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChlbG1TaXplID09IDgpIHsKICAgICAg bCAqPSAyOwogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8bDsgaSs9MikgewogICAgICAg IF9DT1JCQV9VTG9uZyB0bDEgPSAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaSsx XTsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwyID0gKCgoKHRsMSkgJiAweGZmMDAwMDAwKSA+PiAy NCkgfCAoKCh0bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0bDEpICYgMHgwMDAwZmYwMCkg PDwgOCkgfCAoKCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgICB0bDEgPSAoKF9D T1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVUxvbmcq KUJhc2VUOjpOUF9kYXRhKCkpW2ldID0gdGwyOwogICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNl VDo6TlBfZGF0YSgpKVtpKzFdID0gKCgoKHRsMSkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0 bDEpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0bDEpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAo KCh0bDEpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgfQogICAgfQogIH0KfQoKCnRlbXBs YXRlIDxjbGFzcyBULGludCBtYXgsaW50IGVsbVNpemUsIGludCBlbG1BbGlnbm1lbnQ+CmlubGlu ZQp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX3dfRml4U2l6ZUVsZW1lbnQ8VCxtYXgsZWxt U2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNv bnN0CnsKICBfQ09SQkFfVUxvbmcgbCA9IEJhc2VUOjpsZW5ndGgoKTsKICBsID4+PSBzOwogIGlm IChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJ R05fOCkgewogICAgX0NPUkJBX1VMb25nIHBhZGRpbmcgPSAwOwogICAgaWYgKHMud3JDdXJyZW50 QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84KQogICAgICBwYWRkaW5nID4+PSBzOwog IH0KICBzLnB1dF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50 KWwqZWxtU2l6ZSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxpbnQgbWF4LGludCBlbG1TaXplLCBp bnQgZWxtQWxpZ25tZW50PgppbmxpbmUKdm9pZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV93X0Zp eFNpemVFbGVtZW50PFQsbWF4LGVsbVNpemUsZWxtQWxpZ25tZW50Pjo6b3BlcmF0b3I8PD0gKE1l bUJ1ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NPUkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiAo KHMudW5SZWFkKCkgPCAobCplbG1TaXplKSkgfHwgbCA+IG1heCkgewogICAgX0NPUkJBX21hcnNo YWxfZXJyb3IoKTsKCiAgfQoKICBCYXNlVDo6bGVuZ3RoKGwpOwogIGlmIChsPT0wKSByZXR1cm47 CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJR05fOCkgewogICAgaWYg KHMucmRDdXJyZW50QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84KQogICAgICBzLnNr aXAoc2l6ZW9mKF9DT1JCQV9VTG9uZykpOwogIH0KICBzLmdldF9jaGFyX2FycmF5KChfQ09SQkFf Q2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50KWwqZWxtU2l6ZSk7CiAgaWYgKHMuYnl0ZU9yZGVy KCkgIT0gb21uaTo6bXlCeXRlT3JkZXIgJiYgZWxtQWxpZ25tZW50ICE9IDEpIHsKICAgIGlmIChl bG1TaXplID09IDIpIHsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewog ICAgICAgIF9DT1JCQV9VU2hvcnQgdCA9ICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEo KSlbaV07CiAgICAgICAgKChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgo KCh0KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICAgIH0KICAgIH0K ICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gNCkgewogICAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7 IGk8bDsgaSsrKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHQgPSAoKF9DT1JCQV9VTG9uZyopQmFz ZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRh KCkpW2ldID0gKCgoKHQpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodCkgJiAweDAwZmYwMDAw KSA+PiA4KSB8ICgoKHQpICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAoKCh0KSAmIDB4MDAwMDAwZmYp IDw8IDI0KSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gOCkgewogICAg ICBsICo9IDI7CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKz0yKSB7CiAgICAg ICAgX0NPUkJBX1VMb25nIHRsMSA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtp KzFdOwogICAgICAgIF9DT1JCQV9VTG9uZyB0bDIgPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+ IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAw KSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICAgIHRsMSA9ICgo X0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9VTG9u ZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSB0bDI7CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJh c2VUOjpOUF9kYXRhKCkpW2krMV0gPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgo KHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8 ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgfQp9CgoKCnRl bXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xhc3MgVGVsbSxpbnQgZGltZW5zaW9uPgpp bmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9u Pjo6b3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgcGRfbGVuID4+ PSBzOwogIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxwZF9sZW47IGkrKykgewogICAgZm9yIChf Q09SQkFfVUxvbmcgaj0wOyBqPGRpbWVuc2lvbjsgaisrKSB7CiAgICAgICooKFRlbG0qKShwZF9i dWZbaV0pK2opID4+PSBzOwogICAgfQogIH0KICByZXR1cm47Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3Mg VCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbj4KaW5saW5lIHZvaWQKX0NP UkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbj46Om9wZXJhdG9yPDw9 IChOZXRCdWZmZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAg aWYgKGwgPiBzLlJkTWVzc2FnZVVuUmVhZCgpIHx8IChwZF9ib3VuZGVkICYmIGwgPiBwZF9tYXgp KSB7CiAgICBfQ09SQkFfbWFyc2hhbF9lcnJvcigpOwoKICB9CiAgbGVuZ3RoKGwpOwogIGZvciAo X0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAgIGZvciAoX0NPUkJBX1VMb25nIGo9MDsg ajxkaW1lbnNpb247IGorKykgewogICAgICAqKChUZWxtKikocGRfYnVmW2ldKStqKSA8PD0gczsK ICAgIH0KICB9CiAgcmV0dXJuOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9zbGljZSxj bGFzcyBUZWxtLGludCBkaW1lbnNpb24+CmlubGluZSB2b2lkCl9DT1JCQV9TZXF1ZW5jZV9BcnJh eTxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24+OjpvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJl YW0mIHMpIGNvbnN0CnsKICBwZF9sZW4gPj49IHM7CiAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBp PHBkX2xlbjsgaSsrKSB7CiAgICBmb3IgKF9DT1JCQV9VTG9uZyBqPTA7IGo8ZGltZW5zaW9uOyBq KyspIHsKICAgICAgKigoVGVsbSopKHBkX2J1ZltpXSkraikgPj49IHM7CiAgICB9CiAgfQogIHJl dHVybjsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xhc3MgVGVsbSxpbnQg ZGltZW5zaW9uPgppbmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2VfQXJyYXk8VCxUX3NsaWNlLFRl bG0sZGltZW5zaW9uPjo6b3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NP UkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiAocy51blJlYWQoKSA8IGwgfHwgKHBkX2JvdW5k ZWQgJiYgbCA+IHBkX21heCkpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KICBs ZW5ndGgobCk7CiAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgZm9yIChf Q09SQkFfVUxvbmcgaj0wOyBqPGRpbWVuc2lvbjsgaisrKSB7CiAgICAgICooKFRlbG0qKShwZF9i dWZbaV0pK2opIDw8PSBzOwogICAgfQogIH0KICByZXR1cm47Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3Mg VCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbixpbnQgZWxtU2l6ZSxpbnQg ZWxtQWxpZ25tZW50PgppbmxpbmUKdm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5 X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLGVsbVNpemUsZWxtQWxp Z25tZW50Pjo6b3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgX0NP UkJBX1VMb25nIGwgPSBCYXNlVDo6bGVuZ3RoKCk7CiAgbCA+Pj0gczsKICBpZiAobD09MCkgcmV0 dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsKICAg IF9DT1JCQV9VTG9uZyBwYWRkaW5nID0gMDsKICAgIGlmIChzLndyQ3VycmVudEFsaWdubWVudCgp ICE9IChpbnQpb21uaTo6QUxJR05fOCkKICAgICAgcGFkZGluZyA+Pj0gczsKICB9CiAgcy5wdXRf Y2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRhKCksKGludClsKmRpbWVuc2lv biplbG1TaXplKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xhc3MgVGVs bSxpbnQgZGltZW5zaW9uLGludCBlbG1TaXplLGludCBlbG1BbGlnbm1lbnQ+CmlubGluZQp2b2lk Cl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhTaXplRWxlbWVudDxULFRfc2xp Y2UsVGVsbSxkaW1lbnNpb24sZWxtU2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcjw8PSAoTmV0 QnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsKICBsIDw8PSBzOwogIGlmIChs KmRpbWVuc2lvbiplbG1TaXplID4gcy5SZE1lc3NhZ2VVblJlYWQoKSkgewogICAgX0NPUkJBX21h cnNoYWxfZXJyb3IoKTsKCiAgfQogIEJhc2VUOjpsZW5ndGgobCk7CiAgaWYgKGw9PTApIHJldHVy bjsKICBpZiAoKGludCllbG1BbGlnbm1lbnQgPT0gKGludClvbW5pOjpBTElHTl84KSB7CiAgICBp ZiAocy5yZEN1cnJlbnRBbGlnbm1lbnQoKSAhPSAoaW50KW9tbmk6OkFMSUdOXzgpCiAgICAgIHMu c2tpcChzaXplb2YoX0NPUkJBX1VMb25nKSk7CiAgfQogIHMuZ2V0X2NoYXJfYXJyYXkoKF9DT1JC QV9DaGFyKilCYXNlVDo6TlBfZGF0YSgpLChpbnQpbCpkaW1lbnNpb24qZWxtU2l6ZSk7CiAgaWYg KHMuUmRNZXNzYWdlQnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRlT3JkZXIgJiYgZWxtQWxpZ25t ZW50ICE9IDEpIHsKICAgIGlmIChlbG1TaXplID09IDIpIHsKICAgICAgbCAqPSBkaW1lbnNpb247 CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAgICAgICBfQ09SQkFf VVNob3J0IHQgPSAoKF9DT1JCQV9VU2hvcnQqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAgICAg ICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSAoKCgodCkgJiAweGZmKSA8 PCA4KSB8ICgoKHQpID4+IDgpICYgMHhmZikpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChl bG1TaXplID09IDQpIHsKICAgICAgbCAqPSBkaW1lbnNpb247CiAgICAgIGZvciAoX0NPUkJBX1VM b25nIGk9MDsgaTxsOyBpKyspIHsKICAgICAgICBfQ09SQkFfVUxvbmcgdCA9ICgoX0NPUkJBX1VM b25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6 Ok5QX2RhdGEoKSlbaV0gPSAoKCgodCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh0KSAmIDB4 MDBmZjAwMDApID4+IDgpIHwgKCgodCkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHQpICYgMHgw MDAwMDBmZikgPDwgMjQpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoZWxtU2l6ZSA9PSA4 KSB7CiAgICAgIGwgKj0gMipkaW1lbnNpb247CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsg aTxsOyBpKz0yKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHRsMSA9ICgoX0NPUkJBX1VMb25nKilC YXNlVDo6TlBfZGF0YSgpKVtpKzFdOwogICAgICAgIF9DT1JCQV9VTG9uZyB0bDIgPSAoKCgodGwx KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgo KHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8PCAyNCkp OwogICAgICAgIHRsMSA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAg ICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSB0bDI7CiAgICAgICAg KChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2krMV0gPSAoKCgodGwxKSAmIDB4ZmYw MDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAw eDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICB9 CiAgICB9CiAgfQp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9zbGljZSxjbGFzcyBUZWxt LGludCBkaW1lbnNpb24saW50IGVsbVNpemUsaW50IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQK X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGlj ZSxUZWxtLGRpbWVuc2lvbixlbG1TaXplLGVsbUFsaWdubWVudD46Om9wZXJhdG9yPj49IChNZW1C dWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JCQV9VTG9uZyBsID0gQmFzZVQ6Omxlbmd0 aCgpOwogIGwgPj49IHM7CiAgaWYgKGw9PTApIHJldHVybjsKICBpZiAoKGludCllbG1BbGlnbm1l bnQgPT0gKGludClvbW5pOjpBTElHTl84KSB7CiAgICBfQ09SQkFfVUxvbmcgcGFkZGluZyA9IDA7 CiAgICBpZiAocy53ckN1cnJlbnRBbGlnbm1lbnQoKSAhPSAoaW50KW9tbmk6OkFMSUdOXzgpCiAg ICAgIHBhZGRpbmcgPj49IHM7CiAgfQogIHMucHV0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKilC YXNlVDo6TlBfZGF0YSgpLChpbnQpbCpkaW1lbnNpb24qZWxtU2l6ZSk7Cn0KCgp0ZW1wbGF0ZSA8 Y2xhc3MgVCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbixpbnQgZWxtU2l6 ZSxpbnQgZWxtQWxpZ25tZW50PgppbmxpbmUKdm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X0FycmF5X3dfRml4U2l6ZUVsZW1lbnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLGVsbVNpemUs ZWxtQWxpZ25tZW50Pjo6b3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NP UkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiggcy51blJlYWQoKSA8IGwgKiBkaW1lbnNpb24g KiBlbG1TaXplICkgewogICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKCiAgfQogIEJhc2VUOjps ZW5ndGgobCk7CiAgaWYgKGw9PTApIHJldHVybjsKICBpZiAoKGludCllbG1BbGlnbm1lbnQgPT0g KGludClvbW5pOjpBTElHTl84KSB7CiAgICBpZiAocy5yZEN1cnJlbnRBbGlnbm1lbnQoKSAhPSAo aW50KW9tbmk6OkFMSUdOXzgpCiAgICAgIHMuc2tpcChzaXplb2YoX0NPUkJBX1VMb25nKSk7CiAg fQogIHMuZ2V0X2NoYXJfYXJyYXkoKF9DT1JCQV9DaGFyKilCYXNlVDo6TlBfZGF0YSgpLChpbnQp bCpkaW1lbnNpb24qZWxtU2l6ZSk7CiAgaWYgKHMuYnl0ZU9yZGVyKCkgIT0gb21uaTo6bXlCeXRl T3JkZXIgJiYgZWxtQWxpZ25tZW50ICE9IDEpIHsKICAgIGlmIChlbG1TaXplID09IDIpIHsKICAg ICAgbCAqPSBkaW1lbnNpb247CiAgICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKysp IHsKICAgICAgICBfQ09SQkFfVVNob3J0IHQgPSAoKF9DT1JCQV9VU2hvcnQqKUJhc2VUOjpOUF9k YXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0g PSAoKCgodCkgJiAweGZmKSA8PCA4KSB8ICgoKHQpID4+IDgpICYgMHhmZikpOwogICAgICB9CiAg ICB9CiAgICBlbHNlIGlmIChlbG1TaXplID09IDQpIHsKICAgICAgbCAqPSBkaW1lbnNpb247CiAg ICAgIGZvciAoX0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKyspIHsKICAgICAgICBfQ09SQkFfVUxv bmcgdCA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9D T1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaV0gPSAoKCgodCkgJiAweGZmMDAwMDAwKSA+ PiAyNCkgfCAoKCh0KSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodCkgJiAweDAwMDBmZjAwKSA8 PCA4KSB8ICgoKHQpICYgMHgwMDAwMDBmZikgPDwgMjQpKTsKICAgICAgfQogICAgfQogICAgZWxz ZSBpZiAoZWxtU2l6ZSA9PSA4KSB7CiAgICAgIGwgKj0gMipkaW1lbnNpb247CiAgICAgIGZvciAo X0NPUkJBX1VMb25nIGk9MDsgaTxsOyBpKz0yKSB7CiAgICAgICAgX0NPUkJBX1VMb25nIHRsMSA9 ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpKzFdOwogICAgICAgIF9DT1JCQV9V TG9uZyB0bDIgPSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAw ZmYwMDAwKSA+PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAw eDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICAgIHRsMSA9ICgoX0NPUkJBX1VMb25nKilCYXNlVDo6 TlBfZGF0YSgpKVtpXTsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlb aV0gPSB0bDI7CiAgICAgICAgKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2krMV0g PSAoKCgodGwxKSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8ICgoKHRsMSkgJiAweDAwZmYwMDAwKSA+ PiA4KSB8ICgoKHRsMSkgJiAweDAwMDBmZjAwKSA8PCA4KSB8ICgoKHRsMSkgJiAweDAwMDAwMGZm KSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgfQp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3Mg VF9zbGljZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24saW50IG1heCxpbnQgZWxtU2l6ZSwgaW50 IGVsbUFsaWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlf d19GaXhTaXplRWxlbWVudDxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sbWF4LGVsbVNpemUsZWxt QWxpZ25tZW50Pjo6b3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAg X0NPUkJBX1VMb25nIGwgPSBCYXNlVDo6bGVuZ3RoKCk7CiAgbCA+Pj0gczsKICBpZiAobD09MCkg cmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsK ICAgIF9DT1JCQV9VTG9uZyBwYWRkaW5nID0gMDsKICAgIGlmIChzLndyQ3VycmVudEFsaWdubWVu dCgpICE9IChpbnQpb21uaTo6QUxJR05fOCkKICAgICAgcGFkZGluZyA+Pj0gczsKICB9CiAgcy5w dXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRhKCksKGludClsKmRpbWVu c2lvbiplbG1TaXplKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfc2xpY2UsY2xhc3Mg VGVsbSxpbnQgZGltZW5zaW9uLGludCBtYXgsaW50IGVsbVNpemUsIGludCBlbG1BbGlnbm1lbnQ+ CmlubGluZQp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX0FycmF5X3dfRml4U2l6ZUVsZW1l bnQ8VCxUX3NsaWNlLFRlbG0sZGltZW5zaW9uLG1heCxlbG1TaXplLGVsbUFsaWdubWVudD46Om9w ZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwg PDw9IHM7CiAgaWYgKGwqZGltZW5zaW9uKmVsbVNpemUgPiBzLlJkTWVzc2FnZVVuUmVhZCgpIHx8 IGwgPiBtYXgpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KCiAgQmFzZVQ6Omxl bmd0aChsKTsKICBpZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9PSAo aW50KW9tbmk6OkFMSUdOXzgpIHsKICAgIGlmIChzLnJkQ3VycmVudEFsaWdubWVudCgpICE9IChp bnQpb21uaTo6QUxJR05fOCkKICAgICAgcy5za2lwKHNpemVvZihfQ09SQkFfVUxvbmcpKTsKICB9 CiAgcy5nZXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRhKCksKGludCls KmRpbWVuc2lvbiplbG1TaXplKTsKICBpZiAocy5SZE1lc3NhZ2VCeXRlT3JkZXIoKSAhPSBvbW5p OjpteUJ5dGVPcmRlciAmJiBlbG1BbGlnbm1lbnQgIT0gMSkgewogICAgaWYgKGVsbVNpemUgPT0g MikgewogICAgICBsICo9IGRpbWVuc2lvbjsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBp PGw7IGkrKykgewogICAgICAgIF9DT1JCQV9VU2hvcnQgdCA9ICgoX0NPUkJBX1VTaG9ydCopQmFz ZVQ6Ok5QX2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0 YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAg ICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gNCkgewogICAgICBsICo9IGRpbWVu c2lvbjsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9D T1JCQV9VTG9uZyB0ID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAg ICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYw MDAwMDApID4+IDI0KSB8ICgoKHQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0KSAmIDB4MDAw MGZmMDApIDw8IDgpIHwgKCgodCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICB9CiAgICB9 CiAgICBlbHNlIGlmIChlbG1TaXplID09IDgpIHsKICAgICAgbCAqPSAyKmRpbWVuc2lvbjsKICAg ICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrPTIpIHsKICAgICAgICBfQ09SQkFfVUxv bmcgdGwxID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2krMV07CiAgICAgICAg X0NPUkJBX1VMb25nIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwx KSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgo dGwxKSAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgICAgdGwxID0gKChfQ09SQkFfVUxvbmcq KUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBf ZGF0YSgpKVtpXSA9IHRsMjsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEo KSlbaSsxXSA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBm ZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4 MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3Mg VCxjbGFzcyBUX3NsaWNlLGNsYXNzIFRlbG0saW50IGRpbWVuc2lvbixpbnQgbWF4LGludCBlbG1T aXplLCBpbnQgZWxtQWxpZ25tZW50PgppbmxpbmUKdm9pZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5j ZV9BcnJheV93X0ZpeFNpemVFbGVtZW50PFQsVF9zbGljZSxUZWxtLGRpbWVuc2lvbixtYXgsZWxt U2l6ZSxlbG1BbGlnbm1lbnQ+OjpvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNv bnN0CnsKICBfQ09SQkFfVUxvbmcgbCA9IEJhc2VUOjpsZW5ndGgoKTsKICBsID4+PSBzOwogIGlm IChsPT0wKSByZXR1cm47CiAgaWYgKChpbnQpZWxtQWxpZ25tZW50ID09IChpbnQpb21uaTo6QUxJ R05fOCkgewogICAgX0NPUkJBX1VMb25nIHBhZGRpbmcgPSAwOwogICAgaWYgKHMud3JDdXJyZW50 QWxpZ25tZW50KCkgIT0gKGludClvbW5pOjpBTElHTl84KQogICAgICBwYWRkaW5nID4+PSBzOwog IH0KICBzLnB1dF9jaGFyX2FycmF5KChfQ09SQkFfQ2hhciopQmFzZVQ6Ok5QX2RhdGEoKSwoaW50 KWwqZGltZW5zaW9uKmVsbVNpemUpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9zbGlj ZSxjbGFzcyBUZWxtLGludCBkaW1lbnNpb24saW50IG1heCxpbnQgZWxtU2l6ZSwgaW50IGVsbUFs aWdubWVudD4KaW5saW5lCnZvaWQKX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfd19GaXhT aXplRWxlbWVudDxULFRfc2xpY2UsVGVsbSxkaW1lbnNpb24sbWF4LGVsbVNpemUsZWxtQWxpZ25t ZW50Pjo6b3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NPUkJBX1VMb25n IGw7CiAgbCA8PD0gczsKICBpZiAoKHMudW5SZWFkKCkgPCAobCpkaW1lbnNpb24qZWxtU2l6ZSkp IHx8IGwgPiBtYXgpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KCiAgQmFzZVQ6 Omxlbmd0aChsKTsKICBpZiAobD09MCkgcmV0dXJuOwogIGlmICgoaW50KWVsbUFsaWdubWVudCA9 PSAoaW50KW9tbmk6OkFMSUdOXzgpIHsKICAgIGlmIChzLnJkQ3VycmVudEFsaWdubWVudCgpICE9 IChpbnQpb21uaTo6QUxJR05fOCkKICAgICAgcy5za2lwKHNpemVvZihfQ09SQkFfVUxvbmcpKTsK ICB9CiAgcy5nZXRfY2hhcl9hcnJheSgoX0NPUkJBX0NoYXIqKUJhc2VUOjpOUF9kYXRhKCksKGlu dClsKmRpbWVuc2lvbiplbG1TaXplKTsKICBpZiAocy5ieXRlT3JkZXIoKSAhPSBvbW5pOjpteUJ5 dGVPcmRlciAmJiBlbG1BbGlnbm1lbnQgIT0gMSkgewogICAgaWYgKGVsbVNpemUgPT0gMikgewog ICAgICBsICo9IGRpbWVuc2lvbjsKICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkr KykgewogICAgICAgIF9DT1JCQV9VU2hvcnQgdCA9ICgoX0NPUkJBX1VTaG9ydCopQmFzZVQ6Ok5Q X2RhdGEoKSlbaV07CiAgICAgICAgKChfQ09SQkFfVVNob3J0KilCYXNlVDo6TlBfZGF0YSgpKVtp XSA9ICgoKCh0KSAmIDB4ZmYpIDw8IDgpIHwgKCgodCkgPj4gOCkgJiAweGZmKSk7CiAgICAgIH0K ICAgIH0KICAgIGVsc2UgaWYgKGVsbVNpemUgPT0gNCkgewogICAgICBsICo9IGRpbWVuc2lvbjsK ICAgICAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgICAgIF9DT1JCQV9V TG9uZyB0ID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgo X0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgpKVtpXSA9ICgoKCh0KSAmIDB4ZmYwMDAwMDAp ID4+IDI0KSB8ICgoKHQpICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAoKCh0KSAmIDB4MDAwMGZmMDAp IDw8IDgpIHwgKCgodCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpOwogICAgICB9CiAgICB9CiAgICBl bHNlIGlmIChlbG1TaXplID09IDgpIHsKICAgICAgbCAqPSAyKmRpbWVuc2lvbjsKICAgICAgZm9y IChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrPTIpIHsKICAgICAgICBfQ09SQkFfVUxvbmcgdGwx ID0gKChfQ09SQkFfVUxvbmcqKUJhc2VUOjpOUF9kYXRhKCkpW2krMV07CiAgICAgICAgX0NPUkJB X1VMb25nIHRsMiA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4 MDBmZjAwMDApID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAm IDB4MDAwMDAwZmYpIDw8IDI0KSk7CiAgICAgICAgdGwxID0gKChfQ09SQkFfVUxvbmcqKUJhc2VU OjpOUF9kYXRhKCkpW2ldOwogICAgICAgICgoX0NPUkJBX1VMb25nKilCYXNlVDo6TlBfZGF0YSgp KVtpXSA9IHRsMjsKICAgICAgICAoKF9DT1JCQV9VTG9uZyopQmFzZVQ6Ok5QX2RhdGEoKSlbaSsx XSA9ICgoKCh0bDEpICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgKCgodGwxKSAmIDB4MDBmZjAwMDAp ID4+IDgpIHwgKCgodGwxKSAmIDB4MDAwMGZmMDApIDw8IDgpIHwgKCgodGwxKSAmIDB4MDAwMDAw ZmYpIDw8IDI0KSk7CiAgICAgIH0KICAgIH0KICB9Cn0KIyAxNjA3ICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaU9SQjMvYnVmZmVyZWRTdHJlYW0uaCIgMwp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfX0Jvb2xlYW46Om9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3QK ewogIF9DT1JCQV9TZXF1ZW5jZTxfQ09SQkFfQm9vbGVhbj46Om9wZXJhdG9yPj49KHMpOwp9CgoK dm9pZApfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuOjpvcGVyYXRvcjw8PSAoTmV0 QnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfU2VxdWVuY2U8X0NPUkJBX0Jvb2xlYW4+Ojpv cGVyYXRvcjw8PShzKTsKfQoKCnZvaWQKX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fQm9vbGVh bjo6b3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgX0NPUkJBX1Nl cXVlbmNlPF9DT1JCQV9Cb29sZWFuPjo6b3BlcmF0b3I+Pj0ocyk7Cn0KCgp2b2lkCl9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2VfX0Jvb2xlYW46Om9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVh bSYgcykKewogIF9DT1JCQV9TZXF1ZW5jZTxfQ09SQkFfQm9vbGVhbj46Om9wZXJhdG9yPDw9KHMp Owp9CgoKdGVtcGxhdGUgPGludCBtYXg+CnZvaWQKX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX0Jv b2xlYW48bWF4Pjo6b3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAg X0NPUkJBX1NlcXVlbmNlPF9DT1JCQV9Cb29sZWFuPjo6b3BlcmF0b3I+Pj0ocyk7Cn0KCgp0ZW1w bGF0ZSA8aW50IG1heD4Kdm9pZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fQm9vbGVhbjxtYXg+ OjpvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfVUxvbmcgbDsK ICBsIDw8PSBzOwogIGlmIChsID4gcy5SZE1lc3NhZ2VVblJlYWQoKSB8fCBsID4gbWF4KSB7CiAg ICBfQ09SQkFfbWFyc2hhbF9lcnJvcigpOwoKICB9CgogIEJhc2VUOjpsZW5ndGgobCk7CiAgZm9y IChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykgewogICAgX0NPUkJBX1NlcXVlbmNlPF9DT1JC QV9Cb29sZWFuPjo6TlBfZGF0YSgpW2ldIDw8PSBzOwogIH0KICByZXR1cm47Cn0KCgp0ZW1wbGF0 ZSA8aW50IG1heD4Kdm9pZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fQm9vbGVhbjxtYXg+Ojpv cGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBfQ09SQkFfU2VxdWVu Y2U8X0NPUkJBX0Jvb2xlYW4+OjpvcGVyYXRvcj4+PShzKTsKfQoKCnRlbXBsYXRlIDxpbnQgbWF4 Pgp2b2lkCl9DT1JCQV9Cb3VuZGVkX1NlcXVlbmNlX19Cb29sZWFuPG1heD46Om9wZXJhdG9yPDw9 IChNZW1CdWZmZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAg aWYgKChzLnVuUmVhZCgpIDwgbCkgfHwgbCA+IG1heCkgewogICAgX0NPUkJBX21hcnNoYWxfZXJy b3IoKTsKCiAgfQogIEJhc2VUOjpsZW5ndGgobCk7CiAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBp PGw7IGkrKykgewogICAgX0NPUkJBX1NlcXVlbmNlPF9DT1JCQV9Cb29sZWFuPjo6TlBfZGF0YSgp W2ldIDw8PSBzOwogIH0KICByZXR1cm47Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUX3Ns aWNlLCBpbnQgZGltZW5zaW9uPgp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlf X0Jvb2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbj46OgogICAgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZl cmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxf Q09SQkFfQm9vbGVhbixkaW1lbnNpb24+OjpvcGVyYXRvcj4+PShzKTsKfQoKCnRlbXBsYXRlPGNs YXNzIFQsIGNsYXNzIFRfc2xpY2UsIGludCBkaW1lbnNpb24+CnZvaWQKX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVhbjxULFRfc2xpY2UsZGltZW5zaW9uPjo6CiAgICBvcGVy YXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpCnsKICBfQ09SQkFfU2VxdWVuY2VfQXJyYXk8 VCxUX3NsaWNlLF9DT1JCQV9Cb29sZWFuLGRpbWVuc2lvbj46Om9wZXJhdG9yPDw9KHMpOwp9CgoK dGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVF9zbGljZSwgaW50IGRpbWVuc2lvbj4Kdm9pZApfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX0FycmF5X19Cb29sZWFuPFQsVF9zbGljZSxkaW1lbnNpb24+ OjoKICAgIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSYgcykgY29uc3QKewogIF9DT1JC QV9TZXF1ZW5jZV9BcnJheTxULFRfc2xpY2UsX0NPUkJBX0Jvb2xlYW4sZGltZW5zaW9uPjo6b3Bl cmF0b3I+Pj0ocyk7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUX3NsaWNlLCBpbnQgZGlt ZW5zaW9uPgp2b2lkCl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW48VCxU X3NsaWNlLGRpbWVuc2lvbj46OgogICAgb3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBz KQp7CiAgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxfQ09SQkFfQm9vbGVhbixkaW1l bnNpb24+OjpvcGVyYXRvcjw8PShzKTsKfQoKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRfc2xp Y2UsIGludCBkaW1lbnNpb24sIGludCBtYXg+CnZvaWQKX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2Vf QXJyYXlfX0Jvb2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbixtYXg+OjoKICAgb3BlcmF0b3I+Pj0g KE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdAp7CiAgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQs VF9zbGljZSxfQ09SQkFfQm9vbGVhbixkaW1lbnNpb24+OjpvcGVyYXRvcj4+PShzKTsKfQoKCnRl bXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRfc2xpY2UsIGludCBkaW1lbnNpb24sIGludCBtYXg+CnZv aWQKX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfQXJyYXlfX0Jvb2xlYW48VCxUX3NsaWNlLGRpbWVu c2lvbixtYXg+OjoKICAgIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSYgcykKewogIF9D T1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAgaWYgKGwgPiBzLlJkTWVzc2FnZVVuUmVhZCgpIHx8 IGwgPiBtYXgpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KCiAgQmFzZVQ6Omxl bmd0aChsKTsKICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGk8bDsgaSsrKSB7CiAgICBmb3IgKF9D T1JCQV9VTG9uZyBqPTA7IGo8ZGltZW5zaW9uOyBqKyspIHsKICAgICAgKigoX0NPUkJBX0Jvb2xl YW4qKShCYXNlVDo6TlBfZGF0YSgpW2ldKStqKSA8PD0gczsKICAgIH0KICB9CiAgcmV0dXJuOwp9 CgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVF9zbGljZSwgaW50IGRpbWVuc2lvbiwgaW50IG1h eD4Kdm9pZApfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9BcnJheV9fQm9vbGVhbjxULFRfc2xpY2Us ZGltZW5zaW9uLG1heD46OgogICAgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSBj b25zdAp7CiAgX0NPUkJBX1NlcXVlbmNlX0FycmF5PFQsVF9zbGljZSxfQ09SQkFfQm9vbGVhbixk aW1lbnNpb24+OjpvcGVyYXRvcj4+PShzKTsKfQoKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRf c2xpY2UsIGludCBkaW1lbnNpb24sIGludCBtYXg+CnZvaWQKX0NPUkJBX0JvdW5kZWRfU2VxdWVu Y2VfQXJyYXlfX0Jvb2xlYW48VCxUX3NsaWNlLGRpbWVuc2lvbixtYXg+OjoKICAgIG9wZXJhdG9y PDw9IChNZW1CdWZmZXJlZFN0cmVhbSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7 CiAgaWYgKChzLnVuUmVhZCgpIDwgbCkgfHwgbCA+IG1heCkgewogICAgX0NPUkJBX21hcnNoYWxf ZXJyb3IoKTsKCiAgfQogIEJhc2VUOjpsZW5ndGgobCk7CiAgZm9yIChfQ09SQkFfVUxvbmcgaT0w OyBpPGw7IGkrKykgewogICAgZm9yIChfQ09SQkFfVUxvbmcgaj0wOyBqPGRpbWVuc2lvbjsgaisr KSB7CiAgICAgICooKF9DT1JCQV9Cb29sZWFuKikoQmFzZVQ6Ok5QX2RhdGEoKVtpXSkraikgPDw9 IHM7CiAgICB9CiAgfQogIHJldHVybjsKfQoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEVs ZW1ULGNsYXNzIFRfSGVscGVyPgppbmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQs RWxlbVQsVF9IZWxwZXI+OjpvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0 CnsKICA6Om9wZXJhdG9yPj49KF9DT1JCQV9VTG9uZyhwZF9sZW4pLCBzKTsKICBmb3IoIGludCBp ID0gMDsgaSA8IChpbnQpcGRfbGVuOyBpKysgKQogICAgVF9IZWxwZXI6Om1hcnNoYWxPYmpSZWYo cGRfZGF0YVtpXSxzKTsKfQoKCgoKCmlubGluZSB2b2lkIG9wZXJhdG9yIDw8PSAob21uaU9iaktl eSYgaywgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBfQ09SQkFfVUxvbmcgc2l6ZTsKICBzaXpl IDw8PSBzOwogIGsuc2V0X3NpemUoc2l6ZSk7CiAgcy5nZXRfY2hhcl9hcnJheSgoX0NPUkJBX0No YXIqKSBrLndyaXRlX2tleSgpLCBzaXplKTsKfQppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKG9t bmlPYmpLZXkmIGssIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgX0NPUkJBX1VMb25nIHNpemU7 CiAgc2l6ZSA8PD0gczsKICBrLnNldF9zaXplKHNpemUpOwogIHMuZ2V0X2NoYXJfYXJyYXkoKF9D T1JCQV9DaGFyKikgay53cml0ZV9rZXkoKSwgc2l6ZSk7Cn0KCgoKCgp0ZW1wbGF0ZSA8Y2xhc3Mg VCwgY2xhc3MgRWxlbVQsY2xhc3MgVF9IZWxwZXI+CmlubGluZSB2b2lkCl9DT1JCQV9TZXF1ZW5j ZV9PYmpSZWY8VCxFbGVtVCxUX0hlbHBlcj46Om9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVh bSYgcykKewogIF9DT1JCQV9VTG9uZyBsOwogIGwgPDw9IHM7CiAgaWYgKGwgPiBzLlJkTWVzc2Fn ZVVuUmVhZCgpIHx8IChwZF9ib3VuZGVkICYmIGwgPiBwZF9tYXgpKSB7CiAgICBfQ09SQkFfbWFy c2hhbF9lcnJvcigpOwoKICB9CiAgbGVuZ3RoKGwpOwogIGZvciggX0NPUkJBX1VMb25nIGkgPSAw OyBpIDwgbDsgaSsrICkKICAgIG9wZXJhdG9yW10oaSkgPSBUX0hlbHBlcjo6dW5tYXJzaGFsT2Jq UmVmKHMpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEVsZW1ULGNsYXNzIFRfSGVscGVy PgppbmxpbmUgdm9pZApfQ09SQkFfU2VxdWVuY2VfT2JqUmVmPFQsRWxlbVQsVF9IZWxwZXI+Ojpv cGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0CnsKICBwZF9sZW4gPj49IHM7 CiAgZm9yIChpbnQgaT0wOyBpPChpbnQpcGRfbGVuOyBpKyspCiAgICBUX0hlbHBlcjo6bWFyc2hh bE9ialJlZihwZF9kYXRhW2ldLHMpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEVsZW1U LCBjbGFzcyBUX0hlbHBlcj4KaW5saW5lIHZvaWQKX0NPUkJBX1NlcXVlbmNlX09ialJlZjxULEVs ZW1ULFRfSGVscGVyPjo6b3BlcmF0b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKQp7CiAgX0NP UkJBX1VMb25nIGw7CiAgbCA8PD0gczsKICBpZiAocy51blJlYWQoKSA8IGwgfHwgKHBkX2JvdW5k ZWQgJiYgbCA+IHBkX21heCkpIHsKICAgIF9DT1JCQV9tYXJzaGFsX2Vycm9yKCk7CgogIH0KICBs ZW5ndGgobCk7CiAgZm9yIChfQ09SQkFfVUxvbmcgaT0wOyBpPGw7IGkrKykKICAgIG9wZXJhdG9y W10oaSkgPSBUX0hlbHBlcjo6dW5tYXJzaGFsT2JqUmVmKHMpOwp9CiMgNDA4ICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvb21uaUludGVybmFsLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvaW5j bHVkZS9vbW5pT1JCMy9naW9wRHJpdmVyLmgiIDEgMwojIDg0ICIvdXNyL2xvY2FsL2luY2x1ZGUv b21uaU9SQjMvZ2lvcERyaXZlci5oIiAzCmNsYXNzIEdJT1BfQmFzZXR5cGVzIHsKcHVibGljOgog IGNsYXNzIE1lc3NhZ2VIZWFkZXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgX0NPUkJBX0NoYXIg SGVhZGVyVHlwZVs4XTsKICAgIHN0YXRpYyBjb25zdCBIZWFkZXJUeXBlIFJlcXVlc3Q7CiAgICBz dGF0aWMgY29uc3QgSGVhZGVyVHlwZSBSZXBseTsKICAgIHN0YXRpYyBjb25zdCBIZWFkZXJUeXBl IENhbmNlbFJlcXVlc3Q7CiAgICBzdGF0aWMgY29uc3QgSGVhZGVyVHlwZSBMb2NhdGVSZXF1ZXN0 OwogICAgc3RhdGljIGNvbnN0IEhlYWRlclR5cGUgTG9jYXRlUmVwbHk7CiAgICBzdGF0aWMgY29u c3QgSGVhZGVyVHlwZSBDbG9zZUNvbm5lY3Rpb247CiAgICBzdGF0aWMgY29uc3QgSGVhZGVyVHlw ZSBNZXNzYWdlRXJyb3I7CiAgfTsKICBzdHJ1Y3QgX1N5c0V4Y2VwdFJlcG9JRCB7CiAgICBfQ09S QkFfQ2hhciAqaWQ7CiAgICBfQ09SQkFfVUxvbmcgbGVuOwoKICAgIF9TeXNFeGNlcHRSZXBvSUQo X0NPUkJBX0NoYXIgKmkpIHsKICAgICAgaWQgPSBpOyBsZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIg KilpKTsKICAgIH0KICB9OwogIGNsYXNzIFN5c0V4Y2VwdFJlcG9JRCB7CiAgcHVibGljOgogICAg c3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgVU5LTk9XTjsKICAgIHN0YXRpYyBjb25zdCBf U3lzRXhjZXB0UmVwb0lEIEJBRF9QQVJBTTsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVw b0lEIE5PX01FTU9SWTsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIElNUF9MSU1J VDsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIENPTU1fRkFJTFVSRTsKICAgIHN0 YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIElOVl9PQkpSRUY7CiAgICBzdGF0aWMgY29uc3Qg X1N5c0V4Y2VwdFJlcG9JRCBPQkpFQ1RfTk9UX0VYSVNUOwogICAgc3RhdGljIGNvbnN0IF9TeXNF eGNlcHRSZXBvSUQgTk9fUEVSTUlTU0lPTjsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVw b0lEIElOVEVSTkFMOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgTUFSU0hBTDsK ICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIElOSVRJQUxJWkU7CiAgICBzdGF0aWMg Y29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBOT19JTVBMRU1FTlQ7CiAgICBzdGF0aWMgY29uc3QgX1N5 c0V4Y2VwdFJlcG9JRCBCQURfVFlQRUNPREU7CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJl cG9JRCBCQURfT1BFUkFUSU9OOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgTk9f UkVTT1VSQ0VTOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgTk9fUkVTUE9OU0U7 CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBQRVJTSVNUX1NUT1JFOwogICAgc3Rh dGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgQkFEX0lOVl9PUkRFUjsKICAgIHN0YXRpYyBjb25z dCBfU3lzRXhjZXB0UmVwb0lEIFRSQU5TSUVOVDsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0 UmVwb0lEIEZSRUVfTUVNOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgSU5WX0lE RU5UOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgSU5WX0ZMQUc7CiAgICBzdGF0 aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBJTlRGX1JFUE9TOwogICAgc3RhdGljIGNvbnN0IF9T eXNFeGNlcHRSZXBvSUQgQkFEX0NPTlRFWFQ7CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJl cG9JRCBPQkpfQURBUFRFUjsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIERBVEFf Q09OVkVSU0lPTjsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIFRSQU5TQUNUSU9O X1JFUVVJUkVEOwogICAgc3RhdGljIGNvbnN0IF9TeXNFeGNlcHRSZXBvSUQgVFJBTlNBQ1RJT05f Uk9MTEVEQkFDSzsKICAgIHN0YXRpYyBjb25zdCBfU3lzRXhjZXB0UmVwb0lEIElOVkFMSURfVFJB TlNBQ1RJT047CiAgICBzdGF0aWMgY29uc3QgX1N5c0V4Y2VwdFJlcG9JRCBXUk9OR19UUkFOU0FD VElPTjsKICAgIHN0YXRpYyBjb25zdCBfQ09SQkFfVUxvbmcgbWF4SURMZW47CiAgICBzdGF0aWMg Y29uc3QgX0NPUkJBX0NoYXIgKnZlcnNpb247CiAgICBzdGF0aWMgY29uc3QgX0NPUkJBX1VMb25n IHZlcnNpb25MZW47CgogIH07CiAgc3RhdGljIHNpemVfdCBtYXhfZ2lvcF9tZXNzYWdlX3NpemU7 Cn07CgoKY2xhc3MgR0lPUF9DIDogcHVibGljIEdJT1BfQmFzZXR5cGVzLCBwdWJsaWMgTmV0QnVm ZmVyZWRTdHJlYW0gewpwdWJsaWM6CgogIEdJT1BfQyhSb3BlICpyKTsKICB+R0lPUF9DKCk7Cgog IGVudW0gU3RhdGUgeyBJZGxlLAogICAgICAgICAgICAgICBSZXF1ZXN0SW5Qcm9ncmVzcywKICAg ICAgICAgICAgICAgV2FpdGluZ0ZvclJlcGx5LAogICAgICAgICAgICAgICBSZXBseUlzQmVpbmdQ cm9jZXNzZWQsCiAgICAgICAgICAgICAgIFpvbWJpZQogIH07CiMgMjIxICIvdXNyL2xvY2FsL2lu Y2x1ZGUvb21uaU9SQjMvZ2lvcERyaXZlci5oIiAzCiAgdm9pZCBJbml0aWFsaXNlUmVxdWVzdChj b25zdCB2b2lkKiBvYmprZXksCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qg b2Jqa2V5c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG9wbmFtZSwK ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvcG5hbWVzaXplLAogICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1zZ3NpemUsCiAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBfQ09SQkFfQm9vbGVhbiBvbmV3YXkpOwoKCgoKCiAgR0lPUDo6UmVwbHlT dGF0dXNUeXBlIFJlY2VpdmVSZXBseSgpOwoKICB2b2lkIFJlcXVlc3RDb21wbGV0ZWQoX0NPUkJB X0Jvb2xlYW4gc2tpcD0wKTsKCiAgR0lPUDo6TG9jYXRlU3RhdHVzVHlwZSBJc3N1ZUxvY2F0ZVJl cXVlc3QoY29uc3Qgdm9pZCAqb2Jqa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmprZXlzaXplKTsKCiAgc3RhdGljIHNpemVfdCBS ZXF1ZXN0SGVhZGVyU2l6ZShjb25zdCBzaXplX3Qgb2Jqa2V5c2l6ZSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvcG5hbWVzaXplKTsKCgoKICBzaXplX3Qg TWF4TWVzc2FnZVNpemUoKSBjb25zdCB7IHJldHVybiBwZF9tYXhfbWVzc2FnZV9zaXplOyB9CiMg MjU2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvZ2lvcERyaXZlci5oIiAzCnByaXZhdGU6 CiAgU3RhdGUgcGRfc3RhdGU7CiAgX0NPUkJBX1VMb25nIHBkX3JlcXVlc3RfaWQ7CiAgX0NPUkJB X0Jvb2xlYW4gcGRfcmVzcG9uc2VfZXhwZWN0ZWQ7CiAgc2l6ZV90IHBkX21heF9tZXNzYWdlX3Np emU7CgogIHZvaWQgVW5NYXJzaGFsbFN5c3RlbUV4Y2VwdGlvbigpOwoKfTsKCgpjbGFzcyBHSU9Q X1MgOiBwdWJsaWMgR0lPUF9CYXNldHlwZXMsIHB1YmxpYyBOZXRCdWZmZXJlZFN0cmVhbSB7CnB1 YmxpYzoKCiAgc3RhdGljIHZvaWQgZGlzcGF0Y2hlcihTdHJhbmQgKnMpOwojIDI4OCAiL3Vzci9s b2NhbC9pbmNsdWRlL29tbmlPUkIzL2dpb3BEcml2ZXIuaCIgMwogIEdJT1BfUyhTdHJhbmQgKnMp OwogIH5HSU9QX1MoKTsKCiAgZW51bSBTdGF0ZSB7IElkbGUsCiAgICAgICAgICAgICAgIFJlcXVl c3RJc0JlaW5nUHJvY2Vzc2VkLAogICAgICAgICAgICAgICBXYWl0aW5nRm9yUmVwbHksCiAgICAg ICAgICAgICAgIFJlcGx5SXNCZWluZ0NvbXBvc2VkLAogICAgICAgICAgICAgICBab21iaWUKICB9 OwojIDM2NSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL2dpb3BEcml2ZXIuaCIgMwogIHZv aWQgUmVxdWVzdFJlY2VpdmVkKF9DT1JCQV9Cb29sZWFuIHNraXA9MCk7CgogIHZvaWQgSW5pdGlh bGlzZVJlcGx5KGNvbnN0IEdJT1A6OlJlcGx5U3RhdHVzVHlwZSBzdGF0dXMsIHNpemVfdCBtc2dz aXplKTsKCgoKCiAgdm9pZCBSZXBseUNvbXBsZXRlZCgpOwoKICBzdGF0aWMgc2l6ZV90IFJlcGx5 SGVhZGVyU2l6ZSgpOwoKCgogIGlubGluZSBzaXplX3QgTWF4TWVzc2FnZVNpemUoKSBjb25zdCB7 IHJldHVybiBwZF9tYXhfbWVzc2FnZV9zaXplOyB9CiMgMzkwICIvdXNyL2xvY2FsL2luY2x1ZGUv b21uaU9SQjMvZ2lvcERyaXZlci5oIiAzCiAgaW5saW5lIGNvbnN0IF9DT1JCQV9PY3RldCoga2V5 KCkgY29uc3QgeyByZXR1cm4gcGRfa2V5LmtleSgpOyB9CiAgaW5saW5lIGludCBrZXlzaXplKCkg Y29uc3QgeyByZXR1cm4gcGRfa2V5LnNpemUoKTsgfQogIGlubGluZSBjb25zdCBjaGFyKiBvcGVy YXRpb24oKSBjb25zdCB7IHJldHVybiAoY29uc3QgY2hhciopIHBkX29wZXJhdGlvbjsgfQogIGlu bGluZSBfQ09SQkFfQm9vbGVhbiByZXNwb25zZV9leHBlY3RlZCgpIGNvbnN0IHsKICAgIHJldHVy biBwZF9yZXNwb25zZV9leHBlY3RlZDsKICB9CiAgaW5saW5lIHZvaWQgc2V0X3VzZXJfZXhjZXB0 aW9ucyhjb25zdCBjaGFyKmNvbnN0KiB1ZXMsIGludCBuKSB7CiAgICBwZF91c2VyX2V4bnMgPSB1 ZXM7IHBkX25fdXNlcl9leG5zID0gbjsKICB9CgoKICB2b2lkIFNlbmRNc2dFcnJvck1lc3NhZ2Uo KTsKCiAgY2xhc3MgdGVybWluYXRlUHJvY2Vzc2luZyB7CiAgcHVibGljOgoKCiAgICBpbmxpbmUg dGVybWluYXRlUHJvY2Vzc2luZygpIHt9CiAgICBpbmxpbmUgfnRlcm1pbmF0ZVByb2Nlc3Npbmco KSB7fQogIH07Cgpwcml2YXRlOgogIFN0YXRlIHBkX3N0YXRlOwogIF9DT1JCQV9VTG9uZyBwZF9y ZXF1ZXN0X2lkOwogIF9DT1JCQV9Cb29sZWFuIHBkX3Jlc3BvbnNlX2V4cGVjdGVkOwogIHNpemVf dCBwZF9tYXhfbWVzc2FnZV9zaXplOwoKCgogIF9DT1JCQV9PY3RldCogcGRfb3BlcmF0aW9uOwog IF9DT1JCQV9PY3RldCBwZF9vcF9idWZmZXJbMzJdOwogIF9DT1JCQV9PY3RldCogcGRfcHJpbmNp cGFsOwogIF9DT1JCQV9PY3RldCBwZF9wcl9idWZmZXJbMzJdOwoKICBvbW5pT2JqS2V5IHBkX2tl eTsKCgoKICBjb25zdCBjaGFyKmNvbnN0KiBwZF91c2VyX2V4bnM7CiAgaW50IHBkX25fdXNlcl9l eG5zOwoKCgogIHZvaWQgSGFuZGxlUmVxdWVzdChfQ09SQkFfQm9vbGVhbiBieXRlb3JkZXIpOwog IHZvaWQgSGFuZGxlTG9jYXRlUmVxdWVzdChfQ09SQkFfQm9vbGVhbiBieXRlb3JkZXIpOwogIHZv aWQgSGFuZGxlQ2FuY2VsUmVxdWVzdChfQ09SQkFfQm9vbGVhbiBieXRlb3JkZXIpOwogIHZvaWQg SGFuZGxlTWVzc2FnZUVycm9yKCk7CiAgdm9pZCBIYW5kbGVDbG9zZUNvbm5lY3Rpb24oKTsKCiAg dm9pZCBNYXliZU1hcnNoYWxVc2VyRXhjZXB0aW9uKHZvaWQqKTsKCgp9OwojIDQwOSAiL3Vzci9s b2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyIDMKIyAxICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvb21uaU9ialJlZi5oIiAxIDMKIyA1MiAiL3Vzci9sb2NhbC9pbmNs dWRlL29tbmlPUkIzL29tbmlPYmpSZWYuaCIgMwpjbGFzcyBvbW5pOwpjbGFzcyBvbW5pSW50ZXJu YWw7CmNsYXNzIG9tbmlPYmpLZXk7CmNsYXNzIG9tbmlJZGVudGl0eTsKY2xhc3Mgb21uaUxvY2Fs SWRlbnRpdHk7CmNsYXNzIG9tbmlSZW1vdGVJZGVudGl0eTsKY2xhc3Mgb21uaUNhbGxEZXNjcmlw dG9yOwpjbGFzcyBvbW5pU2VydmFudDsKCgpjbGFzcyBvbW5pT2JqUmVmIHsKcHVibGljOgogIHZp cnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqIHJlcG9JZCkgPSAwOwojIDc3ICIv dXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9ialJlZi5oIiAzCiAgdmlydHVhbCBfQ09S QkFfQm9vbGVhbiBfY29tcGF0aWJsZVNlcnZhbnQob21uaVNlcnZhbnQqIHN2bnQpOwoKCgoKCgog IGludCBfZ2V0Um9wZUFuZEtleShvbW5pUm9wZUFuZEtleSYgcmFrLCBfQ09SQkFfQm9vbGVhbiog aXNfbG9jYWw9MCkgY29uc3Q7CgoKCgoKCiAgdm9pZCBfZ2V0VGhlS2V5KG9tbmlPYmpLZXkmIGtl eSwgaW50IGxvY2tlZD0wKSBjb25zdDsKCgoKICBpbmxpbmUgY29uc3QgY2hhciogX21vc3REZXJp dmVkUmVwb0lkKCkgY29uc3QgewogICAgcmV0dXJuIHBkX21vc3REZXJpdmVkUmVwb0lkOwogIH0K CgoKCiAgaW5saW5lIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqIF9pb3BQcm9maWxlcygpIGNvbnN0 IHsKICAgIHJldHVybiBwZF9pb3Bwcm9maWxlczsKICB9CgoKCgoKICBfQ09SQkFfQm9vbGVhbiBf cmVhbF9pc19hKGNvbnN0IGNoYXIqIHJlcG9JZCk7CgoKCgoKCgogIHZvaWQqIF9yZWFsTmFycm93 KGNvbnN0IGNoYXIqIHJlcG9JZCk7CiMgMTI5ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMv b21uaU9ialJlZi5oIiAzCiAgdm9pZCBfYXNzZXJ0RXhpc3RzQW5kVHlwZVZlcmlmaWVkKCk7CgoK CgoKCiAgX0NPUkJBX0Jvb2xlYW4gX3JlbW90ZV9pc19hKGNvbnN0IGNoYXIqIHJlcG9JZCk7CgoK CgoKCiAgX0NPUkJBX0Jvb2xlYW4gX3JlbW90ZV9ub25fZXhpc3RlbnQoKTsKCgoKCgoKICB2b2lk KiBfdHJhbnNpZW50RXhjZXB0aW9uSGFuZGxlcih2b2lkKiYgY29va2llKTsKCgoKCgoKICB2b2lk IF90cmFuc2llbnRFeGNlcHRpb25IYW5kbGVyKHZvaWQqIG5ld19oYW5kbGVyLCB2b2lkKiBjb29r aWUpOwojIDE2NiAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlPYmpSZWYuaCIgMwog IHZvaWQqIF9jb21tRmFpbHVyZUV4Y2VwdGlvbkhhbmRsZXIodm9pZComIGNvb2tpZSk7CgoKCgoK CiAgdm9pZCBfY29tbUZhaWx1cmVFeGNlcHRpb25IYW5kbGVyKHZvaWQqIG5ld19oYW5kbGVyLCB2 b2lkKiBjb29raWUpOwojIDE4MiAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlPYmpS ZWYuaCIgMwogIHZvaWQqIF9zeXN0ZW1FeGNlcHRpb25IYW5kbGVyKHZvaWQqJiBjb29raWUpOwoK CgoKCgogIHZvaWQgX3N5c3RlbUV4Y2VwdGlvbkhhbmRsZXIodm9pZCogbmV3X2hhbmRsZXIsIHZv aWQqIGNvb2tpZSk7CiMgMjAwICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9ialJl Zi5oIiAzCiAgaW5saW5lIG9tbmlPYmpSZWYqKiBfYWRkck9mTG9jYWxSZWZMaXN0KCkgewogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAg IHJldHVybiAmcGRfbmV4dEluTG9jYWxSZWZMaXN0OwogIH0KICBpbmxpbmUgb21uaU9ialJlZiog X25leHRJbkxvY2FsUmVmTGlzdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA7CiAgICByZXR1cm4gcGRfbmV4dEluTG9jYWxSZWZMaXN0 OwogIH0KCgoKICBpbmxpbmUgb21uaUlkZW50aXR5KiBfaWRlbnRpdHkoKSB7CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgcmV0dXJu IHBkX2lkOwogIH0KCgogIGlubGluZSBvbW5pTG9jYWxJZGVudGl0eSogX2xvY2FsSWQoKSB7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwog ICAgcmV0dXJuIHBkX2xvY2FsSWQ7CiAgfQoKCiAgaW5saW5lIGludCBfaXNGb3J3YXJkTG9jYXRp b24oKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgOwogICAgcmV0dXJuIHBkX2ZsYWdzLmZvcndhcmRfbG9jYXRpb247CiAgfQoK CiAgaW5saW5lIF9DT1JCQV9Cb29sZWFuIF9pc19uaWwoKSB7IHJldHVybiAhcGRfaWQ7IH0KCgog IGlubGluZSB2b2lkIF9ub0V4aXN0ZW50Q2hlY2soKSB7CiAgICBwZF9mbGFncy50eXBlX3Zlcmlm aWVkID0gMTsKICAgIHBkX2ZsYWdzLm9iamVjdF9leGlzdHMgPSAxOwogIH0KCgoKCgogIHZvaWQg X2ludm9rZShvbW5pQ2FsbERlc2NyaXB0b3ImLCBfQ09SQkFfQm9vbGVhbiBkb19hc3NlcnQ9MSk7 CgoKCgoKcHJvdGVjdGVkOgogIHZpcnR1YWwgfm9tbmlPYmpSZWYoKTsKCgogIG9tbmlPYmpSZWYo KTsKCgoKCiAgb21uaU9ialJlZihjb25zdCBjaGFyKiBpbnRmUmVwb0lkLCBjb25zdCBjaGFyKiBt b3N0RGVyaXZlZElkLAogICAgICAgICAgICAgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCogcHJvZmls ZXMsCiAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqIGlkLCBvbW5pTG9jYWxJZGVudGl0eSogbGlk KTsKCgogIHZvaWQgX2xvY2F0ZVJlcXVlc3QoKTsKCgoKCgpwcml2YXRlOgogIG9tbmlPYmpSZWYo Y29uc3Qgb21uaU9ialJlZiYpOwogIG9tbmlPYmpSZWYmIG9wZXJhdG9yID0gKGNvbnN0IG9tbmlP YmpSZWYmKTsKCgoKCgoKICBmcmllbmQgY2xhc3Mgb21uaTsKICBmcmllbmQgY2xhc3Mgb21uaUlu dGVybmFsOwogIGZyaWVuZCBjbGFzcyBvbW5pUHk7CgogIGlubGluZSB2b2lkIF9zZXRJZGVudGl0 eShvbW5pSWRlbnRpdHkqIGlkLCBvbW5pTG9jYWxJZGVudGl0eSogbGlkKSB7CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgcGRfaWQg PSBpZDsKICAgIHBkX2xvY2FsSWQgPSBsaWQ7CiAgfQoKCgoKCgoKICBpbnQgcGRfcmVmQ291bnQ7 CgoKICBjaGFyKiBwZF9tb3N0RGVyaXZlZFJlcG9JZDsKIyAzMDQgIi91c3IvbG9jYWwvaW5jbHVk ZS9vbW5pT1JCMy9vbW5pT2JqUmVmLmgiIDMKICBjaGFyKiBwZF9pbnRmUmVwb0lkOwojIDMxNSAi L3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlPYmpSZWYuaCIgMwogIElPUDo6VGFnZ2Vk UHJvZmlsZUxpc3QqIHBkX2lvcHByb2ZpbGVzOwoKCiAgb21uaUlkZW50aXR5KiBwZF9pZDsKCgoK CgogIG9tbmlMb2NhbElkZW50aXR5KiBwZF9sb2NhbElkOwoKCgoKCiAgc3RydWN0IHsKICAgIHVu c2lnbmVkIGZvcndhcmRfbG9jYXRpb24gOiAxOwoKCgoKICAgIHVuc2lnbmVkIHR5cGVfdmVyaWZp ZWQgOiAxOwoKCgoKCiAgICB1bnNpZ25lZCBvYmplY3RfZXhpc3RzIDogMTsKCgoKCgogICAgdW5z aWduZWQgdHJhbnNpZW50X2V4Y2VwdGlvbl9oYW5kbGVyIDogMTsKICAgIHVuc2lnbmVkIGNvbW1m YWlsX2V4Y2VwdGlvbl9oYW5kbGVyIDogMTsKICAgIHVuc2lnbmVkIHN5c3RlbV9leGNlcHRpb25f aGFuZGxlciA6IDE7CgoKCiAgfSBwZF9mbGFnczsKCgogIG9tbmlPYmpSZWYqIHBkX25leHRJbkxv Y2FsUmVmTGlzdDsKCgp9OwojIDQxMCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlJ bnRlcm5hbC5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcHJveHlGYWN0 b3J5LmgiIDEgMwojIDUxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcHJveHlGYWN0b3J5 LmgiIDMKY2xhc3Mgb21uaUxvY2FsSWRlbnRpdHk7CmNsYXNzIG9tbmlPYmpSZWY7CgoKY2xhc3Mg cHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgogIHZpcnR1YWwgfnByb3h5T2JqZWN0RmFjdG9y eSgpOwogIHByb3h5T2JqZWN0RmFjdG9yeShjb25zdCBjaGFyKiByZXBvSWQpOwoKCgoKCiAgc3Rh dGljIHZvaWQgc2h1dGRvd24oKTsKCgoKICBzdGF0aWMgcHJveHlPYmplY3RGYWN0b3J5KiBsb29r dXAoY29uc3QgY2hhciogcmVwb0lkKTsKCiAgaW5saW5lIGNvbnN0IGNoYXIqIGlyUmVwb0lkKCkg Y29uc3QgeyByZXR1cm4gcGRfcmVwb0lkOyB9CgoKCiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdP YmpSZWYoY29uc3QgY2hhciogbW9zdERlcml2ZWRUeXBlSWQsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCogcHJvZmlsZXMsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5KiBpZCwgb21uaUxvY2FsSWRlbnRpdHkq IGxpZCkgPSAwOwoKCiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqIGJh c2VfcmVwb0lkKSBjb25zdCA9IDA7CgoKCgpwcml2YXRlOgogIGNvbnN0IGNoYXIqIHBkX3JlcG9J ZDsKfTsKIyA0MTEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pSW50ZXJuYWwuaCIg MiAzCiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlTZXJ2YW50LmgiIDEgMwoj IDQ0ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaVNlcnZhbnQuaCIgMwpjbGFzcyBv bW5pT2JqUmVmOwpjbGFzcyBvbW5pSWRlbnRpdHk7CgoKCgoKY2xhc3Mgb21uaVNlcnZhbnQgewpw cm90ZWN0ZWQ6CiAgaW5saW5lIG9tbmlTZXJ2YW50KCkgOiBwZF9pZGVudGl0aWVzKDApIHt9CiAg aW5saW5lIG9tbmlTZXJ2YW50KGNvbnN0IG9tbmlTZXJ2YW50JikgOiBwZF9pZGVudGl0aWVzKDAp IHt9CiAgaW5saW5lIG9tbmlTZXJ2YW50JiBvcGVyYXRvciA9IChjb25zdCBvbW5pU2VydmFudCYp IHsgcmV0dXJuICp0aGlzOyB9CgpwdWJsaWM6CiAgdmlydHVhbCB+b21uaVNlcnZhbnQoKTsKCiAg dmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciogcmVwb0lkKTsKIyA3NCAi L3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlTZXJ2YW50LmgiIDMKICB2aXJ0dWFsIHZv aWQqIF9kb3duY2FzdCgpOwoKCgoKCgoKICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZl ZFJlcG9JZCgpOwojIDkxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaVNlcnZhbnQu aCIgMwogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2lzX2EoY29uc3QgY2hhciogbG9naWNhbF90 eXBlX2lkKTsKCgoKCiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfbm9uX2V4aXN0ZW50KCk7CgoK CiAgdmlydHVhbCBvbW5pT2JqUmVmKiBfZG9fZ2V0X2ludGVyZmFjZSgpID0gMDsKCgoKCiAgdmly dHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9TJik7CiMgMTIwICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvb21uaVNlcnZhbnQuaCIgMwogIHZvaWQgX2FkZElkZW50aXR5KG9t bmlMb2NhbElkZW50aXR5Kik7CgoKCiAgdm9pZCBfcmVtb3ZlSWRlbnRpdHkob21uaUxvY2FsSWRl bnRpdHkqKTsKCgoKICBpbmxpbmUgb21uaUxvY2FsSWRlbnRpdHkqIF9pZGVudGl0aWVzKCkgY29u c3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDsKICAgIHJldHVybiBwZF9pZGVudGl0aWVzOwogIH0KCgoKcHJpdmF0ZToKICBvbW5pTG9j YWxJZGVudGl0eSogcGRfaWRlbnRpdGllczsKCgoKCgp9OwojIDQxMiAiL3Vzci9sb2NhbC9pbmNs dWRlL29tbmlPUkIzL29tbmlJbnRlcm5hbC5oIiAyIDMKCgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNs YXNzIF9DT1JCQV9Db25zdHJUeXBlX1ZhcmlhYmxlX1ZhcjsKIyAyNTYgIi91c3IvbG9jYWwvaW5j bHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9S QjMvdGVtcGxhdGVkZWNscy5oIiAxIDMKIyAzNyAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIz L3RlbXBsYXRlZGVjbHMuaCIgMwp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXI+IGNsYXNz IF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyOwp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXI+ IGNsYXNzIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0OwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIF9D T1JCQV9Qc2V1ZG9PYmpfVmFyIHsKcHVibGljOgogIHR5cGVkZWYgVCogVF9wdHI7CiAgdHlwZWRl ZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPiBUX3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9P YmpfTWVtYmVyPFQsVF92YXI+IFRfbWVtYmVyOwoKICBpbmxpbmUgX0NPUkJBX1BzZXVkb09ial9W YXIoKTsKICBpbmxpbmUgX0NPUkJBX1BzZXVkb09ial9WYXIoVF9wdHIgcCkgOiBwZF9kYXRhKHAp IHt9CiAgaW5saW5lIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyKGNvbnN0IFRfdmFyJiB2KTsKICBpbmxp bmUgX0NPUkJBX1BzZXVkb09ial9WYXIoY29uc3QgVF9tZW1iZXImIG0pOwoKICBpbmxpbmUgfl9D T1JCQV9Qc2V1ZG9PYmpfVmFyKCk7CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3I9KFRfcHRyIHAp OwogIGlubGluZSBUX3ZhciYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJiB2KTsKICBpbmxpbmUgVF92 YXImIG9wZXJhdG9yPShjb25zdCBUX21lbWJlciYgdik7CgogIGlubGluZSBUX3B0ciBvcGVyYXRv ci0+KCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQogIGlubGluZSBvcGVyYXRvciBUX3B0ciAo KSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CgogIGlubGluZSBUKiBpbigpIGNvbnN0IHsgcmV0 dXJuIHBkX2RhdGE7IH0KICBpbmxpbmUgVF9wdHImIGlub3V0KCkgeyByZXR1cm4gcGRfZGF0YTsg fQogIGlubGluZSBUX3B0ciYgb3V0KCk7CiAgaW5saW5lIFRfcHRyIF9yZXRuKCk7CgogIGZyaWVu ZCBjbGFzcyBfQ09SQkFfUHNldWRvT2JqX091dDxULCBfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPiA+ OwogIGZyaWVuZCBjbGFzcyBfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULCBfQ09SQkFfUHNldWRv T2JqX1ZhcjxUPiA+OwoKcHJvdGVjdGVkOgogIFRfcHRyIHBkX2RhdGE7Cn07CgoKCgoKdGVtcGxh dGUgPGNsYXNzIFQsIGNsYXNzIFRfdmFyPgpjbGFzcyBfQ09SQkFfUHNldWRvT2JqX01lbWJlciB7 CnB1YmxpYzoKICB0eXBlZGVmIFQqIFRfcHRyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9N ZW1iZXI8VCxUX3Zhcj4gVF9tZW1iZXI7CgogIGlubGluZSBfQ09SQkFfUHNldWRvT2JqX01lbWJl cigpOwogIGlubGluZSBfQ09SQkFfUHNldWRvT2JqX01lbWJlcihUX3B0ciBwKSA6IF9wdHIocCkg e30KICBpbmxpbmUgX0NPUkJBX1BzZXVkb09ial9NZW1iZXIoY29uc3QgVF9tZW1iZXImIHApOwog IGlubGluZSB+X0NPUkJBX1BzZXVkb09ial9NZW1iZXIoKTsKCiAgaW5saW5lIFRfbWVtYmVyJiBv cGVyYXRvcj0oVF9wdHIgcCk7CiAgaW5saW5lIFRfbWVtYmVyJiBvcGVyYXRvcj0oY29uc3QgVF9t ZW1iZXImIHApOwogIGlubGluZSBUX21lbWJlciYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJiBwKTsK CiAgaW5saW5lIFRfcHRyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBfcHRyOyB9CiAgaW5s aW5lIG9wZXJhdG9yIFRfcHRyICgpIGNvbnN0IHsgcmV0dXJuIF9wdHI7IH0KCiAgVF9wdHIgX3B0 cjsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF92YXIsIGNsYXNzIFRfbWJyPgpj bGFzcyBfQ09SQkFfUHNldWRvT2JqX0luT3V0IHsKcHVibGljOgogIGlubGluZSBfQ09SQkFfUHNl dWRvT2JqX0luT3V0KFQqIHApIDogX2RhdGEocCkge30KICBpbmxpbmUgX0NPUkJBX1BzZXVkb09i al9Jbk91dChUX3ZhciYgdikgOiBfZGF0YSh2KSB7fQogIGlubGluZSBfQ09SQkFfUHNldWRvT2Jq X0luT3V0KFRfbWJyJiBtKSA6IF9kYXRhKG0uX3B0cikge30KCiAgVCogX2RhdGE7Cgpwcml2YXRl OgogIF9DT1JCQV9Qc2V1ZG9PYmpfSW5PdXQoKTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwg Y2xhc3MgVF92YXI+CmNsYXNzIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0IHsKcHVibGljOgogIGlubGlu ZSBfQ09SQkFfUHNldWRvT2JqX091dChUKiYgcCkgOiBfZGF0YShwKSB7fQogIGlubGluZSBfQ09S QkFfUHNldWRvT2JqX091dChUX3ZhciYgcCk7CgogIGlubGluZSBfQ09SQkFfUHNldWRvT2JqX091 dDxULFRfdmFyPiYgb3BlcmF0b3I9KFQqIHApIHsKICAgIF9kYXRhID0gcDsKICAgIHJldHVybiAq dGhpczsKICB9CgogIFQqJiBfZGF0YTsKCnByaXZhdGU6CiAgX0NPUkJBX1BzZXVkb09ial9PdXQo KTsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRWxlbVQ+CmNsYXNzIF9DT1JCQV9Q c2V1ZG9fVW5ib3VuZGVkX1NlcXVlbmNlIHsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1BzZXVk b19VbmJvdW5kZWRfU2VxdWVuY2U8VCxFbGVtVD4gVF9zZXE7CgogIGlubGluZSBfQ09SQkFfUHNl dWRvX1VuYm91bmRlZF9TZXF1ZW5jZSgpCiAgICA6IHBkX21heCgwKSwgcGRfbGVuKDApLCBwZF9y ZWwoMSksIHBkX2J1ZigwKSB7IH0KICBpbmxpbmUgX0NPUkJBX1BzZXVkb19VbmJvdW5kZWRfU2Vx dWVuY2UoX0NPUkJBX1VMb25nIG1heCkKICAgIDogcGRfbWF4KG1heCksIHBkX2xlbigwKSwgcGRf cmVsKDEpCiAgewogICAgaWYoICEocGRfYnVmID0gbmV3IEVsZW1UW21heF0pICkKICAgICAgX0NP UkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogIH0KCiAgaW5saW5lIF9DT1JCQV9Qc2V1 ZG9fVW5ib3VuZGVkX1NlcXVlbmNlKF9DT1JCQV9VTG9uZyBtYXgsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW5ndGgsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQqKiB2YWx1ZSwgX0NPUkJBX0Jvb2xlYW4g cmVsZWFzZSA9IDApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4obGVuZ3RoKQogIHsKICAgIGlm KCBsZW5ndGggPiBtYXggKSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHBkX2J1ZiA9 IG5ldyBFbGVtVFtsZW5ndGhdOwogICAgaWYoIHJlbGVhc2UgKSB7CiAgICAgIGZvciggX0NPUkJB X1VMb25nIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKSBwZF9idWZbaV0gPSB2YWx1ZVtpXTsKICAg ICAgZGVsZXRlW10gdmFsdWU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgZm9yKCBfQ09SQkFfVUxv bmcgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApCiAgICAgICAgcGRfYnVmW2ldID0gdmFsdWVbaV07 CiAgICB9CiAgfQoKICBpbmxpbmUgX0NPUkJBX1BzZXVkb19VbmJvdW5kZWRfU2VxdWVuY2UoY29u c3QgVF9zZXEmIHMpCiAgICA6IHBkX21heChzLnBkX21heCksIHBkX2xlbihzLnBkX2xlbiksIHBk X3JlbCgxKQogIHsKICAgIGlmKCAhKHBkX2J1ZiA9IG5ldyBFbGVtVFtzLnBkX21heF0pICkKICAg ICAgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogICAgZm9yKCBfQ09SQkFfVUxv bmcgaT0wOyBpIDwgcy5wZF9sZW47IGkrKyApIHsKICAgICAgcGRfYnVmW2ldID0gcy5wZF9idWZb aV07CiAgICB9CiAgfQoKICBpbmxpbmUgfl9DT1JCQV9Qc2V1ZG9fVW5ib3VuZGVkX1NlcXVlbmNl KCkgewogICAgaWYoIHBkX3JlbCAmJiBwZF9idWYgKSBkZWxldGVbXSBwZF9idWY7CiAgfQoKICBp bmxpbmUgVF9zZXEmIG9wZXJhdG9yPSAoY29uc3QgVF9zZXEmIHMpIHsKICAgIGlmKCAmcyA9PSB0 aGlzICkgcmV0dXJuICp0aGlzOwogICAgaWYoIHBkX21heCA8IHMucGRfbWF4ICkgewogICAgICBF bGVtVCogbmV3YnVmID0gbmV3IEVsZW1UW3MucGRfbWF4XTsKICAgICAgaWYoICFuZXdidWYgKSBf Q09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7CiAgICAgIHBkX21heCA9IHMucGRfbWF4 OwogICAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiApIGRlbGV0ZVtdIHBkX2J1ZjsKICAgICAgZWxz ZSBwZF9yZWwgPSAxOwogICAgICBwZF9idWYgPSBuZXdidWY7CiAgICB9CiAgICBwZF9sZW4gPSBz LnBkX2xlbjsKICAgIGZvciggdW5zaWduZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKyApIHBk X2J1ZltpXSA9IHMucGRfYnVmW2ldOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9D T1JCQV9VTG9uZyBtYXhpbXVtKCkgY29uc3QgeyByZXR1cm4gcGRfbWF4OyB9CiAgaW5saW5lIF9D T1JCQV9VTG9uZyBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBwZF9sZW47IH0KICBpbmxpbmUgdm9p ZCBsZW5ndGgoX0NPUkJBX1VMb25nIGxlbmd0aCkgewogICAgaWYgKGxlbmd0aCA+IHBkX21heCkg ewogICAgICBFbGVtVCogbmV3YnVmID0gbmV3IEVsZW1UW2xlbmd0aF07CiAgICAgIGlmKCAhbmV3 YnVmICkgX0NPUkJBX25ld19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogICAgICBmb3IoIHVuc2ln bmVkIGxvbmcgaSA9IDA7IGkgPCBwZF9sZW47IGkrKyApCiAgICAgICAgbmV3YnVmW2ldID0gcGRf YnVmW2ldOwogICAgICBwZF9tYXggPSBsZW5ndGg7CiAgICAgIGlmKCBwZF9yZWwgJiYgcGRfYnVm ICkgZGVsZXRlW10gcGRfYnVmOwogICAgICBlbHNlIHBkX3JlbCA9IDE7CiAgICAgIHBkX2J1ZiA9 IG5ld2J1ZjsKICAgIH0KICAgIHBkX2xlbiA9IGxlbmd0aDsKICB9CiAgaW5saW5lIEVsZW1UJiBv cGVyYXRvcltdIChfQ09SQkFfVUxvbmcgaW5kZXgpIHsKICAgIGlmKCBpbmRleCA+PSBwZF9sZW4g KSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVybiBwZF9idWZbaW5kZXhdOwog IH0KICBpbmxpbmUgY29uc3QgRWxlbVQmIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpbmRleCkg Y29uc3QgewogICAgaWYoIGluZGV4ID49IHBkX2xlbiApIF9DT1JCQV9ib3VuZF9jaGVja19lcnJv cigpOwogICAgcmV0dXJuIHBkX2J1ZltpbmRleF07CiAgfQogIHN0YXRpYyBpbmxpbmUgVCoqIGFs bG9jYnVmKF9DT1JCQV9VTG9uZyBuZWxlbXMpIHsKICAgIFQqKiB2ID0gbmV3IFQqW25lbGVtc107 CiAgICBmb3IgKF9DT1JCQV9VTG9uZyBpPTA7IGkgPCBuZWxlbXM7IGkrKykgdltpXSA9IFQ6Ol9u aWwoKTsKICAgIHJldHVybiB2OwogIH0KICBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZWJ1ZihUKiog YikgeyBpZiggYiApIGRlbGV0ZVtdIGI7IH0KCiAgaW5saW5lIEVsZW1UKiBOUF9kYXRhKCkgeyBy ZXR1cm4gcGRfYnVmOyB9Cgpwcm90ZWN0ZWQ6CiAgX0NPUkJBX1VMb25nIHBkX21heDsKICBfQ09S QkFfVUxvbmcgcGRfbGVuOwogIF9DT1JCQV9Cb29sZWFuIHBkX3JlbDsKICBFbGVtVCogcGRfYnVm Owp9OwoKCgoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBfQ09SQkFfUHNldWRvVmFsdWVfU2Vx dWVuY2UgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2U8VD4g VF9zZXE7CgogIGlubGluZSBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2UoKQogICAgOiBwZF9t YXgoMCksIHBkX2xlbigwKSwgcGRfcmVsKDEpLCBwZF9idWYoMCkgeyB9CiAgaW5saW5lIF9DT1JC QV9Qc2V1ZG9WYWx1ZV9TZXF1ZW5jZShfQ09SQkFfVUxvbmcgbWF4KQogICAgOiBwZF9tYXgobWF4 KSwgcGRfbGVuKDApLCBwZF9yZWwoMSkKICB7CiAgICBpZiggIShwZF9idWYgPSBhbGxvY2J1Ziht YXgpKSApCiAgICAgIF9DT1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICB9CgogIGlu bGluZSBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2UoX0NPUkJBX1VMb25nIG1heCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9VTG9uZyBsZW5ndGgsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKiB2YWx1ZSwgX0NPUkJBX0Jvb2xlYW4g cmVsZWFzZSA9IDApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4obGVuZ3RoKSwgcGRfcmVsKHJl bGVhc2UpLCBwZF9idWYodmFsdWUpCiAgewogICAgaWYoIGxlbmd0aCA+IG1heCApIF9DT1JCQV9i b3VuZF9jaGVja19lcnJvcigpOwogIH0KCiAgaW5saW5lIF9DT1JCQV9Qc2V1ZG9WYWx1ZV9TZXF1 ZW5jZShjb25zdCBUX3NlcSYgcykKICAgIDogcGRfbWF4KHMucGRfbWF4KSwgcGRfbGVuKHMucGRf bGVuKSwgcGRfcmVsKDEpCiAgewogICAgaWYoICEocGRfYnVmID0gYWxsb2NidWYocy5wZF9tYXgp KSApCiAgICAgIF9DT1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICAgIGZvciggX0NP UkJBX1VMb25nIGk9MDsgaSA8IHMucGRfbGVuOyBpKysgKSB7CiAgICAgIHBkX2J1ZltpXSA9IHMu cGRfYnVmW2ldOwogICAgfQogIH0KCiAgaW5saW5lIH5fQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVu Y2UoKSB7CiAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiApIGRlbGV0ZVtdIHBkX2J1ZjsKICB9Cgog IGlubGluZSBUX3NlcSYgb3BlcmF0b3I9IChjb25zdCBUX3NlcSYgcykgewogICAgaWYoICZzID09 IHRoaXMgKSByZXR1cm4gKnRoaXM7CiAgICBpZiggcGRfbWF4IDwgcy5wZF9tYXggKSB7CiAgICAg IFQqIG5ld2J1ZiA9IGFsbG9jYnVmKHMucGRfbWF4KTsKICAgICAgaWYoICFuZXdidWYgKSBfQ09S QkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7CiAgICAgIHBkX21heCA9IHMucGRfbWF4Owog ICAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiApIGRlbGV0ZVtdIHBkX2J1ZjsKICAgICAgZWxzZSBw ZF9yZWwgPSAxOwogICAgICBwZF9idWYgPSBuZXdidWY7CiAgICB9CiAgICBwZF9sZW4gPSBzLnBk X2xlbjsKICAgIGZvciggdW5zaWduZWQgbG9uZyBpPTA7IGkgPCBwZF9sZW47IGkrKyApIHBkX2J1 ZltpXSA9IHMucGRfYnVmW2ldOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JC QV9VTG9uZyBtYXhpbXVtKCkgY29uc3QgeyByZXR1cm4gcGRfbWF4OyB9CiAgaW5saW5lIF9DT1JC QV9VTG9uZyBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBwZF9sZW47IH0KICBpbmxpbmUgdm9pZCBs ZW5ndGgoX0NPUkJBX1VMb25nIGxlbmd0aCkgewogICAgaWYgKGxlbmd0aCA+IHBkX21heCkgewog ICAgICBUKiBuZXdidWYgPSBhbGxvY2J1ZihsZW5ndGgpOwogICAgICBpZiggIW5ld2J1ZiApIF9D T1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICAgICAgZm9yKCB1bnNpZ25lZCBsb25n IGkgPSAwOyBpIDwgcGRfbGVuOyBpKysgKQogICAgICAgIG5ld2J1ZltpXSA9IHBkX2J1ZltpXTsK ICAgICAgcGRfbWF4ID0gbGVuZ3RoOwogICAgICBpZiggcGRfcmVsICYmIHBkX2J1ZiApIGRlbGV0 ZVtdIHBkX2J1ZjsKICAgICAgZWxzZSBwZF9yZWwgPSAxOwogICAgICBwZF9idWYgPSBuZXdidWY7 CiAgICB9CiAgICBwZF9sZW4gPSBsZW5ndGg7CiAgfQogIGlubGluZSBUJiBvcGVyYXRvcltdIChf Q09SQkFfVUxvbmcgaW5kZXgpIHsKICAgIGlmKCBpbmRleCA+PSBwZF9sZW4gKSBfQ09SQkFfYm91 bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVybiBwZF9idWZbaW5kZXhdOwogIH0KICBpbmxpbmUg Y29uc3QgVCYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4KSBjb25zdCB7CiAgICBpZigg aW5kZXggPj0gcGRfbGVuICkgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICByZXR1cm4g cGRfYnVmW2luZGV4XTsKICB9CiAgc3RhdGljIGlubGluZSBUKiBhbGxvY2J1ZihfQ09SQkFfVUxv bmcgbmVsZW1zKSB7IHJldHVybiBuZXcgVFtuZWxlbXNdOyB9CiAgc3RhdGljIGlubGluZSB2b2lk IGZyZWVidWYoVCogYikgeyBpZiggYiApIGRlbGV0ZVtdIGI7IH0KCiAgaW5saW5lIFQqIE5QX2Rh dGEoKSB7IHJldHVybiBwZF9idWY7IH0KCnByb3RlY3RlZDoKICBfQ09SQkFfVUxvbmcgcGRfbWF4 OwogIF9DT1JCQV9VTG9uZyBwZF9sZW47CiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVsOwogIFQqIHBk X2J1ZjsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX0hlbHBlcj4KY2xhc3MgX0NP UkJBX09ialJlZl9NZW1iZXI7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX0hlbHBlcj4KY2xh c3MgX0NPUkJBX09ialJlZl9FbGVtZW50OwoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9IZWxw ZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZfSU5PVVRfYXJnOwoKdGVtcGxhdGUgPGNsYXNzIFQsY2xh c3MgVF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzsKCnRlbXBsYXRlIDxjbGFz cyBULGNsYXNzIFRfSGVscGVyPgpjbGFzcyBfQ09SQkFfT2JqUmVmX3RjRGVzY19hcmc7Cgp0ZW1w bGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9IZWxwZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZfVmFyIHsK cHVibGljOgogIHR5cGVkZWYgVCogcHRyX3Q7CiAgdHlwZWRlZiBUKiBUX3B0cjsKICB0eXBlZGVm IF9DT1JCQV9PYmpSZWZfTWVtYmVyPFQsVF9IZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVkZWYgX0NP UkJBX09ialJlZl9FbGVtZW50PFQsVF9IZWxwZXI+IFRfZWxlbWVudDsKICB0eXBlZGVmIF9DT1JC QV9PYmpSZWZfVmFyPFQsVF9IZWxwZXI+IFRfdmFyOwoKICBpbmxpbmUgX0NPUkJBX09ialJlZl9W YXIoKSA6IHBkX29ianJlZihUX0hlbHBlcjo6X25pbCgpKSB7fQogIGlubGluZSBfQ09SQkFfT2Jq UmVmX1ZhcihUX3B0ciBwKSA6IHBkX29ianJlZihwKSB7fQogIGlubGluZSBfQ09SQkFfT2JqUmVm X1Zhcihjb25zdCBUX3ZhciYgcCkgOiBwZF9vYmpyZWYocC5wZF9vYmpyZWYpIHsKICAgIFRfSGVs cGVyOjpkdXBsaWNhdGUocC5wZF9vYmpyZWYpOwogIH0KCiAgaW5saW5lIF9DT1JCQV9PYmpSZWZf VmFyKGNvbnN0IFRfbWVtYmVyJiBtKTsKICBpbmxpbmUgX0NPUkJBX09ialJlZl9WYXIoY29uc3Qg VF9lbGVtZW50JiBtKTsKCiAgaW5saW5lIH5fQ09SQkFfT2JqUmVmX1ZhcigpIHsKCiAgICBUX0hl bHBlcjo6cmVsZWFzZShwZF9vYmpyZWYpOwoKCgogIH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRv cj0gKFRfcHRyIHApIHsKICAgIFRfSGVscGVyOjpyZWxlYXNlKHBkX29ianJlZik7CiAgICBwZF9v YmpyZWYgPSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRv cj0gKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBpZiggJnAgIT0gdGhpcyApIHsKICAgICAgVF9IZWxw ZXI6OmR1cGxpY2F0ZShwLnBkX29ianJlZik7CiAgICAgIFRfSGVscGVyOjpyZWxlYXNlKHBkX29i anJlZik7CiAgICAgIHBkX29ianJlZiA9IHAucGRfb2JqcmVmOwogICAgfQogICAgcmV0dXJuICp0 aGlzOwogIH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfbWVtYmVyJiBtKTsK ICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoY29uc3QgVF9lbGVtZW50JiBtKTsKICBpbmxpbmUg VF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBkX29ianJlZjsgfQogIGlubGluZSBv cGVyYXRvciBUX3B0ciAoKSBjb25zdCB7IHJldHVybiBwZF9vYmpyZWY7IH0KCiAgaW5saW5lIFRf cHRyIGluKCkgY29uc3QgeyByZXR1cm4gcGRfb2JqcmVmOyB9CiAgaW5saW5lIFRfcHRyJiBpbm91 dCgpIHsgcmV0dXJuIHBkX29ianJlZjsgfQogIGlubGluZSBUX3B0ciYgb3V0KCkgewogICAgVF9I ZWxwZXI6OnJlbGVhc2UocGRfb2JqcmVmKTsKICAgIHBkX29ianJlZiA9IFRfSGVscGVyOjpfbmls KCk7CiAgICByZXR1cm4gcGRfb2JqcmVmOwogIH0KICBpbmxpbmUgVF9wdHIgX3JldG4oKSB7CiAg ICBUX3B0ciB0bXAgPSBwZF9vYmpyZWY7CiAgICBwZF9vYmpyZWYgPSBUX0hlbHBlcjo6X25pbCgp OwogICAgcmV0dXJuIHRtcDsKICB9CgogIGZyaWVuZCBjbGFzcyBfQ09SQkFfT2JqUmVmX0lOT1VU X2FyZzxULFRfSGVscGVyPjsKICBmcmllbmQgY2xhc3MgX0NPUkJBX09ialJlZl9PVVRfYXJnPFQs VF9IZWxwZXI+OwogIGZyaWVuZCBjbGFzcyBfQ09SQkFfT2JqUmVmX3RjRGVzY19hcmc8VCxUX0hl bHBlcj47Cgpwcml2YXRlOgogIFRfcHRyIHBkX29ianJlZjsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xh c3MgVCxjbGFzcyBUX0hlbHBlcj4KY2xhc3MgX0NPUkJBX09ialJlZl9NZW1iZXIgewpwdWJsaWM6 CiAgdHlwZWRlZiBUKiBUX3B0cjsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfTWVtYmVyPFQsVF9I ZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9FbGVtZW50PFQsVF9IZWxw ZXI+IFRfZWxlbWVudDsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPFQsVF9IZWxwZXI+IFRf dmFyOwoKICBpbmxpbmUgX0NPUkJBX09ialJlZl9NZW1iZXIoKSB7CiAgICBfcHRyID0gVF9IZWxw ZXI6Ol9uaWwoKTsKICB9CgogIGlubGluZSBfQ09SQkFfT2JqUmVmX01lbWJlcihjb25zdCBUX21l bWJlciYgcCkgewogICAgVF9IZWxwZXI6OmR1cGxpY2F0ZShwLl9wdHIpOwogICAgX3B0ciA9IHAu X3B0cjsKICB9CgppbmxpbmUgfl9DT1JCQV9PYmpSZWZfTWVtYmVyKCkgewoKICAgIFRfSGVscGVy OjpyZWxlYXNlKF9wdHIpOwoKCgogIH0KCiAgaW5saW5lIFRfbWVtYmVyJiBvcGVyYXRvcj0gKFRf cHRyIHApIHsKICAgIFRfSGVscGVyOjpyZWxlYXNlKF9wdHIpOwogICAgX3B0ciA9IHA7CiAgICBy ZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9tZW1iZXImIG9wZXJhdG9yPSAoY29uc3QgVF9t ZW1iZXImIHApIHsKICAgIGlmKCAmcCAhPSB0aGlzICkgewogICAgICBUX0hlbHBlcjo6cmVsZWFz ZShfcHRyKTsKICAgICAgVF9IZWxwZXI6OmR1cGxpY2F0ZShwLl9wdHIpOwogICAgICBfcHRyID0g cC5fcHRyOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfbWVtYmVyJiBv cGVyYXRvcj0gKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBUX0hlbHBlcjo6cmVsZWFzZShfcHRyKTsK ICAgIFRfSGVscGVyOjpkdXBsaWNhdGUocCk7CiAgICBfcHRyID0gKFRfcHRyKSBwOwogICAgcmV0 dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfbWVtYmVyJiBvcGVyYXRvcj0gKGNvbnN0IFRfZWxl bWVudCYgcCk7CgogIGlubGluZSBUX3B0ciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gX3B0 cjsgfQoKICBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNl dCkgY29uc3QgewogICAgcmV0dXJuIFRfSGVscGVyOjpOUF9hbGlnbmVkU2l6ZShfcHRyLGluaXRp YWxvZmZzZXQpOwogIH0KCiAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3Ry ZWFtJiBzKSBjb25zdCB7CiAgICBUX0hlbHBlcjo6bWFyc2hhbE9ialJlZihfcHRyLHMpOwogIH0K CiAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBU X3B0ciBfcmVzdWx0ID0gVF9IZWxwZXI6OnVubWFyc2hhbE9ialJlZihzKTsKICAgIFRfSGVscGVy OjpyZWxlYXNlKF9wdHIpOwogICAgX3B0ciA9IF9yZXN1bHQ7CiAgfQoKICBpbmxpbmUgdm9pZCBv cGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIGNvbnN0IHsKICAgIFRfSGVscGVyOjpt YXJzaGFsT2JqUmVmKF9wdHIscyk7CiAgfQoKICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTWVt QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIFRfcHRyIF9yZXN1bHQgPSBUX0hlbHBlcjo6dW5tYXJz aGFsT2JqUmVmKHMpOwogICAgVF9IZWxwZXI6OnJlbGVhc2UoX3B0cik7CiAgICBfcHRyID0gX3Jl c3VsdDsKICB9CgoKCgogIGlubGluZSBvcGVyYXRvciBUX3B0ciAoKSBjb25zdCB7IHJldHVybiBf cHRyOyB9CgogIGlubGluZSBUX3B0ciBpbigpIGNvbnN0IHsgcmV0dXJuIF9wdHI7IH0KICBpbmxp bmUgVF9wdHImIGlub3V0KCkgeyByZXR1cm4gX3B0cjsgfQogIGlubGluZSBUX3B0ciYgb3V0KCkg ewogICAgVF9IZWxwZXI6OnJlbGVhc2UoX3B0cik7CiAgICBfcHRyID0gVF9IZWxwZXI6Ol9uaWwo KTsKICAgIHJldHVybiBfcHRyOwogIH0KICBpbmxpbmUgVF9wdHIgX3JldG4oKSB7CiAgICBUX3B0 ciB0bXA7CiAgICB0bXAgPSBfcHRyOwogICAgX3B0ciA9IFRfSGVscGVyOjpfbmlsKCk7CiAgICBy ZXR1cm4gdG1wOwogIH0KCiAgVF9wdHIgX3B0cjsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxj bGFzcyBUX0hlbHBlcj4KY2xhc3MgX0NPUkJBX09ialJlZl9FbGVtZW50IHsKcHVibGljOgogIHR5 cGVkZWYgVCogVF9wdHI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8VCxUX0hlbHBl cj4gVF9lbGVtZW50OwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9NZW1iZXI8VCxUX0hlbHBlcj4g VF9tZW1iZXI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1ZhcjxULFRfSGVscGVyPiBUX3ZhcjsK CiAgaW5saW5lIF9DT1JCQV9PYmpSZWZfRWxlbWVudChUX3B0ciYgcCwgX0NPUkJBX0Jvb2xlYW4g cmVsKQogICAgOiBwZF9yZWwocmVsKSwgcGRfZGF0YShwKSB7fQoKICBpbmxpbmUgX0NPUkJBX09i alJlZl9FbGVtZW50KGNvbnN0IFRfZWxlbWVudCYgcCkKICAgIDogcGRfcmVsKHAucGRfcmVsKSwg cGRfZGF0YShwLnBkX2RhdGEpIHt9CgogIGlubGluZSB+X0NPUkJBX09ialJlZl9FbGVtZW50KCkg ewoKICB9CgogIGlubGluZSBUX2VsZW1lbnQmIG9wZXJhdG9yPSAoVF9wdHIgcCkgewogICAgaWYo IHBkX3JlbCApIFRfSGVscGVyOjpyZWxlYXNlKHBkX2RhdGEpOwogICAgcGRfZGF0YSA9IHA7CiAg ICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9lbGVtZW50JiBvcGVyYXRvcj0gKGNvbnN0 IFRfZWxlbWVudCYgcCkgewogICAgaWYoIHBkX3JlbCApIHsKICAgICAgVF9IZWxwZXI6OnJlbGVh c2UocGRfZGF0YSk7CiAgICAgIFRfSGVscGVyOjpkdXBsaWNhdGUocC5wZF9kYXRhKTsKICAgICAg cGRfZGF0YSA9IHAucGRfZGF0YTsKICAgIH0KICAgIGVsc2UKICAgICAgcGRfZGF0YSA9IHAucGRf ZGF0YTsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBUX2VsZW1lbnQmIG9wZXJhdG9y PSAoY29uc3QgVF92YXImIHApIHsKICAgIGlmKCBwZF9yZWwgKSB7CiAgICAgIFRfSGVscGVyOjpy ZWxlYXNlKHBkX2RhdGEpOwogICAgICBUX0hlbHBlcjo6ZHVwbGljYXRlKHApOwogICAgfQogICAg cGRfZGF0YSA9IChUX3B0cikgcDsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBUX2Vs ZW1lbnQmIG9wZXJhdG9yPSAoY29uc3QgVF9tZW1iZXImIHApIHsKICAgIGlmKCBwZF9yZWwgKSB7 CiAgICAgIFRfSGVscGVyOjpyZWxlYXNlKHBkX2RhdGEpOwogICAgICBUX0hlbHBlcjo6ZHVwbGlj YXRlKHApOwogICAgfQogICAgcGRfZGF0YSA9IChUX3B0cikgcDsKICAgIHJldHVybiAqdGhpczsK ICB9CgogIGlubGluZSBUX3B0ciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsg fQoKCgoKICBpbmxpbmUgb3BlcmF0b3IgVF9wdHIgKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsg fQoKCiAgaW5saW5lIFRfcHRyIGluKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQogIGlubGlu ZSBUX3B0ciYgaW5vdXQoKSB7IHJldHVybiBwZF9kYXRhOyB9CiAgaW5saW5lIFRfcHRyJiBvdXQo KSB7CiAgICBpZiAocGRfcmVsKSB7CiAgICAgIFRfSGVscGVyOjpyZWxlYXNlKHBkX2RhdGEpOwog ICAgfQogICAgcGRfZGF0YSA9IFRfSGVscGVyOjpfbmlsKCk7CiAgICByZXR1cm4gcGRfZGF0YTsK ICB9CiAgaW5saW5lIFRfcHRyIF9yZXRuKCkgewogICAgVF9wdHIgdG1wID0gcGRfZGF0YTsKICAg IGlmICghcGRfcmVsKQogICAgICBUX0hlbHBlcjo6ZHVwbGljYXRlKHBkX2RhdGEpOwogICAgcGRf ZGF0YSA9IFRfSGVscGVyOjpfbmlsKCk7CiAgICByZXR1cm4gdG1wOwogIH0KCiAgaW5saW5lIFRf cHRyJiBfTlBfcmVmKCkgY29uc3Qge3JldHVybiBwZF9kYXRhO30KICBpbmxpbmUgX0NPUkJBX0Jv b2xlYW4gX05QX3JlbGVhc2UoKSBjb25zdCB7cmV0dXJuIHBkX3JlbDt9CgogIF9DT1JCQV9Cb29s ZWFuIHBkX3JlbDsKICBUX3B0ciYgcGRfZGF0YTsKfTsKCgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBU LCBjbGFzcyBUX0hlbHBlcj4KaW5saW5lCl9DT1JCQV9PYmpSZWZfVmFyPFQsVF9IZWxwZXI+OjoK X0NPUkJBX09ialJlZl9WYXIoY29uc3QgX0NPUkJBX09ialJlZl9NZW1iZXI8VCxUX0hlbHBlcj4m IG0pCnsKICBUX0hlbHBlcjo6ZHVwbGljYXRlKG0uX3B0cik7CiAgcGRfb2JqcmVmID0gbS5fcHRy Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9IZWxwZXI+CmlubGluZQpfQ09SQkFfT2Jq UmVmX1ZhcjxULFRfSGVscGVyPjo6Cl9DT1JCQV9PYmpSZWZfVmFyKGNvbnN0IF9DT1JCQV9PYmpS ZWZfRWxlbWVudDxULFRfSGVscGVyPiYgbSkKewogIFRfSGVscGVyOjpkdXBsaWNhdGUobSk7CiAg cGRfb2JqcmVmID0gKFQqKW07Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9IZWxwZXI+ CmlubGluZSBfQ09SQkFfT2JqUmVmX1ZhcjxULFRfSGVscGVyPiYKX0NPUkJBX09ialJlZl9WYXI8 VCxUX0hlbHBlcj46Om9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX09ialJlZl9NZW1iZXI8VCxUX0hl bHBlcj4mIHApCnsKICBUX0hlbHBlcjo6cmVsZWFzZShwZF9vYmpyZWYpOwogIFRfSGVscGVyOjpk dXBsaWNhdGUocC5fcHRyKTsKICBwZF9vYmpyZWYgPSBwLl9wdHI7CiAgcmV0dXJuICp0aGlzOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVF9IZWxwZXI+CmlubGluZSBfQ09SQkFfT2JqUmVm X1ZhcjxULFRfSGVscGVyPiYKX0NPUkJBX09ialJlZl9WYXI8VCxUX0hlbHBlcj46Om9wZXJhdG9y PSAoY29uc3QgX0NPUkJBX09ialJlZl9FbGVtZW50PFQsVF9IZWxwZXI+JiBwKQp7CiAgVF9IZWxw ZXI6OnJlbGVhc2UocGRfb2JqcmVmKTsKICBUX0hlbHBlcjo6ZHVwbGljYXRlKHApOwogIHBkX29i anJlZiA9IChUKilwOwogIHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNz IFRfSGVscGVyPgppbmxpbmUgX0NPUkJBX09ialJlZl9NZW1iZXI8VCxUX0hlbHBlcj4mCl9DT1JC QV9PYmpSZWZfTWVtYmVyPFQsVF9IZWxwZXI+OjpvcGVyYXRvcj0gKGNvbnN0IF9DT1JCQV9PYmpS ZWZfRWxlbWVudDxULFRfSGVscGVyPiYgcCkKewogIFRfSGVscGVyOjpyZWxlYXNlKF9wdHIpOwog IFRfSGVscGVyOjpkdXBsaWNhdGUocCk7CiAgX3B0ciA9IChUKilwOwogIHJldHVybiAqdGhpczsK fQoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULGNsYXNzIFRfSGVscGVyPgpjbGFzcyBfQ09SQkFfT2Jq UmVmX0lOT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfTWVtYmVyPFQs VF9IZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9FbGVtZW50PFQsVF9I ZWxwZXI+IFRfZWxlbWVudDsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPFQsVF9IZWxwZXI+ IFRfdmFyOwogIGlubGluZSBfQ09SQkFfT2JqUmVmX0lOT1VUX2FyZyhUKiYgcCkgOiBfZGF0YShw KSB7fQogIGlubGluZSBfQ09SQkFfT2JqUmVmX0lOT1VUX2FyZyhUX3ZhciYgcCkgOiBfZGF0YShw LnBkX29ianJlZikge30KICBpbmxpbmUgX0NPUkJBX09ialJlZl9JTk9VVF9hcmcoVF9tZW1iZXIm IHApIDogX2RhdGEocC5fcHRyKSB7fQogIGlubGluZSBfQ09SQkFfT2JqUmVmX0lOT1VUX2FyZyhU X2VsZW1lbnQmIHApIDogX2RhdGEocC5fTlBfcmVmKCkpIHsKCgoKCgoKICAgIGlmKCAhcC5OUF9y ZWxlYXNlKCkgKQogICAgICBUX0hlbHBlcjo6ZHVwbGljYXRlKHAuX05QX3JlZigpKTsKICB9CiAg aW5saW5lIH5fQ09SQkFfT2JqUmVmX0lOT1VUX2FyZygpIHt9CgogIGlubGluZSBvcGVyYXRvciBU KiYoKSB7IHJldHVybiBfZGF0YTsgfQoKICBUKiYgX2RhdGE7Cgpwcml2YXRlOgogIF9DT1JCQV9P YmpSZWZfSU5PVVRfYXJnKCk7Cn07CgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsY2xhc3MgVF9IZWxw ZXI+CmNsYXNzIF9DT1JCQV9PYmpSZWZfT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JC QV9PYmpSZWZfT1VUX2FyZzxULFRfSGVscGVyPiBUX291dDsKICB0eXBlZGVmIF9DT1JCQV9PYmpS ZWZfTWVtYmVyPFQsVF9IZWxwZXI+IFRfbWVtYmVyOwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9F bGVtZW50PFQsVF9IZWxwZXI+IFRfZWxlbWVudDsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFy PFQsVF9IZWxwZXI+IFRfdmFyOwoKICBpbmxpbmUgX0NPUkJBX09ialJlZl9PVVRfYXJnKFQqJiBw KSA6IF9kYXRhKHApIHsgX2RhdGEgPSBUX0hlbHBlcjo6X25pbCgpOyB9CiAgaW5saW5lIF9DT1JC QV9PYmpSZWZfT1VUX2FyZyhUX3ZhciYgcCkgOiBfZGF0YShwLnBkX29ianJlZikgewogICAgcCA9 IFRfSGVscGVyOjpfbmlsKCk7CiAgfQogIGlubGluZSBfQ09SQkFfT2JqUmVmX09VVF9hcmcoVF9t ZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7CiAgICBwID0gVF9IZWxwZXI6Ol9uaWwoKTsKICB9 CiAgaW5saW5lIF9DT1JCQV9PYmpSZWZfT1VUX2FyZyhUX2VsZW1lbnQmIHApIDogX2RhdGEocC5f TlBfcmVmKCkpIHsKICAgIHAgPSBUX0hlbHBlcjo6X25pbCgpOwogIH0KCiAgaW5saW5lIF9DT1JC QV9PYmpSZWZfT1VUX2FyZyhjb25zdCBUX291dCYgcCkgOiBfZGF0YShwLl9kYXRhKSB7fQogIGlu bGluZSB+X0NPUkJBX09ialJlZl9PVVRfYXJnKCkge30KCiAgaW5saW5lIFRfb3V0JiBvcGVyYXRv cj0oY29uc3QgVF9vdXQmIHApIHsgX2RhdGEgPSBwLl9kYXRhOyByZXR1cm4gKnRoaXM7IH0KICBp bmxpbmUgVF9vdXQmIG9wZXJhdG9yPShUKiBwKSB7IF9kYXRhID0gcDsgcmV0dXJuICp0aGlzOyB9 CgogIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiYg cHRyKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsg cmV0dXJuIF9kYXRhOyB9CgogIFQqJiBfZGF0YTsKcHJpdmF0ZToKICBfQ09SQkFfT2JqUmVmX09V VF9hcmcoKTsKICBUX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfbWVtYmVyJiBwKTsKICBUX291dCYg b3BlcmF0b3I9KGNvbnN0IFRfZWxlbWVudCYgcCk7CiAgVF9vdXQmIG9wZXJhdG9yPShjb25zdCBU X3ZhciYgcCk7CgoKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVCxjbGFzcyBUX0hlbHBlcj4KY2xh c3MgX0NPUkJBX09ialJlZl90Y0Rlc2NfYXJnIHsKcHVibGljOgoKCgoKCgogIHR5cGVkZWYgVCog VF9wdHI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX01lbWJlcjxULFRfSGVscGVyPiBUX21lbWJl cjsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfRWxlbWVudDxULFRfSGVscGVyPiBUX2VsZW1lbnQ7 CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX1ZhcjxULFRfSGVscGVyPiBUX3ZhcjsKICBpbmxpbmUg X0NPUkJBX09ialJlZl90Y0Rlc2NfYXJnKFRfcHRyJiBwLCBfQ09SQkFfQm9vbGVhbiByZWwpCiAg ICA6IF9kYXRhKHApLCBfcmVsKHJlbCkge30KICBpbmxpbmUgX0NPUkJBX09ialJlZl90Y0Rlc2Nf YXJnKFRfdmFyJiBwKSA6IF9kYXRhKHAucGRfb2JqcmVmKSwgX3JlbCgxKSB7fQogIGlubGluZSBf Q09SQkFfT2JqUmVmX3RjRGVzY19hcmcoVF9tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSwgX3Jl bCgxKSB7fQogIGlubGluZSBfQ09SQkFfT2JqUmVmX3RjRGVzY19hcmcoVF9lbGVtZW50IHApCiAg ICA6IF9kYXRhKHAuX05QX3JlZigpKSwgX3JlbChwLl9OUF9yZWxlYXNlKCkpIHt9CiAgaW5saW5l IH5fQ09SQkFfT2JqUmVmX3RjRGVzY19hcmcoKSB7fQoKICBUKiYgX2RhdGE7CiAgX0NPUkJBX0Jv b2xlYW4gX3JlbDsKCnByaXZhdGU6CiAgX0NPUkJBX09ialJlZl90Y0Rlc2NfYXJnKCk7Cn07CgoK CgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4KY2xhc3MgX0NPUkJBX0NvbnN0clR5 cGVfRml4X09VVF9hcmc7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgX0NPUkJBX0NvbnN0clR5 cGVfRml4X1ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX0ZpeF9WYXI8 VD4gVF92YXI7CgogIGlubGluZSBfQ09SQkFfQ29uc3RyVHlwZV9GaXhfVmFyKCkge30KICBpbmxp bmUgX0NPUkJBX0NvbnN0clR5cGVfRml4X1ZhcihUKiBwKSB7IHBkX2RhdGEgPSAqcDsgZGVsZXRl IHA7IH0KICBpbmxpbmUgX0NPUkJBX0NvbnN0clR5cGVfRml4X1Zhcihjb25zdCBUX3ZhciYgcCkg ewogICAgcGRfZGF0YSA9IHAucGRfZGF0YTsKICB9CiAgaW5saW5lIH5fQ09SQkFfQ29uc3RyVHlw ZV9GaXhfVmFyKCkge30KICBpbmxpbmUgVF92YXImb3BlcmF0b3I9IChUKiBwKSB7CiAgICBwZF9k YXRhID0gKnA7CiAgICBkZWxldGUgcDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIFRf dmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfdmFyJiBwKSB7CiAgICBwZF9kYXRhID0gcC5wZF9kYXRh OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoVCBwKSB7 CiAgICBwZF9kYXRhID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIFQqIG9wZXJh dG9yLT4oKSBjb25zdCB7IHJldHVybiAoVCopICZwZF9kYXRhOyB9CgoKCgogIGlubGluZSBvcGVy YXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CiAgaW5saW5lIG9wZXJh dG9yIFQmICgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KIyA4MTkgIi91c3IvbG9jYWwvaW5jbHVkZS9v bW5pT1JCMy90ZW1wbGF0ZWRlY2xzLmgiIDMKICBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJu IHBkX2RhdGE7IH0KICBUJiBpbm91dCgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KICBUJiBvdXQoKSB7 IHJldHVybiBwZF9kYXRhOyB9CiAgVCBfcmV0bigpIHsgcmV0dXJuIHBkX2RhdGE7IH0KCiAgZnJp ZW5kIGNsYXNzIF9DT1JCQV9Db25zdHJUeXBlX0ZpeF9PVVRfYXJnPFQsIFRfdmFyPjsKCnByb3Rl Y3RlZDoKICBUIHBkX2RhdGE7Cn07CgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFRfdmFy PgpjbGFzcyBfQ09SQkFfQ29uc3RyVHlwZV9GaXhfT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVm IF9DT1JCQV9Db25zdHJUeXBlX0ZpeF9PVVRfYXJnPFQsVF92YXI+IFRfb3V0OwogIGlubGluZSBf Q09SQkFfQ29uc3RyVHlwZV9GaXhfT1VUX2FyZyhUKiYgcCkgOiBfZGF0YShwKSB7IF9kYXRhID0g MDsgfQogIGlubGluZSBfQ09SQkFfQ29uc3RyVHlwZV9GaXhfT1VUX2FyZyhUX3ZhciYgcCkgOiBf ZGF0YSgmcC5wZF9kYXRhKSB7fQogIGlubGluZSBfQ09SQkFfQ29uc3RyVHlwZV9GaXhfT1VUX2Fy Zyhjb25zdCBUX291dCYgcCkgOiBfZGF0YShwLl9kYXRhKSB7fQogIGlubGluZSBUX291dCYgb3Bl cmF0b3I9KGNvbnN0IFRfb3V0JiBwKSB7IF9kYXRhID0gcC5fZGF0YTsgcmV0dXJuICp0aGlzOyB9 CiAgaW5saW5lIFRfb3V0JiBvcGVyYXRvcj0oVCogcCkgeyBfZGF0YSA9IHA7IHJldHVybiAqdGhp czsgfQogIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBU KiYgcHRyKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVComIG9wZXJhdG9yLT4oKSB7IHJl dHVybiBfZGF0YTsgfQoKICBUKiYgX2RhdGE7Cgpwcml2YXRlOgogIF9DT1JCQV9Db25zdHJUeXBl X0ZpeF9PVVRfYXJnKCk7CiAgVF9vdXQmIG9wZXJhdG9yPShjb25zdCBUX3ZhciYpOwp9OwoKCgoK CnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4KY2xhc3MgX0NPUkJBX0NvbnN0clR5cGVf VmFyaWFibGVfT1VUX2FyZzsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBfQ09SQkFfQ29uc3Ry VHlwZV9WYXJpYWJsZV9WYXIgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9W YXJpYWJsZV9WYXI8VD4gVF92YXI7CgogIGlubGluZSBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJs ZV9WYXIoKSB7IHBkX2RhdGEgPSAwOyB9CiAgaW5saW5lIF9DT1JCQV9Db25zdHJUeXBlX1Zhcmlh YmxlX1ZhcihUKiBwKSB7IHBkX2RhdGEgPSBwOyB9CiAgaW5saW5lIF9DT1JCQV9Db25zdHJUeXBl X1ZhcmlhYmxlX1Zhcihjb25zdCBUX3ZhciYgcCkgewogICAgaWYoICFwLnBkX2RhdGEgKSBwZF9k YXRhID0gMDsKICAgIGVsc2UgewogICAgICBwZF9kYXRhID0gbmV3IFQ7CiAgICAgIGlmKCAhcGRf ZGF0YSApIF9DT1JCQV9uZXdfb3BlcmF0b3JfcmV0dXJuX251bGwoKTsKICAgICAgKnBkX2RhdGEg PSAqcC5wZF9kYXRhOwogICAgfQogIH0KCiAgaW5saW5lIH5fQ09SQkFfQ29uc3RyVHlwZV9WYXJp YWJsZV9WYXIoKSB7IGlmKCBwZF9kYXRhICkgZGVsZXRlIHBkX2RhdGE7IH0KCiAgaW5saW5lIFRf dmFyJiBvcGVyYXRvcj0gKFQqIHApIHsKICAgIGlmKCBwZF9kYXRhICkgZGVsZXRlIHBkX2RhdGE7 CiAgICBwZF9kYXRhID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBUX3ZhciYg b3BlcmF0b3I9IChjb25zdCBUX3ZhciYgcCkgewogICAgaWYoICZwID09IHRoaXMgKSByZXR1cm4g KnRoaXM7CiAgICBpZiggcC5wZF9kYXRhICkgewogICAgICBpZiggIXBkX2RhdGEgKSB7CiAgICAg ICAgcGRfZGF0YSA9IG5ldyBUOwogICAgICAgIGlmKCAhcGRfZGF0YSApIF9DT1JCQV9uZXdfb3Bl cmF0b3JfcmV0dXJuX251bGwoKTsKICAgICAgfQogICAgICAqcGRfZGF0YSA9ICpwLnBkX2RhdGE7 CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYoIHBkX2RhdGEgKSBkZWxldGUgcGRfZGF0YTsKICAg ICAgcGRfZGF0YSA9IDA7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVCog b3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIChUKilwZF9kYXRhOyB9CgoKCgogIGlubGluZSBv cGVyYXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVybiAqcGRfZGF0YTsgfQogIGlubGluZSBv cGVyYXRvciBUJiAoKSB7IHJldHVybiAqcGRfZGF0YTsgfQojIDkyMCAiL3Vzci9sb2NhbC9pbmNs dWRlL29tbmlPUkIzL3RlbXBsYXRlZGVjbHMuaCIgMwogIGNvbnN0IFQmIGluKCkgY29uc3QgeyBy ZXR1cm4gKnBkX2RhdGE7IH0KICBUJiBpbm91dCgpIHsgcmV0dXJuICpwZF9kYXRhOyB9CiAgVCom IG91dCgpIHsgaWYgKHBkX2RhdGEpIHsgZGVsZXRlIHBkX2RhdGE7IHBkX2RhdGEgPSAwOyB9IHJl dHVybiBwZF9kYXRhOyB9CiAgVCogX3JldG4oKSB7IFQqIHRtcCA9IHBkX2RhdGE7IHBkX2RhdGEg PSAwOyByZXR1cm4gdG1wOyB9CgogIGZyaWVuZCBjbGFzcyBfQ09SQkFfQ29uc3RyVHlwZV9WYXJp YWJsZV9PVVRfYXJnPFQsIFRfdmFyPjsKCnByb3RlY3RlZDoKICBUKiBwZF9kYXRhOwp9OwoKCgoK CnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4KY2xhc3MgX0NPUkJBX0NvbnN0clR5cGVf VmFyaWFibGVfT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX1Zh cmlhYmxlX09VVF9hcmc8VCxUX3Zhcj4gVF9vdXQ7CiAgaW5saW5lIF9DT1JCQV9Db25zdHJUeXBl X1ZhcmlhYmxlX09VVF9hcmcoVComIHApIDogX2RhdGEocCkgeyBfZGF0YSA9IDA7IH0KICBpbmxp bmUgX0NPUkJBX0NvbnN0clR5cGVfVmFyaWFibGVfT1VUX2FyZyhUX3ZhciYgcCkgOiBfZGF0YShw LnBkX2RhdGEpIHsKICAgIHAgPSAoVCopMDsKICB9CiAgaW5saW5lIF9DT1JCQV9Db25zdHJUeXBl X1ZhcmlhYmxlX09VVF9hcmcoY29uc3QgVF9vdXQmIHApIDogX2RhdGEocC5fZGF0YSkge30KICBp bmxpbmUgVF9vdXQmIG9wZXJhdG9yPShjb25zdCBUX291dCYgcCkgeyBfZGF0YSA9IHAuX2RhdGE7 IHJldHVybiAqdGhpczsgfQogIGlubGluZSBUX291dCYgb3BlcmF0b3I9KFQqIHApIHsgX2RhdGEg PSBwOyByZXR1cm4gKnRoaXM7IH0KICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4gX2Rh dGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqJiBv cGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgVComIF9kYXRhOwoKcHJpdmF0ZToKICBf Q09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9PVVRfYXJnKCk7CiAgVF9vdXQmIG9wZXJhdG9yPShj b25zdCBUX3ZhciYpOwp9OwoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4KY2xh c3MgX0NPUkJBX0FycmF5X09VVF9hcmc7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVF9IZWxwZXIsIGNsYXNz IFQ+CmNsYXNzIF9DT1JCQV9BcnJheV9WYXIgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfQXJy YXlfVmFyPFRfSGVscGVyLFQ+IFRfdmFyOwoKICBpbmxpbmUgX0NPUkJBX0FycmF5X1ZhciAoKSB7 IHBkX2RhdGEgPSAwOyB9CiAgaW5saW5lIF9DT1JCQV9BcnJheV9WYXIgKFQqIHApIHsgcGRfZGF0 YSA9IHA7IH0KICBpbmxpbmUgX0NPUkJBX0FycmF5X1ZhciAoY29uc3QgVF92YXImIHApIHsKICAg IGlmKCAhcC5wZF9kYXRhICkgcGRfZGF0YSA9IDA7CiAgICBlbHNlIHsKICAgICAgcGRfZGF0YSA9 IFRfSGVscGVyOjpkdXAocC5wZF9kYXRhKTsKICAgICAgaWYoICFwZF9kYXRhICkgX0NPUkJBX25l d19vcGVyYXRvcl9yZXR1cm5fbnVsbCgpOwogICAgfQogIH0KCiAgaW5saW5lIH5fQ09SQkFfQXJy YXlfVmFyKCkgeyBpZiggcGRfZGF0YSApIFRfSGVscGVyOjpmcmVlKHBkX2RhdGEpOyB9CgogIGlu bGluZSBUX3ZhciYgb3BlcmF0b3I9IChUKiBwKSB7CiAgICBpZiAocGRfZGF0YSkgVF9IZWxwZXI6 OmZyZWUocGRfZGF0YSk7CiAgICBwZF9kYXRhID0gcDsKICAgIHJldHVybiAqdGhpczsKICB9Cgog IGlubGluZSBUX3ZhciYgb3BlcmF0b3I9IChjb25zdCBUX3ZhciYgcCkgewogICAgaWYoICZwID09 IHRoaXMgKSByZXR1cm4gKnRoaXM7CiAgICBpZiggcGRfZGF0YSApIFRfSGVscGVyOjpmcmVlKHBk X2RhdGEpOwoKICAgIGlmKCBwLnBkX2RhdGEgKSB7CiAgICAgIHBkX2RhdGEgPSBUX0hlbHBlcjo6 ZHVwKHAucGRfZGF0YSk7CiAgICAgIGlmKCAhcGRfZGF0YSApIF9DT1JCQV9uZXdfb3BlcmF0b3Jf cmV0dXJuX251bGwoKTsKICAgIH0KICAgIGVsc2UgewogICAgICBwZF9kYXRhID0gMDsKICAgIH0K ICAgIHJldHVybiAqdGhpczsKICB9CgoKICBpbmxpbmUgVCYgb3BlcmF0b3JbXSAoX0NPUkJBX1VM b25nIGluZGV4KSB7CiAgICByZXR1cm4gKihwZF9kYXRhICsgaW5kZXgpOwogIH0KICBpbmxpbmUg Y29uc3QgVCYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4KSBjb25zdCB7CiAgICByZXR1 cm4gKigoY29uc3QgVCopIChwZF9kYXRhICsgaW5kZXgpKTsKICB9CiAgaW5saW5lIG9wZXJhdG9y IFQqICgpIGNvbnN0IHsgcmV0dXJuIHBkX2RhdGE7IH0KCgoKCgoKICBjb25zdCBUKiBpbigpIGNv bnN0IHsgcmV0dXJuIHBkX2RhdGE7IH0KICBUKiBpbm91dCgpIHsgcmV0dXJuIHBkX2RhdGE7IH0K ICBUKiYgb3V0KCkgewogICAgaWYgKHBkX2RhdGEpIHsKICAgICAgVF9IZWxwZXI6OmZyZWUocGRf ZGF0YSk7CiAgICAgIHBkX2RhdGEgPSAwOwogICAgfQogICAgcmV0dXJuIHBkX2RhdGE7CiAgfQog IFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBwZF9kYXRhOyBwZF9kYXRhID0gMDsgcmV0dXJuIHRtcDsg fQoKICBmcmllbmQgY2xhc3MgX0NPUkJBX0FycmF5X09VVF9hcmc8VCwgVF92YXI+OwoKcHJpdmF0 ZToKICBUKiBwZF9kYXRhOwp9OwoKCgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4K Y2xhc3MgX0NPUkJBX0FycmF5X09VVF9hcmcgewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfQXJy YXlfT1VUX2FyZzxULFRfdmFyPiBUX291dDsKICBpbmxpbmUgX0NPUkJBX0FycmF5X09VVF9hcmco VComIHApIDogX2RhdGEocCkgeyBfZGF0YSA9IDA7IH0KICBpbmxpbmUgX0NPUkJBX0FycmF5X09V VF9hcmcoVF92YXImIHApIDogX2RhdGEocC5wZF9kYXRhKSB7CiAgICBwID0gKFQqKTA7CiAgfQog IGlubGluZSBfQ09SQkFfQXJyYXlfT1VUX2FyZyhjb25zdCBUX291dCYgcCkgOiBfZGF0YShwLl9k YXRhKSB7fQogIGlubGluZSBUX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfb3V0JiBwKSB7IF9kYXRh ID0gcC5fZGF0YTsgcmV0dXJuICp0aGlzOyB9CiAgaW5saW5lIFRfb3V0JiBvcGVyYXRvcj0oVCog cCkgeyBfZGF0YSA9IHA7IHJldHVybiAqdGhpczsgfQogIGlubGluZSBvcGVyYXRvciBUKiYoKSB7 IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiYgcHRyKCkgeyByZXR1cm4gX2RhdGE7IH0KICBp bmxpbmUgVCYgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4KSB7CiAgICByZXR1cm4gX2Rh dGFbaW5kZXhdOwogIH0KCiAgVComIF9kYXRhOwpwcml2YXRlOgogIF9DT1JCQV9BcnJheV9PVVRf YXJnKCk7CiAgVF9vdXQmIG9wZXJhdG9yPShjb25zdCBUX3ZhciYpOwp9OwoKCgoKCnRlbXBsYXRl IDxjbGFzcyBUX0hlbHBlcixjbGFzcyBUPgpjbGFzcyBfQ09SQkFfQXJyYXlfRm9yYW55IHsKcHVi bGljOgogIGlubGluZSBfQ09SQkFfQXJyYXlfRm9yYW55ICgpIHsgcGRfZGF0YSA9IDA7IHBkX25v Y29weSA9IDA7IH0KCgoKCgogIGlubGluZSBfQ09SQkFfQXJyYXlfRm9yYW55IChUKiBwLF9DT1JC QV9Cb29sZWFuIG5vY29weSA9IDApIHsKICAgIHBkX2RhdGEgPSBwOyBwZF9ub2NvcHkgPSBub2Nv cHk7CiAgfQoKICBpbmxpbmUgX0NPUkJBX0FycmF5X0ZvcmFueSAoY29uc3QgX0NPUkJBX0FycmF5 X0ZvcmFueTxUX0hlbHBlcixUPiYgcCkgewogICAgcGRfZGF0YSA9IHAucGRfZGF0YTsgcGRfbm9j b3B5ID0gMDsKICB9CgogIGlubGluZSB+X0NPUkJBX0FycmF5X0ZvcmFueSgpIHsKCiAgfQoKICBp bmxpbmUgX0NPUkJBX0FycmF5X0ZvcmFueTxUX0hlbHBlcixUPiYgb3BlcmF0b3I9IChUKiBwKSB7 CiAgICBwZF9kYXRhID0gcDsgcGRfbm9jb3B5ID0gMDsgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5s aW5lIFQmIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpbmRleCkgeyByZXR1cm4gKihwZF9kYXRh ICsgaW5kZXgpOyB9CiAgaW5saW5lIGNvbnN0IFQmIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBp bmRleCkgY29uc3QgewogICAgcmV0dXJuICooIChjb25zdCBUKikgKHBkX2RhdGEgKyBpbmRleCkp OwogIH0KCiAgaW5saW5lIG9wZXJhdG9yIFQqICgpIGNvbnN0IHsgcmV0dXJuIHBkX2RhdGE7IH0K ICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCogKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IFQqKXBk X2RhdGE7IH0KCiAgaW5saW5lIFQqIE5QX2dldFNsaWNlKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0 YTsgfQogIGlubGluZSBfQ09SQkFfQm9vbGVhbiBOUF9ub2NvcHkoKSBjb25zdCB7IHJldHVybiBw ZF9ub2NvcHk7IH0KCnByaXZhdGU6CiAgVCogcGRfZGF0YTsKICBfQ09SQkFfQm9vbGVhbiBwZF9u b2NvcHk7Cn07CiMgMjU3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMiAz CiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3N0cmluZ3R5cGVzLmgiIDEgMwojIDY3 ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvc3RyaW5ndHlwZXMuaCIgMwpjbGFzcyBfQ09S QkFfU3RyaW5nX21lbWJlcjsKY2xhc3MgX0NPUkJBX1N0cmluZ19lbGVtZW50OwpjbGFzcyBfQ09S QkFfU3RyaW5nX2lub3V0OwpjbGFzcyBfQ09SQkFfU3RyaW5nX291dDsKCgoKCgpjbGFzcyBfQ09S QkFfU3RyaW5nX3ZhciB7CnB1YmxpYzoKCgoKCgogIHR5cGVkZWYgY2hhciogcHRyX3Q7CgogIHN0 YXRpYyBpbmxpbmUgY2hhciogc3RyaW5nX2R1cChjb25zdCBjaGFyKiBwKSB7CiAgICBjaGFyKiBy ID0gb21uaTo6YWxsb2NTdHJpbmcoc3RybGVuKHApKTsKICAgIHN0cmNweShyLCBwKTsKICAgIHJl dHVybiByOwogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfdmFyKCkgeyBfZGF0YSA9IDA7IH0K ICBpbmxpbmUgX0NPUkJBX1N0cmluZ192YXIoY2hhciAqcCkgeyBfZGF0YSA9IHA7IH0KCiAgaW5s aW5lIF9DT1JCQV9TdHJpbmdfdmFyKGNvbnN0IGNoYXIqIHApIHsKICAgIGlmKCBwICkgX2RhdGEg PSBzdHJpbmdfZHVwKHApOwogICAgZWxzZSBfZGF0YSA9IDA7CiAgfQoKICBpbmxpbmUgX0NPUkJB X1N0cmluZ192YXIoY29uc3QgX0NPUkJBX1N0cmluZ192YXImIHMpIHsKICAgIGlmKCAoY29uc3Qg Y2hhciAqKXMgKSBfZGF0YSA9IHN0cmluZ19kdXAocyk7CiAgICBlbHNlIF9kYXRhID0gMDsKICB9 CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX3Zhcihjb25zdCBfQ09SQkFfU3RyaW5nX21lbWJlciYg cyk7CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX3Zhcihjb25zdCBfQ09SQkFfU3RyaW5nX2VsZW1l bnQmIHMpOwoKICBpbmxpbmUgfl9DT1JCQV9TdHJpbmdfdmFyKCkgewogICAgb21uaTo6ZnJlZVN0 cmluZyhfZGF0YSk7CiAgfQoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ192YXImIG9wZXJhdG9yPShj aGFyKiBwKSB7CiAgICBvbW5pOjpmcmVlU3RyaW5nKF9kYXRhKTsKICAgIF9kYXRhID0gcDsKICAg IHJldHVybiAqdGhpczsKICB9CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX3ZhciYgb3BlcmF0b3I9 KGNvbnN0IGNoYXIqIHApIHsKICAgIG9tbmk6OmZyZWVTdHJpbmcoX2RhdGEpOwogICAgX2RhdGEg PSAwOwogICAgaWYgKHApIF9kYXRhID0gc3RyaW5nX2R1cChwKTsKICAgIHJldHVybiAqdGhpczsK ICB9CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX3ZhciYgb3BlcmF0b3I9KGNvbnN0IF9DT1JCQV9T dHJpbmdfdmFyJiBzKSB7CiAgICBpZiAoJnMgIT0gdGhpcykgewogICAgICBvbW5pOjpmcmVlU3Ry aW5nKF9kYXRhKTsKICAgICAgX2RhdGEgPSAwOwogICAgICBpZiggKGNvbnN0IGNoYXIqKXMgKSBf ZGF0YSA9IHN0cmluZ19kdXAocyk7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxp bmUgX0NPUkJBX1N0cmluZ192YXImIG9wZXJhdG9yPShjb25zdCBfQ09SQkFfU3RyaW5nX21lbWJl ciYgcyk7CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX3ZhciYgb3BlcmF0b3I9KGNvbnN0IF9DT1JC QV9TdHJpbmdfZWxlbWVudCYgcyk7CgoKICBpbmxpbmUgb3BlcmF0b3IgY2hhciogKCkgeyByZXR1 cm4gX2RhdGE7IH0KICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgY2hhciogKCkgY29uc3QgeyByZXR1 cm4gX2RhdGE7IH0KCgoKCiAgaW5saW5lIGNoYXImIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBp bmRleCkgewogICAgaWYgKCFfZGF0YSB8fCAoX0NPUkJBX1VMb25nKXN0cmxlbihfZGF0YSkgPCBp bmRleCkgewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIH0KICAgIHJldHVy biBfZGF0YVtpbmRleF07CiAgfQoKICBpbmxpbmUgY2hhciBvcGVyYXRvcltdIChfQ09SQkFfVUxv bmcgaW5kZXgpIGNvbnN0IHsKICAgIGlmICghX2RhdGEgfHwgKF9DT1JCQV9VTG9uZylzdHJsZW4o X2RhdGEpIDwgaW5kZXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CiAgICB9 CiAgICByZXR1cm4gX2RhdGFbaW5kZXhdOwogIH0KCiAgaW5saW5lIGNvbnN0IGNoYXIqIGluKCkg Y29uc3QgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgY2hhciomIGlub3V0KCkgeyByZXR1cm4g X2RhdGE7IH0KICBpbmxpbmUgY2hhciomIG91dCgpIHsKICAgIGlmKCBfZGF0YSApewogICAgICBv bW5pOjpmcmVlU3RyaW5nKF9kYXRhKTsKICAgICAgX2RhdGEgPSAwOwogICAgfQogICAgcmV0dXJu IF9kYXRhOwogIH0KICBpbmxpbmUgY2hhciogX3JldG4oKSB7CiAgICBjaGFyKiB0bXAgPSBfZGF0 YTsKICAgIF9kYXRhID0gMDsKICAgIHJldHVybiB0bXA7CiAgfQoKICBmcmllbmQgY2xhc3MgX0NP UkJBX1N0cmluZ19pbm91dDsKICBmcmllbmQgY2xhc3MgX0NPUkJBX1N0cmluZ19vdXQ7Cgpwcml2 YXRlOgogIGNoYXIqIF9kYXRhOwp9OwoKCgoKCmNsYXNzIF9DT1JCQV9TdHJpbmdfbWVtYmVyIHsK cHVibGljOgogIHR5cGVkZWYgY2hhciogcHRyX3Q7CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX21l bWJlcigpCiAgICA6IF9wdHIoKGNoYXIqKSBvbW5pOjplbXB0eV9zdHJpbmcpIHt9CgogIGlubGlu ZSBfQ09SQkFfU3RyaW5nX21lbWJlcihjb25zdCBfQ09SQkFfU3RyaW5nX21lbWJlciYgcykKICAg ICAgICAgICA6IF9wdHIoKGNoYXIqKW9tbmk6OmVtcHR5X3N0cmluZykgewogICAgaWYgKHMuX3B0 ciAmJiBzLl9wdHIgIT0gb21uaTo6ZW1wdHlfc3RyaW5nKQogICAgICBfcHRyID0gX0NPUkJBX1N0 cmluZ192YXI6OnN0cmluZ19kdXAocy5fcHRyKTsKICB9CgogIGlubGluZSB+X0NPUkJBX1N0cmlu Z19tZW1iZXIoKSB7CiAgICBvbW5pOjpmcmVlU3RyaW5nKF9wdHIpOwogIH0KCiAgaW5saW5lIF9D T1JCQV9TdHJpbmdfbWVtYmVyJiBvcGVyYXRvcj0oY2hhciogcykgewogICAgb21uaTo6ZnJlZVN0 cmluZyhfcHRyKTsKICAgIF9wdHIgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5l IF9DT1JCQV9TdHJpbmdfbWVtYmVyJiBvcGVyYXRvcj0gKGNvbnN0IGNoYXIqIHMpIHsKICAgIG9t bmk6OmZyZWVTdHJpbmcoX3B0cik7CiAgICBpZiAocykKICAgICAgX3B0ciA9IF9DT1JCQV9TdHJp bmdfdmFyOjpzdHJpbmdfZHVwKHMpOwogICAgZWxzZQogICAgICBfcHRyID0gMDsKICAgIHJldHVy biAqdGhpczsKICB9CgogIGlubGluZSBfQ09SQkFfU3RyaW5nX21lbWJlciYgb3BlcmF0b3I9KGNv bnN0IF9DT1JCQV9TdHJpbmdfbWVtYmVyJiBzKSB7CiAgICBpZiAoJnMgIT0gdGhpcykgewogICAg ICBvbW5pOjpmcmVlU3RyaW5nKF9wdHIpOwogICAgICBpZiAocy5fcHRyICYmIHMuX3B0ciAhPSBv bW5pOjplbXB0eV9zdHJpbmcpCiAgICAgICAgX3B0ciA9IF9DT1JCQV9TdHJpbmdfdmFyOjpzdHJp bmdfZHVwKHMuX3B0cik7CiAgICAgIGVsc2UKICAgICAgICBfcHRyID0gcy5fcHRyOwogICAgfQog ICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfbWVtYmVyJiBvcGVy YXRvcj0oY29uc3QgX0NPUkJBX1N0cmluZ192YXImIHMpIHsKICAgIG9tbmk6OmZyZWVTdHJpbmco X3B0cik7CiAgICBpZiggKGNvbnN0IGNoYXIqKXMgKSB7CiAgICAgIF9wdHIgPSBfQ09SQkFfU3Ry aW5nX3Zhcjo6c3RyaW5nX2R1cCgoY29uc3QgY2hhciopcyk7CiAgICB9CiAgICBlbHNlIHsKICAg ICAgX3B0ciA9IChjaGFyKikgMDsKICAgIH0KICAgIHJldHVybiAqdGhpczsKICB9CgogIGlubGlu ZSBfQ09SQkFfU3RyaW5nX21lbWJlciYgb3BlcmF0b3I9KGNvbnN0IF9DT1JCQV9TdHJpbmdfZWxl bWVudCYgcyk7CgogIGlubGluZSBjaGFyJiBvcGVyYXRvcltdIChfQ09SQkFfVUxvbmcgaW5kZXgp IHsKICAgIGlmICghX3B0ciB8fCAoX0NPUkJBX1VMb25nKXN0cmxlbihfcHRyKSA8IGluZGV4KSB7 CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwogICAgfQogICAgcmV0dXJuIF9wdHJb aW5kZXhdOwogIH0KCiAgaW5saW5lIGNoYXIgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25nIGluZGV4 KSBjb25zdCB7CiAgICBpZiAoIV9wdHIgfHwgKF9DT1JCQV9VTG9uZylzdHJsZW4oX3B0cikgPCBp bmRleCkgewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIH0KICAgIHJldHVy biBfcHRyW2luZGV4XTsKICB9CgoKICBpbmxpbmUgb3BlcmF0b3IgY2hhciogKCkgeyByZXR1cm4g X3B0cjsgfQogIGlubGluZSBvcGVyYXRvciBjb25zdCBjaGFyKiAoKSBjb25zdCB7IHJldHVybiBf cHRyOyB9CgoKCgogIGlubGluZSBjb25zdCBjaGFyKiBpbigpIGNvbnN0IHsgcmV0dXJuIF9wdHI7 IH0KICBpbmxpbmUgY2hhciomIGlub3V0KCkgeyByZXR1cm4gX3B0cjsgfQogIGlubGluZSBjaGFy KiYgb3V0KCkgewogICAgb21uaTo6ZnJlZVN0cmluZyhfcHRyKTsKICAgIF9wdHIgPSAwOwogICAg cmV0dXJuIF9wdHI7CiAgfQoKICBpbmxpbmUgY2hhciogX3JldG4oKSB7CiAgICBjaGFyICp0bXA7 CiAgICB0bXAgPSBfcHRyOwogICAgX3B0ciA9IDA7CiAgICByZXR1cm4gdG1wOwogIH0KCiAgdm9p ZCBvcGVyYXRvciA+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdDsKICB2b2lkIG9wZXJh dG9yIDw8PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpOwogIHZvaWQgb3BlcmF0b3IgPj49IChNZW1C dWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgdm9pZCBvcGVyYXRvciA8PD0gKE1lbUJ1ZmZlcmVk U3RyZWFtJiBzKTsKICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zmc2V0 KSBjb25zdDsKCiAgaW5saW5lIGNoYXIqJiBfTlBfcmVmKCkge3JldHVybiBfcHRyO30KCiAgY2hh ciogX3B0cjsKCn07CgoKCgoKY2xhc3MgX0NPUkJBX1N0cmluZ19lbGVtZW50IHsKCnB1YmxpYzoK CiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudChjaGFyKiYgcCwgX0NPUkJBX0Jvb2xlYW4g cmVsKQogICAgOiBwZF9yZWwocmVsKSwgcGRfZGF0YShwKSB7fQoKICBpbmxpbmUgX0NPUkJBX1N0 cmluZ19lbGVtZW50KGNvbnN0IF9DT1JCQV9TdHJpbmdfZWxlbWVudCYgcykKICA6IHBkX3JlbChz LnBkX3JlbCksIHBkX2RhdGEocy5wZF9kYXRhKSB7fQoKICBpbmxpbmUgfl9DT1JCQV9TdHJpbmdf ZWxlbWVudCgpIHsKCiAgfQoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBvcGVyYXRv cj0oY2hhciogcykgewogICAgaWYgKHBkX3JlbCkKICAgICAgb21uaTo6ZnJlZVN0cmluZyhwZF9k YXRhKTsKICAgIHBkX2RhdGEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9D T1JCQV9TdHJpbmdfZWxlbWVudCYgb3BlcmF0b3I9IChjb25zdCBjaGFyKiBzKSB7CiAgICBpZiAo cGRfcmVsKSB7CiAgICAgIG9tbmk6OmZyZWVTdHJpbmcocGRfZGF0YSk7CiAgICAgIGlmIChzKQog ICAgICAgIHBkX2RhdGEgPSBfQ09SQkFfU3RyaW5nX3Zhcjo6c3RyaW5nX2R1cChzKTsKICAgICAg ZWxzZQogICAgICAgIHBkX2RhdGEgPSAwOwogICAgfSBlbHNlIHsKICAgICAgcGRfZGF0YSA9IChj aGFyKilzOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJp bmdfZWxlbWVudCYgb3BlcmF0b3I9KGNvbnN0IF9DT1JCQV9TdHJpbmdfZWxlbWVudCYgcykgewog ICAgaWYgKCZzICE9IHRoaXMpIHsKICAgICAgaWYgKHBkX3JlbCkgewogICAgICAgIG9tbmk6OmZy ZWVTdHJpbmcocGRfZGF0YSk7CiAgICAgICAgaWYgKHMucGRfZGF0YSAmJiBzLnBkX2RhdGEgIT0g b21uaTo6ZW1wdHlfc3RyaW5nKQogICAgICAgICAgcGRfZGF0YSA9IF9DT1JCQV9TdHJpbmdfdmFy OjpzdHJpbmdfZHVwKHMucGRfZGF0YSk7CiAgICAgICAgZWxzZQogICAgICAgICAgcGRfZGF0YSA9 IChjaGFyKilzLnBkX2RhdGE7CiAgICAgIH0gZWxzZQogICAgICAgIHBkX2RhdGEgPSAoY2hhciop cy5wZF9kYXRhOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JCQV9T dHJpbmdfZWxlbWVudCYgb3BlcmF0b3I9KGNvbnN0IF9DT1JCQV9TdHJpbmdfdmFyJiBzKSB7CiAg ICBpZiAocGRfcmVsKSB7CiAgICAgIG9tbmk6OmZyZWVTdHJpbmcocGRfZGF0YSk7CiAgICAgIGlm KCAoY29uc3QgY2hhciopcyApCiAgICAgICAgcGRfZGF0YSA9IF9DT1JCQV9TdHJpbmdfdmFyOjpz dHJpbmdfZHVwKChjb25zdCBjaGFyKilzKTsKICAgICAgZWxzZQogICAgICAgIHBkX2RhdGEgPSAw OwogICAgfSBlbHNlCiAgICAgIHBkX2RhdGEgPSAoY2hhciopKGNvbnN0IGNoYXIqKXM7CiAgICBy ZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBvcGVyYXRv cj0oY29uc3QgX0NPUkJBX1N0cmluZ19tZW1iZXImIHMpIHsKICAgIGlmIChwZF9yZWwpIHsKICAg ICAgb21uaTo6ZnJlZVN0cmluZyhwZF9kYXRhKTsKICAgICAgaWYoIChjb25zdCBjaGFyKilzICYm IChjb25zdCBjaGFyKikgcyAhPSBvbW5pOjplbXB0eV9zdHJpbmcpCiAgICAgICAgcGRfZGF0YSA9 IF9DT1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKChjb25zdCBjaGFyKilzKTsKICAgICAgZWxz ZQogICAgICAgIHBkX2RhdGEgPSAoY2hhciopKGNvbnN0IGNoYXIqKXM7CiAgICB9IGVsc2UKICAg ICAgcGRfZGF0YSA9IChjaGFyKikoY29uc3QgY2hhciopczsKICAgIHJldHVybiAqdGhpczsKICB9 CgogIGlubGluZSBjaGFyJiBvcGVyYXRvcltdIChfQ09SQkFfVUxvbmcgaW5kZXgpIHsKICAgIGlm ICghKChjaGFyKilwZF9kYXRhKSB8fCAoX0NPUkJBX1VMb25nKXN0cmxlbihwZF9kYXRhKSA8IGlu ZGV4KSB7CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwogICAgfQogICAgcmV0dXJu IHBkX2RhdGFbaW5kZXhdOwogIH0KCiAgaW5saW5lIGNoYXIgb3BlcmF0b3JbXSAoX0NPUkJBX1VM b25nIGluZGV4KSBjb25zdCB7CiAgICBpZiAoISgoY2hhciopcGRfZGF0YSkgfHwgKF9DT1JCQV9V TG9uZylzdHJsZW4ocGRfZGF0YSkgPCBpbmRleCkgewogICAgICBfQ09SQkFfYm91bmRfY2hlY2tf ZXJyb3IoKTsKICAgIH0KICAgIHJldHVybiBwZF9kYXRhW2luZGV4XTsKICB9CgoKICBpbmxpbmUg b3BlcmF0b3IgY2hhciogKCkgeyByZXR1cm4gcGRfZGF0YTsgfQogIGlubGluZSBvcGVyYXRvciBj b25zdCBjaGFyKiAoKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CgoKCgogIGlubGluZSBjb25z dCBjaGFyKiBpbigpIGNvbnN0IHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxpbmUgY2hhciomIGlu b3V0KCkgeyByZXR1cm4gcGRfZGF0YTsgfQogIGlubGluZSBjaGFyKiYgb3V0KCkgewogICAgaWYg KHBkX3JlbCkgewogICAgICBvbW5pOjpmcmVlU3RyaW5nKHBkX2RhdGEpOwogICAgICBwZF9kYXRh ID0gMDsKICAgIH0KICAgIGVsc2UgewogICAgICBwZF9kYXRhID0gMDsKICAgIH0KICAgIHJldHVy biBwZF9kYXRhOwogIH0KICBpbmxpbmUgY2hhciogX3JldG4oKSB7CiAgICBjaGFyICp0bXA7CiAg ICBpZiAocGRfcmVsKSB7CiAgICAgIHRtcCA9IHBkX2RhdGE7CiAgICAgIHBkX2RhdGEgPSAwOwog ICAgfQogICAgZWxzZSB7CiAgICAgIHRtcCA9ICgoKGNoYXIqKXBkX2RhdGEpID8gX0NPUkJBX1N0 cmluZ192YXI6OnN0cmluZ19kdXAocGRfZGF0YSkgOiAwKTsKICAgICAgcGRfZGF0YSA9IDA7CiAg ICB9CiAgICByZXR1cm4gdG1wOwogIH0KCgogIGlubGluZSBjaGFyKiYgX05QX3JlZigpIGNvbnN0 IHtyZXR1cm4gcGRfZGF0YTt9CiAgaW5saW5lIF9DT1JCQV9Cb29sZWFuIF9OUF9yZWxlYXNlKCkg Y29uc3Qge3JldHVybiBwZF9yZWw7fQoKICBfQ09SQkFfQm9vbGVhbiBwZF9yZWw7CiAgY2hhciom IHBkX2RhdGE7Cn07CiMgNDI2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvc3RyaW5ndHlw ZXMuaCIgMwppbmxpbmUgX0NPUkJBX1N0cmluZ192YXI6Ol9DT1JCQV9TdHJpbmdfdmFyKGNvbnN0 IF9DT1JCQV9TdHJpbmdfbWVtYmVyJiBzKQp7CiAgaWYgKChjb25zdCBjaGFyKilzKSB7CiAgICBf ZGF0YSA9IF9DT1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKHMpOwogIH0KICBlbHNlCiAgICBf ZGF0YSA9IDA7Cn0KCmlubGluZSBfQ09SQkFfU3RyaW5nX3Zhcjo6X0NPUkJBX1N0cmluZ192YXIo Y29uc3QgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBzKQp7CiAgaWYgKChjb25zdCBjaGFyKilzKSB7 CiAgICBfZGF0YSA9IF9DT1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKHMpOwogIH0KICBlbHNl CiAgICBfZGF0YSA9IDA7Cn0KCmlubGluZSBfQ09SQkFfU3RyaW5nX3ZhciYKX0NPUkJBX1N0cmlu Z192YXI6Om9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX1N0cmluZ19tZW1iZXImIHMpCnsKICBvbW5p OjpmcmVlU3RyaW5nKF9kYXRhKTsKICBpZiAoKGNvbnN0IGNoYXIqKXMpCiAgICBfZGF0YSA9IF9D T1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKHMpOwogIGVsc2UKICAgIF9kYXRhID0gMDsKICBy ZXR1cm4gKnRoaXM7Cn0KCmlubGluZSBfQ09SQkFfU3RyaW5nX3ZhciYKX0NPUkJBX1N0cmluZ192 YXI6Om9wZXJhdG9yPSAoY29uc3QgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBzKQp7CiAgb21uaTo6 ZnJlZVN0cmluZyhfZGF0YSk7CiAgaWYgKChjb25zdCBjaGFyKilzKQogICAgX2RhdGEgPSBfQ09S QkFfU3RyaW5nX3Zhcjo6c3RyaW5nX2R1cChzKTsKICBlbHNlCiAgICBfZGF0YSA9IDA7CiAgcmV0 dXJuICp0aGlzOwp9CgppbmxpbmUgX0NPUkJBX1N0cmluZ19tZW1iZXImCl9DT1JCQV9TdHJpbmdf bWVtYmVyOjpvcGVyYXRvcj0oY29uc3QgX0NPUkJBX1N0cmluZ19lbGVtZW50JiBzKSB7CiAgb21u aTo6ZnJlZVN0cmluZyhfcHRyKTsKICBpZiggKGNvbnN0IGNoYXIqKXMgKQogICAgX3B0ciA9IF9D T1JCQV9TdHJpbmdfdmFyOjpzdHJpbmdfZHVwKChjb25zdCBjaGFyKilzKTsKICBlbHNlCiAgICBf cHRyID0gMDsKICByZXR1cm4gKnRoaXM7Cn0KCgoKCgoKY2xhc3MgX0NPUkJBX1N0cmluZ19pbm91 dCB7CnB1YmxpYzoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19pbm91dChjaGFyKiYgcCkgOiBfZGF0 YShwKSB7fQogIGlubGluZSBfQ09SQkFfU3RyaW5nX2lub3V0KF9DT1JCQV9TdHJpbmdfdmFyJiBw KSA6IF9kYXRhKHAuX2RhdGEpIHt9CiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfaW5vdXQoX0NPUkJB X1N0cmluZ19tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7fQogIGlubGluZSBfQ09SQkFfU3Ry aW5nX2lub3V0KF9DT1JCQV9TdHJpbmdfZWxlbWVudCYgcCkgOiBfZGF0YShwLl9OUF9yZWYoKSkg ewoKCgoKCgogICAgaWYgKCFwLl9OUF9yZWxlYXNlKCkgJiYgKHAuX05QX3JlZigpKSkgewogICAg ICBwLl9OUF9yZWYoKSA9ICgocC5fTlBfcmVmKCkpID8KICAgICAgICAgICAgICAgICAgICAgX0NP UkJBX1N0cmluZ192YXI6OnN0cmluZ19kdXAocC5fTlBfcmVmKCkpIDogMCk7CiAgICB9CiAgfQog IGlubGluZSB+X0NPUkJBX1N0cmluZ19pbm91dCgpIHt9CgogIGlubGluZSBvcGVyYXRvciBjaGFy KiYoKSB7IHJldHVybiBfZGF0YTsgfQoKICBjaGFyKiYgX2RhdGE7Cgpwcml2YXRlOgogIF9DT1JC QV9TdHJpbmdfaW5vdXQoKTsKfTsKCgoKCgpjbGFzcyBfQ09SQkFfU3RyaW5nX291dCB7CnB1Ymxp YzoKICBpbmxpbmUgX0NPUkJBX1N0cmluZ19vdXQoY2hhciomIHApIDogX2RhdGEocCkgeyBfZGF0 YSA9IDA7IH0KICBpbmxpbmUgX0NPUkJBX1N0cmluZ19vdXQoX0NPUkJBX1N0cmluZ192YXImIHAp IDogX2RhdGEocC5fZGF0YSkgeyBwID0gKGNoYXIqKTA7IH0KICBpbmxpbmUgX0NPUkJBX1N0cmlu Z19vdXQoX0NPUkJBX1N0cmluZ19tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7IHAgPSAoY2hh ciopMDsgfQogIGlubGluZSBfQ09SQkFfU3RyaW5nX291dChfQ09SQkFfU3RyaW5nX2VsZW1lbnQm IHApIDogX2RhdGEocC5fTlBfcmVmKCkpIHsgcCA9IChjaGFyKikwOyB9CiAgaW5saW5lIH5fQ09S QkFfU3RyaW5nX291dCgpIHt9CiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfb3V0KGNvbnN0IF9DT1JC QV9TdHJpbmdfb3V0JiBwKSA6IF9kYXRhKHAuX2RhdGEpIHt9CiAgaW5saW5lIF9DT1JCQV9TdHJp bmdfb3V0JiBvcGVyYXRvcj0oY29uc3QgX0NPUkJBX1N0cmluZ19vdXQmIHApIHsKICAgIF9kYXRh ID0gcC5fZGF0YTsgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgX0NPUkJBX1N0cmluZ19vdXQm IG9wZXJhdG9yPShjaGFyKiBwKSB7CiAgICBfZGF0YSA9IHA7IHJldHVybiAqdGhpczsKICB9CiAg aW5saW5lIF9DT1JCQV9TdHJpbmdfb3V0JiBvcGVyYXRvcj0oY29uc3QgY2hhciogcCkgewogICAg X2RhdGEgPSAoKHApID8gX0NPUkJBX1N0cmluZ192YXI6OnN0cmluZ19kdXAocCkgOiAwKTsgcmV0 dXJuICp0aGlzOwogIH0KCiAgb3BlcmF0b3IgY2hhciomICgpIHsgcmV0dXJuIF9kYXRhOyB9CiAg Y2hhciomIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CgogIGNoYXIqJiBfZGF0YTsKCnByaXZhdGU6 CiAgX0NPUkJBX1N0cmluZ19vdXQoKTsKICBfQ09SQkFfU3RyaW5nX291dCYgb3BlcmF0b3I9KGNv bnN0IF9DT1JCQV9TdHJpbmdfdmFyJiApOwogIF9DT1JCQV9TdHJpbmdfb3V0JiBvcGVyYXRvcj0o Y29uc3QgX0NPUkJBX1N0cmluZ19tZW1iZXImICk7CiAgX0NPUkJBX1N0cmluZ19vdXQmIG9wZXJh dG9yPShjb25zdCBfQ09SQkFfU3RyaW5nX2VsZW1lbnQmICk7Cn07CgoKCgoKY2xhc3MgX0NPUkJB X1NlcXVlbmNlX19TdHJpbmcKewpwdWJsaWM6CiAgdHlwZWRlZiBfQ09SQkFfU3RyaW5nX2VsZW1l bnQgRWxlbVQ7CiAgdHlwZWRlZiBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyBTZXFUOwoKICBpbmxp bmUgX0NPUkJBX1VMb25nIG1heGltdW0oKSBjb25zdCB7IHJldHVybiBwZF9tYXg7IH0KICBpbmxp bmUgX0NPUkJBX1VMb25nIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHBkX2xlbjsgfQogIGlubGlu ZSB2b2lkIGxlbmd0aChfQ09SQkFfVUxvbmcgbGVuKSB7CiAgICBpZiAocGRfYm91bmRlZCAmJiBs ZW4gPiBwZF9tYXgpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7CgogICAgfQoK CiAgICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gbGVuOyBpIDwgcGRfbGVuOyBpKysgKQogICAgICBv cGVyYXRvcltdKGkpID0gKGNoYXIqKSBvbW5pOjplbXB0eV9zdHJpbmc7CgogICAgaWYgKGxlbikg ewoKCiAgICAgIGlmICghcGRfZGF0YSB8fCBsZW4gPiBwZF9tYXgpIHsKICAgICAgICBjb3B5YnVm ZmVyKCgobGVuID4gcGRfbWF4KSA/IGxlbiA6IHBkX21heCkpOwogICAgICB9CiAgICB9CiAgICBw ZF9sZW4gPSBsZW47CiAgfQoKICBpbmxpbmUgRWxlbVQgb3BlcmF0b3JbXSAoX0NPUkJBX1VMb25n IGkpIHsKICAgIGlmKCBpID49IHBkX2xlbiApIF9DT1JCQV9ib3VuZF9jaGVja19lcnJvcigpOwog ICAgcmV0dXJuIEVsZW1UKHBkX2RhdGFbaV0scGRfcmVsKTsKICB9CiAgaW5saW5lIGNvbnN0IEVs ZW1UIG9wZXJhdG9yW10gKF9DT1JCQV9VTG9uZyBpKSBjb25zdCB7CiAgICBpZiggaSA+PSBwZF9s ZW4gKSBfQ09SQkFfYm91bmRfY2hlY2tfZXJyb3IoKTsKICAgIHJldHVybiBFbGVtVChwZF9kYXRh W2ldLHBkX3JlbCk7CiAgfQoKICBzdGF0aWMgaW5saW5lIGNoYXIqKiBhbGxvY2J1ZihfQ09SQkFf VUxvbmcgbmVsZW1zKSB7CiAgICBpZiAoIW5lbGVtcykgcmV0dXJuIDA7CiAgICBjaGFyKiogYiA9 IG5ldyBjaGFyKltuZWxlbXMrMl07CiAgICBvbW5pOjpwdHJfYXJpdGhfdCBsID0gbmVsZW1zOwog ICAgYlswXSA9IChjaGFyKikgKChvbW5pOjpwdHJfYXJpdGhfdCkgMHg1MzUxNTM1NFUpOwogICAg YlsxXSA9IChjaGFyKikgbDsKICAgIGZvciAoX0NPUkJBX1VMb25nIGluZGV4ID0gMjsgaW5kZXgg PCAobmVsZW1zKzIpOyBpbmRleCsrKQogICAgICBiW2luZGV4XSA9IChjaGFyKilvbW5pOjplbXB0 eV9zdHJpbmc7CiAgICByZXR1cm4gYisyOwogIH0KCiAgc3RhdGljIGlubGluZSB2b2lkIGZyZWVi dWYoY2hhcioqIGJ1ZikgewogICAgaWYgKCFidWYpIHJldHVybjsKICAgIGNoYXIqKiBiID0gYnVm LTI7CiAgICBpZiAoKG9tbmk6OnB0cl9hcml0aF90KWJbMF0gIT0gKChvbW5pOjpwdHJfYXJpdGhf dCkgMHg1MzUxNTM1NFUpKSB7CiAgICAgIF9DT1JCQV9iYWRfcGFyYW1fZnJlZWJ1ZigpOwogICAg ICByZXR1cm47CiAgICB9CiAgICBvbW5pOjpwdHJfYXJpdGhfdCBsID0gKG9tbmk6OnB0cl9hcml0 aF90KSBiWzFdOwogICAgZm9yIChfQ09SQkFfVUxvbmcgaSA9IDA7IGkgPCAoX0NPUkJBX1VMb25n KSBsOyBpKyspIHsKICAgICAgb21uaTo6ZnJlZVN0cmluZyhidWZbaV0pOwogICAgfQogICAgYlsw XSA9IChjaGFyKikgMDsKICAgIGRlbGV0ZSBbXSBiOwogIH0KCgoKICBpbmxpbmUgX0NPUkJBX0Jv b2xlYW4gcmVsZWFzZSgpIGNvbnN0IHsgcmV0dXJuIHBkX3JlbDsgfQoKICBpbmxpbmUgY2hhcioq IGdldF9idWZmZXIoX0NPUkJBX0Jvb2xlYW4gb3JwaGFuID0gMCkgewogICAgaWYgKHBkX21heCAm JiAhcGRfZGF0YSkgewogICAgICBjb3B5YnVmZmVyKHBkX21heCk7CiAgICB9CiAgICBpZiAoIW9y cGhhbikgewogICAgICByZXR1cm4gcGRfZGF0YTsKICAgIH0KICAgIGVsc2UgewogICAgICBpZiAo IXBkX3JlbCkKICAgICAgICByZXR1cm4gMDsKICAgICAgZWxzZSB7CiAgICAgICAgY2hhcioqIHRt cCA9IHBkX2RhdGE7CiAgICAgICAgcGRfZGF0YSA9IDA7CiAgICAgICAgaWYgKCFwZF9ib3VuZGVk KSB7CiAgICAgICAgICBwZF9tYXggPSAwOwogICAgICAgIH0KICAgICAgICBwZF9sZW4gPSAwOwog ICAgICAgIHBkX3JlbCA9IDE7CiAgICAgICAgcmV0dXJuIHRtcDsKICAgICAgfQogICAgfQogIH0K CiAgaW5saW5lIGNvbnN0IGNoYXIqIGNvbnN0KiBnZXRfYnVmZmVyKCkgY29uc3QgewogICAgaWYg KHBkX21heCAmJiAhcGRfZGF0YSkgewoKICAgICAgX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcqIHMg PSBjb25zdF9jYXN0PF9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nKj4odGhpcyk7CgoKCiAgICAgIHMt PmNvcHlidWZmZXIocGRfbWF4KTsKICAgIH0KCiAgICByZXR1cm4gcGRfZGF0YTsKCgoKICB9CgoK ICBpbmxpbmUgfl9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nKCkgewogICAgaWYgKHBkX3JlbCAmJiBw ZF9kYXRhKSBmcmVlYnVmKHBkX2RhdGEpOwogICAgcGRfZGF0YSA9IDA7CiAgfQoKCiAgc2l6ZV90 IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgdm9pZCBvcGVy YXRvciA+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yIDw8 PSAoTmV0QnVmZmVyZWRTdHJlYW0mIHMpOwogIHZvaWQgb3BlcmF0b3IgPj49IChNZW1CdWZmZXJl ZFN0cmVhbSYgcykgY29uc3Q7CiAgdm9pZCBvcGVyYXRvciA8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFt JiBzKTsKCnByb3RlY3RlZDoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcoKQogICAg OiBwZF9tYXgoMCksIHBkX2xlbigwKSwgcGRfcmVsKDEpLCBwZF9ib3VuZGVkKDApLCBwZF9kYXRh KDApIHt9CgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyhfQ09SQkFfVUxvbmcgbWF4 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiBib3VuZGVk PTApCiAgICA6IHBkX21heChtYXgpLCBwZF9sZW4oMCksIHBkX3JlbCgxKSwgcGRfYm91bmRlZChi b3VuZGVkKSwgcGRfZGF0YSgwKSB7CiAgfQoKICBpbmxpbmUgX0NPUkJBX1NlcXVlbmNlX19TdHJp bmcoX0NPUkJBX1VMb25nIG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NP UkJBX1VMb25nIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIHZh bHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09SQkFfQm9vbGVhbiByZWxl YXNlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPUkJBX0Jvb2xlYW4g Ym91bmRlZCA9IDApCiAgICAgOiBwZF9tYXgobWF4KSwgcGRfbGVuKGxlbiksIHBkX3JlbChyZWxl YXNlKSwKICAgICAgIHBkX2JvdW5kZWQoYm91bmRlZCksIHBkX2RhdGEodmFsdWUpIHsKICAgIGlm IChsZW4gPiBtYXggfHwgKGxlbiAmJiAhdmFsdWUpKSB7CiAgICAgIF9DT1JCQV9ib3VuZF9jaGVj a19lcnJvcigpOwoKICAgIH0KICB9CgogIGlubGluZSBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyhj b25zdCBTZXFUJiBzKQogICAgOiBwZF9tYXgocy5wZF9tYXgpLCBwZF9sZW4oMCksIHBkX3JlbCgx KSwKICAgICAgcGRfYm91bmRlZChzLnBkX2JvdW5kZWQpLCBwZF9kYXRhKDApIHsKICAgIGxlbmd0 aChzLnBkX2xlbik7CiAgICBmb3IoIF9DT1JCQV9VTG9uZyBpID0gMDsgaSA8IHBkX2xlbjsgaSsr ICkKICAgICAgb3BlcmF0b3JbXShpKSA9IHNbaV07CiAgfQoKICBpbmxpbmUgU2VxVCYgb3BlcmF0 b3IgPSAoY29uc3QgU2VxVCYgcykgewogICAgbGVuZ3RoKHMucGRfbGVuKTsKICAgIGZvciggX0NP UkJBX1VMb25nIGkgPSAwOyBpIDwgcGRfbGVuOyBpKysgKQogICAgICBvcGVyYXRvcltdKGkpID0g c1tpXTsKICAgIHJldHVybiAqdGhpczsKICB9CgoKICBpbmxpbmUgdm9pZCByZXBsYWNlKF9DT1JC QV9VTG9uZyBtYXgsIF9DT1JCQV9VTG9uZyBsZW4sIGNoYXIqKiBkYXRhLAogICAgICAgICAgICAg ICAgICAgICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApIHsKICAgIGlmIChsZW4gPiBtYXgg fHwgKGxlbiAmJiAhZGF0YSkpIHsKICAgICAgX0NPUkJBX2JvdW5kX2NoZWNrX2Vycm9yKCk7Cgog ICAgfQogICAgaWYgKHBkX3JlbCAmJiBwZF9kYXRhKSB7CiAgICAgIGZyZWVidWYocGRfZGF0YSk7 CiAgICB9CiAgICBwZF9tYXggPSBtYXg7CiAgICBwZF9sZW4gPSBsZW47CiAgICBwZF9kYXRhID0g ZGF0YTsKICAgIHBkX3JlbCA9IHJlbGVhc2U7CiAgfQoKCnByaXZhdGU6CgogIHZvaWQgY29weWJ1 ZmZlcihfQ09SQkFfVUxvbmcgbmV3bWF4KSB7CgoKCiAgICBjaGFyKiogbmV3ZGF0YSA9IGFsbG9j YnVmKG5ld21heCk7CiAgICBpZiAoIW5ld2RhdGEpIHsKICAgICAgX0NPUkJBX25ld19vcGVyYXRv cl9yZXR1cm5fbnVsbCgpOwoKICAgIH0KICAgIGZvciAodW5zaWduZWQgbG9uZyBpPTA7IGkgPCBw ZF9sZW47IGkrKykgewogICAgICBpZiAocGRfcmVsKSB7CiAgICAgICAgbmV3ZGF0YVtpXSA9IHBk X2RhdGFbaV07CiAgICAgICAgcGRfZGF0YVtpXSA9IDA7CiAgICAgIH0KICAgICAgZWxzZSB7CiAg ICAgICAgbmV3ZGF0YVtpXSA9ICgocGRfZGF0YVtpXSkgPwogICAgICAgICAgICAgICAgICAgICAg X0NPUkJBX1N0cmluZ192YXI6OnN0cmluZ19kdXAocGRfZGF0YVtpXSkgOiAwKTsKICAgICAgfQog ICAgfQogICAgaWYgKHBkX3JlbCkgewogICAgICBpZiAocGRfZGF0YSkgZnJlZWJ1ZihwZF9kYXRh KTsKICAgIH0KICAgIGVsc2UgewogICAgICBwZF9yZWwgPSAxOwogICAgfQogICAgcGRfZGF0YSA9 IG5ld2RhdGE7CiAgICBwZF9tYXggPSBuZXdtYXg7CiAgfQoKICBfQ09SQkFfVUxvbmcgcGRfbWF4 OwogIF9DT1JCQV9VTG9uZyBwZF9sZW47CiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVsOwogIF9DT1JC QV9Cb29sZWFuIHBkX2JvdW5kZWQ7CiAgY2hhcioqIHBkX2RhdGE7Cn07CgoKCgoKdGVtcGxhdGU8 aW50IG1heD4KY2xhc3MgX0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX1N0cmluZwogIDogcHVibGlj IF9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nCnsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX0JvdW5k ZWRfU2VxdWVuY2VfX1N0cmluZzxtYXg+IFNlcVQ7CgogIGlubGluZSBfQ09SQkFfQm91bmRlZF9T ZXF1ZW5jZV9fU3RyaW5nKCkKICAgIDogX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcobWF4LDEpIHt9 CgogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nKF9DT1JCQV9VTG9uZyBs ZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIHZh bHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29s ZWFuIHJlbGVhc2UgPSAwKQogICAgOiBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZyhtYXgsIGxlbmd0 aCwgdmFsdWUsIHJlbGVhc2UsIDEpIHt9CgogIGlubGluZSBfQ09SQkFfQm91bmRlZF9TZXF1ZW5j ZV9fU3RyaW5nKGNvbnN0IFNlcVQmIHMpCiAgICA6IF9DT1JCQV9TZXF1ZW5jZV9fU3RyaW5nKHMp IHt9CgogIGlubGluZSB+X0NPUkJBX0JvdW5kZWRfU2VxdWVuY2VfX1N0cmluZygpIHt9CgogIGlu bGluZSBTZXFUJiBvcGVyYXRvciA9IChjb25zdCBTZXFUJiBzKSB7CiAgICBfQ09SQkFfU2VxdWVu Y2VfX1N0cmluZzo6b3BlcmF0b3IgPSAocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKCiAgaW5s aW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbGVuLCBjaGFyKiogZGF0YSwKICAgICAgICAg ICAgICAgICAgICAgIF9DT1JCQV9Cb29sZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBfQ09SQkFfU2Vx dWVuY2VfX1N0cmluZzo6cmVwbGFjZShtYXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQp9OwoKCgoK CmNsYXNzIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZwogIDogcHVibGljIF9DT1JC QV9TZXF1ZW5jZV9fU3RyaW5nCnsKcHVibGljOgogIHR5cGVkZWYgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9fU3RyaW5nIFNlcVQ7CgogIGlubGluZSBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X19TdHJpbmcoKSB7fQoKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5n KF9DT1JCQV9VTG9uZyBtYXgpIDoKICAgICAgICAgX0NPUkJBX1NlcXVlbmNlX19TdHJpbmcobWF4 KSB7fQoKICBpbmxpbmUgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nKF9DT1JCQV9V TG9uZyBtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ09S QkFfVUxvbmcgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY2hhcioqIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX0NPUkJBX0Jvb2xlYW4gcmVsZWFzZSA9IDApCiAgICA6IF9DT1JCQV9TZXF1ZW5jZV9fU3Ry aW5nKG1heCwgbGVuZ3RoLCB2YWx1ZSwgcmVsZWFzZSkge30KCiAgaW5saW5lIF9DT1JCQV9VbmJv dW5kZWRfU2VxdWVuY2VfX1N0cmluZyhjb25zdCBTZXFUJiBzKQogICAgOiBfQ09SQkFfU2VxdWVu Y2VfX1N0cmluZyhzKSB7fQoKICBpbmxpbmUgfl9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0 cmluZygpIHt9CgogIGlubGluZSBTZXFUJiBvcGVyYXRvciA9IChjb25zdCBTZXFUJiBzKSB7CiAg ICBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZzo6b3BlcmF0b3IgPSAocyk7CiAgICByZXR1cm4gKnRo aXM7CiAgfQoKCiAgaW5saW5lIHZvaWQgcmVwbGFjZShfQ09SQkFfVUxvbmcgbWF4LCBfQ09SQkFf VUxvbmcgbGVuLCBjaGFyKiogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIF9DT1JCQV9Cb29s ZWFuIHJlbGVhc2UgPSAwKSB7CiAgICBfQ09SQkFfU2VxdWVuY2VfX1N0cmluZzo6cmVwbGFjZSht YXgsbGVuLGRhdGEscmVsZWFzZSk7CiAgfQoKfTsKIyAyNTggIi91c3IvbG9jYWwvaW5jbHVkZS9v bW5pT1JCMy9DT1JCQS5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvdXNl cmV4Y2VwdGlvbi5oIiAxIDMKIyAyNTkgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9DT1JC QS5oIiAyIDMKCgoKY2xhc3Mgb21uaU9yYkJvYVNlcnZhbnQ7CgoKbmFtZXNwYWNlIENPUkJBCgp7 CgoKCiAgdHlwZWRlZiB2b2lkKiBTdGF0dXM7CgoKCgoKCgogIHR5cGVkZWYgX0NPUkJBX0Jvb2xl YW4gQm9vbGVhbjsKICB0eXBlZGVmIF9DT1JCQV9DaGFyIENoYXI7CiAgdHlwZWRlZiBfQ09SQkFf T2N0ZXQgT2N0ZXQ7CiAgdHlwZWRlZiBfQ09SQkFfU2hvcnQgU2hvcnQ7CiAgdHlwZWRlZiBfQ09S QkFfVVNob3J0IFVTaG9ydDsKICB0eXBlZGVmIF9DT1JCQV9Mb25nIExvbmc7CiAgdHlwZWRlZiBf Q09SQkFfVUxvbmcgVUxvbmc7CgogIHR5cGVkZWYgX0NPUkJBX0xvbmdMb25nIExvbmdMb25nOwog IHR5cGVkZWYgX0NPUkJBX1VMb25nTG9uZyBVTG9uZ0xvbmc7CgoKICB0eXBlZGVmIF9DT1JCQV9G bG9hdCBGbG9hdDsKICB0eXBlZGVmIF9DT1JCQV9Eb3VibGUgRG91YmxlOwoKCgoKCiAgdHlwZWRl ZiBfQ09SQkFfQm9vbGVhbiYgQm9vbGVhbl9vdXQ7CiAgdHlwZWRlZiBfQ09SQkFfQ2hhciYgQ2hh cl9vdXQ7CiAgdHlwZWRlZiBfQ09SQkFfT2N0ZXQmIE9jdGV0X291dDsKICB0eXBlZGVmIF9DT1JC QV9TaG9ydCYgU2hvcnRfb3V0OwogIHR5cGVkZWYgX0NPUkJBX1VTaG9ydCYgVVNob3J0X291dDsK ICB0eXBlZGVmIF9DT1JCQV9Mb25nJiBMb25nX291dDsKICB0eXBlZGVmIF9DT1JCQV9VTG9uZyYg VUxvbmdfb3V0OwoKICB0eXBlZGVmIF9DT1JCQV9GbG9hdCYgRmxvYXRfb3V0OwogIHR5cGVkZWYg X0NPUkJBX0RvdWJsZSYgRG91YmxlX291dDsKCgoKCgoKCiAgICAgICAgICAgICAgICAgICBjaGFy KiBzdHJpbmdfYWxsb2MoVUxvbmcgbGVuKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgc3RyaW5n X2ZyZWUoY2hhciopOwogICAgICAgICAgICAgICAgICAgY2hhciogc3RyaW5nX2R1cChjb25zdCBj aGFyKik7CgogIHR5cGVkZWYgX0NPUkJBX1N0cmluZ192YXIgU3RyaW5nX3ZhcjsKICB0eXBlZGVm IF9DT1JCQV9TdHJpbmdfbWVtYmVyIFN0cmluZ19tZW1iZXI7CiAgdHlwZWRlZiBfQ09SQkFfU3Ry aW5nX2lub3V0IFN0cmluZ19JTk9VVF9hcmc7CiAgdHlwZWRlZiBfQ09SQkFfU3RyaW5nX291dCBT dHJpbmdfT1VUX2FyZzsKICB0eXBlZGVmIFN0cmluZ19PVVRfYXJnIFN0cmluZ19vdXQ7CgoKCgoK CiAgY2xhc3MgT2JqZWN0OwogIGNsYXNzIE9iamVjdF92YXI7CiAgdHlwZWRlZiBPYmplY3QqIE9i amVjdF9wdHI7CiAgdHlwZWRlZiBPYmplY3RfcHRyIE9iamVjdFJlZjsKCiAgY2xhc3MgVHlwZUNv ZGU7CiAgdHlwZWRlZiBjbGFzcyBUeXBlQ29kZSogVHlwZUNvZGVfcHRyOwogIHR5cGVkZWYgVHlw ZUNvZGVfcHRyIFR5cGVDb2RlUmVmOwoKCiAgY2xhc3MgQW55IHsKICBwdWJsaWM6CiAgICBBbnko KTsKCiAgICB+QW55KCk7CgogICAgQW55KGNvbnN0IEFueSYgYSk7CgogICAgQW55KFR5cGVDb2Rl X3B0ciB0Yywgdm9pZCogdmFsdWUsIEJvb2xlYW4gcmVsZWFzZSA9IDApOwoKCiAgICB2b2lkIG9w ZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9y PDw9IChOZXRCdWZmZXJlZFN0cmVhbSYgcyk7CgogICAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVm ZmVyZWRTdHJlYW0mIHMpIGNvbnN0OwogICAgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRT dHJlYW0mIHMpOwoKICAgIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZz ZXQpIGNvbnN0OwoKICAgIHZvaWQqIE5QX3BkKCkgeyByZXR1cm4gcGRfcHRyOyB9CiAgICB2b2lk KiBOUF9wZCgpIGNvbnN0IHsgcmV0dXJuIHBkX3B0cjsgfQoKCiAgICB2b2lkIE5QX21hcnNoYWxE YXRhT25seShOZXRCdWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgICB2b2lkIE5QX3VubWFyc2hh bERhdGFPbmx5KE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKTsKCiAgICB2b2lkIE5QX21hcnNoYWxEYXRh T25seShNZW1CdWZmZXJlZFN0cmVhbSYgcykgY29uc3Q7CiAgICB2b2lkIE5QX3VubWFyc2hhbERh dGFPbmx5KE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKTsKCiAgICBzaXplX3QgTlBfYWxpZ25lZERhdGFP bmx5U2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CgoKICAgIHZvaWQgUFJfcGFja0Zy b20oVHlwZUNvZGVfcHRyIG5ld3RjLCB2b2lkKiB0Y2Rlc2MpOwogICAgQm9vbGVhbiBQUl91bnBh Y2tUbyhUeXBlQ29kZV9wdHIgdGMsIHZvaWQqIHRjZGVzYykgY29uc3Q7CgogICAgdm9pZCAqUFJf Z2V0Q2FjaGVkRGF0YSgpIGNvbnN0OwogICAgdm9pZCBQUl9zZXRDYWNoZWREYXRhKHZvaWQgKmRh dGEsIHZvaWQoKmRlc3RydWN0b3IpKHZvaWQgKikpOwoKCiAgICBBbnkmIG9wZXJhdG9yPShjb25z dCBBbnkmIGEpOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oU2hvcnQgcyk7CgogICAgdm9pZCBvcGVy YXRvcjw8PShVU2hvcnQgdSk7CgogICAgdm9pZCBvcGVyYXRvcjw8PShMb25nIGwpOwoKICAgIHZv aWQgb3BlcmF0b3I8PD0oVUxvbmcgdSk7CgoKICAgIHZvaWQgb3BlcmF0b3I8PD0oRmxvYXQgZik7 CgogICAgdm9pZCBvcGVyYXRvcjw8PShEb3VibGUgZCk7CgoKICAgIHZvaWQgb3BlcmF0b3I8PD0o Y29uc3QgQW55JiBhKTsKCiAgICB2b2lkIG9wZXJhdG9yPDw9KEFueSogYSk7CgogICAgdm9pZCBv cGVyYXRvcjw8PShUeXBlQ29kZV9wdHIgdGMpOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oT2JqZWN0 X3B0ciBvYmopOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgY2hhciogcyk7CgogICAgc3Ry dWN0IGZyb21fYm9vbGVhbiB7CiAgICAgIGZyb21fYm9vbGVhbihCb29sZWFuIGIpIDogdmFsKGIp IHt9CiAgICAgIEJvb2xlYW4gdmFsOwogICAgfTsKCiAgICBzdHJ1Y3QgZnJvbV9vY3RldCB7CiAg ICAgIGZyb21fb2N0ZXQoT2N0ZXQgYikgOiB2YWwoYikge30KICAgICAgT2N0ZXQgdmFsOwogICAg fTsKCiAgICBzdHJ1Y3QgZnJvbV9jaGFyIHsKICAgICAgZnJvbV9jaGFyKENoYXIgYikgOiB2YWwo Yikge30KICAgICAgQ2hhciB2YWw7CiAgICB9OwoKICAgIHN0cnVjdCBmcm9tX3N0cmluZyB7CiAg ICAgIGZyb21fc3RyaW5nKGNvbnN0IGNoYXIqIHMsIFVMb25nIGIsIEJvb2xlYW4gbm9jb3B5ID0g MCkKICAgICAgICA6IHZhbCgoY2hhciopcyksIGJvdW5kKGIpLCBuYyhub2NvcHkpIHsgfQogICAg ICBmcm9tX3N0cmluZyhjaGFyKiBzLCBVTG9uZyBiLCBCb29sZWFuIG5vY29weSA9IDApCiAgICAg ICAgOiB2YWwocyksIGJvdW5kKGIpLCBuYyhub2NvcHkpIHsgfQoKICAgICAgY2hhciogdmFsOwog ICAgICBVTG9uZyBib3VuZDsKICAgICAgQm9vbGVhbiBuYzsKICAgIH07CgoKICAgIHZvaWQgb3Bl cmF0b3I8PD0oZnJvbV9ib29sZWFuIGYpOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oZnJvbV9jaGFy IGMpOwoKICAgIHZvaWQgb3BlcmF0b3I8PD0oZnJvbV9vY3RldCBvKTsKCiAgICB2b2lkIG9wZXJh dG9yPDw9KGZyb21fc3RyaW5nIHMpOwoKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KFNob3J0JiBz KSBjb25zdDsKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KFVTaG9ydCYgdSkgY29uc3Q7CgogICAg Qm9vbGVhbiBvcGVyYXRvcj4+PShMb25nJiBsKSBjb25zdDsKCiAgICBCb29sZWFuIG9wZXJhdG9y Pj49KFVMb25nJiB1KSBjb25zdDsKCgogICAgQm9vbGVhbiBvcGVyYXRvcj4+PShGbG9hdCYgZikg Y29uc3Q7CgogICAgQm9vbGVhbiBvcGVyYXRvcj4+PShEb3VibGUmIGQpIGNvbnN0OwoKCiAgICBC b29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IEFueSomIGEpIGNvbnN0OwogICAgQm9vbGVhbiBvcGVy YXRvcj4+PShBbnkqJiBhKSBjb25zdDsKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55JiBhKSBj b25zdDsKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KFR5cGVDb2RlX3B0ciYgdGMpIGNvbnN0OwoK ICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgY2hhciomIHMpIGNvbnN0OwoKICAgIEJvb2xl YW4gb3BlcmF0b3I+Pj0oY2hhciomIHMpIGNvbnN0OwoKCiAgICBzdHJ1Y3QgdG9fYm9vbGVhbiB7 CiAgICAgIHRvX2Jvb2xlYW4oQm9vbGVhbiYgYikgOiByZWYoYikge30KICAgICAgQm9vbGVhbiYg cmVmOwogICAgfTsKCiAgICBzdHJ1Y3QgdG9fY2hhciB7CiAgICAgIHRvX2NoYXIoQ2hhciYgYikg OiByZWYoYikge30KICAgICAgQ2hhciYgcmVmOwogICAgfTsKCiAgICBzdHJ1Y3QgdG9fb2N0ZXQg ewogICAgICB0b19vY3RldChPY3RldCYgYikgOiByZWYoYikge30KICAgICAgT2N0ZXQmIHJlZjsK ICAgIH07CgogICAgc3RydWN0IHRvX3N0cmluZyB7CiAgICAgIHRvX3N0cmluZyhjb25zdCBjaGFy KiYgcywgVUxvbmcgYikgOiB2YWwoKGNoYXIqJilzKSwgYm91bmQoYikgeyB9CiAgICAgIHRvX3N0 cmluZyhjaGFyKiYgcywgVUxvbmcgYikgOiB2YWwocyksIGJvdW5kKGIpIHsgfQoKICAgICAgY2hh ciomIHZhbDsKICAgICAgVUxvbmcgYm91bmQ7CiAgICB9OwoKICAgIHN0cnVjdCB0b19vYmplY3Qg ewogICAgICB0b19vYmplY3QoT2JqZWN0X3B0ciYgb2JqKSA6IHJlZihvYmopIHsgfQogICAgICBP YmplY3RfcHRyJiByZWY7CiAgICB9OwoKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0odG9fYm9vbGVh biBiKSBjb25zdDsKCiAgICBCb29sZWFuIG9wZXJhdG9yPj49KHRvX2NoYXIgYykgY29uc3Q7Cgog ICAgQm9vbGVhbiBvcGVyYXRvcj4+PSh0b19vY3RldCBvKSBjb25zdDsKCgogICAgQm9vbGVhbiBv cGVyYXRvcj4+PSh0b19zdHJpbmcgcykgY29uc3Q7CgoKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0o dG9fb2JqZWN0IG8pIGNvbnN0OwoKICAgIHZvaWQgcmVwbGFjZShUeXBlQ29kZV9wdHIgVENwLCB2 b2lkKiB2YWx1ZSwgQm9vbGVhbiByZWxlYXNlID0gMCk7CgogICAgVHlwZUNvZGVfcHRyIHR5cGUo KSBjb25zdDsKICAgIHZvaWQgdHlwZShUeXBlQ29kZV9wdHIpOwoKICAgIGNvbnN0IHZvaWQqIHZh bHVlKCkgY29uc3Q7CgogIHByaXZhdGU6CiAgICB2b2lkICpwZF9wdHI7CiAgfTsKCgogIGNsYXNz IEFueV9PVVRfYXJnOwoKCiAgY2xhc3MgQW55X3ZhciB7CiAgcHVibGljOgogICAgaW5saW5lIEFu eV92YXIoKSB7IHBkX2RhdGEgPSAwOyB9CiAgICBpbmxpbmUgQW55X3ZhcihBbnkqIHApIHsgcGRf ZGF0YSA9IHA7IH0KICAgIGlubGluZSBBbnlfdmFyKGNvbnN0IEFueV92YXImIHApIHsKICAgICAg aWYgKCFwLnBkX2RhdGEpIHsKICAgICAgICBwZF9kYXRhID0gMDsKICAgICAgICByZXR1cm47CiAg ICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcGRfZGF0YSA9IG5ldyBBbnk7CiAgICAgICAgaWYg KCFwZF9kYXRhKSB7CiAgICAgICAgICBfQ09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7 CgogICAgICAgIH0KICAgICAgICAqcGRfZGF0YSA9ICpwLnBkX2RhdGE7CiAgICAgIH0KICAgIH0K CiAgICBpbmxpbmUgfkFueV92YXIoKSB7IGlmIChwZF9kYXRhKSBkZWxldGUgcGRfZGF0YTsgfQog ICAgaW5saW5lIEFueV92YXImIG9wZXJhdG9yPSAoQW55KiBwKSB7CiAgICAgIGlmIChwZF9kYXRh KSBkZWxldGUgcGRfZGF0YTsKICAgICAgcGRfZGF0YSA9IHA7CiAgICAgIHJldHVybiAqdGhpczsK ICAgIH0KCiAgICBpbmxpbmUgQW55X3ZhciYgb3BlcmF0b3I9IChjb25zdCBBbnlfdmFyJiBwKSB7 CiAgICAgICAgaWYgKHAucGRfZGF0YSkgewogICAgICAgICAgaWYgKCFwZF9kYXRhKSB7CiAgICAg ICAgICAgIHBkX2RhdGEgPSBuZXcgQW55OwogICAgICAgICAgICBpZiAoIXBkX2RhdGEpIHsKICAg ICAgICAgICAgICBfQ09SQkFfbmV3X29wZXJhdG9yX3JldHVybl9udWxsKCk7CgogICAgICAgICAg ICB9CiAgICAgICAgICB9CiAgICAgICAgICAqcGRfZGF0YSA9ICpwLnBkX2RhdGE7CiAgICAgICAg fQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKHBkX2RhdGEpIGRlbGV0ZSBwZF9kYXRhOwog ICAgICAgICAgcGRfZGF0YSA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAqdGhpczsKICAg IH0KCiAgICBpbmxpbmUgQW55KiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gKEFueSopcGRf ZGF0YTsgfQoKCgoKICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBBbnkmICgpIGNvbnN0IHsgcmV0 dXJuICpwZF9kYXRhOyB9CiAgICBpbmxpbmUgb3BlcmF0b3IgQW55JiAoKSB7IHJldHVybiAqcGRf ZGF0YTsgfQoKCiAgICBpbmxpbmUgY29uc3QgQW55JiBpbigpIGNvbnN0IHsgcmV0dXJuICpwZF9k YXRhOyB9CiAgICBpbmxpbmUgQW55JiBpbm91dCgpIHsgcmV0dXJuICpwZF9kYXRhOyB9CiAgICBp bmxpbmUgQW55KiYgb3V0KCkgewogICAgICBpZiggcGRfZGF0YSApewogICAgICAgIGRlbGV0ZSBw ZF9kYXRhOwogICAgICAgIHBkX2RhdGEgPSAwOwogICAgICB9CiAgICAgIHJldHVybiBwZF9kYXRh OwogICAgfQogICAgaW5saW5lIEFueSogX3JldG4oKSB7CiAgICAgIEFueSogdG1wID0gcGRfZGF0 YTsKICAgICAgcGRfZGF0YSA9IDA7CiAgICAgIHJldHVybiB0bXA7CiAgICB9CgoKCiAgICBpbmxp bmUgdm9pZCBvcGVyYXRvcjw8PShTaG9ydCBzKSB7CiAgICAgICpwZF9kYXRhIDw8PSBzOwogICAg fQoKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KFVTaG9ydCB1KSB7CiAgICAgICpwZF9kYXRh IDw8PSB1OwogICAgfQoKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KExvbmcgbCkgewogICAg ICAqcGRfZGF0YSA8PD0gbDsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShVTG9u ZyB1KSB7CiAgICAgICpwZF9kYXRhIDw8PSB1OwogICAgfQoKCiAgICBpbmxpbmUgdm9pZCBvcGVy YXRvcjw8PShGbG9hdCBmKSB7CiAgICAgICpwZF9kYXRhIDw8PSBmOwogICAgfQoKICAgIGlubGlu ZSB2b2lkIG9wZXJhdG9yPDw9KERvdWJsZSBkKSB7CiAgICAgICpwZF9kYXRhIDw8PSBkOwogICAg fQoKCiAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShjb25zdCBBbnkmIGEpIHsKICAgICAgKnBk X2RhdGEgPDw9IGE7CiAgICB9CgogICAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oQW55KiBhKSB7 CiAgICAgICpwZF9kYXRhIDw8PSBhOwogICAgfQoKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9 KFR5cGVDb2RlX3B0ciB0YykgewogICAgICAqcGRfZGF0YSA8PD0gdGM7CiAgICB9CgogICAgaW5s aW5lIHZvaWQgb3BlcmF0b3I8PD0oT2JqZWN0X3B0ciBvYmopIHsKICAgICAgKnBkX2RhdGEgPDw9 IG9iajsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShjb25zdCBjaGFyKiBzKSB7 CiAgICAgICpwZF9kYXRhIDw8PSBzOwogICAgfQoKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9 KEFueTo6ZnJvbV9ib29sZWFuIGYpIHsKICAgICAgKnBkX2RhdGEgPDw9IGY7CiAgICB9CgogICAg aW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oQW55Ojpmcm9tX2NoYXIgYykgewogICAgICAqcGRfZGF0 YSA8PD0gYzsKICAgIH0KCgogICAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oQW55Ojpmcm9tX29j dGV0IG8pIHsKICAgICAgKnBkX2RhdGEgPDw9IG87CiAgICB9CgogICAgaW5saW5lIHZvaWQgb3Bl cmF0b3I8PD0oQW55Ojpmcm9tX3N0cmluZyBzKXsKICAgICAgKnBkX2RhdGEgPDw9IHM7CiAgICB9 CgoKCgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oU2hvcnQmIHMpIGNvbnN0IHsKICAg ICAgcmV0dXJuICgqcGRfZGF0YSA+Pj0gcyk7CiAgICB9CgogICAgaW5saW5lIEJvb2xlYW4gb3Bl cmF0b3I+Pj0oVVNob3J0JiB1KSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IHUp OwogICAgfQoKICAgIGlubGluZSBCb29sZWFuIG9wZXJhdG9yPj49KExvbmcmIGwpIGNvbnN0IHsK ICAgICAgcmV0dXJuICgqcGRfZGF0YSA+Pj0gbCk7CiAgICB9CgogICAgaW5saW5lIEJvb2xlYW4g b3BlcmF0b3I+Pj0oVUxvbmcmIHUpIGNvbnN0IHsKICAgICAgcmV0dXJuICgqcGRfZGF0YSA+Pj0g dSk7CiAgICB9CgoKICAgIGlubGluZSBCb29sZWFuIG9wZXJhdG9yPj49KEZsb2F0JiBmKSBjb25z dCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IGYpOwogICAgICB9CgogICAgaW5saW5lIEJv b2xlYW4gb3BlcmF0b3I+Pj0oRG91YmxlJiBkKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2Rh dGEgPj49IGQpOwogICAgfQoKCgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3Qg QW55KiYgYSkgY29uc3QgewogICAgICByZXR1cm4gKCpwZF9kYXRhID4+PSBhKTsKICAgIH0KCiAg ICBpbmxpbmUgQm9vbGVhbiBvcGVyYXRvcj4+PShBbnkqJiBhKSBjb25zdCB7CiAgICAgIHJldHVy biAoKnBkX2RhdGEgPj49IGEpOwogICAgfQoKICAgIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55JiBh KSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IGEpOwogICAgfQoKICAgIGlubGlu ZSBCb29sZWFuIG9wZXJhdG9yPj49KFR5cGVDb2RlX3B0ciYgdGMpIGNvbnN0IHsKICAgICAgcmV0 dXJuICgqcGRfZGF0YSA+Pj0gdGMpOwogICAgfQoKICAgIGlubGluZSBCb29sZWFuIG9wZXJhdG9y Pj49KGNvbnN0IGNoYXIqJiBzKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IHMp OwogICAgfQoKCiAgICBpbmxpbmUgQm9vbGVhbiBvcGVyYXRvcj4+PShjaGFyKiYgcykgY29uc3Qg ewogICAgICByZXR1cm4gKCpwZF9kYXRhID4+PSBzKTsKICAgIH0KCgogICAgaW5saW5lIEJvb2xl YW4gb3BlcmF0b3I+Pj0oQW55Ojp0b19ib29sZWFuIGIpIGNvbnN0IHsKICAgICAgcmV0dXJuICgq cGRfZGF0YSA+Pj0gYik7CiAgICB9CgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55 Ojp0b19jaGFyIGMpIGNvbnN0IHsKICAgICAgcmV0dXJuICgqcGRfZGF0YSA+Pj0gYyk7CiAgICB9 CgogICAgaW5saW5lIEJvb2xlYW4gb3BlcmF0b3I+Pj0oQW55Ojp0b19vY3RldCBvKSBjb25zdCB7 CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IG8pOwogICAgfQoKCiAgICBpbmxpbmUgQm9vbGVh biBvcGVyYXRvcj4+PShBbnk6OnRvX3N0cmluZyBzKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBk X2RhdGEgPj49IHMpOwogICAgfQoKCiAgICBpbmxpbmUgQm9vbGVhbiBvcGVyYXRvcj4+PShBbnk6 OnRvX29iamVjdCBvKSBjb25zdCB7CiAgICAgIHJldHVybiAoKnBkX2RhdGEgPj49IG8pOwogICAg fQoKICAgIGZyaWVuZCBjbGFzcyBBbnlfT1VUX2FyZzsKCiAgcHJpdmF0ZToKICAgIEFueSogcGRf ZGF0YTsKICB9OwoKCiAgY2xhc3MgQW55X09VVF9hcmcgewogIHB1YmxpYzoKICAgIGlubGluZSBB bnlfT1VUX2FyZyhBbnkqJiBwKSA6IF9kYXRhKHApIHsgX2RhdGEgPSAoQW55KikgMDsgfQogICAg aW5saW5lIEFueV9PVVRfYXJnKEFueV92YXImIHApIDogX2RhdGEocC5wZF9kYXRhKSB7CiAgICAg IHAgPSAoQW55KikwOwogICAgfQogICAgaW5saW5lIEFueV9PVVRfYXJnKGNvbnN0IEFueV9PVVRf YXJnJiBwKSA6IF9kYXRhKHAuX2RhdGEpIHt9CiAgICBpbmxpbmUgQW55X09VVF9hcmcmIG9wZXJh dG9yPShjb25zdCBBbnlfT1VUX2FyZyYgcCkgewogICAgICBfZGF0YSA9IHAuX2RhdGE7IHJldHVy biAqdGhpczsKICAgIH0KICAgIGlubGluZSBBbnlfT1VUX2FyZyYgb3BlcmF0b3I9KEFueSogcCkg eyBfZGF0YSA9IHA7IHJldHVybiAqdGhpczsgfQoKICAgIG9wZXJhdG9yIEFueSomICgpIHsgcmV0 dXJuIF9kYXRhOyB9CiAgICBBbnkqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQoKICAgIEFueSom IF9kYXRhOwogIHByaXZhdGU6CiAgICBBbnlfT1VUX2FyZygpOwogICAgQW55X09VVF9hcmcmIG9w ZXJhdG9yPShjb25zdCBBbnlfdmFyJik7CiAgfTsKCiAgdHlwZWRlZiBBbnlfT1VUX2FyZyBBbnlf b3V0OwoKCgoKCgogIGNsYXNzIEV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCB+RXhj ZXB0aW9uKCk7CgogICAgdmlydHVhbCB2b2lkIF9yYWlzZSgpID0gMDsKCgogICAgc3RhdGljIGlu bGluZSBFeGNlcHRpb24qIF9kb3duY2FzdChFeGNlcHRpb24qIGUpIHsgcmV0dXJuIGU7IH0KCgoK ICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgRXhjZXB0aW9uKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0 aW9uKiBlKSB7IHJldHVybiBlOyB9CgoKCiAgICBzdGF0aWMgaW5saW5lIEV4Y2VwdGlvbiogX25h cnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIGU7IH0KCgoKCiAgICBzdGF0aWMgRXhjZXB0aW9u KiBfZHVwbGljYXRlKEV4Y2VwdGlvbiogZSk7CgoKICAgIHZpcnR1YWwgY29uc3QgY2hhciogX05Q X3JlcG9JZChpbnQqIHNpemUpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgc2l6ZV90IF9OUF9hbGln bmVkU2l6ZShzaXplX3QpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1 ZmZlcmVkU3RyZWFtJikgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1l bUJ1ZmZlcmVkU3RyZWFtJikgY29uc3QgPSAwOwoKICAgIHN0YXRpYyBpbmxpbmUgX0NPUkJBX0Jv b2xlYW4gUFJfaXNfdmFsaWQoRXhjZXB0aW9uKiBwICkgewogICAgICByZXR1cm4gKChwKSA/IChw LT5wZF9tYWdpYyA9PSBQUl9tYWdpYykgOiAxKTsKICAgIH0KICAgIHN0YXRpYyBjb25zdCBfQ09S QkFfVUxvbmcgUFJfbWFnaWM7CgogICAgdHlwZWRlZiB2b2lkICgqaW5zZXJ0RXhjZXB0aW9uVG9B bnkpIChBbnkmLCBjb25zdCBFeGNlcHRpb24mKTsKICAgIHR5cGVkZWYgdm9pZCAoKmluc2VydEV4 Y2VwdGlvblRvQW55TkNQKSAoQW55JiwgY29uc3QgRXhjZXB0aW9uKik7CgogICAgaW5saW5lIGlu c2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm4oKSBjb25zdCB7CiAgICAgIHJldHVybiBw ZF9pbnNlcnRUb0FueUZuOwogICAgfQogICAgaW5saW5lIGluc2VydEV4Y2VwdGlvblRvQW55TkNQ IGluc2VydFRvQW55Rm5OQ1AoKSBjb25zdCB7CiAgICAgIHJldHVybiBwZF9pbnNlcnRUb0FueUZu TkNQOwogICAgfQoKICBwcm90ZWN0ZWQ6CiAgICBpbmxpbmUgRXhjZXB0aW9uKCkgOgogICAgICBw ZF9pbnNlcnRUb0FueUZuKDApLAogICAgICBwZF9pbnNlcnRUb0FueUZuTkNQKDApLAogICAgICBw ZF9tYWdpYyhQUl9tYWdpYykKICAgICAge30KICAgIGlubGluZSBFeGNlcHRpb24mIG9wZXJhdG9y ID0gKGNvbnN0IEV4Y2VwdGlvbiYgZXgpIHsKICAgICAgcGRfbWFnaWMgPSBleC5wZF9tYWdpYzsK ICAgICAgcGRfaW5zZXJ0VG9BbnlGbiA9IGV4LnBkX2luc2VydFRvQW55Rm47CiAgICAgIHBkX2lu c2VydFRvQW55Rm5OQ1AgPSBleC5wZF9pbnNlcnRUb0FueUZuTkNQOwogICAgICByZXR1cm4gKnRo aXM7CiAgICB9CiAgICBzdGF0aWMgRXhjZXB0aW9uKiBfTlBfaXNfYShjb25zdCBFeGNlcHRpb24q IGUsIGNvbnN0IGNoYXIqIHR5cGVJZCk7CgogICAgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgcGRfaW5z ZXJ0VG9BbnlGbjsKICAgIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIHBkX2luc2VydFRvQW55Rm5O Q1A7CgoKCgoKICAgIGlubGluZSBFeGNlcHRpb24oY29uc3QgRXhjZXB0aW9uJiBleCkgOgogICAg ICBwZF9pbnNlcnRUb0FueUZuKGV4LnBkX2luc2VydFRvQW55Rm4pLAogICAgICBwZF9pbnNlcnRU b0FueUZuTkNQKGV4LnBkX2luc2VydFRvQW55Rm5OQ1ApLAogICAgICBwZF9tYWdpYyhleC5wZF9t YWdpYykKICAgICAge30KCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVw bGljYXRlKCkgY29uc3QgPSAwOwoKCgogICAgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlk KCkgY29uc3QgPSAwOwoKCgoKICAgIFVMb25nIHBkX21hZ2ljOwogIH07CgoKCgoKCiAgZW51bSBD b21wbGV0aW9uU3RhdHVzIHsgQ09NUExFVEVEX1lFUywgQ09NUExFVEVEX05PLCBDT01QTEVURURf TUFZQkUgfTsKICBlbnVtIGV4Y2VwdGlvbl90eXBlIHsgTk9fRVhDRVBUSU9OLCBVU0VSX0VYQ0VQ VElPTiwgU1lTVEVNX0VYQ0VQVElPTiB9OwoKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBV TG9uZwogICAgICAgT01HVk1DSUQgPSAxMzMwNDQ2MzM2OwoKCiAgY2xhc3MgU3lzdGVtRXhjZXB0 aW9uIDogcHVibGljIEV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCB+U3lzdGVtRXhj ZXB0aW9uKCk7CgoKCgoKCgogICAgaW5saW5lIFVMb25nIG1pbm9yKCkgY29uc3QgeyByZXR1cm4g cGRfbWlub3I7IH0KICAgIGlubGluZSB2b2lkIG1pbm9yKFVMb25nIG0pIHsgcGRfbWlub3IgPSBt OyB9CgogICAgaW5saW5lIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkKCkgY29uc3QgeyByZXR1 cm4gcGRfc3RhdHVzOyB9CiAgICBpbmxpbmUgdm9pZCBjb21wbGV0ZWQoQ29tcGxldGlvblN0YXR1 cyBzKSB7IHBkX3N0YXR1cyA9IHM7IH0KCiAgICBzdGF0aWMgU3lzdGVtRXhjZXB0aW9uKiBfZG93 bmNhc3QoRXhjZXB0aW9uKik7CiAgICBzdGF0aWMgY29uc3QgU3lzdGVtRXhjZXB0aW9uKiBfZG93 bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7CiAgICBzdGF0aWMgaW5saW5lIFN5c3RlbUV4Y2VwdGlv biogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsKICAgICAgcmV0dXJuIF9kb3duY2FzdChlKTsKICAg IH0KCiAgICBpbmxpbmUgU3lzdGVtRXhjZXB0aW9uKCkgewogICAgICBwZF9taW5vciA9IDA7CiAg ICAgIHBkX3N0YXR1cyA9IENPTVBMRVRFRF9OTzsKICAgIH0KICAgIGlubGluZSBTeXN0ZW1FeGNl cHRpb24oY29uc3QgU3lzdGVtRXhjZXB0aW9uJiBlKSA6IEV4Y2VwdGlvbihlKSB7CiAgICAgIHBk X21pbm9yID0gZS5wZF9taW5vcjsKICAgICAgcGRfc3RhdHVzID0gZS5wZF9zdGF0dXM7CiAgICB9 CiAgICBpbmxpbmUgU3lzdGVtRXhjZXB0aW9uKFVMb25nIG1pbm9yLCBDb21wbGV0aW9uU3RhdHVz IHN0YXR1cykgewogICAgICBwZF9taW5vciA9IG1pbm9yOwogICAgICBwZF9zdGF0dXMgPSBzdGF0 dXM7CiAgICB9CiAgICBpbmxpbmUgU3lzdGVtRXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgU3lz dGVtRXhjZXB0aW9uJiBlKSB7CiAgICAgIEV4Y2VwdGlvbjo6b3BlcmF0b3I9KGUpOwogICAgICBw ZF9taW5vciA9IGUucGRfbWlub3I7CiAgICAgIHBkX3N0YXR1cyA9IGUucGRfc3RhdHVzOwogICAg ICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHByb3RlY3RlZDoKICAgIFVMb25nIHBkX21pbm9yOwog ICAgQ29tcGxldGlvblN0YXR1cyBwZF9zdGF0dXM7CgogIHByaXZhdGU6CiAgICB2aXJ0dWFsIHNp emVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90KSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBfTlBf bWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIF9OUF9t YXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7CiAgfTsKIyA5MzkgIi91c3IvbG9jYWwv aW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAzCiAgY2xhc3MgVU5LTk9XTiA6IHB1YmxpYyBTeXN0 ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBVTktOT1dOKFVMb25nIG1pbm9yID0gMCwgQ29t cGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9u IChtaW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBw ZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgVU5LTk9XTihj b25zdCBVTktOT1dOJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBVTktOT1dO JiBvcGVyYXRvcj0oY29uc3QgVU5LTk9XTiYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRv cj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+VU5LTk9XTigpOyB2aXJ0dWFsIHZvaWQg X3JhaXNlKCk7IHN0YXRpYyBVTktOT1dOKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBj b25zdCBVTktOT1dOKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUg VU5LTk9XTiogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2 aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4 Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2Vw dGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTog dmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBj aGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIEJBRF9QQVJBTSA6IHB1YmxpYyBTeXN0 ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBCQURfUEFSQU0oVUxvbmcgbWlub3IgPSAwLCBD b21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRp b24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47 IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBCQURfUEFS QU0oY29uc3QgQkFEX1BBUkFNJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBC QURfUEFSQU0mIG9wZXJhdG9yPShjb25zdCBCQURfUEFSQU0mIGV4KSB7IFN5c3RlbUV4Y2VwdGlv bjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkJBRF9QQVJBTSgpOyB2 aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBCQURfUEFSQU0qIF9kb3duY2FzdChFeGNlcHRp b24qKTsgc3RhdGljIGNvbnN0IEJBRF9QQVJBTSogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiop OyBzdGF0aWMgaW5saW5lIEJBRF9QQVJBTSogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJu IF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXpl KSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9B bnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9B bnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25z dDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIE5PX01F TU9SWSA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBOT19NRU1PUlko VUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9O TykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlG biA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQ OyB9IGlubGluZSBOT19NRU1PUlkoY29uc3QgTk9fTUVNT1JZJiBleCkgOiBTeXN0ZW1FeGNlcHRp b24oZXgpIHt9IGlubGluZSBOT19NRU1PUlkmIG9wZXJhdG9yPShjb25zdCBOT19NRU1PUlkmIGV4 KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1 YWwgfk5PX01FTU9SWSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBOT19NRU1PUlkq IF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE5PX01FTU9SWSogX2Rvd25jYXN0 KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIE5PX01FTU9SWSogX25hcnJvdyhFeGNl cHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9O UF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0 aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9u VG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9O UF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29u c3Q7IH07IGNsYXNzIElNUF9MSU1JVCA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6 IGlubGluZSBJTVBfTElNSVQoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBs ZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQp IHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1Ag PSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBJTVBfTElNSVQoY29uc3QgSU1QX0xJTUlUJiBl eCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBJTVBfTElNSVQmIG9wZXJhdG9yPShj b25zdCBJTVBfTElNSVQmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0 dXJuICp0aGlzOyB9IHZpcnR1YWwgfklNUF9MSU1JVCgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7 IHN0YXRpYyBJTVBfTElNSVQqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IElN UF9MSU1JVCogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIElNUF9M SU1JVCogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0 dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2Vw dGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlv bjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmly dHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFy KiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIENPTU1fRkFJTFVSRSA6IHB1YmxpYyBTeXN0 ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBDT01NX0ZBSUxVUkUoVUxvbmcgbWlub3IgPSAw LCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNl cHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55 Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBDT01N X0ZBSUxVUkUoY29uc3QgQ09NTV9GQUlMVVJFJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9 IGlubGluZSBDT01NX0ZBSUxVUkUmIG9wZXJhdG9yPShjb25zdCBDT01NX0ZBSUxVUkUmIGV4KSB7 IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwg fkNPTU1fRkFJTFVSRSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBDT01NX0ZBSUxV UkUqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IENPTU1fRkFJTFVSRSogX2Rv d25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIENPTU1fRkFJTFVSRSogX25h cnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0 IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5z ZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0 RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNl cHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlw ZUlkKCkgY29uc3Q7IH07IGNsYXNzIElOVl9PQkpSRUYgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9u IHsgcHVibGljOiBpbmxpbmUgSU5WX09CSlJFRihVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25T dGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3Is IGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0 VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIElOVl9PQkpSRUYoY29uc3Qg SU5WX09CSlJFRiYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgSU5WX09CSlJF RiYgb3BlcmF0b3I9KGNvbnN0IElOVl9PQkpSRUYmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3Bl cmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfklOVl9PQkpSRUYoKTsgdmlydHVh bCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgSU5WX09CSlJFRiogX2Rvd25jYXN0KEV4Y2VwdGlvbiop OyBzdGF0aWMgY29uc3QgSU5WX09CSlJFRiogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBz dGF0aWMgaW5saW5lIElOVl9PQkpSRUYqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBf ZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkg Y29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55 Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55 Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7 IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBPQkpFQ1Rf Tk9UX0VYSVNUIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIE9CSkVD VF9OT1RfRVhJU1QoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9 IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRf aW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNl cnRUb0FueUZuTkNQOyB9IGlubGluZSBPQkpFQ1RfTk9UX0VYSVNUKGNvbnN0IE9CSkVDVF9OT1Rf RVhJU1QmIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIE9CSkVDVF9OT1RfRVhJ U1QmIG9wZXJhdG9yPShjb25zdCBPQkpFQ1RfTk9UX0VYSVNUJiBleCkgeyBTeXN0ZW1FeGNlcHRp b246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5PQkpFQ1RfTk9UX0VY SVNUKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIE9CSkVDVF9OT1RfRVhJU1QqIF9k b3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE9CSkVDVF9OT1RfRVhJU1QqIF9kb3du Y2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBPQkpFQ1RfTk9UX0VYSVNUKiBf bmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29u c3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjpp bnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNl cnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4 Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90 eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgTk9fUEVSTUlTU0lPTiA6IHB1YmxpYyBTeXN0ZW1FeGNl cHRpb24geyBwdWJsaWM6IGlubGluZSBOT19QRVJNSVNTSU9OKFVMb25nIG1pbm9yID0gMCwgQ29t cGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9u IChtaW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBw ZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgTk9fUEVSTUlT U0lPTihjb25zdCBOT19QRVJNSVNTSU9OJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlu bGluZSBOT19QRVJNSVNTSU9OJiBvcGVyYXRvcj0oY29uc3QgTk9fUEVSTUlTU0lPTiYgZXgpIHsg U3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+ Tk9fUEVSTUlTU0lPTigpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBOT19QRVJNSVNT SU9OKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBOT19QRVJNSVNTSU9OKiBf ZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgTk9fUEVSTUlTU0lPTiog X25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNv bnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6 aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5z ZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBF eGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBf dHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIElOVEVSTkFMIDogcHVibGljIFN5c3RlbUV4Y2VwdGlv biB7IHB1YmxpYzogaW5saW5lIElOVEVSTkFMKFVMb25nIG1pbm9yID0gMCwgQ29tcGxldGlvblN0 YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uIChtaW5vciwg Y29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRU b0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSU5URVJOQUwoY29uc3QgSU5U RVJOQUwmIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIElOVEVSTkFMJiBvcGVy YXRvcj0oY29uc3QgSU5URVJOQUwmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4 KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfklOVEVSTkFMKCk7IHZpcnR1YWwgdm9pZCBfcmFp c2UoKTsgc3RhdGljIElOVEVSTkFMKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25z dCBJTlRFUk5BTCogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIElO VEVSTkFMKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZp cnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhj ZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0 aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2 aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNo YXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgTUFSU0hBTCA6IHB1YmxpYyBTeXN0ZW1F eGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBNQVJTSEFMKFVMb25nIG1pbm9yID0gMCwgQ29tcGxl dGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uICht aW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9p bnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgTUFSU0hBTChjb25z dCBNQVJTSEFMJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBNQVJTSEFMJiBv cGVyYXRvcj0oY29uc3QgTUFSU0hBTCYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0o ZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+TUFSU0hBTCgpOyB2aXJ0dWFsIHZvaWQgX3Jh aXNlKCk7IHN0YXRpYyBNQVJTSEFMKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25z dCBNQVJTSEFMKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgTUFS U0hBTCogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0 dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2Vw dGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlv bjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmly dHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFy KiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIElOSVRJQUxJWkUgOiBwdWJsaWMgU3lzdGVt RXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgSU5JVElBTElaRShVTG9uZyBtaW5vciA9IDAsIENv bXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlv biAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsg cGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIElOSVRJQUxJ WkUoY29uc3QgSU5JVElBTElaRSYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUg SU5JVElBTElaRSYgb3BlcmF0b3I9KGNvbnN0IElOSVRJQUxJWkUmIGV4KSB7IFN5c3RlbUV4Y2Vw dGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfklOSVRJQUxJWkUo KTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgSU5JVElBTElaRSogX2Rvd25jYXN0KEV4 Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgSU5JVElBTElaRSogX2Rvd25jYXN0KGNvbnN0IEV4Y2Vw dGlvbiopOyBzdGF0aWMgaW5saW5lIElOSVRJQUxJWkUqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7 IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGlu dCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGlu c2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGlu c2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRl KCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFz cyBOT19JTVBMRU1FTlQgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUg Tk9fSU1QTEVNRU5UKFVMb25nIG1pbm9yID0gMCwgQ29tcGxldGlvblN0YXR1cyBjb21wbGV0ZWQg PSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uIChtaW5vciwgY29tcGxldGVkKSB7IHBk X2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5z ZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgTk9fSU1QTEVNRU5UKGNvbnN0IE5PX0lNUExFTUVOVCYg ZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgTk9fSU1QTEVNRU5UJiBvcGVyYXRv cj0oY29uc3QgTk9fSU1QTEVNRU5UJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShl eCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5OT19JTVBMRU1FTlQoKTsgdmlydHVhbCB2b2lk IF9yYWlzZSgpOyBzdGF0aWMgTk9fSU1QTEVNRU5UKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0 YXRpYyBjb25zdCBOT19JTVBMRU1FTlQqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3Rh dGljIGlubGluZSBOT19JTVBMRU1FTlQqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBf ZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkg Y29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55 Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55 Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7 IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBCQURfVFlQ RUNPREUgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgQkFEX1RZUEVD T0RFKFVMb25nIG1pbm9yID0gMCwgQ29tcGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVU RURfTk8pIDogU3lzdGVtRXhjZXB0aW9uIChtaW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRv QW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlG bk5DUDsgfSBpbmxpbmUgQkFEX1RZUEVDT0RFKGNvbnN0IEJBRF9UWVBFQ09ERSYgZXgpIDogU3lz dGVtRXhjZXB0aW9uKGV4KSB7fSBpbmxpbmUgQkFEX1RZUEVDT0RFJiBvcGVyYXRvcj0oY29uc3Qg QkFEX1RZUEVDT0RFJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVy biAqdGhpczsgfSB2aXJ0dWFsIH5CQURfVFlQRUNPREUoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgp OyBzdGF0aWMgQkFEX1RZUEVDT0RFKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25z dCBCQURfVFlQRUNPREUqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGlu ZSBCQURfVFlQRUNPREUqIF9uYXJyb3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3Qo ZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0 YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRp YyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHBy aXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwg Y29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB9OyBjbGFzcyBCQURfT1BFUkFUSU9OIDog cHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIEJBRF9PUEVSQVRJT04oVUxv bmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykg OiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9 IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9 IGlubGluZSBCQURfT1BFUkFUSU9OKGNvbnN0IEJBRF9PUEVSQVRJT04mIGV4KSA6IFN5c3RlbUV4 Y2VwdGlvbihleCkge30gaW5saW5lIEJBRF9PUEVSQVRJT04mIG9wZXJhdG9yPShjb25zdCBCQURf T1BFUkFUSU9OJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAq dGhpczsgfSB2aXJ0dWFsIH5CQURfT1BFUkFUSU9OKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsg c3RhdGljIEJBRF9PUEVSQVRJT04qIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0 IEJBRF9PUEVSQVRJT04qIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGlu ZSBCQURfT1BFUkFUSU9OKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0 KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBz dGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0 aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBw cml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFs IGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgTk9fUkVTT1VSQ0VTIDog cHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIE5PX1JFU09VUkNFUyhVTG9u ZyBtaW5vciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6 IFN5c3RlbUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0g aW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0g aW5saW5lIE5PX1JFU09VUkNFUyhjb25zdCBOT19SRVNPVVJDRVMmIGV4KSA6IFN5c3RlbUV4Y2Vw dGlvbihleCkge30gaW5saW5lIE5PX1JFU09VUkNFUyYgb3BlcmF0b3I9KGNvbnN0IE5PX1JFU09V UkNFUyYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7 IH0gdmlydHVhbCB+Tk9fUkVTT1VSQ0VTKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGlj IE5PX1JFU09VUkNFUyogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgTk9fUkVT T1VSQ0VTKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgTk9fUkVT T1VSQ0VTKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZp cnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhj ZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0 aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2 aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNo YXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgTk9fUkVTUE9OU0UgOiBwdWJsaWMgU3lz dGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgTk9fUkVTUE9OU0UoVUxvbmcgbWlub3IgPSAw LCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNl cHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55 Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBOT19S RVNQT05TRShjb25zdCBOT19SRVNQT05TRSYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4KSB7fSBp bmxpbmUgTk9fUkVTUE9OU0UmIG9wZXJhdG9yPShjb25zdCBOT19SRVNQT05TRSYgZXgpIHsgU3lz dGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+Tk9f UkVTUE9OU0UoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgTk9fUkVTUE9OU0UqIF9k b3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IE5PX1JFU1BPTlNFKiBfZG93bmNhc3Qo Y29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgTk9fUkVTUE9OU0UqIF9uYXJyb3coRXhj ZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBf TlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2Vw dGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlv blRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBf TlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNv bnN0OyB9OyBjbGFzcyBQRVJTSVNUX1NUT1JFIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1 YmxpYzogaW5saW5lIFBFUlNJU1RfU1RPUkUoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3Rh dHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBj b21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRv QW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBQRVJTSVNUX1NUT1JFKGNvbnN0 IFBFUlNJU1RfU1RPUkUmIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIFBFUlNJ U1RfU1RPUkUmIG9wZXJhdG9yPShjb25zdCBQRVJTSVNUX1NUT1JFJiBleCkgeyBTeXN0ZW1FeGNl cHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5QRVJTSVNUX1NU T1JFKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIFBFUlNJU1RfU1RPUkUqIF9kb3du Y2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IFBFUlNJU1RfU1RPUkUqIF9kb3duY2FzdChj b25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBQRVJTSVNUX1NUT1JFKiBfbmFycm93KEV4 Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciog X05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNl cHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRp b25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiog X05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBj b25zdDsgfTsgY2xhc3MgQkFEX0lOVl9PUkRFUiA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBw dWJsaWM6IGlubGluZSBCQURfSU5WX09SREVSKFVMb25nIG1pbm9yID0gMCwgQ29tcGxldGlvblN0 YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uIChtaW5vciwg Y29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRU b0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgQkFEX0lOVl9PUkRFUihjb25z dCBCQURfSU5WX09SREVSJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBCQURf SU5WX09SREVSJiBvcGVyYXRvcj0oY29uc3QgQkFEX0lOVl9PUkRFUiYgZXgpIHsgU3lzdGVtRXhj ZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+QkFEX0lOVl9P UkRFUigpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBCQURfSU5WX09SREVSKiBfZG93 bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBCQURfSU5WX09SREVSKiBfZG93bmNhc3Qo Y29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgQkFEX0lOVl9PUkRFUiogX25hcnJvdyhF eGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIq IF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhj ZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0 aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24q IF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkg Y29uc3Q7IH07IGNsYXNzIFRSQU5TSUVOVCA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJs aWM6IGlubGluZSBUUkFOU0lFTlQoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNv bXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0 ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5O Q1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBUUkFOU0lFTlQoY29uc3QgVFJBTlNJRU5U JiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBUUkFOU0lFTlQmIG9wZXJhdG9y PShjb25zdCBUUkFOU0lFTlQmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsg cmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgflRSQU5TSUVOVCgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNl KCk7IHN0YXRpYyBUUkFOU0lFTlQqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0 IFRSQU5TSUVOVCogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIFRS QU5TSUVOVCogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2 aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4 Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2Vw dGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTog dmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBj aGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNzIEZSRUVfTUVNIDogcHVibGljIFN5c3Rl bUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIEZSRUVfTUVNKFVMb25nIG1pbm9yID0gMCwgQ29t cGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9u IChtaW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBw ZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgRlJFRV9NRU0o Y29uc3QgRlJFRV9NRU0mIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIEZSRUVf TUVNJiBvcGVyYXRvcj0oY29uc3QgRlJFRV9NRU0mIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3Bl cmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkZSRUVfTUVNKCk7IHZpcnR1YWwg dm9pZCBfcmFpc2UoKTsgc3RhdGljIEZSRUVfTUVNKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0 YXRpYyBjb25zdCBGUkVFX01FTSogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMg aW5saW5lIEZSRUVfTUVNKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0 KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBz dGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0 aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBw cml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFs IGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgSU5WX0lERU5UIDogcHVi bGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIElOVl9JREVOVChVTG9uZyBtaW5v ciA9IDAsIENvbXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3Rl bUV4Y2VwdGlvbiAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0 VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5l IElOVl9JREVOVChjb25zdCBJTlZfSURFTlQmIGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30g aW5saW5lIElOVl9JREVOVCYgb3BlcmF0b3I9KGNvbnN0IElOVl9JREVOVCYgZXgpIHsgU3lzdGVt RXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+SU5WX0lE RU5UKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIElOVl9JREVOVCogX2Rvd25jYXN0 KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgSU5WX0lERU5UKiBfZG93bmNhc3QoY29uc3QgRXhj ZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSU5WX0lERU5UKiBfbmFycm93KEV4Y2VwdGlvbiogZSkg eyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChp bnQqIHNpemUpIGNvbnN0OyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBp bnNlcnRUb0FueUZuOyBzdGF0aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBp bnNlcnRUb0FueUZuTkNQOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0 ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xh c3MgSU5WX0ZMQUcgOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgSU5W X0ZMQUcoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBM RVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0 VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0Fu eUZuTkNQOyB9IGlubGluZSBJTlZfRkxBRyhjb25zdCBJTlZfRkxBRyYgZXgpIDogU3lzdGVtRXhj ZXB0aW9uKGV4KSB7fSBpbmxpbmUgSU5WX0ZMQUcmIG9wZXJhdG9yPShjb25zdCBJTlZfRkxBRyYg ZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmly dHVhbCB+SU5WX0ZMQUcoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgSU5WX0ZMQUcq IF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IElOVl9GTEFHKiBfZG93bmNhc3Qo Y29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSU5WX0ZMQUcqIF9uYXJyb3coRXhjZXB0 aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFyKiBfTlBf cmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlv blRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRv QW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBf ZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0 OyB9OyBjbGFzcyBJTlRGX1JFUE9TIDogcHVibGljIFN5c3RlbUV4Y2VwdGlvbiB7IHB1YmxpYzog aW5saW5lIElOVEZfUkVQT1MoVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBs ZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQp IHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1Ag PSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBJTlRGX1JFUE9TKGNvbnN0IElOVEZfUkVQT1Mm IGV4KSA6IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIElOVEZfUkVQT1MmIG9wZXJhdG9y PShjb25zdCBJTlRGX1JFUE9TJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7 IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5JTlRGX1JFUE9TKCk7IHZpcnR1YWwgdm9pZCBfcmFp c2UoKTsgc3RhdGljIElOVEZfUkVQT1MqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNv bnN0IElOVEZfUkVQT1MqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGlu ZSBJTlRGX1JFUE9TKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUp OyB9IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0 aWMgRXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMg RXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2 YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNv bnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgQkFEX0NPTlRFWFQgOiBwdWJs aWMgU3lzdGVtRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgQkFEX0NPTlRFWFQoVUxvbmcgbWlu b3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBsZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0 ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2Vy dFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGlu ZSBCQURfQ09OVEVYVChjb25zdCBCQURfQ09OVEVYVCYgZXgpIDogU3lzdGVtRXhjZXB0aW9uKGV4 KSB7fSBpbmxpbmUgQkFEX0NPTlRFWFQmIG9wZXJhdG9yPShjb25zdCBCQURfQ09OVEVYVCYgZXgp IHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0gdmlydHVh bCB+QkFEX0NPTlRFWFQoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgQkFEX0NPTlRF WFQqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEJBRF9DT05URVhUKiBfZG93 bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgQkFEX0NPTlRFWFQqIF9uYXJy b3coRXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBj aGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2Vy dEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4 Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0 aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJ ZCgpIGNvbnN0OyB9OyBjbGFzcyBPQkpfQURBUFRFUiA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24g eyBwdWJsaWM6IGlubGluZSBPQkpfQURBUFRFUihVTG9uZyBtaW5vciA9IDAsIENvbXBsZXRpb25T dGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlvbiAobWlub3Is IGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0 VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIE9CSl9BREFQVEVSKGNvbnN0 IE9CSl9BREFQVEVSJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBPQkpfQURB UFRFUiYgb3BlcmF0b3I9KGNvbnN0IE9CSl9BREFQVEVSJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246 Om9wZXJhdG9yPShleCk7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5PQkpfQURBUFRFUigpOyB2 aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBPQkpfQURBUFRFUiogX2Rvd25jYXN0KEV4Y2Vw dGlvbiopOyBzdGF0aWMgY29uc3QgT0JKX0FEQVBURVIqIF9kb3duY2FzdChjb25zdCBFeGNlcHRp b24qKTsgc3RhdGljIGlubGluZSBPQkpfQURBUFRFUiogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsg cmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50 KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5z ZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5z ZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUo KSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07IGNsYXNz IERBVEFfQ09OVkVSU0lPTiA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGlu ZSBEQVRBX0NPTlZFUlNJT04oVUxvbmcgbWlub3IgPSAwLCBDb21wbGV0aW9uU3RhdHVzIGNvbXBs ZXRlZCA9IENPTVBMRVRFRF9OTykgOiBTeXN0ZW1FeGNlcHRpb24gKG1pbm9yLCBjb21wbGV0ZWQp IHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1Ag PSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBEQVRBX0NPTlZFUlNJT04oY29uc3QgREFUQV9D T05WRVJTSU9OJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBEQVRBX0NPTlZF UlNJT04mIG9wZXJhdG9yPShjb25zdCBEQVRBX0NPTlZFUlNJT04mIGV4KSB7IFN5c3RlbUV4Y2Vw dGlvbjo6b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkRBVEFfQ09OVkVS U0lPTigpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBEQVRBX0NPTlZFUlNJT04qIF9k b3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IERBVEFfQ09OVkVSU0lPTiogX2Rvd25j YXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIERBVEFfQ09OVkVSU0lPTiogX25h cnJvdyhFeGNlcHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0 IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5z ZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0 RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNl cHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlw ZUlkKCkgY29uc3Q7IH07IGNsYXNzIFRSQU5TQUNUSU9OX1JFUVVJUkVEIDogcHVibGljIFN5c3Rl bUV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIFRSQU5TQUNUSU9OX1JFUVVJUkVEKFVMb25nIG1p bm9yID0gMCwgQ29tcGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBDT01QTEVURURfTk8pIDogU3lz dGVtRXhjZXB0aW9uIChtaW5vciwgY29tcGxldGVkKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNl cnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxp bmUgVFJBTlNBQ1RJT05fUkVRVUlSRUQoY29uc3QgVFJBTlNBQ1RJT05fUkVRVUlSRUQmIGV4KSA6 IFN5c3RlbUV4Y2VwdGlvbihleCkge30gaW5saW5lIFRSQU5TQUNUSU9OX1JFUVVJUkVEJiBvcGVy YXRvcj0oY29uc3QgVFJBTlNBQ1RJT05fUkVRVUlSRUQmIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6 b3BlcmF0b3I9KGV4KTsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgflRSQU5TQUNUSU9OX1JFUVVJ UkVEKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIFRSQU5TQUNUSU9OX1JFUVVJUkVE KiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBUUkFOU0FDVElPTl9SRVFVSVJF RCogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIFRSQU5TQUNUSU9O X1JFUVVJUkVEKiBfbmFycm93KEV4Y2VwdGlvbiogZSkgeyByZXR1cm4gX2Rvd25jYXN0KGUpOyB9 IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyBzdGF0aWMg RXhjZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgRXhj ZXB0aW9uOjppbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBwcml2YXRl OiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0 IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgfTsgY2xhc3MgVFJBTlNBQ1RJT05fUk9MTEVEQkFD SyA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBUUkFOU0FDVElPTl9S T0xMRURCQUNLKFVMb25nIG1pbm9yID0gMCwgQ29tcGxldGlvblN0YXR1cyBjb21wbGV0ZWQgPSBD T01QTEVURURfTk8pIDogU3lzdGVtRXhjZXB0aW9uIChtaW5vciwgY29tcGxldGVkKSB7IHBkX2lu c2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0 VG9BbnlGbk5DUDsgfSBpbmxpbmUgVFJBTlNBQ1RJT05fUk9MTEVEQkFDSyhjb25zdCBUUkFOU0FD VElPTl9ST0xMRURCQUNLJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24oZXgpIHt9IGlubGluZSBUUkFO U0FDVElPTl9ST0xMRURCQUNLJiBvcGVyYXRvcj0oY29uc3QgVFJBTlNBQ1RJT05fUk9MTEVEQkFD SyYgZXgpIHsgU3lzdGVtRXhjZXB0aW9uOjpvcGVyYXRvcj0oZXgpOyByZXR1cm4gKnRoaXM7IH0g dmlydHVhbCB+VFJBTlNBQ1RJT05fUk9MTEVEQkFDSygpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7 IHN0YXRpYyBUUkFOU0FDVElPTl9ST0xMRURCQUNLKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0 YXRpYyBjb25zdCBUUkFOU0FDVElPTl9ST0xMRURCQUNLKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0 aW9uKik7IHN0YXRpYyBpbmxpbmUgVFJBTlNBQ1RJT05fUk9MTEVEQkFDSyogX25hcnJvdyhFeGNl cHRpb24qIGUpIHsgcmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9O UF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0 aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9u VG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9O UF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29u c3Q7IH07IGNsYXNzIElOVkFMSURfVFJBTlNBQ1RJT04gOiBwdWJsaWMgU3lzdGVtRXhjZXB0aW9u IHsgcHVibGljOiBpbmxpbmUgSU5WQUxJRF9UUkFOU0FDVElPTihVTG9uZyBtaW5vciA9IDAsIENv bXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlv biAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsg cGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIElOVkFMSURf VFJBTlNBQ1RJT04oY29uc3QgSU5WQUxJRF9UUkFOU0FDVElPTiYgZXgpIDogU3lzdGVtRXhjZXB0 aW9uKGV4KSB7fSBpbmxpbmUgSU5WQUxJRF9UUkFOU0FDVElPTiYgb3BlcmF0b3I9KGNvbnN0IElO VkFMSURfVFJBTlNBQ1RJT04mIGV4KSB7IFN5c3RlbUV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsg cmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfklOVkFMSURfVFJBTlNBQ1RJT04oKTsgdmlydHVhbCB2 b2lkIF9yYWlzZSgpOyBzdGF0aWMgSU5WQUxJRF9UUkFOU0FDVElPTiogX2Rvd25jYXN0KEV4Y2Vw dGlvbiopOyBzdGF0aWMgY29uc3QgSU5WQUxJRF9UUkFOU0FDVElPTiogX2Rvd25jYXN0KGNvbnN0 IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIElOVkFMSURfVFJBTlNBQ1RJT04qIF9uYXJyb3co RXhjZXB0aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0gdmlydHVhbCBjb25zdCBjaGFy KiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4 Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBFeGNlcHRpb246Omluc2VydEV4Y2Vw dGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9u KiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgp IGNvbnN0OyB9OyBjbGFzcyBXUk9OR19UUkFOU0FDVElPTiA6IHB1YmxpYyBTeXN0ZW1FeGNlcHRp b24geyBwdWJsaWM6IGlubGluZSBXUk9OR19UUkFOU0FDVElPTihVTG9uZyBtaW5vciA9IDAsIENv bXBsZXRpb25TdGF0dXMgY29tcGxldGVkID0gQ09NUExFVEVEX05PKSA6IFN5c3RlbUV4Y2VwdGlv biAobWlub3IsIGNvbXBsZXRlZCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsg cGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIFdST05HX1RS QU5TQUNUSU9OKGNvbnN0IFdST05HX1RSQU5TQUNUSU9OJiBleCkgOiBTeXN0ZW1FeGNlcHRpb24o ZXgpIHt9IGlubGluZSBXUk9OR19UUkFOU0FDVElPTiYgb3BlcmF0b3I9KGNvbnN0IFdST05HX1RS QU5TQUNUSU9OJiBleCkgeyBTeXN0ZW1FeGNlcHRpb246Om9wZXJhdG9yPShleCk7IHJldHVybiAq dGhpczsgfSB2aXJ0dWFsIH5XUk9OR19UUkFOU0FDVElPTigpOyB2aXJ0dWFsIHZvaWQgX3JhaXNl KCk7IHN0YXRpYyBXUk9OR19UUkFOU0FDVElPTiogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0 aWMgY29uc3QgV1JPTkdfVFJBTlNBQ1RJT04qIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsg c3RhdGljIGlubGluZSBXUk9OR19UUkFOU0FDVElPTiogX25hcnJvdyhFeGNlcHRpb24qIGUpIHsg cmV0dXJuIF9kb3duY2FzdChlKTsgfSB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50 KiBzaXplKSBjb25zdDsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5z ZXJ0VG9BbnlGbjsgc3RhdGljIEV4Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5z ZXJ0VG9BbnlGbk5DUDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUo KSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IH07CiMgOTQ4 ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMwogIGNsYXNzIFVzZXJFeGNl cHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIH5Vc2VyRXhj ZXB0aW9uKCk7CiAgICBzdGF0aWMgVXNlckV4Y2VwdGlvbiogX2Rvd25jYXN0KEV4Y2VwdGlvbiog ZSk7CiAgICBzdGF0aWMgY29uc3QgVXNlckV4Y2VwdGlvbiogX2Rvd25jYXN0KGNvbnN0IEV4Y2Vw dGlvbiogZSk7CiAgICBzdGF0aWMgaW5saW5lIFVzZXJFeGNlcHRpb24qIF9uYXJyb3coRXhjZXB0 aW9uKiBlKSB7IHJldHVybiBfZG93bmNhc3QoZSk7IH0KCiAgcHJvdGVjdGVkOgogICAgaW5saW5l IFVzZXJFeGNlcHRpb24oKSB7fQoKCgoKCiAgICBpbmxpbmUgVXNlckV4Y2VwdGlvbihjb25zdCBV c2VyRXhjZXB0aW9uJiBleCkgOiBFeGNlcHRpb24oZXgpIHt9CgogIHB1YmxpYzoKICAgIFVzZXJF eGNlcHRpb24mIG9wZXJhdG9yPShjb25zdCBVc2VyRXhjZXB0aW9uJiBleCkgewogICAgICBFeGNl cHRpb246Om9wZXJhdG9yPShleCk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICB9OwoKCgoK CgogIGNsYXNzIFVua25vd25Vc2VyRXhjZXB0aW9uIDogcHVibGljIFVzZXJFeGNlcHRpb24gewog IHB1YmxpYzoKICAgIHZpcnR1YWwgflVua25vd25Vc2VyRXhjZXB0aW9uKCk7CgogICAgVW5rbm93 blVzZXJFeGNlcHRpb24oQW55KiBleCk7CgoKICAgIGlubGluZSBVbmtub3duVXNlckV4Y2VwdGlv bihjb25zdCBVbmtub3duVXNlckV4Y2VwdGlvbiYgZXgpCiAgICAgIDogVXNlckV4Y2VwdGlvbihl eCkgewogICAgICBwZF9leGNlcHRpb24gPSBuZXcgQW55KCpleC5wZF9leGNlcHRpb24pOwogICAg fQogICAgVW5rbm93blVzZXJFeGNlcHRpb24mIG9wZXJhdG9yPShjb25zdCBVbmtub3duVXNlckV4 Y2VwdGlvbiYgZXgpIHsKICAgICAgVXNlckV4Y2VwdGlvbjo6b3BlcmF0b3I9KGV4KTsKICAgICAg aWYgKHBkX2V4Y2VwdGlvbikgZGVsZXRlIHBkX2V4Y2VwdGlvbjsKICAgICAgcGRfZXhjZXB0aW9u ID0gbmV3IEFueSgqZXgucGRfZXhjZXB0aW9uKTsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoK ICAgIEFueSYgZXhjZXB0aW9uKCk7CgogICAgdmlydHVhbCB2b2lkIF9yYWlzZSgpOwogICAgc3Rh dGljIFVua25vd25Vc2VyRXhjZXB0aW9uKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7CiAgICBzdGF0 aWMgY29uc3QgVW5rbm93blVzZXJFeGNlcHRpb24qIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24q KTsKICAgIHN0YXRpYyBpbmxpbmUgVW5rbm93blVzZXJFeGNlcHRpb24qIF9uYXJyb3coRXhjZXB0 aW9uKiBlKSB7CiAgICAgIHJldHVybiBfZG93bmNhc3QoZSk7CiAgICB9CgogICAgc3RhdGljIEV4 Y2VwdGlvbjo6aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsKICAgIHN0YXRpYyBF eGNlcHRpb246Omluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7CgogIHBy aXZhdGU6CiAgICB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OwogICAg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7CiAgICB2aXJ0dWFsIGNvbnN0 IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBfTlBf bWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIF9OUF9t YXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7CgogICAgQW55KiBwZF9leGNlcHRpb247 CiAgfTsKCgoKCgoKICBjbGFzcyBXcm9uZ1RyYW5zYWN0aW9uIDogcHVibGljIFVzZXJFeGNlcHRp b24geyBwdWJsaWM6IGlubGluZSBXcm9uZ1RyYW5zYWN0aW9uKCkgeyBwZF9pbnNlcnRUb0FueUZu ID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7 IH0gaW5saW5lIFdyb25nVHJhbnNhY3Rpb24oY29uc3QgV3JvbmdUcmFuc2FjdGlvbiYgX2V4KSA6 IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgV3JvbmdUcmFuc2FjdGlvbiYgb3BlcmF0b3I9 KGNvbnN0IFdyb25nVHJhbnNhY3Rpb24mIF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikgdGhpcyA9 IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfldyb25nVHJhbnNhY3Rpb24oKTsgdmlydHVh bCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgV3JvbmdUcmFuc2FjdGlvbiogX2Rvd25jYXN0KEV4Y2Vw dGlvbiopOyBzdGF0aWMgY29uc3QgV3JvbmdUcmFuc2FjdGlvbiogX2Rvd25jYXN0KGNvbnN0IEV4 Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIFdyb25nVHJhbnNhY3Rpb24qIF9uYXJyb3coRXhjZXB0 aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2Fs aWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3Bl cmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRv cj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9 KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVy ZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsg c3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBj b25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1 cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwg dm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQg X05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgfTsKCgoKCgoKICBjbGFzcyBF bnZpcm9ubWVudDsKICB0eXBlZGVmIEVudmlyb25tZW50KiBFbnZpcm9ubWVudF9wdHI7CiAgdHlw ZWRlZiBFbnZpcm9ubWVudF9wdHIgRW52aXJvbm1lbnRSZWY7CiAgdHlwZWRlZiBfQ09SQkFfUHNl dWRvT2JqX1ZhcjxFbnZpcm9ubWVudD4gRW52aXJvbm1lbnRfdmFyOwogIHR5cGVkZWYgX0NPUkJB X1BzZXVkb09ial9PdXQ8RW52aXJvbm1lbnQsRW52aXJvbm1lbnRfdmFyPiBFbnZpcm9ubWVudF9v dXQ7CgogIGNsYXNzIEVudmlyb25tZW50IHsKICBwdWJsaWM6CiAgICBFbnZpcm9ubWVudCgpOwoK ICAgIHZpcnR1YWwgfkVudmlyb25tZW50KCk7CgogICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbihF eGNlcHRpb24qKTsKICAgIHZpcnR1YWwgRXhjZXB0aW9uKiBleGNlcHRpb24oKSBjb25zdDsKICAg IHZpcnR1YWwgdm9pZCBjbGVhcigpOwoKICAgIHZpcnR1YWwgQm9vbGVhbiBOUF9pc19uaWwoKSBj b25zdDsKICAgIHZpcnR1YWwgRW52aXJvbm1lbnRfcHRyIE5QX2R1cGxpY2F0ZSgpOwoKICAgIHN0 YXRpYyBFbnZpcm9ubWVudF9wdHIgX2R1cGxpY2F0ZShFbnZpcm9ubWVudF9wdHIpOwogICAgc3Rh dGljIEVudmlyb25tZW50X3B0ciBfbmlsKCk7CgogICAgc3RhdGljIGlubGluZSBfQ09SQkFfQm9v bGVhbiBQUl9pc192YWxpZChFbnZpcm9ubWVudF9wdHIgcCApIHsKICAgICAgcmV0dXJuICgocCkg PyAocC0+cGRfbWFnaWMgPT0gUFJfbWFnaWMpIDogMSk7CiAgICB9CgogICAgc3RhdGljIGNvbnN0 IF9DT1JCQV9VTG9uZyBQUl9tYWdpYzsKCiAgcHJpdmF0ZToKICAgIENPUkJBOjpFeGNlcHRpb24q IHBkX2V4Y2VwdGlvbjsKICAgIF9DT1JCQV9VTG9uZyBwZF9tYWdpYzsKCiAgICBFbnZpcm9ubWVu dChjb25zdCBFbnZpcm9ubWVudCYpOwogICAgRW52aXJvbm1lbnQmIG9wZXJhdG9yPShjb25zdCBF bnZpcm9ubWVudCYpOwoKICBwdWJsaWM6CiAgICBDT1JCQTo6Qm9vbGVhbiBwZF9pc19wc2V1ZG87 CiAgfTsKCgoKCgoKICBlbnVtIF9GbGFncyB7CiAgICBBUkdfSU4gPSAweDEsCiAgICBBUkdfT1VU ID0gMHgyLAogICAgQVJHX0lOT1VUID0gMHg0LAogICAgQ1RYX1JFU1RSSUNUX1NDT1BFID0gMHg4 LAogICAgT1VUX0xJU1RfTUVNT1JZID0gMHgxMCwKICAgIElOX0NPUFlfVkFMVUUgPSAweDIwCiAg fTsKCiAgdHlwZWRlZiBVTG9uZyBGbGFnczsKCiAgY2xhc3MgTmFtZWRWYWx1ZTsKICB0eXBlZGVm IE5hbWVkVmFsdWUqIE5hbWVkVmFsdWVfcHRyOwogIHR5cGVkZWYgTmFtZWRWYWx1ZV9wdHIgTmFt ZWRWYWx1ZVJlZjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPE5hbWVkVmFsdWU+IE5h bWVkVmFsdWVfdmFyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8TmFtZWRWYWx1ZSxO YW1lZFZhbHVlX3Zhcj4gTmFtZWRWYWx1ZV9vdXQ7CgogIGNsYXNzIE5hbWVkVmFsdWUgewogIHB1 YmxpYzoKICAgIHZpcnR1YWwgfk5hbWVkVmFsdWUoKTsKCiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIq IG5hbWUoKSBjb25zdCA9IDA7CgoKICAgIHZpcnR1YWwgQW55KiB2YWx1ZSgpIGNvbnN0ID0gMDsK CgogICAgdmlydHVhbCBGbGFncyBmbGFncygpIGNvbnN0ID0gMDsKCiAgICB2aXJ0dWFsIEJvb2xl YW4gTlBfaXNfbmlsKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCBOYW1lZFZhbHVlX3B0ciBOUF9k dXBsaWNhdGUoKSA9IDA7CgogICAgc3RhdGljIE5hbWVkVmFsdWVfcHRyIF9kdXBsaWNhdGUoTmFt ZWRWYWx1ZV9wdHIpOwogICAgc3RhdGljIE5hbWVkVmFsdWVfcHRyIF9uaWwoKTsKCiAgICBzdGF0 aWMgaW5saW5lIF9DT1JCQV9Cb29sZWFuIFBSX2lzX3ZhbGlkKE5hbWVkVmFsdWVfcHRyIHAgKSB7 CiAgICAgIHJldHVybiAoKHApID8gKHAtPnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAg fQoKICAgIHN0YXRpYyBjb25zdCBfQ09SQkFfVUxvbmcgUFJfbWFnaWM7CgogIHByb3RlY3RlZDoK ICAgIE5hbWVkVmFsdWUoKSB7IHBkX21hZ2ljID0gUFJfbWFnaWM7IH0KCiAgcHJpdmF0ZToKICAg IF9DT1JCQV9VTG9uZyBwZF9tYWdpYzsKCiAgICBOYW1lZFZhbHVlKGNvbnN0IE5hbWVkVmFsdWUm KTsKICAgIE5hbWVkVmFsdWUmIG9wZXJhdG9yPShjb25zdCBOYW1lZFZhbHVlJik7CiAgfTsKCgoK CgoKICBjbGFzcyBOVkxpc3Q7CiAgdHlwZWRlZiBOVkxpc3QqIE5WTGlzdF9wdHI7CiAgdHlwZWRl ZiBOVkxpc3RfcHRyIE5WTGlzdFJlZjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPE5W TGlzdD4gTlZMaXN0X3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0PE5WTGlzdCxO Vkxpc3RfdmFyPiBOVkxpc3Rfb3V0OwoKICBjbGFzcyBOVkxpc3QgewogIHB1YmxpYzoKICAgIHZp cnR1YWwgfk5WTGlzdCgpOwoKICAgIHZpcnR1YWwgVUxvbmcgY291bnQoKSBjb25zdCA9IDA7CiAg ICB2aXJ0dWFsIE5hbWVkVmFsdWVfcHRyIGFkZChGbGFncykgPSAwOwogICAgdmlydHVhbCBOYW1l ZFZhbHVlX3B0ciBhZGRfaXRlbShjb25zdCBjaGFyKiwgRmxhZ3MpID0gMDsKICAgIHZpcnR1YWwg TmFtZWRWYWx1ZV9wdHIgYWRkX3ZhbHVlKGNvbnN0IGNoYXIqLCBjb25zdCBBbnkmLCBGbGFncykg PSAwOwogICAgdmlydHVhbCBOYW1lZFZhbHVlX3B0ciBhZGRfaXRlbV9jb25zdW1lKGNoYXIqLEZs YWdzKSA9IDA7CiAgICB2aXJ0dWFsIE5hbWVkVmFsdWVfcHRyIGFkZF92YWx1ZV9jb25zdW1lKGNo YXIqLCBBbnkqLCBGbGFncykgPSAwOwogICAgdmlydHVhbCBOYW1lZFZhbHVlX3B0ciBpdGVtKFVM b25nIGluZGV4KSA9IDA7CiAgICB2aXJ0dWFsIFN0YXR1cyByZW1vdmUgKFVMb25nKSA9IDA7Cgog ICAgdmlydHVhbCBCb29sZWFuIE5QX2lzX25pbCgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgTlZM aXN0X3B0ciBOUF9kdXBsaWNhdGUoKSA9IDA7CgogICAgc3RhdGljIE5WTGlzdF9wdHIgX2R1cGxp Y2F0ZShOVkxpc3RfcHRyKTsKICAgIHN0YXRpYyBOVkxpc3RfcHRyIF9uaWwoKTsKCgoKICAgIGNs YXNzIEJvdW5kcyA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgQm91bmRz KCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5D UCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEJvdW5kcyhjb25zdCBCb3VuZHMmIF9leCkg OiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5lIEJvdW5kcyYgb3BlcmF0b3I9KGNvbnN0IEJv dW5kcyYgX2V4KSB7ICogKFVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7 IH0gdmlydHVhbCB+Qm91bmRzKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEJvdW5k cyogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgQm91bmRzKiBfZG93bmNhc3Qo Y29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgQm91bmRzKiBfbmFycm93KEV4Y2VwdGlv biogX2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGln bmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJh dG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+ Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShO ZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVk U3RyZWFtJikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0 YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29u c3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBs aWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZp cnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZv aWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9O UF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CgogICAgc3RhdGljIGlubGlu ZSBfQ09SQkFfQm9vbGVhbiBQUl9pc192YWxpZChOVkxpc3RfcHRyIHAgKSB7CiAgICAgIHJldHVy biAoKHApID8gKHAtPnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAgfQoKICAgIHN0YXRp YyBjb25zdCBfQ09SQkFfVUxvbmcgUFJfbWFnaWM7CgogIHByb3RlY3RlZDoKICAgIE5WTGlzdCgp IHsgcGRfbWFnaWMgPSBQUl9tYWdpYzsgfQoKICBwcml2YXRlOgogICAgX0NPUkJBX1VMb25nIHBk X21hZ2ljOwoKICAgIE5WTGlzdChjb25zdCBOVkxpc3QmIG52bCk7CiAgICBOVkxpc3QmIG9wZXJh dG9yPShjb25zdCBOVkxpc3QmKTsKICB9OwoKCgoKCgogIGNsYXNzIENvbnRleHQ7CiAgdHlwZWRl ZiBDb250ZXh0KiBDb250ZXh0X3B0cjsKICB0eXBlZGVmIENvbnRleHRfcHRyIENvbnRleHRSZWY7 CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxDb250ZXh0PiBDb250ZXh0X3ZhcjsKICB0 eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfT3V0PENvbnRleHQsQ29udGV4dF92YXI+IENvbnRleHRf b3V0OwoKICBjbGFzcyBDb250ZXh0IHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIH5Db250ZXh0KCk7 CgogICAgdmlydHVhbCBjb25zdCBjaGFyKiBjb250ZXh0X25hbWUoKSBjb25zdCA9IDA7CiAgICB2 aXJ0dWFsIENPUkJBOjpDb250ZXh0X3B0ciBwYXJlbnQoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFs IENPUkJBOjpTdGF0dXMgY3JlYXRlX2NoaWxkKGNvbnN0IGNoYXIqLCBDb250ZXh0X291dCkgPSAw OwogICAgdmlydHVhbCBDT1JCQTo6U3RhdHVzIHNldF9vbmVfdmFsdWUoY29uc3QgY2hhciosIGNv bnN0IEFueSYpID0gMDsKICAgIHZpcnR1YWwgQ09SQkE6OlN0YXR1cyBzZXRfdmFsdWVzKENPUkJB OjpOVkxpc3RfcHRyKSA9IDA7CiAgICB2aXJ0dWFsIENPUkJBOjpTdGF0dXMgZGVsZXRlX3ZhbHVl cyhjb25zdCBjaGFyKikgPSAwOwogICAgdmlydHVhbCBDT1JCQTo6U3RhdHVzIGdldF92YWx1ZXMo Y29uc3QgY2hhciogc3RhcnRfc2NvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBDT1JCQTo6RmxhZ3Mgb3BfZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBjaGFyKiBwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgQ09SQkE6Ok5WTGlzdF9vdXQgdmFsdWVzKSA9IDA7CgoKCiAgICB2aXJ0dWFsIEJv b2xlYW4gTlBfaXNfbmlsKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCBDT1JCQTo6Q29udGV4dF9w dHIgTlBfZHVwbGljYXRlKCkgPSAwOwoKICAgIHN0YXRpYyBDb250ZXh0X3B0ciBfZHVwbGljYXRl KENvbnRleHRfcHRyKTsKICAgIHN0YXRpYyBDb250ZXh0X3B0ciBfbmlsKCk7CgoKICAgIHN0YXRp YyBzaXplX3QgX05QX2FsaWduZWRTaXplKENvbnRleHRfcHRyIGN0eHQsIGNvbnN0IGNoYXIqY29u c3QqIHdoaWNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNobGVu LCBzaXplX3QgaW5pdGlhbG9mZnNldCk7CiAgICBzdGF0aWMgdm9pZCBtYXJzaGFsQ29udGV4dChD b250ZXh0X3B0ciBjdHh0LCBjb25zdCBjaGFyKmNvbnN0KiB3aGljaCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGludCB3aGljaGxlbiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpOwogICAg c3RhdGljIHZvaWQgbWFyc2hhbENvbnRleHQoQ29udGV4dF9wdHIgY3R4dCwgY29uc3QgY2hhcipj b25zdCogd2hpY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2hsZW4s IE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKTsKICAgIHN0YXRpYyBDb250ZXh0X3B0ciB1bm1hcnNoYWxD b250ZXh0KE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKTsKICAgIHN0YXRpYyBDb250ZXh0X3B0ciB1bm1h cnNoYWxDb250ZXh0KE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKTsKCiAgICBzdGF0aWMgaW5saW5lIF9D T1JCQV9Cb29sZWFuIFBSX2lzX3ZhbGlkKENvbnRleHRfcHRyIHAgKSB7CiAgICAgIHJldHVybiAo KHApID8gKHAtPnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAgfQoKICAgIHN0YXRpYyBj b25zdCBfQ09SQkFfVUxvbmcgUFJfbWFnaWM7CgogIHByb3RlY3RlZDoKICAgIENvbnRleHQoKSB7 IHBkX21hZ2ljID0gUFJfbWFnaWM7IH0KCiAgcHJpdmF0ZToKICAgIF9DT1JCQV9VTG9uZyBwZF9t YWdpYzsKCiAgICBDb250ZXh0KGNvbnN0IENvbnRleHQmKTsKICAgIENvbnRleHQmIG9wZXJhdG9y PShjb25zdCBDb250ZXh0Jik7CiAgfTsKCgoKCgoKICBjbGFzcyBDb250ZXh0TGlzdDsKICB0eXBl ZGVmIENvbnRleHRMaXN0KiBDb250ZXh0TGlzdF9wdHI7CiAgdHlwZWRlZiBDb250ZXh0TGlzdF9w dHIgQ29udGV4dExpc3RSZWY7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX1ZhcjxDb250ZXh0 TGlzdD4gQ29udGV4dExpc3RfdmFyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8Q29u dGV4dExpc3QsQ29udGV4dExpc3RfdmFyPiBDb250ZXh0TGlzdF9vdXQ7CgogIGNsYXNzIENvbnRl eHRMaXN0IHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIH5Db250ZXh0TGlzdCgpOwoKICAgIHZpcnR1 YWwgVUxvbmcgY291bnQoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgYWRkKGNvbnN0IGNo YXIqIGN0eHQpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBhZGRfY29uc3VtZShjaGFyKiBjdHh0KSA9 IDA7CgoKICAgIHZpcnR1YWwgY29uc3QgY2hhciogaXRlbShVTG9uZyBpbmRleCkgPSAwOwoKCiAg ICB2aXJ0dWFsIFN0YXR1cyByZW1vdmUoVUxvbmcgaW5kZXgpID0gMDsKCiAgICB2aXJ0dWFsIEJv b2xlYW4gTlBfaXNfbmlsKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCBDb250ZXh0TGlzdF9wdHIg TlBfZHVwbGljYXRlKCkgPSAwOwoKICAgIHN0YXRpYyBDb250ZXh0TGlzdF9wdHIgX2R1cGxpY2F0 ZShDb250ZXh0TGlzdF9wdHIpOwogICAgc3RhdGljIENvbnRleHRMaXN0X3B0ciBfbmlsKCk7CgoK CiAgICBjbGFzcyBCb3VuZHMgOiBwdWJsaWMgVXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5l IEJvdW5kcygpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRv QW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBCb3VuZHMoY29uc3QgQm91bmRz JiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBCb3VuZHMmIG9wZXJhdG9yPShj b25zdCBCb3VuZHMmIF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJu ICp0aGlzOyB9IHZpcnR1YWwgfkJvdW5kcygpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRp YyBCb3VuZHMqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEJvdW5kcyogX2Rv d25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIEJvdW5kcyogX25hcnJvdyhF eGNlcHRpb24qIF9leCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBf TlBfYWxpZ25lZFNpemUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9p ZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9w ZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0 b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1C dWZmZXJlZFN0cmVhbSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0Fu eUZuOyBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3Rh dGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBf TlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNv bnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmly dHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwg dm9pZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwoKICAgIHN0YXRp YyBpbmxpbmUgX0NPUkJBX0Jvb2xlYW4gUFJfaXNfdmFsaWQoQ29udGV4dExpc3RfcHRyIHAgKSB7 CiAgICAgIHJldHVybiAoKHApID8gKHAtPnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAg fQoKICAgIHN0YXRpYyBjb25zdCBfQ09SQkFfVUxvbmcgUFJfbWFnaWM7CgogIHByb3RlY3RlZDoK ICAgIENvbnRleHRMaXN0KCkgeyBwZF9tYWdpYyA9IFBSX21hZ2ljOyB9CgogIHByaXZhdGU6CiAg ICBfQ09SQkFfVUxvbmcgcGRfbWFnaWM7CgogICAgQ29udGV4dExpc3QoY29uc3QgQ29udGV4dExp c3QmKTsKICAgIENvbnRleHRMaXN0JiBvcGVyYXRvcj0oY29uc3QgQ29udGV4dExpc3QmKTsKICB9 OwoKCgoKCgogIGNsYXNzIFByaW5jaXBhbDsKICB0eXBlZGVmIFByaW5jaXBhbCogUHJpbmNpcGFs X3B0cjsKICB0eXBlZGVmIFByaW5jaXBhbF9wdHIgUHJpbmNpcGFsUmVmOwoKCgogIGNsYXNzIFBy aW5jaXBhbElEIDogcHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0IHsKICBw dWJsaWM6CiAgICBpbmxpbmUgUHJpbmNpcGFsSUQoKSB7fQogICAgaW5saW5lIFByaW5jaXBhbElE KGNvbnN0IFByaW5jaXBhbElEJiBzZXEpCiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5j ZV9fT2N0ZXQoc2VxKSB7fQogICAgaW5saW5lIFByaW5jaXBhbElEKENPUkJBOjpVTG9uZyBtYXgp CiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQobWF4KSB7fQogICAgaW5s aW5lIFByaW5jaXBhbElEKENPUkJBOjpVTG9uZyBtYXgsIENPUkJBOjpVTG9uZyBsZW4sIENPUkJB OjpPY3RldCogdmFsLCBDT1JCQTo6Qm9vbGVhbiByZWw9MCkKICAgICAgOiBfQ09SQkFfVW5ib3Vu ZGVkX1NlcXVlbmNlX19PY3RldChtYXgsIGxlbiwgdmFsLCByZWwpIHt9CiAgICBpbmxpbmUgUHJp bmNpcGFsSUQmIG9wZXJhdG9yID0gKGNvbnN0IFByaW5jaXBhbElEJiBzZXEpIHsKICAgICAgX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQ6Om9wZXJhdG9yPShzZXEpOwogICAgICByZXR1 cm4gKnRoaXM7CiAgICB9OwogIH07CgogIGNsYXNzIFByaW5jaXBhbCB7CiAgcHVibGljOgogICAg c3RhdGljIFByaW5jaXBhbF9wdHIgX2R1cGxpY2F0ZShQcmluY2lwYWxfcHRyKTsKICAgIHN0YXRp YyBQcmluY2lwYWxfcHRyIF9uaWwoKTsKICBwcml2YXRlOgogICAgUHJpbmNpcGFsKCk7CiAgfTsK CgoKCgoKICBjbGFzcyBFeGNlcHRpb25MaXN0OwogIHR5cGVkZWYgRXhjZXB0aW9uTGlzdCogRXhj ZXB0aW9uTGlzdF9wdHI7CiAgdHlwZWRlZiBFeGNlcHRpb25MaXN0X3B0ciBFeGNlcHRpb25MaXN0 UmVmOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8RXhjZXB0aW9uTGlzdD4gRXhjZXB0 aW9uTGlzdF92YXI7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX091dDxFeGNlcHRpb25MaXN0 LEV4Y2VwdGlvbkxpc3RfdmFyPiBFeGNlcHRpb25MaXN0X291dDsKCiAgY2xhc3MgRXhjZXB0aW9u TGlzdCB7CiAgcHVibGljOgogICAgdmlydHVhbCB+RXhjZXB0aW9uTGlzdCgpOwoKICAgIHZpcnR1 YWwgVUxvbmcgY291bnQoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgYWRkKFR5cGVDb2Rl X3B0ciB0YykgPSAwOwogICAgdmlydHVhbCB2b2lkIGFkZF9jb25zdW1lKFR5cGVDb2RlX3B0ciB0 YykgPSAwOwoKCiAgICB2aXJ0dWFsIFR5cGVDb2RlX3B0ciBpdGVtKFVMb25nIGluZGV4KSA9IDA7 CgoKICAgIHZpcnR1YWwgU3RhdHVzIHJlbW92ZShVTG9uZyBpbmRleCkgPSAwOwoKICAgIHZpcnR1 YWwgQm9vbGVhbiBOUF9pc19uaWwoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIEV4Y2VwdGlvbkxp c3RfcHRyIE5QX2R1cGxpY2F0ZSgpID0gMDsKCiAgICBzdGF0aWMgRXhjZXB0aW9uTGlzdF9wdHIg X2R1cGxpY2F0ZShFeGNlcHRpb25MaXN0X3B0cik7CiAgICBzdGF0aWMgRXhjZXB0aW9uTGlzdF9w dHIgX25pbCgpOwoKCgogICAgY2xhc3MgQm91bmRzIDogcHVibGljIFVzZXJFeGNlcHRpb24geyBw dWJsaWM6IGlubGluZSBCb3VuZHMoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZu OyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgQm91bmRz KGNvbnN0IEJvdW5kcyYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgQm91bmRz JiBvcGVyYXRvcj0oY29uc3QgQm91bmRzJiBfZXgpIHsgKiAoVXNlckV4Y2VwdGlvbiopIHRoaXMg PSBfZXg7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5Cb3VuZHMoKTsgdmlydHVhbCB2b2lkIF9y YWlzZSgpOyBzdGF0aWMgQm91bmRzKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25z dCBCb3VuZHMqIF9kb3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBCb3Vu ZHMqIF9uYXJyb3coRXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlu bGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7 IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBp bmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGlu ZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZvaWQgb3Bl cmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9B bnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRv QW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFs IEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9O UF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6 ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNv bnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsg fTsKCiAgICBzdGF0aWMgaW5saW5lIF9DT1JCQV9Cb29sZWFuIFBSX2lzX3ZhbGlkKEV4Y2VwdGlv bkxpc3RfcHRyIHAgKSB7CiAgICAgIHJldHVybiAoKHApID8gKHAtPnBkX21hZ2ljID09IFBSX21h Z2ljKSA6IDEpOwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBfQ09SQkFfVUxvbmcgUFJfbWFnaWM7 CgogIHByb3RlY3RlZDoKICAgIEV4Y2VwdGlvbkxpc3QoKSB7IHBkX21hZ2ljID0gUFJfbWFnaWM7 IH0KCiAgcHJpdmF0ZToKICAgIF9DT1JCQV9VTG9uZyBwZF9tYWdpYzsKCiAgICBFeGNlcHRpb25M aXN0KGNvbnN0IEV4Y2VwdGlvbkxpc3QmIGVsKTsKICAgIEV4Y2VwdGlvbkxpc3QmIG9wZXJhdG9y PShjb25zdCBFeGNlcHRpb25MaXN0Jik7CiAgfTsKCgoKCgoKICBjbGFzcyBUeXBlQ29kZV92YXI7 CgogIGNsYXNzIFR5cGVDb2RlX21lbWJlciB7CiAgcHVibGljOgogICAgVHlwZUNvZGVfbWVtYmVy KCk7CiAgICBpbmxpbmUgVHlwZUNvZGVfbWVtYmVyKFR5cGVDb2RlX3B0ciBwKSA6IF9wdHIocCkg e30KICAgIFR5cGVDb2RlX21lbWJlcihjb25zdCBUeXBlQ29kZV9tZW1iZXImIHApOwogICAgflR5 cGVDb2RlX21lbWJlcigpOwoKICAgIFR5cGVDb2RlX21lbWJlciYgb3BlcmF0b3I9KFR5cGVDb2Rl X3B0ciBwKTsKICAgIFR5cGVDb2RlX21lbWJlciYgb3BlcmF0b3I9KGNvbnN0IFR5cGVDb2RlX21l bWJlciYgcCk7CiAgICBUeXBlQ29kZV9tZW1iZXImIG9wZXJhdG9yPShjb25zdCBUeXBlQ29kZV92 YXImIHApOwoKICAgIGlubGluZSBUeXBlQ29kZV9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0 dXJuIF9wdHI7IH0KICAgIGlubGluZSBvcGVyYXRvciBUeXBlQ29kZV9wdHIoKSBjb25zdCB7IHJl dHVybiBfcHRyOyB9CgogICAgVHlwZUNvZGVfcHRyIF9wdHI7CgogICAgdm9pZCBvcGVyYXRvcj4+ PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZm ZXJlZFN0cmVhbSYpOwogICAgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNv bnN0OwogICAgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVhbSYpOwogICAgc2l6ZV90 IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QpIGNvbnN0OwogIH07CgoKCn0KCm5hbWVzcGFjZSBDT1JC QQp7CiMgMTQyMCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDMKIyAxICIv dXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvY29yYmFpZGxfZGVmcy5oaCIgMSAzCgoKCgoKCgpj bGFzcyBJRExUeXBlOwpjbGFzcyBfb2JqcmVmX0lETFR5cGU7CmNsYXNzIF9pbXBsX0lETFR5cGU7 Cgp0eXBlZGVmIF9vYmpyZWZfSURMVHlwZSogSURMVHlwZV9wdHI7CnR5cGVkZWYgSURMVHlwZV9w dHIgSURMVHlwZVJlZjsKCmNsYXNzIElETFR5cGVfSGVscGVyIHsKcHVibGljOgogIHR5cGVkZWYg SURMVHlwZV9wdHIgX3B0cl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKICBzdGF0 aWMgX0NPUkJBX0Jvb2xlYW4gaXNfbmlsKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgcmVsZWFz ZShfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIGR1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRp YyBzaXplX3QgTlBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyB2b2lk IG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBf cHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIHZv aWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGlj IF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKTsKfTsKCnR5cGVk ZWYgX0NPUkJBX09ialJlZl9WYXI8X29ianJlZl9JRExUeXBlLCBJRExUeXBlX0hlbHBlcj4gSURM VHlwZV92YXI7CnR5cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfSURMVHlwZSxJ RExUeXBlX0hlbHBlciA+IElETFR5cGVfb3V0OwoKCgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVD b2RlX3B0ciBfdGNfSWRlbnRpZmllcjsKCnR5cGVkZWYgY2hhciogSWRlbnRpZmllcjsKdHlwZWRl ZiBDT1JCQTo6U3RyaW5nX3ZhciBJZGVudGlmaWVyX3ZhcjsKCnN0cnVjdCBTdHJ1Y3RNZW1iZXIg ewogIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfVmFyaWFibGVfVmFyPFN0cnVjdE1lbWJlcj4g X3Zhcl90eXBlOwoKICBDT1JCQTo6U3RyaW5nX21lbWJlciBuYW1lOwoKICBDT1JCQTo6VHlwZUNv ZGVfbWVtYmVyIHR5cGU7CgogIF9DT1JCQV9PYmpSZWZfTWVtYmVyPCBfb2JqcmVmX0lETFR5cGUs IElETFR5cGVfSGVscGVyPiB0eXBlX2RlZjsKCiAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXpl X3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRT dHJlYW0gJikgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJik7 CiAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgdm9pZCBv cGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJik7Cn07Cgp0eXBlZGVmIFN0cnVjdE1lbWJl cjo6X3Zhcl90eXBlIFN0cnVjdE1lbWJlcl92YXI7Cgp0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBl X1ZhcmlhYmxlX09VVF9hcmc8IFN0cnVjdE1lbWJlcixTdHJ1Y3RNZW1iZXJfdmFyID4gU3RydWN0 TWVtYmVyX291dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19TdHJ1Y3RN ZW1iZXI7CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfU3RydWN0TWVtYmVy U2VxOwoKY2xhc3MgU3RydWN0TWVtYmVyU2VxX3ZhcjsKCmNsYXNzIFN0cnVjdE1lbWJlclNlcSA6 IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBTdHJ1Y3RNZW1iZXI+IHsKcHVibGlj OgogIHR5cGVkZWYgU3RydWN0TWVtYmVyU2VxX3ZhciBfdmFyX3R5cGU7CiAgaW5saW5lIFN0cnVj dE1lbWJlclNlcSgpIHt9CiAgaW5saW5lIFN0cnVjdE1lbWJlclNlcShjb25zdCBTdHJ1Y3RNZW1i ZXJTZXEmIHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFN0cnVjdE1lbWJlcj4g KHMpIHt9CgogIGlubGluZSBTdHJ1Y3RNZW1iZXJTZXEoX0NPUkJBX1VMb25nIF9tYXgpCiAgICA6 IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFN0cnVjdE1lbWJlcj4gKF9tYXgpIHt9CiAgaW5s aW5lIFN0cnVjdE1lbWJlclNlcShfQ09SQkFfVUxvbmcgX21heCwgX0NPUkJBX1VMb25nIF9sZW4s IFN0cnVjdE1lbWJlciogX3ZhbCwgX0NPUkJBX0Jvb2xlYW4gX3JlbD0wKQogICAgOiBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlPCBTdHJ1Y3RNZW1iZXI+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVs KSB7fQoKICBpbmxpbmUgU3RydWN0TWVtYmVyU2VxJiBvcGVyYXRvciA9IChjb25zdCBTdHJ1Y3RN ZW1iZXJTZXEmIHMpIHsKICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFN0cnVjdE1lbWJl cj4gOjpvcGVyYXRvcj0ocyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3MgU3RydWN0 TWVtYmVyU2VxX291dDsKCmNsYXNzIFN0cnVjdE1lbWJlclNlcV92YXIgewpwdWJsaWM6CiAgdHlw ZWRlZiBTdHJ1Y3RNZW1iZXJTZXEgVDsKICB0eXBlZGVmIFN0cnVjdE1lbWJlclNlcV92YXIgVF92 YXI7CgogIGlubGluZSBTdHJ1Y3RNZW1iZXJTZXFfdmFyKCkgOiBfcGRfc2VxKDApIHt9CiAgaW5s aW5lIFN0cnVjdE1lbWJlclNlcV92YXIoVCogcykgOiBfcGRfc2VxKHMpIHt9CiAgaW5saW5lIFN0 cnVjdE1lbWJlclNlcV92YXIoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBzLl9wZF9zZXEgKSBf cGRfc2VxID0gbmV3IFQoKnMuX3BkX3NlcSk7CiAgICBlbHNlIF9wZF9zZXEgPSAwOwogIH0KICBp bmxpbmUgflN0cnVjdE1lbWJlclNlcV92YXIoKSB7IGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9z ZXE7IH0KCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICBpZiggX3BkX3Nl cSApIGRlbGV0ZSBfcGRfc2VxOwogICAgX3BkX3NlcSA9IHM7CiAgICByZXR1cm4gKnRoaXM7CiAg fQogIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBz Ll9wZF9zZXEgKSB7CiAgICAgIGlmKCAhX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVDsKICAgICAg Kl9wZF9zZXEgPSAqcy5fcGRfc2VxOwogICAgfSBlbHNlIGlmKCBfcGRfc2VxICkgewogICAgICBk ZWxldGUgX3BkX3NlcTsKICAgICAgX3BkX3NlcSA9IDA7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7 CiAgfQoKICBpbmxpbmUgU3RydWN0TWVtYmVyJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIHMp IHsKICAgIHJldHVybiAoKl9wZF9zZXEpW3NdOwogIH0KCiAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0KCgoKICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkg Y29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1 cm4gKl9wZF9zZXE7IH0KCgogIGlubGluZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJuICpf cGRfc2VxOyB9CiAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxp bmUgVComIG91dCgpIHsKICAgIGlmKCBfcGRfc2VxICkgeyBkZWxldGUgX3BkX3NlcTsgX3BkX3Nl cSA9IDA7IH0KICAgIHJldHVybiBfcGRfc2VxOwogIH0KICBpbmxpbmUgVCogX3JldG4oKSB7IFQq IHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogIGZyaWVuZCBjbGFz cyBTdHJ1Y3RNZW1iZXJTZXFfb3V0OwoKcHJpdmF0ZToKICBUKiBfcGRfc2VxOwp9OwoKY2xhc3Mg U3RydWN0TWVtYmVyU2VxX291dCB7CnB1YmxpYzoKICB0eXBlZGVmIFN0cnVjdE1lbWJlclNlcSBU OwogIHR5cGVkZWYgU3RydWN0TWVtYmVyU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIFN0cnVjdE1l bWJlclNlcV9vdXQoVComIHMpIDogX2RhdGEocykgeyBfZGF0YSA9IDA7IH0KICBpbmxpbmUgU3Ry dWN0TWVtYmVyU2VxX291dChUX3ZhciYgcykKICAgIDogX2RhdGEocy5fcGRfc2VxKSB7IHMgPSAo VCopIDA7IH0KICBpbmxpbmUgU3RydWN0TWVtYmVyU2VxX291dChjb25zdCBTdHJ1Y3RNZW1iZXJT ZXFfb3V0JiBzKSA6IF9kYXRhKHMuX2RhdGEpIHt9CiAgaW5saW5lIFN0cnVjdE1lbWJlclNlcV9v dXQmIG9wZXJhdG9yID0gKGNvbnN0IFN0cnVjdE1lbWJlclNlcV9vdXQmIHMpIHsKICAgIF9kYXRh ID0gcy5fZGF0YTsKICAgIHJldHVybiAqdGhpczsKICB9IGlubGluZSBTdHJ1Y3RNZW1iZXJTZXFf b3V0JiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICBfZGF0YSA9IHM7CiAgICByZXR1cm4gKnRoaXM7 CiAgfQogIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBU KiYgcHRyKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVCogb3BlcmF0b3ItPigpIHsgcmV0 dXJuIF9kYXRhOyB9CgogIGlubGluZSBTdHJ1Y3RNZW1iZXImIG9wZXJhdG9yIFtdIChfQ09SQkFf VUxvbmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEpW2ldOwogIH0KCiAgVComIF9kYXRhOwoKcHJp dmF0ZToKICBTdHJ1Y3RNZW1iZXJTZXFfb3V0KCk7CiAgU3RydWN0TWVtYmVyU2VxX291dCYgb3Bl cmF0b3I9KGNvbnN0IFRfdmFyJik7Cn07CgpzdHJ1Y3QgVW5pb25NZW1iZXIgewogIHR5cGVkZWYg X0NPUkJBX0NvbnN0clR5cGVfVmFyaWFibGVfVmFyPFVuaW9uTWVtYmVyPiBfdmFyX3R5cGU7Cgog IENPUkJBOjpTdHJpbmdfbWVtYmVyIG5hbWU7CgogIENPUkJBOjpBbnkgbGFiZWw7CgogIENPUkJB OjpUeXBlQ29kZV9tZW1iZXIgdHlwZTsKCiAgX0NPUkJBX09ialJlZl9NZW1iZXI8IF9vYmpyZWZf SURMVHlwZSwgSURMVHlwZV9IZWxwZXI+IHR5cGVfZGVmOwoKICBzaXplX3QgX05QX2FsaWduZWRT aXplKHNpemVfdCBpbml0aWFsb2Zmc2V0KSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPj49IChOZXRC dWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0 cmVhbSAmKTsKICB2b2lkIG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsK ICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsKfTsKCnR5cGVkZWYgVW5p b25NZW1iZXI6Ol92YXJfdHlwZSBVbmlvbk1lbWJlcl92YXI7Cgp0eXBlZGVmIF9DT1JCQV9Db25z dHJUeXBlX1ZhcmlhYmxlX09VVF9hcmc8IFVuaW9uTWVtYmVyLFVuaW9uTWVtYmVyX3ZhciA+IFVu aW9uTWVtYmVyX291dDsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Vbmlv bk1lbWJlcjsKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Vbmlvbk1lbWJl clNlcTsKCmNsYXNzIFVuaW9uTWVtYmVyU2VxX3ZhcjsKCmNsYXNzIFVuaW9uTWVtYmVyU2VxIDog cHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFVuaW9uTWVtYmVyPiB7CnB1YmxpYzoK ICB0eXBlZGVmIFVuaW9uTWVtYmVyU2VxX3ZhciBfdmFyX3R5cGU7CiAgaW5saW5lIFVuaW9uTWVt YmVyU2VxKCkge30KICBpbmxpbmUgVW5pb25NZW1iZXJTZXEoY29uc3QgVW5pb25NZW1iZXJTZXEm IHMpCiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFVuaW9uTWVtYmVyPiAocykge30K CiAgaW5saW5lIFVuaW9uTWVtYmVyU2VxKF9DT1JCQV9VTG9uZyBfbWF4KQogICAgOiBfQ09SQkFf VW5ib3VuZGVkX1NlcXVlbmNlPCBVbmlvbk1lbWJlcj4gKF9tYXgpIHt9CiAgaW5saW5lIFVuaW9u TWVtYmVyU2VxKF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgVW5pb25NZW1i ZXIqIF92YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZTwgVW5pb25NZW1iZXI+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICBpbmxp bmUgVW5pb25NZW1iZXJTZXEmIG9wZXJhdG9yID0gKGNvbnN0IFVuaW9uTWVtYmVyU2VxJiBzKSB7 CiAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBVbmlvbk1lbWJlcj4gOjpvcGVyYXRvcj0o cyk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQp9OwoKY2xhc3MgVW5pb25NZW1iZXJTZXFfb3V0OwoK Y2xhc3MgVW5pb25NZW1iZXJTZXFfdmFyIHsKcHVibGljOgogIHR5cGVkZWYgVW5pb25NZW1iZXJT ZXEgVDsKICB0eXBlZGVmIFVuaW9uTWVtYmVyU2VxX3ZhciBUX3ZhcjsKCiAgaW5saW5lIFVuaW9u TWVtYmVyU2VxX3ZhcigpIDogX3BkX3NlcSgwKSB7fQogIGlubGluZSBVbmlvbk1lbWJlclNlcV92 YXIoVCogcykgOiBfcGRfc2VxKHMpIHt9CiAgaW5saW5lIFVuaW9uTWVtYmVyU2VxX3Zhcihjb25z dCBUX3ZhciYgcykgewogICAgaWYoIHMuX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRf c2VxKTsKICAgIGVsc2UgX3BkX3NlcSA9IDA7CiAgfQogIGlubGluZSB+VW5pb25NZW1iZXJTZXFf dmFyKCkgeyBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBUX3ZhciYg b3BlcmF0b3IgPSAoVCogcykgewogICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAg IF9wZF9zZXEgPSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJh dG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7CiAgICBpZiggcy5fcGRfc2VxICkgewogICAgICBpZigg IV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsK ICAgIH0gZWxzZSBpZiggX3BkX3NlcSApIHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9w ZF9zZXEgPSAwOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFVuaW9uTWVt YmVyJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIHMpIHsKICAgIHJldHVybiAoKl9wZF9zZXEp W3NdOwogIH0KCiAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0K CgoKICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7 IH0KICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KCgogIGlubGlu ZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQmIGlu b3V0KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgVComIG91dCgpIHsKICAgIGlmKCBf cGRfc2VxICkgeyBkZWxldGUgX3BkX3NlcTsgX3BkX3NlcSA9IDA7IH0KICAgIHJldHVybiBfcGRf c2VxOwogIH0KICBpbmxpbmUgVCogX3JldG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEg PSAwOyByZXR1cm4gdG1wOyB9CgogIGZyaWVuZCBjbGFzcyBVbmlvbk1lbWJlclNlcV9vdXQ7Cgpw cml2YXRlOgogIFQqIF9wZF9zZXE7Cn07CgpjbGFzcyBVbmlvbk1lbWJlclNlcV9vdXQgewpwdWJs aWM6CiAgdHlwZWRlZiBVbmlvbk1lbWJlclNlcSBUOwogIHR5cGVkZWYgVW5pb25NZW1iZXJTZXFf dmFyIFRfdmFyOwoKICBpbmxpbmUgVW5pb25NZW1iZXJTZXFfb3V0KFQqJiBzKSA6IF9kYXRhKHMp IHsgX2RhdGEgPSAwOyB9CiAgaW5saW5lIFVuaW9uTWVtYmVyU2VxX291dChUX3ZhciYgcykKICAg IDogX2RhdGEocy5fcGRfc2VxKSB7IHMgPSAoVCopIDA7IH0KICBpbmxpbmUgVW5pb25NZW1iZXJT ZXFfb3V0KGNvbnN0IFVuaW9uTWVtYmVyU2VxX291dCYgcykgOiBfZGF0YShzLl9kYXRhKSB7fQog IGlubGluZSBVbmlvbk1lbWJlclNlcV9vdXQmIG9wZXJhdG9yID0gKGNvbnN0IFVuaW9uTWVtYmVy U2VxX291dCYgcykgewogICAgX2RhdGEgPSBzLl9kYXRhOwogICAgcmV0dXJuICp0aGlzOwogIH0g aW5saW5lIFVuaW9uTWVtYmVyU2VxX291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgX2RhdGEg PSBzOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1 cm4gX2RhdGE7IH0KICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5l IFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICBpbmxpbmUgVW5pb25NZW1iZXIm IG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgcmV0dXJuICgqX2RhdGEpW2ldOwog IH0KCiAgVComIF9kYXRhOwoKcHJpdmF0ZToKICBVbmlvbk1lbWJlclNlcV9vdXQoKTsKICBVbmlv bk1lbWJlclNlcV9vdXQmIG9wZXJhdG9yPShjb25zdCBUX3ZhciYpOwp9OwoKZXh0ZXJuIGNvbnN0 IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX0VudW1NZW1iZXJTZXE7CgpjbGFzcyBFbnVtTWVtYmVy U2VxX3ZhcjsKCmNsYXNzIEVudW1NZW1iZXJTZXEgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9fU3RyaW5nIHsKcHVibGljOgogIHR5cGVkZWYgRW51bU1lbWJlclNlcV92YXIgX3Zh cl90eXBlOwogIGlubGluZSBFbnVtTWVtYmVyU2VxKCkge30KICBpbmxpbmUgRW51bU1lbWJlclNl cShjb25zdCBFbnVtTWVtYmVyU2VxJiBzKQogICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNl X19TdHJpbmcocykge30KCiAgaW5saW5lIEVudW1NZW1iZXJTZXEoX0NPUkJBX1VMb25nIF9tYXgp CiAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyhfbWF4KSB7fQogIGlubGlu ZSBFbnVtTWVtYmVyU2VxKF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgY2hh cioqIF92YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgIDogX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9fU3RyaW5nKF9tYXgsIF9sZW4sIF92YWwsIF9yZWwpIHt9CgogIGlubGluZSBFbnVt TWVtYmVyU2VxJiBvcGVyYXRvciA9IChjb25zdCBFbnVtTWVtYmVyU2VxJiBzKSB7CiAgICBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlX19TdHJpbmc6Om9wZXJhdG9yPShzKTsKICAgIHJldHVybiAq dGhpczsKICB9Cn07CgpjbGFzcyBFbnVtTWVtYmVyU2VxX291dDsKCmNsYXNzIEVudW1NZW1iZXJT ZXFfdmFyIHsKcHVibGljOgogIHR5cGVkZWYgRW51bU1lbWJlclNlcSBUOwogIHR5cGVkZWYgRW51 bU1lbWJlclNlcV92YXIgVF92YXI7CgogIGlubGluZSBFbnVtTWVtYmVyU2VxX3ZhcigpIDogX3Bk X3NlcSgwKSB7fQogIGlubGluZSBFbnVtTWVtYmVyU2VxX3ZhcihUKiBzKSA6IF9wZF9zZXEocykg e30KICBpbmxpbmUgRW51bU1lbWJlclNlcV92YXIoY29uc3QgVF92YXImIHMpIHsKICAgIGlmKCBz Ll9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQoKnMuX3BkX3NlcSk7CiAgICBlbHNlIF9wZF9zZXEg PSAwOwogIH0KICBpbmxpbmUgfkVudW1NZW1iZXJTZXFfdmFyKCkgeyBpZiggX3BkX3NlcSApIGRl bGV0ZSBfcGRfc2VxOyB9CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoVCogcykgewogICAg aWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgIF9wZF9zZXEgPSBzOwogICAgcmV0dXJu ICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7 CiAgICBpZiggcy5fcGRfc2VxICkgewogICAgICBpZiggIV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3 IFQ7CiAgICAgICpfcGRfc2VxID0gKnMuX3BkX3NlcTsKICAgIH0gZWxzZSBpZiggX3BkX3NlcSAp IHsKICAgICAgZGVsZXRlIF9wZF9zZXE7CiAgICAgIF9wZF9zZXEgPSAwOwogICAgfQogICAgcmV0 dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCBvcGVyYXRvciBb XSAoX0NPUkJBX1VMb25nIHMpIHsKICAgIHJldHVybiAoKl9wZF9zZXEpW3NdOwogIH0KCiAgaW5s aW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0KCgoKICBpbmxpbmUgb3Bl cmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICBpbmxpbmUgb3Bl cmF0b3IgVCYgKCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KCgogIGlubGluZSBjb25zdCBUJiBpbigp IGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9CiAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4g Kl9wZF9zZXE7IH0KICBpbmxpbmUgVComIG91dCgpIHsKICAgIGlmKCBfcGRfc2VxICkgeyBkZWxl dGUgX3BkX3NlcTsgX3BkX3NlcSA9IDA7IH0KICAgIHJldHVybiBfcGRfc2VxOwogIH0KICBpbmxp bmUgVCogX3JldG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1w OyB9CgogIGZyaWVuZCBjbGFzcyBFbnVtTWVtYmVyU2VxX291dDsKCnByaXZhdGU6CiAgVCogX3Bk X3NlcTsKfTsKCmNsYXNzIEVudW1NZW1iZXJTZXFfb3V0IHsKcHVibGljOgogIHR5cGVkZWYgRW51 bU1lbWJlclNlcSBUOwogIHR5cGVkZWYgRW51bU1lbWJlclNlcV92YXIgVF92YXI7CgogIGlubGlu ZSBFbnVtTWVtYmVyU2VxX291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsgfQogIGlu bGluZSBFbnVtTWVtYmVyU2VxX291dChUX3ZhciYgcykKICAgIDogX2RhdGEocy5fcGRfc2VxKSB7 IHMgPSAoVCopIDA7IH0KICBpbmxpbmUgRW51bU1lbWJlclNlcV9vdXQoY29uc3QgRW51bU1lbWJl clNlcV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICBpbmxpbmUgRW51bU1lbWJlclNlcV9v dXQmIG9wZXJhdG9yID0gKGNvbnN0IEVudW1NZW1iZXJTZXFfb3V0JiBzKSB7CiAgICBfZGF0YSA9 IHMuX2RhdGE7CiAgICByZXR1cm4gKnRoaXM7CiAgfSBpbmxpbmUgRW51bU1lbWJlclNlcV9vdXQm IG9wZXJhdG9yID0gKFQqIHMpIHsKICAgIF9kYXRhID0gczsKICAgIHJldHVybiAqdGhpczsKICB9 CiAgaW5saW5lIG9wZXJhdG9yIFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFQqJiBw dHIoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4g X2RhdGE7IH0KCiAgaW5saW5lIF9DT1JCQV9TdHJpbmdfZWxlbWVudCBvcGVyYXRvciBbXSAoX0NP UkJBX1VMb25nIGkpIHsKICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICB9CgogIFQqJiBfZGF0YTsK CnByaXZhdGU6CiAgRW51bU1lbWJlclNlcV9vdXQoKTsKICBFbnVtTWVtYmVyU2VxX291dCYgb3Bl cmF0b3I9KGNvbnN0IFRfdmFyJik7Cn07CiMgMTQyMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlP UkIzL0NPUkJBLmgiIDIgMwoKCiAgY2xhc3MgSW50ZXJmYWNlRGVmOwogIGNsYXNzIF9vYmpyZWZf SW50ZXJmYWNlRGVmOwoKICBjbGFzcyBJbXBsZW1lbnRhdGlvbkRlZiB7fTsKICB0eXBlZGVmIElt cGxlbWVudGF0aW9uRGVmKiBJbXBsZW1lbnRhdGlvbkRlZl9wdHI7CiAgdHlwZWRlZiBJbXBsZW1l bnRhdGlvbkRlZl9wdHIgSW1wbGVtZW50YXRpb25EZWZSZWY7CgogIGNsYXNzIE9wZXJhdGlvbkRl ZjsKICBjbGFzcyBfb2JqcmVmX09wZXJhdGlvbkRlZjsKCiAgY2xhc3MgU2VydmVyUmVxdWVzdDsK ICB0eXBlZGVmIFNlcnZlclJlcXVlc3QqIFNlcnZlclJlcXVlc3RfcHRyOwogIHR5cGVkZWYgU2Vy dmVyUmVxdWVzdF9wdHIgU2VydmVyUmVxdWVzdFJlZjsKCiAgY2xhc3MgUmVxdWVzdDsKICB0eXBl ZGVmIFJlcXVlc3QqIFJlcXVlc3RfcHRyOwogIHR5cGVkZWYgUmVxdWVzdF9wdHIgUmVxdWVzdFJl ZjsKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFJlcXVlc3Q+IFJlcXVlc3RfdmFyOwog IHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8UmVxdWVzdCxSZXF1ZXN0X3Zhcj4gUmVxdWVz dF9vdXQ7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxSZXF1ZXN0LFJlcXVlc3Rf dmFyPiBSZXF1ZXN0X21lbWJlcjsKCgoKCgogIGNsYXNzIE9iamVjdF9IZWxwZXIgewogIHB1Ymxp YzoKICAgIHR5cGVkZWYgT2JqZWN0X3B0ciBfcHRyX3R5cGU7CgogICAgc3RhdGljIF9wdHJfdHlw ZSBfbmlsKCk7CiAgICBzdGF0aWMgX0NPUkJBX0Jvb2xlYW4gaXNfbmlsKF9wdHJfdHlwZSk7CiAg ICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgdm9pZCBkdXBsaWNh dGUoX3B0cl90eXBlKTsKICAgIHN0YXRpYyBzaXplX3QgTlBfYWxpZ25lZFNpemUoX3B0cl90eXBl LCBzaXplX3QpOwogICAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1 ZmZlcmVkU3RyZWFtJik7CiAgICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRC dWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUs IE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJl ZihNZW1CdWZmZXJlZFN0cmVhbSYpOwogIH07CgogIGNsYXNzIE9iamVjdCB7CiAgcHVibGljOgog ICAgdHlwZWRlZiBPYmplY3RfcHRyIF9wdHJfdHlwZTsKICAgIHR5cGVkZWYgT2JqZWN0X3ZhciBf dmFyX3R5cGU7CgogICAgdmlydHVhbCB+T2JqZWN0KCk7CgogICAgU3RhdHVzIF9jcmVhdGVfcmVx dWVzdChDb250ZXh0X3B0ciBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNo YXIgKm9wZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTlZMaXN0X3B0ciBhcmdf bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRWYWx1ZV9wdHIgcmVzdWx0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0X291dCByZXF1ZXN0LAogICAgICAgICAg ICAgICAgICAgICAgICAgICBGbGFncyByZXFfZmxhZ3MpOwoKICAgIFN0YXR1cyBfY3JlYXRlX3Jl cXVlc3QoQ29udGV4dF9wdHIgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBj aGFyICpvcGVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WTGlzdF9wdHIgYXJn X2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkVmFsdWVfcHRyIHJlc3VsdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uTGlzdF9wdHIgZXhjZXB0aW9ucywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dExpc3RfcHRyIGN0eGxpc3QsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3Rfb3V0IHJlcXVlc3QsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIEZsYWdzIHJlcV9mbGFncyk7CgogICAgUmVxdWVzdF9wdHIgX3JlcXVlc3Qo Y29uc3QgY2hhciogb3BlcmF0aW9uKTsKCiAgICBJbXBsZW1lbnRhdGlvbkRlZl9wdHIgX2dldF9p bXBsZW1lbnRhdGlvbigpOwogICAgX29ianJlZl9JbnRlcmZhY2VEZWYqIF9nZXRfaW50ZXJmYWNl KCk7CgoKICAgIEJvb2xlYW4gX2lzX2EoY29uc3QgY2hhciogcmVwb0lkKTsKICAgIHZpcnR1YWwg Qm9vbGVhbiBfbm9uX2V4aXN0ZW50KCk7CiAgICBCb29sZWFuIF9pc19lcXVpdmFsZW50KF9wdHJf dHlwZSBvdGhlcl9vYmplY3QpOwogICAgVUxvbmcgX2hhc2goVUxvbmcgbWF4aW11bSk7CgogICAg c3RhdGljIF9wdHJfdHlwZSBfZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgaW5saW5l IF9wdHJfdHlwZSBfbmFycm93KE9iamVjdF9wdHIgbykgeyByZXR1cm4gX2R1cGxpY2F0ZShvKTsg fQogICAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CgoKCgoKICAgIGlubGluZSBPYmplY3QoKSA6 IHBkX29iaigwKSwgcGRfbWFnaWMoX1BSX21hZ2ljKSB7fQoKICAgIGlubGluZSBCb29sZWFuIF9O UF9pc19uaWwoKSBjb25zdCB7IHJldHVybiBwZF9vYmogPT0gMDsgfQogICAgaW5saW5lIEJvb2xl YW4gX05QX2lzX3BzZXVkbygpIGNvbnN0IHsgcmV0dXJuIHBkX29iaiA9PSAob21uaU9ialJlZiop IDE7IH0KICAgIGlubGluZSBvbW5pT2JqUmVmKiBfUFJfZ2V0b2JqKCkgeyByZXR1cm4gcGRfb2Jq OyB9CiAgICBpbmxpbmUgdm9pZCBfUFJfc2V0b2JqKG9tbmlPYmpSZWYqIG8pIHsgcGRfb2JqID0g bzsgfQogICAgc3RhdGljIGlubGluZSBfQ09SQkFfQm9vbGVhbiBfUFJfaXNfdmFsaWQoT2JqZWN0 X3B0ciBwKSB7CiAgICAgIHJldHVybiBwID8gKHAtPnBkX21hZ2ljID09IF9QUl9tYWdpYykgOiAx OwogICAgfQoKICAgIHZpcnR1YWwgdm9pZCBfTlBfaW5jclJlZkNvdW50KCk7CiAgICB2aXJ0dWFs IHZvaWQgX05QX2RlY3JSZWZDb3VudCgpOwogICAgdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYo Y29uc3QgY2hhciogcmVwb0lkKTsKCiAgICBzdGF0aWMgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShP YmplY3RfcHRyLCBzaXplX3QpOwogICAgc3RhdGljIHZvaWQgX21hcnNoYWxPYmpSZWYoT2JqZWN0 X3B0ciwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyBPYmplY3RfcHRyIF91bm1hcnNo YWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyB2b2lkIF9tYXJzaGFsT2Jq UmVmKE9iamVjdF9wdHIsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgICBzdGF0aWMgT2JqZWN0X3B0 ciBfdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogICAgc3RhdGljIGNvbnN0 IGNoYXIqIF9QRF9yZXBvSWQ7CiAgICBzdGF0aWMgY29uc3QgVUxvbmcgX1BSX21hZ2ljOwoKICBw cml2YXRlOgogICAgb21uaU9ialJlZiogcGRfb2JqOwoKCiAgICBVTG9uZyBwZF9tYWdpYzsKICB9 OwoKCgoKCgoKICBzdHJ1Y3QgUFJfc3RydWN0TWVtYmVyIHsKICAgIGNvbnN0IGNoYXIqIG5hbWU7 CiAgICBUeXBlQ29kZV9wdHIgdHlwZTsKICB9OwoKICB0eXBlZGVmIFVMb25nIFBSX3VuaW9uRGlz Y3JpbWluYXRvcjsKCiAgc3RydWN0IFBSX3VuaW9uTWVtYmVyIHsKICAgIGNvbnN0IGNoYXIqIG5h bWU7CiAgICBUeXBlQ29kZV9wdHIgdHlwZTsKICAgIFBSX3VuaW9uRGlzY3JpbWluYXRvciBsYWJl bDsKICB9OwoKICBlbnVtIFRDS2luZCB7CiAgICB0a19udWxsID0gMCwKICAgIHRrX3ZvaWQgPSAx LAogICAgdGtfc2hvcnQgPSAyLAogICAgdGtfbG9uZyA9IDMsCiAgICB0a191c2hvcnQgPSA0LAog ICAgdGtfdWxvbmcgPSA1LAogICAgdGtfZmxvYXQgPSA2LAogICAgdGtfZG91YmxlID0gNywKICAg IHRrX2Jvb2xlYW4gPSA4LAogICAgdGtfY2hhciA9IDksCiAgICB0a19vY3RldCA9IDEwLAogICAg dGtfYW55ID0gMTEsCiAgICB0a19UeXBlQ29kZSA9IDEyLAogICAgdGtfUHJpbmNpcGFsPSAxMywK ICAgIHRrX29ianJlZiA9IDE0LAogICAgdGtfc3RydWN0ID0gMTUsCiAgICB0a191bmlvbiA9IDE2 LAogICAgdGtfZW51bSA9IDE3LAogICAgdGtfc3RyaW5nID0gMTgsCiAgICB0a19zZXF1ZW5jZSA9 IDE5LAogICAgdGtfYXJyYXkgPSAyMCwKICAgIHRrX2FsaWFzID0gMjEsCiAgICB0a19leGNlcHQg PSAyMiwKICAgIHRrX2xvbmdsb25nID0gMjMsCiAgICB0a191bG9uZ2xvbmcgPSAyNCwKICAgIHRr X2xvbmdkb3VibGUgPSAyNQogIH07CgoKICBjbGFzcyBUeXBlQ29kZSB7CiAgcHVibGljOgogICAg dmlydHVhbCB+VHlwZUNvZGUoKTsKCiAgICBUQ0tpbmQga2luZCgpIGNvbnN0OwoKICAgIEJvb2xl YW4gZXF1YWwoVHlwZUNvZGVfcHRyIFRDcCkgY29uc3Q7CgogICAgQm9vbGVhbiBlcXVpdmFsZW50 KFR5cGVDb2RlX3B0ciBUQ3ApIGNvbnN0OwoKCiAgICBUeXBlQ29kZV9wdHIgZ2V0X2NvbXBhY3Rf dHlwZWNvZGUoKSBjb25zdDsKCgogICAgY29uc3QgY2hhciogaWQoKSBjb25zdDsKICAgIGNvbnN0 IGNoYXIqIG5hbWUoKSBjb25zdDsKCiAgICBVTG9uZyBtZW1iZXJfY291bnQoKSBjb25zdDsKICAg IGNvbnN0IGNoYXIqIG1lbWJlcl9uYW1lKFVMb25nIGluZGV4KSBjb25zdDsKCiAgICBUeXBlQ29k ZV9wdHIgbWVtYmVyX3R5cGUoVUxvbmcgaSkgY29uc3Q7CgogICAgQW55KiBtZW1iZXJfbGFiZWwo VUxvbmcgaSkgY29uc3Q7CiAgICBUeXBlQ29kZV9wdHIgZGlzY3JpbWluYXRvcl90eXBlKCkgY29u c3Q7CiAgICBMb25nIGRlZmF1bHRfaW5kZXgoKSBjb25zdDsKCiAgICBVTG9uZyBsZW5ndGgoKSBj b25zdDsKCiAgICBUeXBlQ29kZV9wdHIgY29udGVudF90eXBlKCkgY29uc3Q7CgogICAgTG9uZyBw YXJhbV9jb3VudCgpIGNvbnN0OwogICAgQW55KiBwYXJhbWV0ZXIoTG9uZyBpbmRleCkgY29uc3Q7 CiMgMTYyNSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDMKICAgIHN0YXRp YyBUeXBlQ29kZV9wdHIgX2R1cGxpY2F0ZShUeXBlQ29kZV9wdHIgdCk7CiAgICBzdGF0aWMgVHlw ZUNvZGVfcHRyIF9uaWwoKTsKCgoKICAgIGNsYXNzIEJvdW5kcyA6IHB1YmxpYyBVc2VyRXhjZXB0 aW9uIHsgcHVibGljOiBpbmxpbmUgQm91bmRzKCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0 VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5l IEJvdW5kcyhjb25zdCBCb3VuZHMmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5l IEJvdW5kcyYgb3BlcmF0b3I9KGNvbnN0IEJvdW5kcyYgX2V4KSB7ICogKFVzZXJFeGNlcHRpb24q KSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+Qm91bmRzKCk7IHZpcnR1YWwg dm9pZCBfcmFpc2UoKTsgc3RhdGljIEJvdW5kcyogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0 aWMgY29uc3QgQm91bmRzKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxp bmUgQm91bmRzKiBfbmFycm93KEV4Y2VwdGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4 KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0 dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29u c3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7 fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2 b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30gc3RhdGljIGluc2VydEV4Y2Vw dGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBp bnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTog dmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBj aGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChp bnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJl YW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikg Y29uc3Q7IH07CiAgICBjbGFzcyBCYWRLaW5kIDogcHVibGljIFVzZXJFeGNlcHRpb24geyBwdWJs aWM6IGlubGluZSBCYWRLaW5kKCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsg cGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEJhZEtpbmQo Y29uc3QgQmFkS2luZCYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgQmFkS2lu ZCYgb3BlcmF0b3I9KGNvbnN0IEJhZEtpbmQmIF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikgdGhp cyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkJhZEtpbmQoKTsgdmlydHVhbCB2b2lk IF9yYWlzZSgpOyBzdGF0aWMgQmFkS2luZCogX2Rvd25jYXN0KEV4Y2VwdGlvbiopOyBzdGF0aWMg Y29uc3QgQmFkS2luZCogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5l IEJhZEtpbmQqIF9uYXJyb3coRXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgp OyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1 cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25z dCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9 IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZv aWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0 aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGlu c2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2 aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNo YXIqIF9OUF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGlu dCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVh bSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBj b25zdDsgfTsKCiAgICBzdGF0aWMgdm9pZCBtYXJzaGFsVHlwZUNvZGUoVHlwZUNvZGVfcHRyIG9i aixOZXRCdWZmZXJlZFN0cmVhbSYgcyk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIHVubWFyc2hh bFR5cGVDb2RlKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKTsKCgogICAgc3RhdGljIHZvaWQgbWFyc2hh bFR5cGVDb2RlKFR5cGVDb2RlX3B0ciBvYmosTWVtQnVmZmVyZWRTdHJlYW0mIHMpOwogICAgc3Rh dGljIFR5cGVDb2RlX3B0ciB1bm1hcnNoYWxUeXBlQ29kZShNZW1CdWZmZXJlZFN0cmVhbSYgcyk7 CiMgMTY1NCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDMKICAgIHN0YXRp YyBUeXBlQ29kZV9wdHIgTlBfdW5pb25fdGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5h bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVDb2RlX3B0ciBkaXNj cmltaW5hdG9yX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IFVuaW9uTWVtYmVyU2VxJiBtZW1iZXJzKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfZW51 bV90Yyhjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBFbnVtTWVtYmVyU2VxJiBtZW1iZXJzKTsKICAgIHN0YXRp YyBUeXBlQ29kZV9wdHIgTlBfYWxpYXNfdGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5h bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVDb2RlX3B0ciBvcmln aW5hbF90eXBlKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfaW50ZXJmYWNlX3RjKGNvbnN0 IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBf c3RyaW5nX3RjKFVMb25nIGJvdW5kKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgTlBfc2VxdWVu Y2VfdGMoVUxvbmcgYm91bmQsIFR5cGVDb2RlX3B0ciBlbGVtZW50X3R5cGUpOwogICAgc3RhdGlj IFR5cGVDb2RlX3B0ciBOUF9hcnJheV90YyhVTG9uZyBsZW5ndGgsIFR5cGVDb2RlX3B0ciBlbGVt ZW50X3R5cGUpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBOUF9yZWN1cnNpdmVfc2VxdWVuY2Vf dGMoVUxvbmcgYm91bmQsIFVMb25nIG9mZnNldCk7CgoKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIg UFJfc3RydWN0X3RjKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFJfc3RydWN0TWVtYmVyKiBtZW1iZXJz LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxvbmcgbWVtYmVyQ291bnQp OwoKCiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX3VuaW9uX3RjKGNvbnN0IGNoYXIqIGlkLCBj b25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBl Q29kZV9wdHIgZGlzY3JpbWluYXRvcl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBQUl91bmlvbk1lbWJlciogbWVtYmVycywKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgVUxvbmcgbWVtYmVyQ291bnQsIExvbmcgZGVmbHQgPSAtMSk7CiAg ICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX2VudW1fdGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNo YXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioq IG1lbWJlcnMsIFVMb25nIG1lbWJlckNvdW50KTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJf YWxpYXNfdGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFR5cGVDb2RlX3B0ciBvcmlnaW5hbF90eXBlKTsKICAgIHN0 YXRpYyBUeXBlQ29kZV9wdHIgUFJfZXhjZXB0aW9uX3RjKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBj aGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg UFJfc3RydWN0TWVtYmVyKiBtZW1iZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgVUxvbmcgbWVtYmVyQ291bnQpOwoKCiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBS X2ludGVyZmFjZV90Yyhjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFtZSk7CiAgICBzdGF0 aWMgVHlwZUNvZGVfcHRyIFBSX3N0cmluZ190YyhVTG9uZyBib3VuZCk7CiAgICBzdGF0aWMgVHlw ZUNvZGVfcHRyIFBSX3NlcXVlbmNlX3RjKFVMb25nIGJvdW5kLCBUeXBlQ29kZV9wdHIgZWxlbWVu dF90eXBlKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfYXJyYXlfdGMoVUxvbmcgbGVuZ3Ro LCBUeXBlQ29kZV9wdHIgZWxlbWVudF90eXBlKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJf cmVjdXJzaXZlX3NlcXVlbmNlX3RjKFVMb25nIGJvdW5kLCBVTG9uZyBvZmZzZXQpOwogICAgc3Rh dGljIFR5cGVDb2RlX3B0ciBQUl9udWxsX3RjKCk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBS X3ZvaWRfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfc2hvcnRfdGMoKTsKICAgIHN0 YXRpYyBUeXBlQ29kZV9wdHIgUFJfbG9uZ190YygpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBQ Ul91c2hvcnRfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfdWxvbmdfdGMoKTsKICAg IHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfZmxvYXRfdGMoKTsKICAgIHN0YXRpYyBUeXBlQ29kZV9w dHIgUFJfZG91YmxlX3RjKCk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBSX2Jvb2xlYW5fdGMo KTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfY2hhcl90YygpOwogICAgc3RhdGljIFR5cGVD b2RlX3B0ciBQUl9vY3RldF90YygpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBQUl9hbnlfdGMo KTsKICAgIHN0YXRpYyBUeXBlQ29kZV9wdHIgUFJfVHlwZUNvZGVfdGMoKTsKICAgIHN0YXRpYyBU eXBlQ29kZV9wdHIgUFJfUHJpbmNpcGFsX3RjKCk7CiAgICBzdGF0aWMgVHlwZUNvZGVfcHRyIFBS X09iamVjdF90YygpOwogICAgc3RhdGljIFR5cGVDb2RlX3B0ciBQUl9zdHJpbmdfdGMoKTsKCgog ICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAg ICB2aXJ0dWFsIENPUkJBOjpCb29sZWFuIE5QX2lzX25pbCgpIGNvbnN0OwoKICAgIHN0YXRpYyBp bmxpbmUgX0NPUkJBX0Jvb2xlYW4gUFJfaXNfdmFsaWQoVHlwZUNvZGVfcHRyIHAgKSB7CiAgICAg IHJldHVybiAoKHApID8gKHAtPnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAgfQogICAg c3RhdGljIGNvbnN0IENPUkJBOjpVTG9uZyBQUl9tYWdpYzsKCiAgcHJvdGVjdGVkOgoKICAgIFR5 cGVDb2RlKGNvbnN0IFR5cGVDb2RlJiB0Yyk7CiAgICBUeXBlQ29kZSYgb3BlcmF0b3I9KGNvbnN0 IFR5cGVDb2RlJiB0Yyk7CiAgICBUeXBlQ29kZSgpIHsgcGRfbWFnaWMgPSBQUl9tYWdpYzsgfTsK CiAgICBfQ09SQkFfVUxvbmcgcGRfbWFnaWM7CiAgfTsKCgoKCgoKICBleHRlcm4gVHlwZUNvZGVf cHRyIF90Y19udWxsOwogIGV4dGVybiBUeXBlQ29kZV9wdHIgX3RjX3ZvaWQ7CiAgZXh0ZXJuIFR5 cGVDb2RlX3B0ciBfdGNfc2hvcnQ7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfbG9uZzsKICBl eHRlcm4gVHlwZUNvZGVfcHRyIF90Y191c2hvcnQ7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNf dWxvbmc7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfZmxvYXQ7CiAgZXh0ZXJuIFR5cGVDb2Rl X3B0ciBfdGNfZG91YmxlOwogIGV4dGVybiBUeXBlQ29kZV9wdHIgX3RjX2Jvb2xlYW47CiAgZXh0 ZXJuIFR5cGVDb2RlX3B0ciBfdGNfY2hhcjsKICBleHRlcm4gVHlwZUNvZGVfcHRyIF90Y19vY3Rl dDsKICBleHRlcm4gVHlwZUNvZGVfcHRyIF90Y19hbnk7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBf dGNfVHlwZUNvZGU7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfUHJpbmNpcGFsOwogIGV4dGVy biBUeXBlQ29kZV9wdHIgX3RjX09iamVjdDsKICBleHRlcm4gVHlwZUNvZGVfcHRyIF90Y19zdHJp bmc7CiAgZXh0ZXJuIFR5cGVDb2RlX3B0ciBfdGNfTmFtZWRWYWx1ZTsKCgoKCgoKICBjbGFzcyBE eW5Bbnk7CiAgdHlwZWRlZiBEeW5BbnkqIER5bkFueV9wdHI7CiAgdHlwZWRlZiBEeW5BbnlfcHRy IER5bkFueVJlZjsKCiAgY2xhc3MgRHluRW51bTsKICB0eXBlZGVmIER5bkVudW0qIER5bkVudW1f cHRyOwogIHR5cGVkZWYgRHluRW51bV9wdHIgRHluRW51bVJlZjsKCiAgY2xhc3MgRHluU3RydWN0 OwogIHR5cGVkZWYgRHluU3RydWN0KiBEeW5TdHJ1Y3RfcHRyOwogIHR5cGVkZWYgRHluU3RydWN0 X3B0ciBEeW5TdHJ1Y3RSZWY7CgogIGNsYXNzIER5blVuaW9uOwogIHR5cGVkZWYgRHluVW5pb24q IER5blVuaW9uX3B0cjsKICB0eXBlZGVmIER5blVuaW9uX3B0ciBEeW5VbmlvblJlZjsKCiAgY2xh c3MgRHluU2VxdWVuY2U7CiAgdHlwZWRlZiBEeW5TZXF1ZW5jZSogRHluU2VxdWVuY2VfcHRyOwog IHR5cGVkZWYgRHluU2VxdWVuY2VfcHRyIER5blNlcXVlbmNlUmVmOwoKICBjbGFzcyBEeW5BcnJh eTsKICB0eXBlZGVmIER5bkFycmF5KiBEeW5BcnJheV9wdHI7CiAgdHlwZWRlZiBEeW5BcnJheV9w dHIgRHluQXJyYXlSZWY7CgoKCgoKCiAgY2xhc3MgRHluQW55IHsKICBwdWJsaWM6CgogICAgY2xh c3MgSW52YWxpZCA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgSW52YWxp ZCgpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5O Q1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBJbnZhbGlkKGNvbnN0IEludmFsaWQmIF9l eCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5lIEludmFsaWQmIG9wZXJhdG9yPShjb25z dCBJbnZhbGlkJiBfZXgpIHsgKiAoVXNlckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAq dGhpczsgfSB2aXJ0dWFsIH5JbnZhbGlkKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGlj IEludmFsaWQqIF9kb3duY2FzdChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEludmFsaWQqIF9k b3duY2FzdChjb25zdCBFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBJbnZhbGlkKiBfbmFycm93 KEV4Y2VwdGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90 IF9OUF9hbGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2 b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQg b3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVy YXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1l bUJ1ZmZlcmVkU3RyZWFtJikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRv QW55Rm47IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBz dGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24q IF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkg Y29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2 aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVh bCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFz cyBJbnZhbGlkVmFsdWUgOiBwdWJsaWMgVXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIElu dmFsaWRWYWx1ZSgpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2Vy dFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBJbnZhbGlkVmFsdWUoY29u c3QgSW52YWxpZFZhbHVlJiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBJbnZh bGlkVmFsdWUmIG9wZXJhdG9yPShjb25zdCBJbnZhbGlkVmFsdWUmIF9leCkgeyAqIChVc2VyRXhj ZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkludmFsaWRWYWx1 ZSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBJbnZhbGlkVmFsdWUqIF9kb3duY2Fz dChFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEludmFsaWRWYWx1ZSogX2Rvd25jYXN0KGNvbnN0 IEV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIEludmFsaWRWYWx1ZSogX25hcnJvdyhFeGNlcHRp b24qIF9leCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxp Z25lZFNpemUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVy YXRvcj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9y Pj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0o TmV0QnVmZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJl ZFN0cmVhbSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBz dGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNv bnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgRXhjZXB0aW9uKiBfTlBfZHVw bGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2 aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2 b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBf TlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgVHlwZU1p c21hdGNoIDogcHVibGljIFVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBUeXBlTWlzbWF0 Y2goKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZu TkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgVHlwZU1pc21hdGNoKGNvbnN0IFR5cGVN aXNtYXRjaCYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgVHlwZU1pc21hdGNo JiBvcGVyYXRvcj0oY29uc3QgVHlwZU1pc21hdGNoJiBfZXgpIHsgKiAoVXNlckV4Y2VwdGlvbiop IHRoaXMgPSBfZXg7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5UeXBlTWlzbWF0Y2goKTsgdmly dHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgVHlwZU1pc21hdGNoKiBfZG93bmNhc3QoRXhjZXB0 aW9uKik7IHN0YXRpYyBjb25zdCBUeXBlTWlzbWF0Y2gqIF9kb3duY2FzdChjb25zdCBFeGNlcHRp b24qKTsgc3RhdGljIGlubGluZSBUeXBlTWlzbWF0Y2gqIF9uYXJyb3coRXhjZXB0aW9uKiBfZXgp IHsgcmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXpl KHNpemVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0o TmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1C dWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZl cmVkU3RyZWFtJikge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0m KSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGlu c2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFy KiBfUERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFsIEV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgp IGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBj b25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBf bWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNo YWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgfTsKICAgIGNsYXNzIEludmFsaWRTZXEgOiBw dWJsaWMgVXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIEludmFsaWRTZXEoKSB7IHBkX2lu c2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0 VG9BbnlGbk5DUDsgfSBpbmxpbmUgSW52YWxpZFNlcShjb25zdCBJbnZhbGlkU2VxJiBfZXgpIDog VXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBJbnZhbGlkU2VxJiBvcGVyYXRvcj0oY29uc3Qg SW52YWxpZFNlcSYgX2V4KSB7ICogKFVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4g KnRoaXM7IH0gdmlydHVhbCB+SW52YWxpZFNlcSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0 YXRpYyBJbnZhbGlkU2VxKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBJbnZh bGlkU2VxKiBfZG93bmNhc3QoY29uc3QgRXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgSW52YWxp ZFNlcSogX25hcnJvdyhFeGNlcHRpb24qIF9leCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0g aW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBv czsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9 IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5s aW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBv cGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVhbSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25U b0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0 VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1 YWwgRXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciog X05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBz aXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikg Y29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0 OyB9OwoKICAgIHR5cGVkZWYgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgT2N0ZXRT ZXE7CgogICAgdmlydHVhbCB+RHluQW55KCk7CgogICAgdmlydHVhbCBUeXBlQ29kZV9wdHIgdHlw ZSgpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBhc3NpZ24oRHluQW55X3B0ciBkeW5fYW55 KSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgZnJvbV9hbnkoY29uc3QgQW55JiB2YWx1ZSkgPSAwOwog ICAgdmlydHVhbCBBbnkqIHRvX2FueSgpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkg PSAwOwogICAgdmlydHVhbCBEeW5BbnlfcHRyIGNvcHkoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQg aW5zZXJ0X2Jvb2xlYW4oQm9vbGVhbiB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCB2b2lkIGluc2Vy dF9vY3RldChPY3RldCB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCB2b2lkIGluc2VydF9jaGFyKENo YXIgdmFsdWUpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRfc2hvcnQoU2hvcnQgdmFsdWUp ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRfdXNob3J0KFVTaG9ydCB2YWx1ZSkgPSAwOwog ICAgdmlydHVhbCB2b2lkIGluc2VydF9sb25nKExvbmcgdmFsdWUpID0gMDsKICAgIHZpcnR1YWwg dm9pZCBpbnNlcnRfdWxvbmcoVUxvbmcgdmFsdWUpID0gMDsKCiAgICB2aXJ0dWFsIHZvaWQgaW5z ZXJ0X2Zsb2F0KEZsb2F0IHZhbHVlKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0X2RvdWJs ZShEb3VibGUgdmFsdWUpID0gMDsKCiAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0X3N0cmluZyhjb25z dCBjaGFyKiB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCB2b2lkIGluc2VydF9yZWZlcmVuY2UoT2Jq ZWN0X3B0ciB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCB2b2lkIGluc2VydF90eXBlY29kZShUeXBl Q29kZV9wdHIgdmFsdWUpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRfYW55KGNvbnN0IEFu eSYgdmFsdWUpID0gMDsKICAgIHZpcnR1YWwgQm9vbGVhbiBnZXRfYm9vbGVhbigpID0gMDsKICAg IHZpcnR1YWwgT2N0ZXQgZ2V0X29jdGV0KCkgPSAwOwogICAgdmlydHVhbCBDaGFyIGdldF9jaGFy KCkgPSAwOwogICAgdmlydHVhbCBTaG9ydCBnZXRfc2hvcnQoKSA9IDA7CiAgICB2aXJ0dWFsIFVT aG9ydCBnZXRfdXNob3J0KCkgPSAwOwogICAgdmlydHVhbCBMb25nIGdldF9sb25nKCkgPSAwOwog ICAgdmlydHVhbCBVTG9uZyBnZXRfdWxvbmcoKSA9IDA7CgogICAgdmlydHVhbCBGbG9hdCBnZXRf ZmxvYXQoKSA9IDA7CiAgICB2aXJ0dWFsIERvdWJsZSBnZXRfZG91YmxlKCkgPSAwOwoKICAgIHZp cnR1YWwgY2hhciogZ2V0X3N0cmluZygpID0gMDsKICAgIHZpcnR1YWwgT2JqZWN0X3B0ciBnZXRf cmVmZXJlbmNlKCkgPSAwOwogICAgdmlydHVhbCBUeXBlQ29kZV9wdHIgZ2V0X3R5cGVjb2RlKCkg PSAwOwogICAgdmlydHVhbCBBbnkqIGdldF9hbnkoKSA9IDA7CiAgICB2aXJ0dWFsIER5bkFueV9w dHIgY3VycmVudF9jb21wb25lbnQoKSA9IDA7CiAgICB2aXJ0dWFsIEJvb2xlYW4gbmV4dCgpID0g MDsKICAgIHZpcnR1YWwgQm9vbGVhbiBzZWVrKExvbmcgaW5kZXgpID0gMDsKICAgIHZpcnR1YWwg dm9pZCByZXdpbmQoKSA9IDA7CgogICAgc3RhdGljIER5bkFueV9wdHIgX2R1cGxpY2F0ZShEeW5B bnlfcHRyKTsKICAgIHN0YXRpYyBEeW5BbnlfcHRyIF9uYXJyb3coRHluQW55X3B0cik7CiAgICBz dGF0aWMgRHluQW55X3B0ciBfbmlsKCk7CgogICAgdmlydHVhbCBCb29sZWFuIE5QX2lzX25pbCgp IGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgaW50IE5QX25vZGV0eXBlKCkgY29uc3QgPSAwOwogICAg dmlydHVhbCB2b2lkKiBOUF9uYXJyb3coKSA9IDA7CgogICAgc3RhdGljIGlubGluZSBfQ09SQkFf Qm9vbGVhbiBQUl9pc192YWxpZChEeW5BbnlfcHRyIHAgKSB7CiAgICAgIHJldHVybiAoKHApID8g KHAtPnBkX21hZ2ljID09IFBSX21hZ2ljKSA6IDEpOwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBf Q09SQkFfVUxvbmcgUFJfbWFnaWM7CiAgcHJvdGVjdGVkOgogICAgRHluQW55KCk7CgogIHByaXZh dGU6CiAgICBfQ09SQkFfVUxvbmcgcGRfbWFnaWM7CgogICAgRHluQW55KGNvbnN0IER5bkFueSYp OwogICAgRHluQW55JiBvcGVyYXRvcj0oY29uc3QgRHluQW55Jik7CiAgfTsKIyAxODg2ICIvdXNy L2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMwogIGNsYXNzIER5bkVudW0gOiBwdWJs aWMgdmlydHVhbCBEeW5BbnkgewogIHB1YmxpYzoKCiAgICB2aXJ0dWFsIGNoYXIqIHZhbHVlX2Fz X3N0cmluZygpID0gMDsKICAgIHZpcnR1YWwgdm9pZCB2YWx1ZV9hc19zdHJpbmcoY29uc3QgY2hh ciogdmFsdWUpID0gMDsKICAgIHZpcnR1YWwgVUxvbmcgdmFsdWVfYXNfdWxvbmcoKSA9IDA7CiAg ICB2aXJ0dWFsIHZvaWQgdmFsdWVfYXNfdWxvbmcoVUxvbmcgdmFsdWUpID0gMDsKCiAgICBzdGF0 aWMgRHluRW51bV9wdHIgX2R1cGxpY2F0ZShEeW5FbnVtX3B0cik7CiAgICBzdGF0aWMgRHluRW51 bV9wdHIgX25hcnJvdyhEeW5BbnlfcHRyKTsKICAgIHN0YXRpYyBEeW5FbnVtX3B0ciBfbmlsKCk7 CgogICAgdmlydHVhbCB+RHluRW51bSgpOwoKICBwcm90ZWN0ZWQ6CiAgICBEeW5FbnVtKCkge30K CiAgcHJpdmF0ZToKICAgIER5bkVudW0oY29uc3QgRHluRW51bSYpOwogICAgRHluRW51bSYgb3Bl cmF0b3I9KGNvbnN0IER5bkVudW0mKTsKICB9OwoKCgoKCiAgdHlwZWRlZiBjaGFyKiBGaWVsZE5h bWU7CiAgdHlwZWRlZiBTdHJpbmdfdmFyIEZpZWxkTmFtZV92YXI7CgogIHN0cnVjdCBOYW1lVmFs dWVQYWlyIHsKICAgIFN0cmluZ19tZW1iZXIgaWQ7CiAgICBBbnkgdmFsdWU7CiAgfTsKCiAgdHlw ZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9WYXI8TmFtZVZhbHVlUGFpcj4gTmFtZVZh bHVlUGFpcl92YXI7CiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2U8TmFtZVZh bHVlUGFpcj4gTmFtZVZhbHVlUGFpclNlcTsKCiAgY2xhc3MgRHluU3RydWN0IDogcHVibGljIHZp cnR1YWwgRHluQW55IHsKICBwdWJsaWM6CgogICAgdmlydHVhbCBjaGFyKiBjdXJyZW50X21lbWJl cl9uYW1lKCkgPSAwOwogICAgdmlydHVhbCBUQ0tpbmQgY3VycmVudF9tZW1iZXJfa2luZCgpID0g MDsKICAgIHZpcnR1YWwgTmFtZVZhbHVlUGFpclNlcSogZ2V0X21lbWJlcnMoKSA9IDA7CiAgICB2 aXJ0dWFsIHZvaWQgc2V0X21lbWJlcnMoY29uc3QgTmFtZVZhbHVlUGFpclNlcSYgTlZTZXFWYWwp ID0gMDsKCiAgICBzdGF0aWMgRHluU3RydWN0X3B0ciBfZHVwbGljYXRlKER5blN0cnVjdF9wdHIp OwogICAgc3RhdGljIER5blN0cnVjdF9wdHIgX25hcnJvdyhEeW5BbnlfcHRyKTsKICAgIHN0YXRp YyBEeW5TdHJ1Y3RfcHRyIF9uaWwoKTsKCiAgICB2aXJ0dWFsIH5EeW5TdHJ1Y3QoKTsKCiAgcHJv dGVjdGVkOgogICAgRHluU3RydWN0KCkge30KCiAgcHJpdmF0ZToKICAgIER5blN0cnVjdChjb25z dCBEeW5TdHJ1Y3QmKTsKICAgIER5blN0cnVjdCYgb3BlcmF0b3I9KGNvbnN0IER5blN0cnVjdCYp OwogIH07CgoKCgoKICBjbGFzcyBEeW5VbmlvbiA6IHB1YmxpYyB2aXJ0dWFsIER5bkFueSB7CiAg cHVibGljOgogICAgdmlydHVhbCBCb29sZWFuIHNldF9hc19kZWZhdWx0KCkgPSAwOwogICAgdmly dHVhbCB2b2lkIHNldF9hc19kZWZhdWx0KEJvb2xlYW4gdmFsdWUpID0gMDsKICAgIHZpcnR1YWwg RHluQW55X3B0ciBkaXNjcmltaW5hdG9yKCkgPSAwOwogICAgdmlydHVhbCBUQ0tpbmQgZGlzY3Jp bWluYXRvcl9raW5kKCkgPSAwOwogICAgdmlydHVhbCBEeW5BbnlfcHRyIG1lbWJlcigpID0gMDsK ICAgIHZpcnR1YWwgY2hhciogbWVtYmVyX25hbWUoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgbWVt YmVyX25hbWUoY29uc3QgY2hhciogdmFsdWUpID0gMDsKICAgIHZpcnR1YWwgVENLaW5kIG1lbWJl cl9raW5kKCkgPSAwOwoKICAgIHN0YXRpYyBEeW5Vbmlvbl9wdHIgX2R1cGxpY2F0ZShEeW5Vbmlv bl9wdHIpOwogICAgc3RhdGljIER5blVuaW9uX3B0ciBfbmFycm93KER5bkFueV9wdHIpOwogICAg c3RhdGljIER5blVuaW9uX3B0ciBfbmlsKCk7CgogICAgdmlydHVhbCB+RHluVW5pb24oKTsKCiAg cHJvdGVjdGVkOgogICAgRHluVW5pb24oKSB7fQoKICBwcml2YXRlOgogICAgRHluVW5pb24oY29u c3QgRHluVW5pb24mKTsKICAgIER5blVuaW9uJiBvcGVyYXRvcj0oY29uc3QgRHluVW5pb24mKTsK ICB9OwoKCgoKCiAgdHlwZWRlZiBfQ09SQkFfUHNldWRvVmFsdWVfU2VxdWVuY2U8QW55PiBBbnlT ZXE7CgogIGNsYXNzIER5blNlcXVlbmNlIDogcHVibGljIHZpcnR1YWwgRHluQW55IHsKICBwdWJs aWM6CgogICAgdmlydHVhbCBVTG9uZyBsZW5ndGgoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgbGVu Z3RoIChVTG9uZyB2YWx1ZSkgPSAwOwogICAgdmlydHVhbCBBbnlTZXEqIGdldF9lbGVtZW50cygp ID0gMDsKICAgIHZpcnR1YWwgdm9pZCBzZXRfZWxlbWVudHMoY29uc3QgQW55U2VxJiB2YWx1ZSkg PSAwOwoKICAgIHN0YXRpYyBEeW5TZXF1ZW5jZV9wdHIgX2R1cGxpY2F0ZShEeW5TZXF1ZW5jZV9w dHIpOwogICAgc3RhdGljIER5blNlcXVlbmNlX3B0ciBfbmFycm93KER5bkFueV9wdHIpOwogICAg c3RhdGljIER5blNlcXVlbmNlX3B0ciBfbmlsKCk7CgogICAgdmlydHVhbCB+RHluU2VxdWVuY2Uo KTsKCiAgcHJvdGVjdGVkOgogICAgRHluU2VxdWVuY2UoKSB7fQoKICBwcml2YXRlOgogICAgRHlu U2VxdWVuY2UoY29uc3QgRHluU2VxdWVuY2UmKTsKICAgIER5blNlcXVlbmNlJiBvcGVyYXRvcj0o Y29uc3QgRHluU2VxdWVuY2UmKTsKICB9OwoKCgoKCiAgY2xhc3MgRHluQXJyYXkgOiBwdWJsaWMg dmlydHVhbCBEeW5BbnkgewogIHB1YmxpYzoKCiAgICB2aXJ0dWFsIEFueVNlcSogZ2V0X2VsZW1l bnRzKCkgPSAwOwogICAgdmlydHVhbCB2b2lkIHNldF9lbGVtZW50cyhjb25zdCBBbnlTZXEmIHZh bHVlKSA9IDA7CgogICAgc3RhdGljIER5bkFycmF5X3B0ciBfZHVwbGljYXRlKER5bkFycmF5X3B0 cik7CiAgICBzdGF0aWMgRHluQXJyYXlfcHRyIF9uYXJyb3coRHluQW55X3B0cik7CiAgICBzdGF0 aWMgRHluQXJyYXlfcHRyIF9uaWwoKTsKCiAgICB2aXJ0dWFsIH5EeW5BcnJheSgpOwoKICBwcm90 ZWN0ZWQ6CiAgICBEeW5BcnJheSgpIHt9CgogIHByaXZhdGU6CiAgICBEeW5BcnJheShjb25zdCBE eW5BcnJheSYpOwogICAgRHluQXJyYXkmIG9wZXJhdG9yPShjb25zdCBEeW5BcnJheSYpOwogIH07 CgoKCgoKCiAgY2xhc3MgUmVxdWVzdCB7CiAgcHVibGljOgogICAgdmlydHVhbCB+UmVxdWVzdCgp OwoKICAgIHZpcnR1YWwgT2JqZWN0X3B0ciB0YXJnZXQoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFs IGNvbnN0IGNoYXIqIG9wZXJhdGlvbigpIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgTlZMaXN0X3B0 ciBhcmd1bWVudHMoKSA9IDA7CiAgICB2aXJ0dWFsIE5hbWVkVmFsdWVfcHRyIHJlc3VsdCgpID0g MDsKICAgIHZpcnR1YWwgRW52aXJvbm1lbnRfcHRyIGVudigpID0gMDsKICAgIHZpcnR1YWwgRXhj ZXB0aW9uTGlzdF9wdHIgZXhjZXB0aW9ucygpID0gMDsKICAgIHZpcnR1YWwgQ29udGV4dExpc3Rf cHRyIGNvbnRleHRzKCkgPSAwOwogICAgdmlydHVhbCBDb250ZXh0X3B0ciBjdHgoKSBjb25zdCA9 IDA7CiAgICB2aXJ0dWFsIHZvaWQgY3R4KENvbnRleHRfcHRyKSA9IDA7CgogICAgdmlydHVhbCBB bnkmIGFkZF9pbl9hcmcoKSA9IDA7CiAgICB2aXJ0dWFsIEFueSYgYWRkX2luX2FyZyhjb25zdCBj aGFyKiBuYW1lKSA9IDA7CiAgICB2aXJ0dWFsIEFueSYgYWRkX2lub3V0X2FyZygpID0gMDsKICAg IHZpcnR1YWwgQW55JiBhZGRfaW5vdXRfYXJnKGNvbnN0IGNoYXIqIG5hbWUpID0gMDsKICAgIHZp cnR1YWwgQW55JiBhZGRfb3V0X2FyZygpID0gMDsKICAgIHZpcnR1YWwgQW55JiBhZGRfb3V0X2Fy Zyhjb25zdCBjaGFyKiBuYW1lKSA9IDA7CgogICAgdmlydHVhbCB2b2lkIHNldF9yZXR1cm5fdHlw ZShUeXBlQ29kZV9wdHIgdGMpID0gMDsKICAgIHZpcnR1YWwgQW55JiByZXR1cm5fdmFsdWUoKSA9 IDA7CgogICAgdmlydHVhbCBTdGF0dXMgaW52b2tlKCkgPSAwOwogICAgdmlydHVhbCBTdGF0dXMg c2VuZF9vbmV3YXkoKSA9IDA7CiAgICB2aXJ0dWFsIFN0YXR1cyBzZW5kX2RlZmVycmVkKCkgPSAw OwogICAgdmlydHVhbCBTdGF0dXMgZ2V0X3Jlc3BvbnNlKCkgPSAwOwogICAgdmlydHVhbCBCb29s ZWFuIHBvbGxfcmVzcG9uc2UoKSA9IDA7CgogICAgdmlydHVhbCBCb29sZWFuIE5QX2lzX25pbCgp IGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgUmVxdWVzdF9wdHIgTlBfZHVwbGljYXRlKCkgPSAwOwoK ICAgIHN0YXRpYyBSZXF1ZXN0X3B0ciBfZHVwbGljYXRlKFJlcXVlc3RfcHRyKTsKICAgIHN0YXRp YyBSZXF1ZXN0X3B0ciBfbmlsKCk7CgogICAgc3RhdGljIGlubGluZSBfQ09SQkFfQm9vbGVhbiBQ Ul9pc192YWxpZChSZXF1ZXN0X3B0ciBwICkgewogICAgICByZXR1cm4gKChwKSA/IChwLT5wZF9t YWdpYyA9PSBQUl9tYWdpYykgOiAxKTsKICAgIH0KCiAgICBzdGF0aWMgY29uc3QgX0NPUkJBX1VM b25nIFBSX21hZ2ljOwoKICBwcm90ZWN0ZWQ6CiAgICBSZXF1ZXN0KCkgeyBwZF9tYWdpYyA9IFBS X21hZ2ljOyB9CgogIHByaXZhdGU6CiAgICBfQ09SQkFfVUxvbmcgcGRfbWFnaWM7CgogICAgUmVx dWVzdChjb25zdCBSZXF1ZXN0Jik7CiAgICBSZXF1ZXN0JiBvcGVyYXRvcj0oY29uc3QgUmVxdWVz dCYpOwogIH07CgoKCgoKCiAgY2xhc3MgU2VydmVyUmVxdWVzdCB7CiAgcHVibGljOgogICAgdmly dHVhbCBjb25zdCBjaGFyKiBvcGVyYXRpb24oKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgYXJndW1l bnRzKE5WTGlzdF9wdHImIHBhcmFtZXRlcnMpID0gMDsKICAgIHZpcnR1YWwgQ29udGV4dF9wdHIg Y3R4KCkgPSAwOwogICAgdmlydHVhbCB2b2lkIHNldF9yZXN1bHQoY29uc3QgQW55JiB2YWx1ZSkg PSAwOwogICAgdmlydHVhbCB2b2lkIHNldF9leGNlcHRpb24oY29uc3QgQW55JiB2YWx1ZSkgPSAw OwoKICBwcm90ZWN0ZWQ6CiAgICBpbmxpbmUgU2VydmVyUmVxdWVzdCgpIHt9CiAgICB2aXJ0dWFs IH5TZXJ2ZXJSZXF1ZXN0KCk7CgogIHByaXZhdGU6CiAgICBTZXJ2ZXJSZXF1ZXN0KGNvbnN0IFNl cnZlclJlcXVlc3QmKTsKICAgIFNlcnZlclJlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBTZXJ2ZXJS ZXF1ZXN0Jik7CiAgfTsKCgoKCgoKICB0eXBlZGVmIFVMb25nIFBvbGljeVR5cGU7CgogIGNsYXNz IFBvbGljeTsKICB0eXBlZGVmIFBvbGljeSogUG9saWN5X3B0cjsKICB0eXBlZGVmIFBvbGljeV9w dHIgUG9saWN5UmVmOwoKICBjbGFzcyBQb2xpY3kgOiBwdWJsaWMgdmlydHVhbCBPYmplY3Qgewog IHB1YmxpYzoKICAgIHZpcnR1YWwgflBvbGljeSgpOwoKICAgIHZpcnR1YWwgUG9saWN5VHlwZSBw b2xpY3lfdHlwZSgpOwogICAgdmlydHVhbCBQb2xpY3lfcHRyIGNvcHkoKTsKCiAgICB2aXJ0dWFs IHZvaWQgZGVzdHJveSgpOwoKCiAgICBzdGF0aWMgUG9saWN5X3B0ciBfZHVwbGljYXRlKFBvbGlj eV9wdHIpOwogICAgc3RhdGljIFBvbGljeV9wdHIgX25hcnJvdyhPYmplY3RfcHRyKTsKICAgIHN0 YXRpYyBQb2xpY3lfcHRyIF9uaWwoKTsKCgoKICAgIFBvbGljeShQb2xpY3lUeXBlIHR5cGUpOwog ICAgUG9saWN5KCk7CgogICAgdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciog cmVwb0lkKTsKICAgIHZpcnR1YWwgdm9pZCBfTlBfaW5jclJlZkNvdW50KCk7CiAgICB2aXJ0dWFs IHZvaWQgX05QX2RlY3JSZWZDb3VudCgpOwoKCiAgICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3Jl cG9JZDsKCiAgcHJpdmF0ZToKICAgIFBvbGljeShjb25zdCBQb2xpY3kmKTsKICAgIFBvbGljeSYg b3BlcmF0b3IgPSAoY29uc3QgUG9saWN5Jik7CgogICAgaW50IHBkX3JlZkNvdW50OwogICAgUG9s aWN5VHlwZSBwZF90eXBlOwogIH07CgogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8UG9s aWN5PiBQb2xpY3lfdmFyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9NZW1iZXI8UG9saWN5 LCBQb2xpY3lfdmFyPiBQb2xpY3lfbWVtYmVyOwoKICB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9fVW5i b3VuZGVkX1NlcXVlbmNlPFBvbGljeSwgUG9saWN5X21lbWJlcj4gUG9saWN5TGlzdDsKICB0eXBl ZGVmIFBvbGljeUxpc3QqIFBvbGljeUxpc3RfdmFyOwoKCgoKCgogIGNsYXNzIERvbWFpbk1hbmFn ZXI7CiAgdHlwZWRlZiBjbGFzcyBEb21haW5NYW5hZ2VyKiBEb21haW5NYW5hZ2VyX3B0cjsKICB0 eXBlZGVmIERvbWFpbk1hbmFnZXJfcHRyIERvbWFpbk1hbmFnZXJSZWY7CgogIGNsYXNzIERvbWFp bk1hbmFnZXIgewogIHB1YmxpYzoKICAgIFBvbGljeV9wdHIgZ2V0X2RvbWFpbl9wb2xpY3koUG9s aWN5VHlwZSBwb2xpY3lfdHlwZSk7CgogICAgc3RhdGljIERvbWFpbk1hbmFnZXJfcHRyIF9kdXBs aWNhdGUoRG9tYWluTWFuYWdlcl9wdHIgcCk7CiAgICBzdGF0aWMgRG9tYWluTWFuYWdlcl9wdHIg X25pbCgpOwoKICBwcml2YXRlOgogICAgRG9tYWluTWFuYWdlcigpOwogIH07CgogICAgICAgICAg ICAgICAgICAgQm9vbGVhbiBpc19uaWwoRG9tYWluTWFuYWdlcl9wdHIgcCk7CiAgICAgICAgICAg ICAgICAgICB2b2lkIHJlbGVhc2UoRG9tYWluTWFuYWdlcl9wdHIpOwoKICB0eXBlZGVmIF9DT1JC QV9Qc2V1ZG9PYmpfVmFyPERvbWFpbk1hbmFnZXI+IERvbWFpbk1hbmFnZXJfdmFyOwogIHR5cGVk ZWYgX0NPUkJBX1BzZXVkb09ial9NZW1iZXI8RG9tYWluTWFuYWdlcixEb21haW5NYW5hZ2VyX3Zh cj4KICAgIERvbWFpbk1hbmFnZXJfbWVtYmVyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb19VbmJv dW5kZWRfU2VxdWVuY2U8RG9tYWluTWFuYWdlcixEb21haW5NYW5hZ2VyX21lbWJlcj4KICAgIERv bWFpbk1hbmFnZXJMaXN0OwoKCgoKCgogIGNsYXNzIEJPQTsKICBjbGFzcyBCT0FfdmFyOwogIHR5 cGVkZWYgQk9BKiBCT0FfcHRyOwogIHR5cGVkZWYgQk9BX3B0ciBCT0FSZWY7CgoKICBjbGFzcyBS ZWZlcmVuY2VEYXRhIDogcHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0IHsK ICBwdWJsaWM6CiAgICBpbmxpbmUgUmVmZXJlbmNlRGF0YSgpIHt9CiAgICBpbmxpbmUgUmVmZXJl bmNlRGF0YShjb25zdCBSZWZlcmVuY2VEYXRhJiBzZXEpCiAgICAgIDogX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV9fT2N0ZXQoc2VxKSB7fQogICAgaW5saW5lIFJlZmVyZW5jZURhdGEoQ09SQkE6 OlVMb25nIG1heCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldChtYXgp IHt9CiAgICBpbmxpbmUgUmVmZXJlbmNlRGF0YShDT1JCQTo6VUxvbmcgbWF4LCBDT1JCQTo6VUxv bmcgbGVuLCBDT1JCQTo6T2N0ZXQqIHZhbCwgQ09SQkE6OkJvb2xlYW4gcmVsPTApCiAgICAgIDog X0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQobWF4LCBsZW4sIHZhbCwgcmVsKSB7fQog ICAgaW5saW5lIFJlZmVyZW5jZURhdGEmIG9wZXJhdG9yID0gKGNvbnN0IFJlZmVyZW5jZURhdGEm IHNlcSkgewogICAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldDo6b3BlcmF0b3I9 KHNlcSk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH07CiAgfTsKCgogIGNsYXNzIEJPQSA6IHB1 YmxpYyBPYmplY3QgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBpbXBsX2lzX3JlYWR5KElt cGxlbWVudGF0aW9uRGVmX3B0ciBwPTAsIEJvb2xlYW4gTm9CbGs9MCkgPSAwOwogICAgdmlydHVh bCB2b2lkIGltcGxfc2h1dGRvd24oKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpID0g MDsKCiAgICB2aXJ0dWFsIHZvaWQgb2JqX2lzX3JlYWR5KG9tbmlPcmJCb2FTZXJ2YW50KiwgSW1w bGVtZW50YXRpb25EZWZfcHRyIHA9MCk9MDsKICAgIHZpcnR1YWwgdm9pZCBvYmpfaXNfcmVhZHko T2JqZWN0X3B0ciwgSW1wbGVtZW50YXRpb25EZWZfcHRyIHA9MCk9MDsKICAgIHZpcnR1YWwgdm9p ZCBkaXNwb3NlKE9iamVjdF9wdHIpID0gMDsKCiAgICB2aXJ0dWFsIE9iamVjdF9wdHIgY3JlYXRl KGNvbnN0IFJlZmVyZW5jZURhdGEmLCBfb2JqcmVmX0ludGVyZmFjZURlZiosCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uRGVmX3B0cikgPSAwOwogICAgdmlydHVh bCBSZWZlcmVuY2VEYXRhKiBnZXRfaWQoT2JqZWN0X3B0cikgPSAwOwogICAgdmlydHVhbCB2b2lk IGNoYW5nZV9pbXBsZW1lbnRhdGlvbihPYmplY3RfcHRyLEltcGxlbWVudGF0aW9uRGVmX3B0cikg PSAwOwogICAgdmlydHVhbCBQcmluY2lwYWxfcHRyIGdldF9wcmluY2lwYWwoT2JqZWN0X3B0ciwg RW52aXJvbm1lbnRfcHRyKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgZGVhY3RpdmF0ZV9pbXBsKElt cGxlbWVudGF0aW9uRGVmX3B0cikgPSAwOwogICAgdmlydHVhbCB2b2lkIGRlYWN0aXZhdGVfb2Jq KE9iamVjdF9wdHIpID0gMDsKCiAgICBzdGF0aWMgQk9BX3B0ciBfZHVwbGljYXRlKEJPQV9wdHIp OwogICAgc3RhdGljIEJPQV9wdHIgX25hcnJvdyhPYmplY3RfcHRyKTsKICAgIHN0YXRpYyBCT0Ff cHRyIF9uaWwoKTsKICAgIHN0YXRpYyBCT0FfcHRyIGdldEJPQSgpOwoKICAgIHN0YXRpYyBjb25z dCBjaGFyKiBfUERfcmVwb0lkOwoKICBwcm90ZWN0ZWQ6CiAgICBpbmxpbmUgQk9BKGludCBuaWwp IHsgX1BSX3NldG9iaigob21uaU9ialJlZiopIChuaWwgPyAwOjEpKTsgfQogICAgdmlydHVhbCB+ Qk9BKCk7CgogIHByaXZhdGU6CiAgICBCT0EoY29uc3QgQk9BJik7CiAgICBCT0EmIG9wZXJhdG9y PShjb25zdCBCT0EmKTsKICB9OwoKCgoKCiAgY2xhc3MgT1JCOwogIGNsYXNzIE9SQl92YXI7CiAg dHlwZWRlZiBPUkIqIE9SQl9wdHI7CiAgdHlwZWRlZiBPUkJfcHRyIE9SQlJlZjsKCiAgY2xhc3Mg T1JCIDogcHVibGljIE9iamVjdCB7CiAgcHVibGljOgogICAgdHlwZWRlZiBPUkJfcHRyIF9wdHJf dHlwZTsKICAgIHR5cGVkZWYgT1JCX3ZhciBfdmFyX3R5cGU7CgogICAgdHlwZWRlZiBjaGFyKiBP QWlkOwoKICAgIHR5cGVkZWYgY2hhciogT2JqZWN0SWQ7CiAgICB0eXBlZGVmIFN0cmluZ192YXIg T2JqZWN0SWRfdmFyOwoKICAgIHR5cGVkZWYgX0NPUkJBX1BzZXVkb19VbmJvdW5kZWRfU2VxdWVu Y2U8UmVxdWVzdCxSZXF1ZXN0X21lbWJlcj4KICAgICAgUmVxdWVzdFNlcTsKCiAgICBjbGFzcyBJ bnZhbGlkTmFtZSA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgSW52YWxp ZE5hbWUoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0Fu eUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSW52YWxpZE5hbWUoY29uc3QgSW52 YWxpZE5hbWUmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5lIEludmFsaWROYW1l JiBvcGVyYXRvcj0oY29uc3QgSW52YWxpZE5hbWUmIF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikg dGhpcyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkludmFsaWROYW1lKCk7IHZpcnR1 YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEludmFsaWROYW1lKiBfZG93bmNhc3QoRXhjZXB0aW9u Kik7IHN0YXRpYyBjb25zdCBJbnZhbGlkTmFtZSogX2Rvd25jYXN0KGNvbnN0IEV4Y2VwdGlvbiop OyBzdGF0aWMgaW5saW5lIEludmFsaWROYW1lKiBfbmFycm93KEV4Y2VwdGlvbiogX2V4KSB7IHJl dHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXpl X3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1 ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVy ZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0 cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30g c3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRF eGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BE X3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25z dDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3Qg Y2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNo YWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1l bUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBJbmNvbnNpc3RlbnRUeXBlQ29k ZSA6IHB1YmxpYyBVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgSW5jb25zaXN0ZW50VHlw ZUNvZGUoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0Fu eUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgSW5jb25zaXN0ZW50VHlwZUNvZGUo Y29uc3QgSW5jb25zaXN0ZW50VHlwZUNvZGUmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30g aW5saW5lIEluY29uc2lzdGVudFR5cGVDb2RlJiBvcGVyYXRvcj0oY29uc3QgSW5jb25zaXN0ZW50 VHlwZUNvZGUmIF9leCkgeyAqIChVc2VyRXhjZXB0aW9uKikgdGhpcyA9IF9leDsgcmV0dXJuICp0 aGlzOyB9IHZpcnR1YWwgfkluY29uc2lzdGVudFR5cGVDb2RlKCk7IHZpcnR1YWwgdm9pZCBfcmFp c2UoKTsgc3RhdGljIEluY29uc2lzdGVudFR5cGVDb2RlKiBfZG93bmNhc3QoRXhjZXB0aW9uKik7 IHN0YXRpYyBjb25zdCBJbmNvbnNpc3RlbnRUeXBlQ29kZSogX2Rvd25jYXN0KGNvbnN0IEV4Y2Vw dGlvbiopOyBzdGF0aWMgaW5saW5lIEluY29uc2lzdGVudFR5cGVDb2RlKiBfbmFycm93KEV4Y2Vw dGlvbiogX2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9h bGlnbmVkU2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9w ZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0 b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8 PShOZXRCdWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZl cmVkU3RyZWFtJikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47 IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMg Y29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBFeGNlcHRpb24qIF9OUF9k dXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7 IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFs IHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lk IF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CgoKCgoKICAgIGNsYXNz IE9iamVjdElkTGlzdF92YXI7CgogICAgY2xhc3MgT2JqZWN0SWRMaXN0IDogcHVibGljIF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfX1N0cmluZyB7CiAgICBwdWJsaWM6CiAgICAgIHR5cGVkZWYg T2JqZWN0SWRMaXN0X3ZhciBfdmFyX3R5cGU7CiAgICAgIGlubGluZSBPYmplY3RJZExpc3QoKSB7 fQogICAgICBpbmxpbmUgT2JqZWN0SWRMaXN0KGNvbnN0IE9iamVjdElkTGlzdCYgc2VxKQogICAg ICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fU3RyaW5nKHNlcSkge30KICAgICAgaW5s aW5lIE9iamVjdElkTGlzdChVTG9uZyBtYXgpCiAgICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1Nl cXVlbmNlX19TdHJpbmcobWF4KSB7fQogICAgICBpbmxpbmUgT2JqZWN0SWRMaXN0KFVMb25nIG1h eCwgVUxvbmcgbGVuLCBjaGFyKiogdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xl YW4gcmVsPTApCiAgICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19TdHJpbmcobWF4 LCBsZW4sIHZhbCwgcmVsKSB7fQogICAgICBpbmxpbmUgT2JqZWN0SWRMaXN0JiBvcGVyYXRvciA9 IChjb25zdCBPYmplY3RJZExpc3QmIHNlcSkgewogICAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2VfX1N0cmluZzo6b3BlcmF0b3I9KHNlcSk7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAg ICB9CiAgICB9OwoKICAgIGNsYXNzIE9iamVjdElkTGlzdF9vdXQ7CgogICAgY2xhc3MgT2JqZWN0 SWRMaXN0X3ZhciB7CiAgICBwdWJsaWM6CiAgICAgIHR5cGVkZWYgT2JqZWN0SWRMaXN0IFQ7CiAg ICAgIHR5cGVkZWYgT2JqZWN0SWRMaXN0X3ZhciBUX3ZhcjsKCiAgICAgIGlubGluZSBPYmplY3RJ ZExpc3RfdmFyKCkgOiBwZF9zZXEoMCkge30KICAgICAgaW5saW5lIE9iamVjdElkTGlzdF92YXIo VCogcykgOiBwZF9zZXEocykge30KICAgICAgaW5saW5lIE9iamVjdElkTGlzdF92YXIoY29uc3Qg VF92YXImIHN2KSB7CiAgICAgICAgaWYoIHN2LnBkX3NlcSApIHsKICAgICAgICAgIHBkX3NlcSA9 IG5ldyBUOwogICAgICAgICAgKnBkX3NlcSA9ICpzdi5wZF9zZXE7CiAgICAgICAgfSBlbHNlCiAg ICAgICAgICBwZF9zZXEgPSAwOwogICAgICB9CiAgICAgIGlubGluZSB+T2JqZWN0SWRMaXN0X3Zh cigpIHsgaWYoIHBkX3NlcSApIGRlbGV0ZSBwZF9zZXE7IH0KCiAgICAgIGlubGluZSBUX3ZhciYg b3BlcmF0b3IgPSAoVCogcykgewogICAgICAgIGlmKCBwZF9zZXEgKSBkZWxldGUgcGRfc2VxOwog ICAgICAgIHBkX3NlcSA9IHM7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICB9CiAgICAgIGlu bGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoY29uc3QgVF92YXImIHN2KSB7CiAgICAgICAgaWYoIHN2 LnBkX3NlcSApIHsKICAgICAgICAgIGlmKCAhcGRfc2VxICkgcGRfc2VxID0gbmV3IFQ7CiAgICAg ICAgICAqcGRfc2VxID0gKnN2LnBkX3NlcTsKICAgICAgICB9IGVsc2UgaWYoIHBkX3NlcSApIHsK ICAgICAgICAgIGRlbGV0ZSBwZF9zZXE7CiAgICAgICAgICBwZF9zZXEgPSAwOwogICAgICAgIH0K ICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgIH0KCiAgICAgIGlubGluZSBfQ09SQkFfU3RyaW5n X2VsZW1lbnQgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBpKSB7IHJldHVybiAoKnBkX3NlcSlb aV07IH0KICAgICAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsgcmV0dXJuIHBkX3NlcTsgfQoK CgogICAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKnBkX3Nl cTsgfQogICAgICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1cm4gKnBkX3NlcTsgfQoKCiAg ICAgIGlubGluZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJuICpwZF9zZXE7IH0KICAgICAg aW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKnBkX3NlcTsgfQogICAgICBpbmxpbmUgVComIG91 dCgpIHsgaWYgKHBkX3NlcSkgeyBkZWxldGUgcGRfc2VxOyBwZF9zZXEgPSAwOyB9IHJldHVybiBw ZF9zZXE7IH0KICAgICAgaW5saW5lIFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBwZF9zZXE7IHBkX3Nl cSA9IDA7IHJldHVybiB0bXA7IH0KCiAgICAgIGZyaWVuZCBjbGFzcyBPYmplY3RJZExpc3Rfb3V0 OwoKICAgIHByaXZhdGU6CiAgICAgIFQqIHBkX3NlcTsKICAgIH07CgogICAgY2xhc3MgT2JqZWN0 SWRMaXN0X291dCB7CiAgICBwdWJsaWM6CiAgICAgIHR5cGVkZWYgT2JqZWN0SWRMaXN0IFQ7CiAg ICAgIHR5cGVkZWYgT2JqZWN0SWRMaXN0X3ZhciBUX3ZhcjsKCiAgICAgIGlubGluZSBPYmplY3RJ ZExpc3Rfb3V0KFQqJiBzKSA6IF9kYXRhKHMpIHsgX2RhdGEgPSAwOyB9CiAgICAgIGlubGluZSBP YmplY3RJZExpc3Rfb3V0KFRfdmFyJiBzdikKICAgICAgICA6IF9kYXRhKHN2LnBkX3NlcSkgeyBz diA9IChUKikgMDsgfQogICAgICBpbmxpbmUgT2JqZWN0SWRMaXN0X291dChjb25zdCBPYmplY3RJ ZExpc3Rfb3V0JiBzKSA6IF9kYXRhKHMuX2RhdGEpIHt9CiAgICAgIGlubGluZSBPYmplY3RJZExp c3Rfb3V0JiBvcGVyYXRvcj0oY29uc3QgT2JqZWN0SWRMaXN0X291dCYgcykgewogICAgICAgIF9k YXRhID0gcy5fZGF0YTsgcmV0dXJuICp0aGlzOwogICAgICB9CiAgICAgIGlubGluZSBPYmplY3RJ ZExpc3Rfb3V0JiBvcGVyYXRvcj0oVCogcykgeyBfZGF0YSA9IHM7IHJldHVybiAqdGhpczsgfQog ICAgICBpbmxpbmUgb3BlcmF0b3IgVComKCkgeyByZXR1cm4gX2RhdGE7IH0KICAgICAgaW5saW5l IFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogICAgICBpbmxpbmUgVCogb3BlcmF0b3ItPigp IHsgcmV0dXJuIF9kYXRhOyB9CiAgICAgIGlubGluZSBfQ09SQkFfU3RyaW5nX2VsZW1lbnQgb3Bl cmF0b3IgW10gKF9DT1JCQV9VTG9uZyBpKSB7CiAgICAgICAgcmV0dXJuICgqX2RhdGEpW2ldOwog ICAgICB9CiAgICAgIFQqJiBfZGF0YTsKCiAgICBwcml2YXRlOgogICAgICBPYmplY3RJZExpc3Rf b3V0KCk7CiAgICAgIE9iamVjdElkTGlzdF9vdXQgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJik7CiAg ICB9OwoKCgoKCiAgICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICAg IHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhPYmplY3RfcHRyKTsKICAgIHN0YXRpYyBfcHRyX3R5 cGUgX25pbCgpOwoKICAgIHZpcnR1YWwgY2hhciogb2JqZWN0X3RvX3N0cmluZyhPYmplY3RfcHRy KSA9IDA7CiAgICB2aXJ0dWFsIE9iamVjdF9wdHIgc3RyaW5nX3RvX29iamVjdChjb25zdCBjaGFy KikgPSAwOwoKICAgIHZpcnR1YWwgT2JqZWN0SWRMaXN0KiBsaXN0X2luaXRpYWxfc2VydmljZXMo KSA9IDA7CiAgICB2aXJ0dWFsIE9iamVjdF9wdHIgcmVzb2x2ZV9pbml0aWFsX3JlZmVyZW5jZXMo Y29uc3QgY2hhciogaWRlbnRpZmllcikgPSAwOwoKICAgIHZpcnR1YWwgQm9vbGVhbiB3b3JrX3Bl bmRpbmcoKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybV93b3JrKCkgPSAwOwogICAgdmly dHVhbCB2b2lkIHJ1bigpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBzaHV0ZG93bihCb29sZWFuIHdh aXRfZm9yX2NvbXBsZXRpb24pID0gMDsKICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOwoK ICAgIGlubGluZSB2b2lkIE5QX2Rlc3Ryb3koKSB7IGRlc3Ryb3koKTsgfQoKCiAgICBCT0FfcHRy IEJPQV9pbml0KGludCYgYXJnYywgY2hhcioqIGFyZ3YsIGNvbnN0IGNoYXIqIGJvYV9pZGVudGlm aWVyPTApOwoKICAgIFN0YXR1cyBjcmVhdGVfbGlzdChMb25nLCBOVkxpc3Rfb3V0KTsKICAgIFN0 YXR1cyBjcmVhdGVfb3BlcmF0aW9uX2xpc3QoX29ianJlZl9PcGVyYXRpb25EZWYqLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBOVkxpc3Rfb3V0KTsKICAgIFN0YXR1cyBjcmVhdGVf bmFtZWRfdmFsdWUoTmFtZWRWYWx1ZV9vdXQpOwogICAgU3RhdHVzIGNyZWF0ZV9leGNlcHRpb25f bGlzdChFeGNlcHRpb25MaXN0X291dCk7CiAgICBTdGF0dXMgY3JlYXRlX2NvbnRleHRfbGlzdChD b250ZXh0TGlzdF9vdXQpOwoKICAgIFN0YXR1cyBnZXRfZGVmYXVsdF9jb250ZXh0KENvbnRleHRf b3V0IGNvbnRleHRfb3V0KTsKCgoKICAgIFN0YXR1cyBjcmVhdGVfZW52aXJvbm1lbnQoRW52aXJv bm1lbnRfb3V0KTsKCiAgICBTdGF0dXMgc2VuZF9tdWx0aXBsZV9yZXF1ZXN0c19vbmV3YXkoY29u c3QgUmVxdWVzdFNlcSYpOwogICAgU3RhdHVzIHNlbmRfbXVsdGlwbGVfcmVxdWVzdHNfZGVmZXJy ZWQoY29uc3QgUmVxdWVzdFNlcSYpOwogICAgQm9vbGVhbiBwb2xsX25leHRfcmVzcG9uc2UoKTsK ICAgIFN0YXR1cyBnZXRfbmV4dF9yZXNwb25zZShSZXF1ZXN0X291dCk7CgogICAgVHlwZUNvZGVf cHRyIGNyZWF0ZV9zdHJ1Y3RfdGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJ1Y3RNZW1iZXJTZXEmIG1l bWJlcnMpOwogICAgVHlwZUNvZGVfcHRyIGNyZWF0ZV91bmlvbl90Yyhjb25zdCBjaGFyKiBpZCwg Y29uc3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNv ZGVfcHRyIGRpc2NyaW1pbmF0b3JfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgVW5pb25NZW1iZXJTZXEmIG1lbWJlcnMpOwogICAgVHlwZUNvZGVfcHRyIGNyZWF0 ZV9lbnVtX3RjKGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1NZW1iZXJTZXEmIG1lbWJlcnMpOwogICAgVHlw ZUNvZGVfcHRyIGNyZWF0ZV9hbGlhc190Yyhjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogbmFt ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvZGVfcHRyIG9yaWdpbmFs X3R5cGUpOwogICAgVHlwZUNvZGVfcHRyIGNyZWF0ZV9leGNlcHRpb25fdGMoY29uc3QgY2hhciog aWQsIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBTdHJ1Y3RNZW1iZXJTZXEmIG1lbWJlcnMpOwogICAgVHlwZUNvZGVfcHRyIGNyZWF0 ZV9pbnRlcmZhY2VfdGMoY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIG5hbWUpOwogICAgVHlw ZUNvZGVfcHRyIGNyZWF0ZV9zdHJpbmdfdGMoVUxvbmcgYm91bmQpOwogICAgVHlwZUNvZGVfcHRy IGNyZWF0ZV9zZXF1ZW5jZV90YyhVTG9uZyBib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVHlwZUNvZGVfcHRyIGVsZW1lbnRfdHlwZSk7CiAgICBUeXBlQ29kZV9wdHIg Y3JlYXRlX2FycmF5X3RjKFVMb25nIGxlbmd0aCwgVHlwZUNvZGVfcHRyIGV0eXBlKTsKICAgIFR5 cGVDb2RlX3B0ciBjcmVhdGVfcmVjdXJzaXZlX3NlcXVlbmNlX3RjKFVMb25nIGJvdW5kLCBVTG9u ZyBvZmZzZXQpOwoKCgoKCiAgICBEeW5BbnlfcHRyIGNyZWF0ZV9keW5fYW55KGNvbnN0IEFueSYg dmFsdWUpOwogICAgRHluQW55X3B0ciBjcmVhdGVfYmFzaWNfZHluX2FueShUeXBlQ29kZV9wdHIg dGMpOwogICAgRHluU3RydWN0X3B0ciBjcmVhdGVfZHluX3N0cnVjdChUeXBlQ29kZV9wdHIgdGMp OwogICAgRHluU2VxdWVuY2VfcHRyIGNyZWF0ZV9keW5fc2VxdWVuY2UoVHlwZUNvZGVfcHRyIHRj KTsKICAgIER5bkFycmF5X3B0ciBjcmVhdGVfZHluX2FycmF5KFR5cGVDb2RlX3B0ciB0Yyk7CiAg ICBEeW5Vbmlvbl9wdHIgY3JlYXRlX2R5bl91bmlvbihUeXBlQ29kZV9wdHIgdGMpOwogICAgRHlu RW51bV9wdHIgY3JlYXRlX2R5bl9lbnVtKFR5cGVDb2RlX3B0ciB0Yyk7CgoKCgoKICAgIHN0YXRp YyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwogICAgdmlydHVhbCB+T1JCKCk7CgogIHByb3RlY3Rl ZDoKICAgIGlubGluZSBPUkIoaW50IG5pbCkgeyBfUFJfc2V0b2JqKChvbW5pT2JqUmVmKikgKG5p bCA/IDA6MSkpOyB9CgogIHByaXZhdGU6CiAgICBPUkIoY29uc3QgT1JCJik7CiAgICBPUkImIG9w ZXJhdG9yID0gKGNvbnN0IE9SQiYpOwogIH07CgogIHR5cGVkZWYgY2hhciogT1JCaWQ7CiAgdHlw ZWRlZiBTdHJpbmdfdmFyIE9SQmlkX3ZhcjsKCiAgICAgICAgICAgICAgICAgICBPUkJfcHRyIE9S Ql9pbml0KGludCYgYXJnYywgY2hhcioqIGFyZ3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbnN0IGNoYXIqIG9yYl9pZGVudGlmaWVyPSIiKTsKCgoKCgoKICAgICAgICAg ICAgICAgICAgIGlubGluZSBCb29sZWFuIGlzX25pbChFbnZpcm9ubWVudF9wdHIgcCkgewogICAg aWYgKCFFbnZpcm9ubWVudDo6UFJfaXNfdmFsaWQocCkpCiAgICAgIHJldHVybiAwOwogICAgZWxz ZQogICAgICByZXR1cm4gKHAgPyBwLT5OUF9pc19uaWwoKSA6CiAgICAgICAgICAgICAgX0NPUkJB X3VzZV9uaWxfcHRyX2FzX25pbF9wc2V1ZG9fb2JqcmVmKCJFbnZpcm9ubWVudCIpKTsKICB9CiAg ICAgICAgICAgICAgICAgICBpbmxpbmUgQm9vbGVhbiBpc19uaWwoQ29udGV4dF9wdHIgcCkgewog ICAgaWYgKCFDb250ZXh0OjpQUl9pc192YWxpZChwKSkKICAgICAgcmV0dXJuIDA7CiAgICBlbHNl CiAgICAgIHJldHVybiAocCA/IHAtPk5QX2lzX25pbCgpIDoKICAgICAgICAgICAgICBfQ09SQkFf dXNlX25pbF9wdHJfYXNfbmlsX3BzZXVkb19vYmpyZWYoIkNvbnRleHQiKSk7CiAgfQogICAgICAg ICAgICAgICAgICAgQm9vbGVhbiBpc19uaWwoUHJpbmNpcGFsX3B0cik7CiAgICAgICAgICAgICAg ICAgICBpbmxpbmUgQm9vbGVhbiBpc19uaWwoT2JqZWN0X3B0ciBvKSB7CiAgICBpZiggIU9iamVj dDo6X1BSX2lzX3ZhbGlkKG8pICkgcmV0dXJuIDA7CiAgICBpZiggbyApIHJldHVybiBvLT5fTlBf aXNfbmlsKCk7CiAgICBlbHNlIHsKCgoKCgoKICAgICAgcmV0dXJuIF9DT1JCQV91c2VfbmlsX3B0 cl9hc19uaWxfb2JqcmVmKCk7CiAgICB9CiAgfQogICAgICAgICAgICAgICAgICAgaW5saW5lIEJv b2xlYW4gaXNfbmlsKE5hbWVkVmFsdWVfcHRyIHApIHsKICAgIGlmICghTmFtZWRWYWx1ZTo6UFJf aXNfdmFsaWQocCkpCiAgICAgIHJldHVybiAwOwogICAgZWxzZQogICAgICByZXR1cm4gKHAgPyBw LT5OUF9pc19uaWwoKSA6CiAgICAgICAgICAgICAgX0NPUkJBX3VzZV9uaWxfcHRyX2FzX25pbF9w c2V1ZG9fb2JqcmVmKCJOYW1lZFZhbHVlIikpOwogIH0KICAgICAgICAgICAgICAgICAgIGlubGlu ZSBCb29sZWFuIGlzX25pbChOVkxpc3RfcHRyIHApIHsKICAgIGlmICghTlZMaXN0OjpQUl9pc192 YWxpZChwKSkKICAgICAgcmV0dXJuIDA7CiAgICBlbHNlCiAgICAgIHJldHVybiAocCA/IHAtPk5Q X2lzX25pbCgpIDoKICAgICAgICAgICAgICBfQ09SQkFfdXNlX25pbF9wdHJfYXNfbmlsX3BzZXVk b19vYmpyZWYoIk5WTGlzdCIpKTsKICB9CiAgICAgICAgICAgICAgICAgICBpbmxpbmUgQm9vbGVh biBpc19uaWwoUmVxdWVzdF9wdHIgcCkgewogICAgaWYgKCFSZXF1ZXN0OjpQUl9pc192YWxpZChw KSkKICAgICAgcmV0dXJuIDA7CiAgICBlbHNlCiAgICAgIHJldHVybiAocCA/IHAtPk5QX2lzX25p bCgpIDoKICAgICAgICAgICAgICBfQ09SQkFfdXNlX25pbF9wdHJfYXNfbmlsX3BzZXVkb19vYmpy ZWYoIlJlcXVlc3QiKSk7CiAgfQogICAgICAgICAgICAgICAgICAgaW5saW5lIEJvb2xlYW4gaXNf bmlsKEV4Y2VwdGlvbkxpc3RfcHRyIHApIHsKICAgIGlmICghRXhjZXB0aW9uTGlzdDo6UFJfaXNf dmFsaWQocCkpCiAgICAgIHJldHVybiAwOwogICAgZWxzZQogICAgICByZXR1cm4gKHAgPyBwLT5O UF9pc19uaWwoKSA6CiAgICAgICAgICAgICAgX0NPUkJBX3VzZV9uaWxfcHRyX2FzX25pbF9wc2V1 ZG9fb2JqcmVmKCJFeGNlcHRpb25MaXN0IikpOwogIH0KICAgICAgICAgICAgICAgICAgIGlubGlu ZSBCb29sZWFuIGlzX25pbChDb250ZXh0TGlzdF9wdHIgcCkgewogICAgaWYgKCFDb250ZXh0TGlz dDo6UFJfaXNfdmFsaWQocCkpCiAgICAgIHJldHVybiAwOwogICAgZWxzZQogICAgICByZXR1cm4g KHAgPyBwLT5OUF9pc19uaWwoKSA6CiAgICAgICAgICAgICAgX0NPUkJBX3VzZV9uaWxfcHRyX2Fz X25pbF9wc2V1ZG9fb2JqcmVmKCJDb250ZXh0TGlzdCIpKTsKICB9CiAgICAgICAgICAgICAgICAg ICBpbmxpbmUgQm9vbGVhbiBpc19uaWwoVHlwZUNvZGVfcHRyIHApIHsKICAgIGlmICghVHlwZUNv ZGU6OlBSX2lzX3ZhbGlkKHApKQogICAgICByZXR1cm4gMDsKICAgIGVsc2UKICAgICAgcmV0dXJu IChwID8gcC0+TlBfaXNfbmlsKCkgOgogICAgICAgICAgICAgIF9DT1JCQV91c2VfbmlsX3B0cl9h c19uaWxfcHNldWRvX29ianJlZigiVHlwZUNvZGUiKSk7CiAgfQogICAgICAgICAgICAgICAgICAg aW5saW5lIEJvb2xlYW4gaXNfbmlsKER5bkFueV9wdHIgcCkgewogICAgaWYgKCFEeW5Bbnk6OlBS X2lzX3ZhbGlkKHApKQogICAgICByZXR1cm4gMDsKICAgIGVsc2UKICAgICAgcmV0dXJuIChwID8g cC0+TlBfaXNfbmlsKCkgOgogICAgICAgICAgICAgIF9DT1JCQV91c2VfbmlsX3B0cl9hc19uaWxf cHNldWRvX29ianJlZigiRHluQW55IikpOwogIH0KCgoKCgoKICAgICAgICAgICAgICAgICAgIGlu bGluZSB2b2lkIHJlbGVhc2UoT2JqZWN0X3B0ciBvKSB7CiAgICBpZiggbyAmJiAhby0+X05QX2lz X25pbCgpICkgewogICAgICBpZiggby0+X05QX2lzX3BzZXVkbygpICkgby0+X05QX2RlY3JSZWZD b3VudCgpOwogICAgICBlbHNlIG9tbmk6OnJlbGVhc2VPYmpSZWYoby0+X1BSX2dldG9iaigpKTsK ICAgIH0KICB9CiAgICAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2UoRW52aXJvbm1lbnRfcHRy IHApOwogICAgICAgICAgICAgICAgICAgdm9pZCByZWxlYXNlKENvbnRleHRfcHRyIHApOwogICAg ICAgICAgICAgICAgICAgdm9pZCByZWxlYXNlKFByaW5jaXBhbF9wdHIpOwogICAgICAgICAgICAg ICAgICAgdm9pZCByZWxlYXNlKE5hbWVkVmFsdWVfcHRyIHApOwogICAgICAgICAgICAgICAgICAg dm9pZCByZWxlYXNlKE5WTGlzdF9wdHIgcCk7CiAgICAgICAgICAgICAgICAgICB2b2lkIHJlbGVh c2UoUmVxdWVzdF9wdHIgcCk7CiAgICAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2UoRXhjZXB0 aW9uTGlzdF9wdHIgcCk7CiAgICAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2UoQ29udGV4dExp c3RfcHRyIHApOwogICAgICAgICAgICAgICAgICAgdm9pZCByZWxlYXNlKFR5cGVDb2RlX3B0ciBv KTsKICAgICAgICAgICAgICAgICAgIHZvaWQgcmVsZWFzZShEeW5BbnlfcHRyIGQpOwoKCgoKICAg ICAgICAgICAgICAgICAgIE9iamVjdF9wdHIgVW5NYXJzaGFsT2JqUmVmKGNvbnN0IGNoYXIqIHJl cG9JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldEJ1 ZmZlcmVkU3RyZWFtJiBzKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgTWFyc2hhbE9ialJlZihP YmplY3RfcHRyIG9iaiwgY29uc3QgY2hhciAqcmVwb0lkLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNpemVfdCByZXBvSWRTaXplLCBOZXRCdWZmZXJlZFN0cmVhbSYgcyk7 CiAgICAgICAgICAgICAgICAgICBzaXplX3QgQWxpZ25lZE9ialJlZihPYmplY3RfcHRyIG9iaiwg Y29uc3QgY2hhciAqcmVwb0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc2l6ZV90IHJlcG9JZFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzaXplX3QgaW5pdGlhbG9mZnNldCk7CiAgICAgICAgICAgICAgICAgICBPYmplY3RfcHRy IFVuTWFyc2hhbE9ialJlZihjb25zdCBjaGFyICpyZXBvSWQsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1CdWZmZXJlZFN0cmVhbSYgcyk7CiAgICAgICAg ICAgICAgICAgICB2b2lkIE1hcnNoYWxPYmpSZWYoT2JqZWN0X3B0ciBvYmosIGNvbnN0IGNoYXIq IHJlcG9JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVw b0lkU2l6ZSwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpOwoKCiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRl L29tbmlPUkIzL0NPUkJBX3ZhcnR5cGVzLmgiIDEgMwojIDQ4ICIvdXNyL2xvY2FsL2luY2x1ZGUv b21uaU9SQjMvQ09SQkFfdmFydHlwZXMuaCIgMwpjbGFzcyBPYmplY3RfTWVtYmVyOwpjbGFzcyBP YmplY3RfRWxlbWVudDsKY2xhc3MgT2JqZWN0X0lOT1VUX2FyZzsKY2xhc3MgT2JqZWN0X09VVF9h cmc7CmNsYXNzIE9iamVjdF90Y0Rlc2NfYXJnOwoKY2xhc3MgT2JqZWN0X3ZhciB7CnB1YmxpYzoK ICB0eXBlZGVmIE9iamVjdCBUOwogIHR5cGVkZWYgT2JqZWN0X3B0ciBUX3B0cjsKICB0eXBlZGVm IE9iamVjdF92YXIgVF92YXI7CiAgdHlwZWRlZiBPYmplY3RfTWVtYmVyIFRfbWVtYmVyOwogIHR5 cGVkZWYgT2JqZWN0X0VsZW1lbnQgVF9lbGVtZW50OwoKICBpbmxpbmUgT2JqZWN0X3ZhcigpIDog cGRfcmVmKFQ6Ol9uaWwoKSkge30KICBpbmxpbmUgT2JqZWN0X3ZhcihUX3B0ciBwKSB7IHBkX3Jl ZiA9IHA7IH0KICBpbmxpbmUgT2JqZWN0X3Zhcihjb25zdCBUX3ZhciYgcCkgOiBwZF9yZWYoVDo6 X2R1cGxpY2F0ZShwLnBkX3JlZikpIHt9CiAgaW5saW5lIE9iamVjdF92YXIoY29uc3QgVF9tZW1i ZXImIHApOwogIGlubGluZSBPYmplY3RfdmFyKGNvbnN0IFRfZWxlbWVudCYgcCk7CiAgaW5saW5l IH5PYmplY3RfdmFyKCkgeyByZWxlYXNlKHBkX3JlZik7IH0KCiAgaW5saW5lIFRfdmFyJiBvcGVy YXRvcj0gKFRfcHRyIHApIHsKICAgIHJlbGVhc2UocGRfcmVmKTsKICAgIHBkX3JlZiA9IHA7CiAg ICByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSBUX3ZhciYgb3BlcmF0b3I9IChjb25zdCBUX3Zh ciYgcCkgewogICAgaWYoIHBkX3JlZiAhPSBwLnBkX3JlZiApIHsKICAgICAgcmVsZWFzZShwZF9y ZWYpOwogICAgICBwZF9yZWYgPSBUOjpfZHVwbGljYXRlKHAucGRfcmVmKTsKICAgIH0KICAgIHJl dHVybiAqdGhpczsKICB9CiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfbWVtYmVy JiBwKTsKCiAgaW5saW5lIFRfdmFyJiBvcGVyYXRvcj0gKGNvbnN0IFRfZWxlbWVudCYgcCk7Cgog IGlubGluZSBUX3B0ciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcGRfcmVmOyB9CiAgaW5s aW5lIG9wZXJhdG9yIFRfcHRyKCkgY29uc3QgeyByZXR1cm4gcGRfcmVmOyB9CgogIGlubGluZSBU X3B0ciBpbigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQogIGlubGluZSBUX3B0ciYgaW5vdXQo KSB7IHJldHVybiBwZF9yZWY7IH0KICBpbmxpbmUgVF9wdHImIG91dCgpIHsKICAgIGlmKCAhaXNf bmlsKHBkX3JlZikgKSB7CiAgICAgIHJlbGVhc2UocGRfcmVmKTsKICAgICAgcGRfcmVmID0gVDo6 X25pbCgpOwogICAgfQogICAgcmV0dXJuIHBkX3JlZjsKICB9CiAgaW5saW5lIFRfcHRyIF9yZXRu KCkgewogICAgVF9wdHIgdG1wID0gcGRfcmVmOwogICAgcGRfcmVmID0gVDo6X25pbCgpOwogICAg cmV0dXJuIHRtcDsKICB9CgogIGZyaWVuZCBjbGFzcyBPYmplY3RfTWVtYmVyOwogIGZyaWVuZCBj bGFzcyBPYmplY3RfSU5PVVRfYXJnOwogIGZyaWVuZCBjbGFzcyBPYmplY3RfT1VUX2FyZzsKICBm cmllbmQgY2xhc3MgT2JqZWN0X3RjRGVzY19hcmc7Cgpwcml2YXRlOgogIFRfcHRyIHBkX3JlZjsK fTsKCgoKCgpjbGFzcyBPYmplY3RfTWVtYmVyIHsKcHVibGljOgogIHR5cGVkZWYgT2JqZWN0IFQ7 CiAgdHlwZWRlZiBPYmplY3RfcHRyIFRfcHRyOwogIHR5cGVkZWYgT2JqZWN0X3ZhciBUX3ZhcjsK ICB0eXBlZGVmIE9iamVjdF9NZW1iZXIgVF9tZW1iZXI7CiAgdHlwZWRlZiBPYmplY3RfRWxlbWVu dCBUX2VsZW1lbnQ7CgogIGlubGluZSBPYmplY3RfTWVtYmVyKCkgOiBfcHRyKFQ6Ol9uaWwoKSkg e30KICBpbmxpbmUgT2JqZWN0X01lbWJlcihjb25zdCBUX21lbWJlciYgcCkgewogICAgX3B0ciA9 IFQ6Ol9kdXBsaWNhdGUocC5fcHRyKTsKICB9CiAgaW5saW5lIH5PYmplY3RfTWVtYmVyKCkgewog ICAgQ09SQkE6OnJlbGVhc2UoX3B0cik7CiAgfQoKICBpbmxpbmUgVF9tZW1iZXImIG9wZXJhdG9y PSAoVF9wdHIgcCkgewogICAgQ09SQkE6OnJlbGVhc2UoX3B0cik7CiAgICBfcHRyID0gcDsKICAg IHJldHVybiAqdGhpczsKICB9CiAgaW5saW5lIFRfbWVtYmVyJiBvcGVyYXRvcj0gKGNvbnN0IFRf bWVtYmVyJiBwKSB7CiAgICBpZiggJnAgIT0gdGhpcyApIHsKICAgICAgQ09SQkE6OnJlbGVhc2Uo X3B0cik7CiAgICAgIF9wdHIgPSBUOjpfZHVwbGljYXRlKHAuX3B0cik7CiAgICB9CiAgICByZXR1 cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9tZW1iZXImIG9wZXJhdG9yPSAoY29uc3QgVF92YXIm IHApIHsKICAgIENPUkJBOjpyZWxlYXNlKF9wdHIpOwogICAgX3B0ciA9IFQ6Ol9kdXBsaWNhdGUo cCk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9tZW1iZXImIG9wZXJhdG9yPSAo Y29uc3QgVF9lbGVtZW50JiBwKTsKCiAgaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6 ZV90IGluaXRpYWxvZmZzZXQpIGNvbnN0IHsKICAgIHJldHVybiBDT1JCQTo6T2JqZWN0OjpfTlBf YWxpZ25lZFNpemUoX3B0cixpbml0aWFsb2Zmc2V0KTsKICB9CiAgaW5saW5lIHZvaWQgb3BlcmF0 b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSBjb25zdCB7CiAgICBDT1JCQTo6T2JqZWN0Ojpf bWFyc2hhbE9ialJlZihfcHRyLHMpOwogIH0KICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PSAoTmV0 QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIE9iamVjdF9wdHIgX3Jlc3VsdCA9IENPUkJBOjpPYmpl Y3Q6Ol91bm1hcnNoYWxPYmpSZWYocyk7CiAgICBDT1JCQTo6cmVsZWFzZShfcHRyKTsKICAgIF9w dHIgPSBfcmVzdWx0OwogIH0KICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRT dHJlYW0mIHMpIGNvbnN0IHsKICAgIENPUkJBOjpPYmplY3Q6Ol9tYXJzaGFsT2JqUmVmKF9wdHIs cyk7CiAgfQogIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSYgcykg ewogICAgT2JqZWN0X3B0ciBfcmVzdWx0ID0gQ09SQkE6Ok9iamVjdDo6X3VubWFyc2hhbE9ialJl ZihzKTsKICAgIENPUkJBOjpyZWxlYXNlKF9wdHIpOwogICAgX3B0ciA9IF9yZXN1bHQ7CiAgfQoK ICBpbmxpbmUgT2JqZWN0X3B0ciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gX3B0cjsgfQog IGlubGluZSBvcGVyYXRvciBPYmplY3RfcHRyICgpIGNvbnN0IHsgcmV0dXJuIF9wdHI7IH0KCiAg aW5saW5lIE9iamVjdF9wdHIgaW4oKSBjb25zdCB7IHJldHVybiBfcHRyOyB9CiAgaW5saW5lIE9i amVjdF9wdHImIGlub3V0KCkgeyByZXR1cm4gX3B0cjsgfQogIGlubGluZSBPYmplY3RfcHRyJiBv dXQoKSB7CiAgICBDT1JCQTo6cmVsZWFzZShfcHRyKTsKICAgIF9wdHIgPSBDT1JCQTo6T2JqZWN0 OjpfbmlsKCk7CiAgICByZXR1cm4gX3B0cjsKICB9CiAgaW5saW5lIE9iamVjdF9wdHIgX3JldG4o KSB7CiAgICBPYmplY3RfcHRyIHRtcDsKICAgIHRtcCA9IF9wdHI7CiAgICBfcHRyID0gQ09SQkE6 Ok9iamVjdDo6X25pbCgpOwogICAgcmV0dXJuIHRtcDsKICB9CgogIE9iamVjdF9wdHIgX3B0cjsK fTsKCgoKCgpjbGFzcyBPYmplY3RfRWxlbWVudCB7CnB1YmxpYzoKICB0eXBlZGVmIE9iamVjdCBU OwogIHR5cGVkZWYgT2JqZWN0X3B0ciBUX3B0cjsKICB0eXBlZGVmIE9iamVjdF92YXIgVF92YXI7 CiAgdHlwZWRlZiBPYmplY3RfTWVtYmVyIFRfbWVtYmVyOwogIHR5cGVkZWYgT2JqZWN0X0VsZW1l bnQgVF9lbGVtZW50OwoKICBpbmxpbmUgT2JqZWN0X0VsZW1lbnQoVF9wdHImIHAsIF9DT1JCQV9C b29sZWFuIHJlbCkKICAgIDogcGRfcmVsKHJlbCksIHBkX2RhdGEocCkge30KCiAgaW5saW5lIE9i amVjdF9FbGVtZW50KGNvbnN0IFRfZWxlbWVudCYgcCkKICAgIDogcGRfcmVsKHAucGRfcmVsKSwg cGRfZGF0YShwLnBkX2RhdGEpIHt9CgogIGlubGluZSB+T2JqZWN0X0VsZW1lbnQoKSB7CgogIH0K CiAgaW5saW5lIFRfZWxlbWVudCYgb3BlcmF0b3I9IChUX3B0ciBwKSB7CiAgICBpZiggcGRfcmVs ICkgQ09SQkE6OnJlbGVhc2UocGRfZGF0YSk7CiAgICBwZF9kYXRhID0gcDsKICAgIHJldHVybiAq dGhpczsKICB9CgogIGlubGluZSBUX2VsZW1lbnQmIG9wZXJhdG9yPSAoY29uc3QgVF9lbGVtZW50 JiBwKSB7CiAgICBpZiggcGRfcmVsICkgewogICAgICBDT1JCQTo6cmVsZWFzZShwZF9kYXRhKTsK ICAgICAgVDo6X2R1cGxpY2F0ZShwLnBkX2RhdGEpOwogICAgICBwZF9kYXRhID0gcC5wZF9kYXRh OwogICAgfQogICAgZWxzZQogICAgICBwZF9kYXRhID0gcC5wZF9kYXRhOwogICAgcmV0dXJuICp0 aGlzOwogIH0KCiAgaW5saW5lIFRfZWxlbWVudCYgb3BlcmF0b3I9IChjb25zdCBUX21lbWJlciYg cCkgewogICAgaWYoIHBkX3JlbCApIHsKICAgICAgQ09SQkE6OnJlbGVhc2UocGRfZGF0YSk7CiAg ICAgIFQ6Ol9kdXBsaWNhdGUocCk7CiAgICB9CiAgICBwZF9kYXRhID0gKFRfcHRyKSBwOwogICAg cmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfZWxlbWVudCYgb3BlcmF0b3I9IChjb25zdCBU X3ZhciYgcCkgewogICAgaWYoIHBkX3JlbCApIHsKICAgICAgQ09SQkE6OnJlbGVhc2UocGRfZGF0 YSk7CiAgICAgIFQ6Ol9kdXBsaWNhdGUocCk7CiAgICB9CiAgICBwZF9kYXRhID0gKFRfcHRyKXA7 CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0 IHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxpbmUgb3BlcmF0b3IgVF9wdHIgKCkgY29uc3QgeyBy ZXR1cm4gcGRfZGF0YTsgfQoKICBpbmxpbmUgVF9wdHIgaW4oKSBjb25zdCB7IHJldHVybiBwZF9k YXRhOyB9CiAgaW5saW5lIFRfcHRyJiBpbm91dCgpIHsgcmV0dXJuIHBkX2RhdGE7IH0KICBpbmxp bmUgVF9wdHImIG91dCgpIHsKICAgIGlmIChwZF9yZWwpIHsKICAgICAgQ09SQkE6OnJlbGVhc2Uo cGRfZGF0YSk7CiAgICB9CiAgICBwZF9kYXRhID0gVDo6X25pbCgpOwogICAgcmV0dXJuIHBkX2Rh dGE7CiAgfQoKICBpbmxpbmUgVF9wdHIgX3JldG4oKSB7CiAgICBUX3B0ciB0bXAgPSBwZF9kYXRh OwogICAgaWYgKCFwZF9yZWwpIHsgVDo6X2R1cGxpY2F0ZShwZF9kYXRhKTsgfQogICAgcGRfZGF0 YSA9IFQ6Ol9uaWwoKTsKICAgIHJldHVybiB0bXA7CiAgfQoKICBpbmxpbmUgVF9wdHImIF9OUF9y ZWYoKSBjb25zdCB7cmV0dXJuIHBkX2RhdGE7fQogIGlubGluZSBfQ09SQkFfQm9vbGVhbiBfTlBf cmVsZWFzZSgpIGNvbnN0IHtyZXR1cm4gcGRfcmVsO30KCiAgX0NPUkJBX0Jvb2xlYW4gcGRfcmVs OwogIFRfcHRyJiBwZF9kYXRhOwp9OwoKCgoKCmNsYXNzIE9iamVjdF9JTk9VVF9hcmcgewpwdWJs aWM6CiAgaW5saW5lIE9iamVjdF9JTk9VVF9hcmcoT2JqZWN0X3B0ciYgcCkgOiBfZGF0YShwKSB7 fQogIGlubGluZSBPYmplY3RfSU5PVVRfYXJnKE9iamVjdF92YXImIHApIDogX2RhdGEocC5wZF9y ZWYpIHt9CiAgaW5saW5lIE9iamVjdF9JTk9VVF9hcmcoT2JqZWN0X01lbWJlciYgcCkgOiBfZGF0 YShwLl9wdHIpIHt9CiAgaW5saW5lIE9iamVjdF9JTk9VVF9hcmcoT2JqZWN0X0VsZW1lbnQmIHAp IDogX2RhdGEocC5fTlBfcmVmKCkpIHsKCgoKCgoKICAgIGlmKCAhcC5fTlBfcmVsZWFzZSgpICkK ICAgICAgT2JqZWN0OjpfZHVwbGljYXRlKHAuX05QX3JlZigpKTsKICB9CiAgaW5saW5lIH5PYmpl Y3RfSU5PVVRfYXJnKCkge30KCiAgaW5saW5lIG9wZXJhdG9yIE9iamVjdF9wdHImKCkgeyByZXR1 cm4gX2RhdGE7IH0KCiAgT2JqZWN0X3B0ciYgX2RhdGE7Cgpwcml2YXRlOgogIE9iamVjdF9JTk9V VF9hcmcoKTsKfTsKCgoKCgpjbGFzcyBPYmplY3RfT1VUX2FyZyB7CnB1YmxpYzoKICB0eXBlZGVm IE9iamVjdCBUOwogIHR5cGVkZWYgT2JqZWN0X3B0ciBUX3B0cjsKICB0eXBlZGVmIE9iamVjdF92 YXIgVF92YXI7CiAgdHlwZWRlZiBPYmplY3RfTWVtYmVyIFRfbWVtYmVyOwogIHR5cGVkZWYgT2Jq ZWN0X0VsZW1lbnQgVF9lbGVtZW50OwogIHR5cGVkZWYgT2JqZWN0X09VVF9hcmcgVF9vdXQ7Cgog IGlubGluZSBPYmplY3RfT1VUX2FyZyhUX3B0ciYgcCkgOiBfZGF0YShwKSB7IF9kYXRhID0gVDo6 X25pbCgpOyB9CiAgaW5saW5lIE9iamVjdF9PVVRfYXJnKFRfdmFyJiBwKSA6IF9kYXRhKHAucGRf cmVmKSB7CiAgICBwID0gVDo6X25pbCgpOwogIH0KICBpbmxpbmUgT2JqZWN0X09VVF9hcmcoVF9t ZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7CiAgICBwID0gVDo6X25pbCgpOwogIH0KICBpbmxp bmUgT2JqZWN0X09VVF9hcmcoVF9lbGVtZW50JiBwKSA6IF9kYXRhKHAuX05QX3JlZigpKSB7CiAg ICBwID0gVDo6X25pbCgpOwogIH0KICBpbmxpbmUgT2JqZWN0X09VVF9hcmcoY29uc3QgVF9vdXQm IHApIDogX2RhdGEocC5fZGF0YSkge30KICBpbmxpbmUgfk9iamVjdF9PVVRfYXJnKCkge30KCiAg aW5saW5lIE9iamVjdF9PVVRfYXJnJiBvcGVyYXRvcj0oY29uc3QgVF9vdXQmIHApIHsKICAgIF9k YXRhID0gcC5fZGF0YTsgcmV0dXJuICp0aGlzOyB9CiAgaW5saW5lIE9iamVjdF9PVVRfYXJnJiBv cGVyYXRvcj0oVF9wdHIgcCkgeyBfZGF0YSA9IHA7IHJldHVybiAqdGhpczsgfQoKICBpbmxpbmUg b3BlcmF0b3IgVF9wdHImKCkgeyByZXR1cm4gX2RhdGE7IH0KICBpbmxpbmUgVF9wdHImIHB0cigp IHsgcmV0dXJuIF9kYXRhOyB9CiAgaW5saW5lIFRfcHRyIG9wZXJhdG9yLT4oKSB7IHJldHVybiBf ZGF0YTsgfQoKICBUX3B0ciYgX2RhdGE7Cgpwcml2YXRlOgogIE9iamVjdF9PVVRfYXJnKCk7CiAg VF9vdXQmIG9wZXJhdG9yPShjb25zdCBUX21lbWJlciYgcCk7CiAgVF9vdXQmIG9wZXJhdG9yPShj b25zdCBUX2VsZW1lbnQmIHApOwogIFRfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImIHApOwoK fTsKCgp0eXBlZGVmIE9iamVjdF9PVVRfYXJnIE9iamVjdF9vdXQ7CgoKCgoKY2xhc3MgT2JqZWN0 X3RjRGVzY19hcmcgewpwdWJsaWM6CgoKCgoKCiAgdHlwZWRlZiBPYmplY3RfTWVtYmVyIFRfbWVt YmVyOwogIHR5cGVkZWYgT2JqZWN0X0VsZW1lbnQgVF9lbGVtZW50OwogIHR5cGVkZWYgT2JqZWN0 X3ZhciBUX3ZhcjsKICBpbmxpbmUgT2JqZWN0X3RjRGVzY19hcmcoVF92YXImIHApIDogX2RhdGEo cC5wZF9yZWYpLCBfcmVsKDEpIHt9CiAgaW5saW5lIE9iamVjdF90Y0Rlc2NfYXJnKFRfbWVtYmVy JiBwKSA6IF9kYXRhKHAuX3B0ciksIF9yZWwoMSkge30KICBpbmxpbmUgT2JqZWN0X3RjRGVzY19h cmcoVF9lbGVtZW50IHApCiAgICA6IF9kYXRhKHAuX05QX3JlZigpKSwgX3JlbChwLl9OUF9yZWxl YXNlKCkpIHt9CiAgaW5saW5lIH5PYmplY3RfdGNEZXNjX2FyZygpIHt9CgogIE9iamVjdF9wdHIm IF9kYXRhOwogIF9DT1JCQV9Cb29sZWFuIF9yZWw7Cgpwcml2YXRlOgogIE9iamVjdF90Y0Rlc2Nf YXJnKCk7Cn07CgoKCgoKY2xhc3MgVHlwZUNvZGVfSU5PVVRfYXJnOwpjbGFzcyBUeXBlQ29kZV9P VVRfYXJnOwoKY2xhc3MgVHlwZUNvZGVfdmFyIHsKcHVibGljOgogIHR5cGVkZWYgVHlwZUNvZGVf cHRyIFRfcHRyOwogIHR5cGVkZWYgVHlwZUNvZGVfdmFyIFRfdmFyOwogIHR5cGVkZWYgVHlwZUNv ZGVfbWVtYmVyIFRfbWVtYmVyOwoKICBpbmxpbmUgVHlwZUNvZGVfdmFyKCkgOiBwZF9yZWYoVHlw ZUNvZGU6Ol9uaWwoKSkge30KICBpbmxpbmUgVHlwZUNvZGVfdmFyKFRfcHRyIHApIDogcGRfcmVm KHApIHt9CiAgaW5saW5lIFR5cGVDb2RlX3Zhcihjb25zdCBUX3ZhciYgcCkgewogICAgcGRfcmVm ID0gVHlwZUNvZGU6Ol9kdXBsaWNhdGUocC5wZF9yZWYpOwogIH0KICBUeXBlQ29kZV92YXIoY29u c3QgVHlwZUNvZGVfbWVtYmVyJiBwKSB7CiAgICBwZF9yZWYgPSBUeXBlQ29kZTo6X2R1cGxpY2F0 ZShwLl9wdHIpOwogIH0KICB+VHlwZUNvZGVfdmFyKCkgeyByZWxlYXNlKHBkX3JlZik7IH0KCiAg aW5saW5lIFRfdmFyJiBvcGVyYXRvcj0gKFRfcHRyIHApIHsKICAgIHJlbGVhc2UocGRfcmVmKTsK ICAgIHBkX3JlZiA9IHA7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF92YXImIG9w ZXJhdG9yPSAoY29uc3QgVF92YXImIHApIHsKICAgIGlmKCBwZF9yZWYgIT0gcC5wZF9yZWYgKSB7 CiAgICAgIHJlbGVhc2UocGRfcmVmKTsKICAgICAgcGRfcmVmID0gVHlwZUNvZGU6Ol9kdXBsaWNh dGUocC5wZF9yZWYpOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIFRfdmFy JiBvcGVyYXRvcj0oY29uc3QgVHlwZUNvZGVfbWVtYmVyJiBwKSB7CiAgICByZWxlYXNlKHBkX3Jl Zik7CiAgICBwZF9yZWYgPSBUeXBlQ29kZTo6X2R1cGxpY2F0ZShwLl9wdHIpOwogICAgcmV0dXJu ICp0aGlzOwogIH0KCiAgVF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsg fQogIG9wZXJhdG9yIFRfcHRyICgpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQoKICBUX3B0ciBp bigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQogIFRfcHRyJiBpbm91dCgpIHsgcmV0dXJuIHBk X3JlZjsgfQogIFRfcHRyJiBvdXQoKSB7CiAgICByZWxlYXNlKHBkX3JlZik7CiAgICBwZF9yZWYg PSBUeXBlQ29kZTo6X25pbCgpOwogICAgcmV0dXJuIHBkX3JlZjsKICB9CiAgVF9wdHIgX3JldG4o KSB7CiAgICBUX3B0ciB0bXAgPSBwZF9yZWY7CiAgICBwZF9yZWYgPSBUeXBlQ29kZTo6X25pbCgp OwogICAgcmV0dXJuIHRtcDsKICB9CgogIGZyaWVuZCBjbGFzcyBUeXBlQ29kZV9tZW1iZXI7CiAg ZnJpZW5kIGNsYXNzIFR5cGVDb2RlX0lOT1VUX2FyZzsKICBmcmllbmQgY2xhc3MgVHlwZUNvZGVf T1VUX2FyZzsKCnByaXZhdGU6CiAgVF9wdHIgcGRfcmVmOwp9OwoKCgoKCmNsYXNzIFR5cGVDb2Rl X0lOT1VUX2FyZyB7CnB1YmxpYzoKICBpbmxpbmUgVHlwZUNvZGVfSU5PVVRfYXJnKFR5cGVDb2Rl X3B0ciYgcCkgOiBfZGF0YShwKSB7IH0KICBpbmxpbmUgVHlwZUNvZGVfSU5PVVRfYXJnKFR5cGVD b2RlX3ZhciYgcCkgOiBfZGF0YShwLnBkX3JlZikgeyB9CiAgaW5saW5lIFR5cGVDb2RlX0lOT1VU X2FyZyhUeXBlQ29kZV9tZW1iZXImIHApIDogX2RhdGEocC5fcHRyKSB7IH0KICBpbmxpbmUgflR5 cGVDb2RlX0lOT1VUX2FyZygpIHt9CgogIGlubGluZSBvcGVyYXRvciBUeXBlQ29kZV9wdHImKCkg eyByZXR1cm4gX2RhdGE7IH0KCiAgVHlwZUNvZGVfcHRyJiBfZGF0YTsKCnByaXZhdGU6CiAgVHlw ZUNvZGVfSU5PVVRfYXJnKCk7Cn07CgoKCgoKY2xhc3MgVHlwZUNvZGVfT1VUX2FyZyB7CnB1Ymxp YzoKICB0eXBlZGVmIFR5cGVDb2RlIFQ7CiAgdHlwZWRlZiBUeXBlQ29kZV9wdHIgVF9wdHI7CiAg dHlwZWRlZiBUeXBlQ29kZV92YXIgVF92YXI7CiAgdHlwZWRlZiBUeXBlQ29kZV9tZW1iZXIgVF9t ZW1iZXI7CgogIFR5cGVDb2RlX09VVF9hcmcoVF9wdHImIHApIDogX2RhdGEocCkgeyBfZGF0YSA9 IFQ6Ol9uaWwoKTsgfQogIFR5cGVDb2RlX09VVF9hcmcoVF92YXImIHApIDogX2RhdGEocC5wZF9y ZWYpIHsKICAgIHAgPSBUOjpfbmlsKCk7CiAgfQogIGlubGluZSBUeXBlQ29kZV9PVVRfYXJnKFRf bWVtYmVyJiBwKSA6IF9kYXRhKHAuX3B0cikgewogICAgcCA9IFQ6Ol9uaWwoKTsKICB9CiAgaW5s aW5lIH5UeXBlQ29kZV9PVVRfYXJnKCkge30KCiAgaW5saW5lIFR5cGVDb2RlX09VVF9hcmcmIG9w ZXJhdG9yPShUX3B0ciBwKSB7IF9kYXRhID0gcDsgcmV0dXJuICp0aGlzOyB9CiAgaW5saW5lIFR5 cGVDb2RlX09VVF9hcmcmIG9wZXJhdG9yPShjb25zdCBUX21lbWJlciYgcCkgewogICAgX2RhdGEg PSBUOjpfZHVwbGljYXRlKHApOyByZXR1cm4gKnRoaXM7CiAgfQogIGlubGluZSBvcGVyYXRvciBU X3B0ciYoKSB7IHJldHVybiBfZGF0YTsgfQogIGlubGluZSBUX3B0ciYgcHRyKCkgeyByZXR1cm4g X2RhdGE7IH0KICBpbmxpbmUgVF9wdHIgb3BlcmF0b3ItPigpIHsgcmV0dXJuIF9kYXRhOyB9Cgog IFRfcHRyJiBfZGF0YTsKCnByaXZhdGU6CiAgVHlwZUNvZGVfT1VUX2FyZygpOwp9OwoKCnR5cGVk ZWYgVHlwZUNvZGVfT1VUX2FyZyBUeXBlQ29kZV9vdXQ7CgoKCgoKY2xhc3MgT1JCX3ZhciB7CnB1 YmxpYzoKICB0eXBlZGVmIE9SQiBUOwogIHR5cGVkZWYgT1JCX3B0ciBUX3B0cjsKICB0eXBlZGVm IE9SQl92YXIgVF92YXI7CgogIGlubGluZSBPUkJfdmFyKCkgOiBwZF9yZWYoVDo6X25pbCgpKSB7 fQogIGlubGluZSBPUkJfdmFyKFRfcHRyIHApIDogcGRfcmVmKHApIHt9CiAgaW5saW5lIE9SQl92 YXIoY29uc3QgVF92YXImIHApIDogcGRfcmVmKFQ6Ol9kdXBsaWNhdGUocC5wZF9yZWYpKSB7fQog IGlubGluZSB+T1JCX3ZhcigpIHsgcmVsZWFzZShwZF9yZWYpOyB9CgogIGlubGluZSBUX3ZhciYg b3BlcmF0b3I9IChUX3B0ciBwKSB7CiAgICByZWxlYXNlKHBkX3JlZik7CiAgICBwZF9yZWYgPSBw OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoY29uc3Qg VF92YXImIHApIHsKICAgIGlmKCBwZF9yZWYgIT0gcC5wZF9yZWYgKSB7CiAgICAgIHJlbGVhc2Uo cGRfcmVmKTsKICAgICAgcGRfcmVmID0gVDo6X2R1cGxpY2F0ZShwLnBkX3JlZik7CiAgICB9CiAg ICByZXR1cm4gKnRoaXM7CiAgfQoKICBpbmxpbmUgVF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsg cmV0dXJuIHBkX3JlZjsgfQogIGlubGluZSBvcGVyYXRvciBUX3B0cigpIGNvbnN0IHsgcmV0dXJu IHBkX3JlZjsgfQoKICBpbmxpbmUgVF9wdHIgaW4oKSBjb25zdCB7IHJldHVybiBwZF9yZWY7IH0K ICBpbmxpbmUgVF9wdHImIGlub3V0KCkgeyByZXR1cm4gcGRfcmVmOyB9CiAgaW5saW5lIFRfcHRy JiBvdXQoKSB7CiAgICBpZiggIWlzX25pbChwZF9yZWYpICkgewogICAgICByZWxlYXNlKHBkX3Jl Zik7CiAgICAgIHBkX3JlZiA9IFQ6Ol9uaWwoKTsKICAgIH0KICAgIHJldHVybiBwZF9yZWY7CiAg fQogIGlubGluZSBUX3B0ciBfcmV0bigpIHsKICAgIFRfcHRyIHRtcCA9IHBkX3JlZjsKICAgIHBk X3JlZiA9IFQ6Ol9uaWwoKTsKICAgIHJldHVybiB0bXA7CiAgfQoKcHJpdmF0ZToKICBUX3B0ciBw ZF9yZWY7Cn07CgoKCgoKY2xhc3MgQk9BX3ZhciB7CnB1YmxpYzoKICB0eXBlZGVmIEJPQSBUOwog IHR5cGVkZWYgQk9BX3B0ciBUX3B0cjsKICB0eXBlZGVmIEJPQV92YXIgVF92YXI7CgogIGlubGlu ZSBCT0FfdmFyKCkgOiBwZF9yZWYoVDo6X25pbCgpKSB7fQogIGlubGluZSBCT0FfdmFyKFRfcHRy IHApIDogcGRfcmVmKHApIHt9CiAgaW5saW5lIEJPQV92YXIoY29uc3QgVF92YXImIHApIDogcGRf cmVmKFQ6Ol9kdXBsaWNhdGUocC5wZF9yZWYpKSB7fQogIGlubGluZSB+Qk9BX3ZhcigpIHsgcmVs ZWFzZShwZF9yZWYpOyB9CgogIGlubGluZSBUX3ZhciYgb3BlcmF0b3I9IChUX3B0ciBwKSB7CiAg ICByZWxlYXNlKHBkX3JlZik7CiAgICBwZF9yZWYgPSBwOwogICAgcmV0dXJuICp0aGlzOwogIH0K ICBpbmxpbmUgVF92YXImIG9wZXJhdG9yPSAoY29uc3QgVF92YXImIHApIHsKICAgIGlmKCBwZF9y ZWYgIT0gcC5wZF9yZWYgKSB7CiAgICAgIHJlbGVhc2UocGRfcmVmKTsKICAgICAgcGRfcmVmID0g VDo6X2R1cGxpY2F0ZShwLnBkX3JlZik7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBp bmxpbmUgVF9wdHIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQogIGlubGlu ZSBvcGVyYXRvciBUX3B0cigpIGNvbnN0IHsgcmV0dXJuIHBkX3JlZjsgfQoKICBpbmxpbmUgVF9w dHIgaW4oKSBjb25zdCB7IHJldHVybiBwZF9yZWY7IH0KICBpbmxpbmUgVF9wdHImIGlub3V0KCkg eyByZXR1cm4gcGRfcmVmOyB9CiAgaW5saW5lIFRfcHRyJiBvdXQoKSB7CiAgICBpZiggIWlzX25p bChwZF9yZWYpICkgewogICAgICByZWxlYXNlKHBkX3JlZik7CiAgICAgIHBkX3JlZiA9IFQ6Ol9u aWwoKTsKICAgIH0KICAgIHJldHVybiBwZF9yZWY7CiAgfQogIGlubGluZSBUX3B0ciBfcmV0bigp IHsKICAgIFRfcHRyIHRtcCA9IHBkX3JlZjsKICAgIHBkX3JlZiA9IFQ6Ol9uaWwoKTsKICAgIHJl dHVybiB0bXA7CiAgfQoKcHJpdmF0ZToKICBUX3B0ciBwZF9yZWY7Cn07CgoKCgoKCnR5cGVkZWYg X0NPUkJBX1BzZXVkb09ial9WYXI8RHluQW55PiBEeW5BbnlfdmFyOwp0eXBlZGVmIF9DT1JCQV9Q c2V1ZG9PYmpfVmFyPER5bkVudW0+IER5bkVudW1fdmFyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9P YmpfVmFyPER5blN0cnVjdD4gRHluU3RydWN0X3ZhcjsKdHlwZWRlZiBfQ09SQkFfUHNldWRvT2Jq X1ZhcjxEeW5Vbmlvbj4gRHluVW5pb25fdmFyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFy PER5blNlcXVlbmNlPiBEeW5TZXF1ZW5jZV92YXI7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9W YXI8RHluQXJyYXk+IER5bkFycmF5X3ZhcjsKCgp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVt YmVyPER5bkFueSxEeW5BbnlfdmFyPiBEeW5BbnlfbWVtYmVyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1 ZG9PYmpfTWVtYmVyPER5bkVudW0sRHluRW51bV92YXI+IER5bkVudW1fbWVtYmVyOwp0eXBlZGVm IF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5blN0cnVjdCxEeW5TdHJ1Y3RfdmFyPiBEeW5TdHJ1 Y3RfbWVtYmVyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5blVuaW9uLER5blVu aW9uX3Zhcj4gRHluVW5pb25fbWVtYmVyOwp0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVy PER5blNlcXVlbmNlLER5blNlcXVlbmNlX3Zhcj4KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluU2VxdWVuY2VfbWVtYmVyOwp0eXBlZGVm IF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPER5bkFycmF5LER5bkFycmF5X3Zhcj4gRHluQXJyYXlf bWVtYmVyOwoKCnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8RHluQW55LER5bkFueV92YXI+ IER5bkFueV9vdXQ7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8RHluRW51bSxEeW5FbnVt X3Zhcj4gRHluRW51bV9vdXQ7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8RHluU3RydWN0 LER5blN0cnVjdF92YXI+IER5blN0cnVjdF9vdXQ7CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9P dXQ8RHluVW5pb24sRHluVW5pb25fdmFyPiBEeW5Vbmlvbl9vdXQ7CnR5cGVkZWYgX0NPUkJBX1Bz ZXVkb09ial9PdXQ8RHluU2VxdWVuY2UsRHluU2VxdWVuY2VfdmFyPiBEeW5TZXF1ZW5jZV9vdXQ7 CnR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9PdXQ8RHluQXJyYXksRHluQXJyYXlfdmFyPiBEeW5B cnJheV9vdXQ7CiMgMjU5MCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDIg MwoKCn0KCm5hbWVzcGFjZSBDT1JCQQp7CiMgMjYxNiAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlP UkIzL0NPUkJBLmgiIDMKfQoKCiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlP UkIuaCIgMSAzCiMgMTI1ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAz CnN0cnVjdCBvbW5pT3JiQm9hS2V5IHsKICBfQ09SQkFfVUxvbmcgaGk7CiAgX0NPUkJBX1VMb25n IG1lZDsKICBfQ09SQkFfVUxvbmcgbG87Cn07CgoKbmFtZXNwYWNlIG9tbmlPUkIKCnsKIyAxNDgg Ii91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiIDMKICBleHRlcm4gY2hhciog c2VydmVyTmFtZTsKIyAxNjEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgi IDMKICBleHRlcm4gaW50IHRyYWNlTGV2ZWw7CgoKCgoKICBleHRlcm4gaW50IHRyYWNlSW52b2Nh dGlvbnM7CiMgMTk3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAzCiAg ZXh0ZXJuIENPUkJBOjpCb29sZWFuIHN0cmljdElJT1A7CiMgMjIzICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAzCiAgZXh0ZXJuIENPUkJBOjpCb29sZWFuIHRjQWxpYXNF eHBhbmQ7CiMgMjM3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAzCiAg dHlwZWRlZiBvbW5pT3JiQm9hS2V5IG9iamVjdEtleTsKCgoKCgoKICAgICAgICAgICAgICAgICAg IHZvaWQgZ2VuZXJhdGVOZXdLZXkob2JqZWN0S2V5ICZrKTsKCgogICAgICAgICAgICAgICAgICAg b2JqZWN0S2V5IG51bGxrZXkoKTsKCgogICAgICAgICAgICAgICAgICAgaW50IG9wZXJhdG9yPT0o Y29uc3Qgb2JqZWN0S2V5ICZrMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBvYmplY3RLZXkgJmsyKTsKCgogICAgICAgICAgICAgICAgICAgaW50IG9wZXJhdG9y IT0oY29uc3Qgb2JqZWN0S2V5ICZrMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBvYmplY3RLZXkgJmsyKTsKCgogIHR5cGVkZWYgX0NPUkJBX1VuYm91bmRlZF9T ZXF1ZW5jZV9PY3RldCBzZXFPY3RldHM7CgogICAgICAgICAgICAgICAgICAgc2VxT2N0ZXRzKiBr ZXlUb09jdGV0U2VxdWVuY2UoY29uc3Qgb2JqZWN0S2V5ICZrMSk7CgoKCgogICAgICAgICAgICAg ICAgICAgb2JqZWN0S2V5IG9jdGV0U2VxdWVuY2VUb0tleShjb25zdCBzZXFPY3RldHMmIHNlcSk7 CiMgMjc0ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAzCiAgICAgICAg ICAgICAgICAgICBzaXplX3QgTWF4TWVzc2FnZVNpemUoKTsKIyAyODMgIi91c3IvbG9jYWwvaW5j bHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiIDMKICAgICAgICAgICAgICAgICAgIHZvaWQgTWF4TWVz c2FnZVNpemUoc2l6ZV90IG5ld3ZhbHVlKTsKCgoKICBlbnVtIGlkbGVDb25uVHlwZSB7IGlkbGVJ bmNvbWluZywgaWRsZU91dGdvaW5nIH07CiMgMjk2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9S QjMvb21uaU9SQi5oIiAzCiAgICAgICAgICAgICAgICAgICB2b2lkIGlkbGVDb25uZWN0aW9uU2Nh blBlcmlvZChpZGxlQ29ublR5cGUgZGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBDT1JCQTo6VUxvbmcgc2VjKTsKCgoKCgogICAgICAgICAgICAgICAgICAg Q09SQkE6OlVMb25nIGlkbGVDb25uZWN0aW9uU2NhblBlcmlvZCgKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBpZGxlQ29ublR5cGUgZGlyZWN0aW9uKTsKCgoKICBlbnVt IGNhbGxUaW1lT3V0VHlwZSB7IGNsaWVudFNpZGUsIHNlcnZlclNpZGUgfTsKIyAzMTggIi91c3Iv bG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiIDMKICAgICAgICAgICAgICAgICAgIHZv aWQgY2FsbFRpbWVPdXRQZXJpb2QoY2FsbFRpbWVPdXRUeXBlIGRpcmVjdGlvbiwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SQkE6OlVMb25nIHNlYyk7CgoKCgoK ICAgICAgICAgICAgICAgICAgIENPUkJBOjpVTG9uZyBjYWxsVGltZU91dFBlcmlvZCgKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFRpbWVPdXRUeXBlIGRp cmVjdGlvbik7CiMgMzQwICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAz CiAgICAgICAgICAgICAgICAgICB2b2lkIHNjYW5HcmFudWxhcml0eShDT1JCQTo6VUxvbmcgc2Vj KTsKCgoKCgogICAgICAgICAgICAgICAgICAgQ09SQkE6OlVMb25nIHNjYW5HcmFudWxhcml0eSgp OwojIDM4MiAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIgMwogIHR5cGVk ZWYgQ09SQkE6OkJvb2xlYW4gKCp0cmFuc2llbnRFeGNlcHRpb25IYW5kbGVyX3QpKHZvaWQqIGNv b2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUkJBOjpVTG9u ZyBuX3JldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBDT1JCQTo6VFJBTlNJRU5UJiBleCk7CgogICAgICAgICAgICAgICAgICAgdm9pZCBpbnN0YWxs VHJhbnNpZW50RXhjZXB0aW9uSGFuZGxlcih2b2lkKiBjb29raWUsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHRyYW5zaWVudEV4Y2VwdGlvbkhhbmRsZXJfdCBmbik7CgogICAgICAg ICAgICAgICAgICAgdm9pZCBpbnN0YWxsVHJhbnNpZW50RXhjZXB0aW9uSGFuZGxlcigKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHRyYW5zaWVudEV4Y2VwdGlvbkhhbmRsZXJfdCBmbik7CgogIGV4dGVy biBDT1JCQTo6VUxvbmcgZGVmYXVsdFRyYW5zaWVudFJldHJ5RGVsYXlJbmNyZW1lbnQ7CiAgZXh0 ZXJuIENPUkJBOjpVTG9uZyBkZWZhdWx0VHJhbnNpZW50UmV0cnlEZWxheU1heGltdW07CiMgNDEz ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAzCiAgdHlwZWRlZiBDT1JC QTo6Qm9vbGVhbiAoKmNvbW1GYWlsdXJlRXhjZXB0aW9uSGFuZGxlcl90KSh2b2lkKiBjb29raWUs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JCQTo6VUxvbmcgbl9y ZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09S QkE6OkNPTU1fRkFJTFVSRSYgZXgpOwoKICAgICAgICAgICAgICAgICAgIHZvaWQgaW5zdGFsbENv bW1GYWlsdXJlRXhjZXB0aW9uSGFuZGxlcih2b2lkKiBjb29raWUsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbW1GYWlsdXJlRXhjZXB0aW9uSGFuZGxlcl90IGZuKTsKCiAgICAg ICAgICAgICAgICAgICB2b2lkIGluc3RhbGxDb21tRmFpbHVyZUV4Y2VwdGlvbkhhbmRsZXIoCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tRmFpbHVyZUV4Y2VwdGlvbkhhbmRsZXJfdCBm bik7CiMgNDQ2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAzCiAgdHlw ZWRlZiBDT1JCQTo6Qm9vbGVhbiAoKnN5c3RlbUV4Y2VwdGlvbkhhbmRsZXJfdCkodm9pZCogY29v a2llLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUkJBOjpVTG9uZyBuX3Jl dHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OlN5 c3RlbUV4Y2VwdGlvbiYgZXgpOwoKICAgICAgICAgICAgICAgICAgIHZvaWQgaW5zdGFsbFN5c3Rl bUV4Y2VwdGlvbkhhbmRsZXIodm9pZCogY29va2llLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzeXN0ZW1FeGNlcHRpb25IYW5kbGVyX3QgZm4pOwoKICAgICAgICAgICAgICAg ICAgIHZvaWQgaW5zdGFsbFN5c3RlbUV4Y2VwdGlvbkhhbmRsZXIoCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzeXN0ZW1FeGNlcHRpb25IYW5kbGVyX3QgZm4pOwojIDQ4OCAiL3Vzci9s b2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIgMwogIGNsYXNzIGxvYWRlciB7CiAgcHVi bGljOgogICAgdHlwZWRlZiBDT1JCQTo6T2JqZWN0X3B0ciAoKm1hcEtleVRvT2JqZWN0X3QpICgK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0S2V5JiBr ZXkpOwoKICAgIHN0YXRpYyB2b2lkIHNldChtYXBLZXlUb09iamVjdF90IE5ld0tleVRvT2JqZWN0 KTsKICB9OwojIDUzOSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIgMwog IGNsYXNzIGdpb3BTZXJ2ZXJUaHJlYWRXcmFwcGVyIHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIHZv aWQgcnVuKHZvaWQgKCpmbikodm9pZCopLCB2b2lkKiBhcmcpIHsgZm4oYXJnKTsgfQogICAgdmly dHVhbCB+Z2lvcFNlcnZlclRocmVhZFdyYXBwZXIoKSB7fQoKCgoKCgogICAgc3RhdGljIHZvaWQg c2V0R2lvcFNlcnZlclRocmVhZFdyYXBwZXIoZ2lvcFNlcnZlclRocmVhZFdyYXBwZXIqIHApOwog ICAgc3RhdGljIGdpb3BTZXJ2ZXJUaHJlYWRXcmFwcGVyKiBnZXRHaW9wU2VydmVyVGhyZWFkV3Jh cHBlcigpOwogIH07CiMgNTYxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5o IiAzCiAgY2xhc3MgZmF0YWxFeGNlcHRpb24gewogIHB1YmxpYzoKICAgIGZhdGFsRXhjZXB0aW9u KGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUsY29uc3QgY2hhciAqZXJybXNnKTsKICAgIGlubGlu ZSB+ZmF0YWxFeGNlcHRpb24oKSB7fQogICAgaW5saW5lIGNvbnN0IGNoYXIgKmZpbGUoKSBjb25z dCB7IHJldHVybiBwZF9maWxlOyB9CiAgICBpbmxpbmUgaW50IGxpbmUoKSBjb25zdCB7IHJldHVy biBwZF9saW5lOyB9CiAgICBpbmxpbmUgY29uc3QgY2hhciAqZXJybXNnKCkgY29uc3QgeyByZXR1 cm4gcGRfZXJybXNnOyB9CiAgcHJpdmF0ZToKICAgIGNvbnN0IGNoYXIgKnBkX2ZpbGU7CiAgICBp bnQgcGRfbGluZTsKICAgIGNvbnN0IGNoYXIgKnBkX2Vycm1zZzsKCiAgICBmYXRhbEV4Y2VwdGlv bigpOwogIH07CiMgNTg3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21uaU9SQi5oIiAz CiAgZXh0ZXJuIHVuc2lnbmVkIGludCBtYXhUY3BDb25uZWN0aW9uUGVyU2VydmVyOwojIDYwMCAi L3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlPUkIuaCIgMwogIGV4dGVybiBDT1JCQTo6 Qm9vbGVhbiBkaWlUaHJvd3NTeXNFeGNlcHRpb25zOwojIDYxNyAiL3Vzci9sb2NhbC9pbmNsdWRl L29tbmlPUkIzL29tbmlPUkIuaCIgMwogIGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBhYm9ydE9uSW50 ZXJuYWxFcnJvcjsKIyA2MjcgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgi IDMKICBleHRlcm4gX0NPUkJBX1VMb25nIG9iamVjdFRhYmxlU2l6ZTsKIyA2NDEgIi91c3IvbG9j YWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiIDMKICAgICAgICAgICAgICAgICAgIHZvaWQg ZW5hYmxlTGNkTW9kZSgpOwojIDY1OSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL29tbmlP UkIuaCIgMwogIGV4dGVybgogICAgICAgICAgICAgICAgICAgICAgQ09SQkE6OkJvb2xlYW4gb21u aU9SQl8yN19Db21wYXRpYmxlQW55RXh0cmFjdGlvbjsKIyA2NzEgIi91c3IvbG9jYWwvaW5jbHVk ZS9vbW5pT1JCMy9vbW5pT1JCLmgiIDMKICBleHRlcm4gQ09SQkE6OkJvb2xlYW4gdmVyaWZ5T2Jq ZWN0RXhpc3RzQW5kVHlwZTsKIyA2ODYgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5p T1JCLmgiIDMKICBleHRlcm4gaW50IHBvYUhvbGRSZXF1ZXN0VGltZW91dDsKIyA2OTkgIi91c3Iv bG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiIDMKICBjbGFzcyBMT0NBVElPTl9GT1JX QVJEIHsKICBwdWJsaWM6CiAgICBpbmxpbmUgTE9DQVRJT05fRk9SV0FSRChDT1JCQTo6T2JqZWN0 X3B0ciBvYmpyZWYpCiAgICAgIDogcGRfb2JqcmVmKG9ianJlZikge30KCiAgICBpbmxpbmUgQ09S QkE6Ok9iamVjdF9wdHIgZ2V0X29iaigpIGNvbnN0IHsgcmV0dXJuIHBkX29ianJlZjsgfQoKICBw cml2YXRlOgogICAgQ09SQkE6Ok9iamVjdF9wdHIgcGRfb2JqcmVmOwogIH07CgoKCgoKICBleHRl cm4gQ09SQkE6OkJvb2xlYW4gdXNlVHlwZUNvZGVJbmRpcmVjdGlvbnM7CgoKICBleHRlcm4gQ09S QkE6OkJvb2xlYW4gYWNjZXB0TWlzYWxpZ25lZFRjSW5kaXJlY3Rpb25zOwoKCgogIGNsYXNzIGxv Z1N0cmVhbSB7CiAgcHVibGljOgogICAgbG9nU3RyZWFtKCk7CiAgICB+bG9nU3RyZWFtKCk7CiAg ICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwoY2hhciBjKTsKICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8 PCh1bnNpZ25lZCBjaGFyIGMpIHsgcmV0dXJuICgqdGhpcykgPDwgKGNoYXIpYzsgfQogICAgbG9n U3RyZWFtJiBvcGVyYXRvcjw8KHNpZ25lZCBjaGFyIGMpIHsgcmV0dXJuICgqdGhpcykgPDwgKGNo YXIpYzsgfQogICAgbG9nU3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwogICAgbG9n U3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMpIHsKICAgICAgcmV0dXJu ICgqdGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7CiAgICB9CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9y PDwoY29uc3Qgc2lnbmVkIGNoYXIgKnMpIHsKICAgICAgcmV0dXJuICgqdGhpcykgPDwgKGNvbnN0 IGNoYXIqKXM7CiAgICB9CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqcCk7 CiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwoaW50IG4pOwogICAgbG9nU3RyZWFtJiBvcGVyYXRv cjw8KHVuc2lnbmVkIGludCBuKTsKICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8PChsb25nIG4pOwog ICAgbG9nU3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbik7CiAgICBsb2dTdHJlYW0m IG9wZXJhdG9yPDwoc2hvcnQgbikge3JldHVybiBvcGVyYXRvcjw8KChpbnQpbik7fQogICAgbG9n U3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIHNob3J0IG4pIHtyZXR1cm4gb3BlcmF0b3I8PCgo dW5zaWduZWQgaW50KW4pO30KCiAgICBsb2dTdHJlYW0mIG9wZXJhdG9yPDwobG9uZyBsb25nIG4p OwogICAgbG9nU3RyZWFtJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbG9uZyBuKTsKCgogICAg bG9nU3RyZWFtJiBvcGVyYXRvcjw8KGJvb2wgYikgeyByZXR1cm4gb3BlcmF0b3I8PCgoaW50KWIp OyB9CgoKICAgIGxvZ1N0cmVhbSYgb3BlcmF0b3I8PChkb3VibGUgbik7CiAgICBsb2dTdHJlYW0m IG9wZXJhdG9yPDwoZmxvYXQgbikgeyByZXR1cm4gb3BlcmF0b3I8PCgoZG91YmxlKW4pOyB9CgoK CgogICAgbG9nU3RyZWFtJiBmbHVzaCgpOwogIHByaXZhdGU6CiAgICB2b2lkKiBwZF9zdGF0ZTsK ICB9OwoKICBleHRlcm4gbG9nU3RyZWFtJiBsb2c7CgoKCgoKICBzdGF0aWMgaW5saW5lIGludCB0 cmFjZShpbnQgdGwpIHsgcmV0dXJuIHRyYWNlTGV2ZWwgPj0gdGw7IH0KCgogIGNsYXNzIGxvZ2dl ciB7CiAgcHVibGljOgogICAgbG9nZ2VyKGNvbnN0IGNoYXIqIHByZWZpeCA9IDApOwogICAgfmxv Z2dlcigpOwoKCiAgICBsb2dnZXImIG9wZXJhdG9yPDwoY2hhciBjKTsKICAgIGxvZ2dlciYgb3Bl cmF0b3I8PCh1bnNpZ25lZCBjaGFyIGMpIHsgcmV0dXJuICgqdGhpcykgPDwgKGNoYXIpYzsgfQog ICAgbG9nZ2VyJiBvcGVyYXRvcjw8KHNpZ25lZCBjaGFyIGMpIHsgcmV0dXJuICgqdGhpcykgPDwg KGNoYXIpYzsgfQogICAgbG9nZ2VyJiBvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwogICAgbG9n Z2VyJiBvcGVyYXRvcjw8KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMpIHsKICAgICAgcmV0dXJuICgq dGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7CiAgICB9CiAgICBsb2dnZXImIG9wZXJhdG9yPDwoY29u c3Qgc2lnbmVkIGNoYXIgKnMpIHsKICAgICAgcmV0dXJuICgqdGhpcykgPDwgKGNvbnN0IGNoYXIq KXM7CiAgICB9CiAgICBsb2dnZXImIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqcCk7CiAgICBsb2dn ZXImIG9wZXJhdG9yPDwoaW50IG4pOwogICAgbG9nZ2VyJiBvcGVyYXRvcjw8KHVuc2lnbmVkIGlu dCBuKTsKICAgIGxvZ2dlciYgb3BlcmF0b3I8PChsb25nIG4pOwogICAgbG9nZ2VyJiBvcGVyYXRv cjw8KHVuc2lnbmVkIGxvbmcgbik7CiAgICBsb2dnZXImIG9wZXJhdG9yPDwoc2hvcnQgbikge3Jl dHVybiBvcGVyYXRvcjw8KChpbnQpbik7fQogICAgbG9nZ2VyJiBvcGVyYXRvcjw8KHVuc2lnbmVk IHNob3J0IG4pIHtyZXR1cm4gb3BlcmF0b3I8PCgodW5zaWduZWQgaW50KW4pO30KCiAgICBsb2dn ZXImIG9wZXJhdG9yPDwobG9uZyBsb25nIG4pOwogICAgbG9nZ2VyJiBvcGVyYXRvcjw8KHVuc2ln bmVkIGxvbmcgbG9uZyBuKTsKCgogICAgbG9nZ2VyJiBvcGVyYXRvcjw8KGJvb2wgYikgeyByZXR1 cm4gb3BlcmF0b3I8PCgoaW50KWIpOyB9CgoKICAgIGxvZ2dlciYgb3BlcmF0b3I8PChkb3VibGUg bik7CiAgICBsb2dnZXImIG9wZXJhdG9yPDwoZmxvYXQgbikgeyByZXR1cm4gb3BlcmF0b3I8PCgo ZG91YmxlKW4pOyB9CgoKCgogICAgbG9nZ2VyJiBvcGVyYXRvcjw8KG9tbmlMb2NhbElkZW50aXR5 Kik7CiAgICBsb2dnZXImIG9wZXJhdG9yPDwob21uaUlkZW50aXR5Kik7CiAgICBsb2dnZXImIG9w ZXJhdG9yPDwob21uaU9iaktleSYpOwoKICAgIHZvaWQgZmx1c2goKTsKCgoKICBwcml2YXRlOgog ICAgbG9nZ2VyKGNvbnN0IGxvZ2dlciYpOwogICAgbG9nZ2VyJiBvcGVyYXRvcj0oY29uc3QgbG9n Z2VyJik7CgogICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShpbnQgbikgeyBpZiggcGRfZW5kIC0gcGRf cCAtIDEgPCBuICkgbW9yZShuKTsgfQogICAgdm9pZCBtb3JlKGludCBuKTsKCiAgICBjb25zdCBj aGFyKiBwZF9wcmVmaXg7CiAgICBjaGFyKiBwZF9idWY7CiAgICBjaGFyKiBwZF9wOwogICAgY2hh ciogcGRfZW5kOwogIH07CgoKICAgICAgICAgICAgICAgICAgIHZvaWQgbG9nZihjb25zdCBjaGFy KiBmbXQgLi4uKTsKCgogICAgICAgICAgICAgICAgICAgdm9pZCBkb19sb2dzKGNvbnN0IGNoYXIq IG1zZyk7CgoKICAgICAgICAgICAgICAgICAgIGlubGluZSB2b2lkIGxvZ3MoaW50IHRsLCBjb25z dCBjaGFyKiBtc2cpIHsKICAgIGlmKCB0cmFjZUxldmVsID49IHRsICkgZG9fbG9ncyhtc2cpOwog IH0KIyA4NDYgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9vbW5pT1JCLmgiIDMKICBleHRl cm4gb2JqZWN0S2V5IHNlZWQ7CiMgODc3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvb21u aU9SQi5oIiAzCn0KIyAyNjIwICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIg MiAzCiMgMSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3Byb3h5RmFjdG9yeS5oIiAxIDMK IyAyNjIxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMiAzCiMgMSAiL3Vz ci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3RlbXBsYXRlZGVmbnMuaCIgMSAzCiMgNDggIi91c3Iv bG9jYWwvaW5jbHVkZS9vbW5pT1JCMy90ZW1wbGF0ZWRlZm5zLmgiIDMKdGVtcGxhdGUgPGNsYXNz IFQ+CmlubGluZQpfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPjo6X0NPUkJBX1BzZXVkb09ial9WYXIo KQogIDogcGRfZGF0YShUOjpfbmlsKCkpIHt9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZQpf Q09SQkFfUHNldWRvT2JqX1ZhcjxUPjo6X0NPUkJBX1BzZXVkb09ial9WYXIoY29uc3QgX0NPUkJB X1BzZXVkb09ial9WYXI8VD4mIHYpCnsKICBwZF9kYXRhID0gVDo6X2R1cGxpY2F0ZSh2LnBkX2Rh dGEpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZQpfQ09SQkFfUHNldWRvT2JqX1ZhcjxU Pjo6X0NPUkJBX1BzZXVkb09ial9WYXIoY29uc3QgX0NPUkJBX1BzZXVkb09ial9NZW1iZXI8VCwg X0NPUkJBX1BzZXVkb09ial9WYXI8VD4gPiYgcCkKewogIHBkX2RhdGEgPSBUOjpfZHVwbGljYXRl KHAuX3B0cik7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lCl9DT1JCQV9Qc2V1ZG9PYmpf VmFyPFQ+Ojp+X0NPUkJBX1BzZXVkb09ial9WYXIoKQp7CiAgQ09SQkE6OnJlbGVhc2UocGRfZGF0 YSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFQ+ JgpfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPjo6b3BlcmF0b3I9KFQqIHApCnsKICBDT1JCQTo6cmVs ZWFzZShwZF9kYXRhKTsKICBwZF9kYXRhID0gcDsKICByZXR1cm4gKnRoaXM7Cn0KCgp0ZW1wbGF0 ZSA8Y2xhc3MgVD4KaW5saW5lIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFQ+JgpfQ09SQkFfUHNldWRv T2JqX1ZhcjxUPjo6b3BlcmF0b3I9KGNvbnN0IF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFQ+JiB2KQp7 CiAgaWYoIHBkX2RhdGEgIT0gdi5wZF9kYXRhICkgewogICAgQ09SQkE6OnJlbGVhc2UocGRfZGF0 YSk7CiAgICBpZiggdi5wZF9kYXRhICkgcGRfZGF0YSA9IFQ6Ol9kdXBsaWNhdGUodi5wZF9kYXRh KTsKICAgIGVsc2UgcGRfZGF0YSA9IFQ6Ol9uaWwoKTsKICB9CiAgcmV0dXJuICp0aGlzOwp9CgoK dGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSBfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPiYKX0NPUkJB X1BzZXVkb09ial9WYXI8VD46Om9wZXJhdG9yPShjb25zdCBfQ09SQkFfUHNldWRvT2JqX01lbWJl cjxULCBfQ09SQkFfUHNldWRvT2JqX1ZhcjxUPiA+JiBtKQp7CiAgQ09SQkE6OnJlbGVhc2UocGRf ZGF0YSk7CiAgcGRfZGF0YSA9IFQ6Ol9kdXBsaWNhdGUobS5fcHRyKTsKICByZXR1cm4gKnRoaXM7 Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lIFQqJgpfQ09SQkFfUHNldWRvT2JqX1ZhcjxU Pjo6b3V0KCkKewogIENPUkJBOjpyZWxlYXNlKHBkX2RhdGEpOwogIHBkX2RhdGEgPSBUOjpfbmls KCk7CiAgcmV0dXJuIHBkX2RhdGE7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lIFQqCl9D T1JCQV9Qc2V1ZG9PYmpfVmFyPFQ+OjpfcmV0bigpCnsKICBUX3B0ciB0bXAgPSBwZF9kYXRhOwog IHBkX2RhdGEgPSBUOjpfbmlsKCk7CiAgcmV0dXJuIHRtcDsKfQoKCgoKCnRlbXBsYXRlIDxjbGFz cyBULCBjbGFzcyBUX3Zhcj4KaW5saW5lCl9DT1JCQV9Qc2V1ZG9PYmpfT3V0PFQsVF92YXI+Ojpf Q09SQkFfUHNldWRvT2JqX091dChUX3ZhciYgdikKICA6IF9kYXRhKHYucGRfZGF0YSkKewoKICB2 ID0gVDo6X25pbCgpOwp9CgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFRfdmFyPgppbmxp bmUKX0NPUkJBX1BzZXVkb09ial9NZW1iZXI8VCxUX3Zhcj46Ol9DT1JCQV9Qc2V1ZG9PYmpfTWVt YmVyKCkKICA6IF9wdHIoVDo6X25pbCgpKSB7fQoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBU X3Zhcj4KaW5saW5lCl9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+OjpfQ09SQkFfUHNl dWRvT2JqX01lbWJlcihjb25zdCBfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULFRfdmFyPiYgbSkK ewogIGlmKCBtLl9wdHIgKSBfcHRyID0gVDo6X2R1cGxpY2F0ZShtLl9wdHIpOwogIGVsc2UgX3B0 ciA9IFQ6Ol9uaWwoKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBUX3Zhcj4KaW5saW5l Cl9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+Ojp+X0NPUkJBX1BzZXVkb09ial9NZW1i ZXIoKQp7CiAgQ09SQkE6OnJlbGVhc2UoX3B0cik7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xh c3MgVF92YXI+CmlubGluZSBfQ09SQkFfUHNldWRvT2JqX01lbWJlcjxULFRfdmFyPiYKX0NPUkJB X1BzZXVkb09ial9NZW1iZXI8VCxUX3Zhcj46Om9wZXJhdG9yPShUKiBwKQp7CiAgQ09SQkE6OnJl bGVhc2UoX3B0cik7CiAgX3B0ciA9IHA7CiAgcmV0dXJuICp0aGlzOwp9CgoKdGVtcGxhdGUgPGNs YXNzIFQsIGNsYXNzIFRfdmFyPgppbmxpbmUgX0NPUkJBX1BzZXVkb09ial9NZW1iZXI8VCxUX3Zh cj4mCl9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+OjpvcGVyYXRvcj0oY29uc3QgX0NP UkJBX1BzZXVkb09ial9NZW1iZXI8VCxUX3Zhcj4mIG0pCnsKICBpZiggX3B0ciAhPSBtLl9wdHIg KSB7CiAgICBDT1JCQTo6cmVsZWFzZShfcHRyKTsKICAgIF9wdHIgPSBUOjpfZHVwbGljYXRlKG0u X3B0cik7CiAgfQogIHJldHVybiAqdGhpczsKfQoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBU X3Zhcj4KaW5saW5lIF9DT1JCQV9Qc2V1ZG9PYmpfTWVtYmVyPFQsVF92YXI+JgpfQ09SQkFfUHNl dWRvT2JqX01lbWJlcjxULFRfdmFyPjo6b3BlcmF0b3I9KGNvbnN0IFRfdmFyJiB2KQp7CiAgQ09S QkE6OnJlbGVhc2UoX3B0cik7CiAgX3B0ciA9IFQ6Ol9kdXBsaWNhdGUodi5wZF9kYXRhKTsKICBy ZXR1cm4gKnRoaXM7Cn0KIyAyMDggIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy90ZW1wbGF0 ZWRlZm5zLmgiIDMKaW5saW5lCkNPUkJBOjpPYmplY3RfdmFyOjpPYmplY3RfdmFyKGNvbnN0IENP UkJBOjpPYmplY3RfTWVtYmVyJiBwKQogIDogcGRfcmVmKFQ6Ol9kdXBsaWNhdGUocCkpCnsKfQoK aW5saW5lCkNPUkJBOjpPYmplY3RfdmFyOjpPYmplY3RfdmFyKGNvbnN0IENPUkJBOjpPYmplY3Rf RWxlbWVudCYgcCkKICA6IHBkX3JlZihUOjpfZHVwbGljYXRlKHApKQp7Cn0KCgppbmxpbmUgQ09S QkE6Ok9iamVjdF92YXImCkNPUkJBOjpPYmplY3RfdmFyOjpvcGVyYXRvcj0gKGNvbnN0IENPUkJB OjpPYmplY3RfTWVtYmVyJiBwKQp7CiAgcmVsZWFzZShwZF9yZWYpOwogIHBkX3JlZiA9IFQ6Ol9k dXBsaWNhdGUocCk7CiAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgQ09SQkE6Ok9iamVjdF92YXIm CkNPUkJBOjpPYmplY3RfdmFyOjpvcGVyYXRvcj0gKGNvbnN0IENPUkJBOjpPYmplY3RfRWxlbWVu dCYgcCkKewogIHJlbGVhc2UocGRfcmVmKTsKICBwZF9yZWYgPSBUOjpfZHVwbGljYXRlKHApOwog IHJldHVybiAqdGhpczsKfQoKaW5saW5lIENPUkJBOjpPYmplY3RfTWVtYmVyJgpDT1JCQTo6T2Jq ZWN0X01lbWJlcjo6b3BlcmF0b3I9KGNvbnN0IENPUkJBOjpPYmplY3RfRWxlbWVudCYgcCkKewog IHJlbGVhc2UoX3B0cik7CiAgX3B0ciA9IFQ6Ol9kdXBsaWNhdGUocCk7CiAgcmV0dXJuICp0aGlz Owp9CiMgMjYyMiAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgiIDIgMwojIDEg Ii91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9jb3JiYV9vcGVyYXRvcnMuaCIgMSAzCiMgMzIg Ii91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9jb3JiYV9vcGVyYXRvcnMuaCIgMwpleHRlcm4g dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiYpOwpl eHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkV4Y2VwdGlv biopOwoKCgoKCgoKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENP UkJBOjpVTktOT1dOJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25z dCBDT1JCQTo6VU5LTk9XTiopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29u c3QgQ09SQkE6OkFueSYsIENPUkJBOjpVTktOT1dOKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8 PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9QQVJBTSYpOyBleHRlcm4gdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9QQVJBTSopOyBleHRlcm4gQ09S QkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpCQURfUEFS QU0qJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6 Tk9fTUVNT1JZJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBD T1JCQTo6Tk9fTUVNT1JZKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25z dCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX01FTU9SWSomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8 PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTVBfTElNSVQmKTsgZXh0ZXJuIHZvaWQgb3Bl cmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTVBfTElNSVQqKTsgZXh0ZXJuIENP UkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6SU1QX0xJ TUlUKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6 OkNPTU1fRkFJTFVSRSYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29u c3QgQ09SQkE6OkNPTU1fRkFJTFVSRSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpDT01NX0ZBSUxVUkUqJik7CmV4dGVybiB2b2lk IG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6SU5WX09CSlJFRiYpOyBleHRl cm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOVl9PQkpSRUYq KTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBD T1JCQTo6SU5WX09CSlJFRiomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYs IGNvbnN0IENPUkJBOjpPQkpFQ1RfTk9UX0VYSVNUJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9 KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6T0JKRUNUX05PVF9FWElTVCopOyBleHRlcm4gQ09S QkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpPQkpFQ1Rf Tk9UX0VYSVNUKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3Qg Q09SQkE6Ok5PX1BFUk1JU1NJT04mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFu eSYsIGNvbnN0IENPUkJBOjpOT19QRVJNSVNTSU9OKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBv cGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX1BFUk1JU1NJT04qJik7CmV4 dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6SU5URVJOQUwm KTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTlRF Uk5BTCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFu eSYsIENPUkJBOjpJTlRFUk5BTComKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFu eSYsIGNvbnN0IENPUkJBOjpNQVJTSEFMJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJB OjpBbnkmLCBjb25zdCBDT1JCQTo6TUFSU0hBTCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3Bl cmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpNQVJTSEFMKiYpOwpleHRlcm4gdm9p ZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOSVRJQUxJWkUmKTsgZXh0 ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTklUSUFMSVpF Kik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55Jiwg Q09SQkE6OklOSVRJQUxJWkUqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkm LCBjb25zdCBDT1JCQTo6Tk9fSU1QTEVNRU5UJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENP UkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6Tk9fSU1QTEVNRU5UKik7IGV4dGVybiBDT1JCQTo6Qm9v bGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX0lNUExFTUVOVCom KTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpCQURf VFlQRUNPREUmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENP UkJBOjpCQURfVFlQRUNPREUqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNv bnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6QkFEX1RZUEVDT0RFKiYpOwpleHRlcm4gdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9PUEVSQVRJT04mKTsgZXh0ZXJu IHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpCQURfT1BFUkFUSU9O Kik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55Jiwg Q09SQkE6OkJBRF9PUEVSQVRJT04qJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpB bnkmLCBjb25zdCBDT1JCQTo6Tk9fUkVTT1VSQ0VTJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9 KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6Tk9fUkVTT1VSQ0VTKik7IGV4dGVybiBDT1JCQTo6 Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX1JFU09VUkNF UyomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpO T19SRVNQT05TRSYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3Qg Q09SQkE6Ok5PX1JFU1BPTlNFKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShj b25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok5PX1JFU1BPTlNFKiYpOwpleHRlcm4gdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OlBFUlNJU1RfU1RPUkUmKTsgZXh0ZXJu IHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpQRVJTSVNUX1NUT1JF Kik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55Jiwg Q09SQkE6OlBFUlNJU1RfU1RPUkUqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpB bnkmLCBjb25zdCBDT1JCQTo6QkFEX0lOVl9PUkRFUiYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8 PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkJBRF9JTlZfT1JERVIqKTsgZXh0ZXJuIENPUkJB OjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6QkFEX0lOVl9P UkRFUiomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJB OjpUUkFOU0lFTlQmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpUUkFOU0lFTlQqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNv bnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6VFJBTlNJRU5UKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkZSRUVfTUVNJik7IGV4dGVybiB2b2lkIG9w ZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6RlJFRV9NRU0qKTsgZXh0ZXJuIENP UkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6RlJFRV9N RU0qJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6 SU5WX0lERU5UJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBD T1JCQTo6SU5WX0lERU5UKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25z dCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVl9JREVOVComKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8 PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpJTlZfRkxBRyYpOyBleHRlcm4gdm9pZCBvcGVy YXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOVl9GTEFHKik7IGV4dGVybiBDT1JC QTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVl9GTEFH KiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklO VEZfUkVQT1MmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENP UkJBOjpJTlRGX1JFUE9TKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25z dCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVEZfUkVQT1MqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9y PDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6QkFEX0NPTlRFWFQmKTsgZXh0ZXJuIHZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpCQURfQ09OVEVYVCopOyBleHRl cm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpC QURfQ09OVEVYVComKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpPQkpfQURBUFRFUiYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55 JiwgY29uc3QgQ09SQkE6Ok9CSl9BREFQVEVSKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVy YXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Ok9CSl9BREFQVEVSKiYpOwpleHRlcm4g dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkRBVEFfQ09OVkVSU0lP TiYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkRB VEFfQ09OVkVSU0lPTiopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3Qg Q09SQkE6OkFueSYsIENPUkJBOjpEQVRBX0NPTlZFUlNJT04qJik7CmV4dGVybiB2b2lkIG9wZXJh dG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6VFJBTlNBQ1RJT05fUkVRVUlSRUQmKTsg ZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpUUkFOU0FD VElPTl9SRVFVSVJFRCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3Qg Q09SQkE6OkFueSYsIENPUkJBOjpUUkFOU0FDVElPTl9SRVFVSVJFRComKTsKZXh0ZXJuIHZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpUUkFOU0FDVElPTl9ST0xMRURC QUNLJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6 VFJBTlNBQ1RJT05fUk9MTEVEQkFDSyopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpUUkFOU0FDVElPTl9ST0xMRURCQUNLKiYpOwpl eHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OklOVkFMSURf VFJBTlNBQ1RJT04mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpJTlZBTElEX1RSQU5TQUNUSU9OKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVy YXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OklOVkFMSURfVFJBTlNBQ1RJT04qJik7 CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6V1JPTkdf VFJBTlNBQ1RJT04mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpXUk9OR19UUkFOU0FDVElPTiopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0 b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpXUk9OR19UUkFOU0FDVElPTiomKTsKZXh0 ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpVbmtub3duVXNl ckV4Y2VwdGlvbiYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3Qg Q09SQkE6OlVua25vd25Vc2VyRXhjZXB0aW9uKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVy YXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6OlVua25vd25Vc2VyRXhjZXB0aW9uKiYp OwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6Oldyb25n VHJhbnNhY3Rpb24mKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpXcm9uZ1RyYW5zYWN0aW9uKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRv cj4+PShjb25zdCBDT1JCQTo6QW55JiwgQ09SQkE6Oldyb25nVHJhbnNhY3Rpb24qJik7CmV4dGVy biB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6Q29udGV4dExpc3Q6 OkJvdW5kcyYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09S QkE6OkNvbnRleHRMaXN0OjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9y Pj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6Q29udGV4dExpc3Q6OkJvdW5kcyomKTsKZXh0 ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpFeGNlcHRpb25M aXN0OjpCb3VuZHMmKTsgZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0 IENPUkJBOjpFeGNlcHRpb25MaXN0OjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9w ZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6RXhjZXB0aW9uTGlzdDo6Qm91bmRz KiYpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6Ok5W TGlzdDo6Qm91bmRzJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25z dCBDT1JCQTo6TlZMaXN0OjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9y Pj49KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6TlZMaXN0OjpCb3VuZHMqJik7CmV4dGVybiB2 b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6VHlwZUNvZGU6OkJvdW5k cyYpOyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OlR5 cGVDb2RlOjpCb3VuZHMqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0 IENPUkJBOjpBbnkmLCBDT1JCQTo6VHlwZUNvZGU6OkJvdW5kcyomKTsKZXh0ZXJuIHZvaWQgb3Bl cmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpUeXBlQ29kZTo6QmFkS2luZCYpOyBl eHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OlR5cGVDb2Rl OjpCYWRLaW5kKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JC QTo6QW55JiwgQ09SQkE6OlR5cGVDb2RlOjpCYWRLaW5kKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6SW52YWxpZCYpOyBleHRlcm4g dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6SW52YWxp ZCopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYs IENPUkJBOjpEeW5Bbnk6OkludmFsaWQqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJB OjpBbnkmLCBjb25zdCBDT1JCQTo6RHluQW55OjpJbnZhbGlkVmFsdWUmKTsgZXh0ZXJuIHZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpEeW5Bbnk6OkludmFsaWRWYWx1 ZSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYs IENPUkJBOjpEeW5Bbnk6OkludmFsaWRWYWx1ZSomKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0o Q09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpEeW5Bbnk6OlR5cGVNaXNtYXRjaCYpOyBleHRlcm4g dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6VHlwZU1p c21hdGNoKik7IGV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6 QW55JiwgQ09SQkE6OkR5bkFueTo6VHlwZU1pc21hdGNoKiYpOwpleHRlcm4gdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6SW52YWxpZFNlcSYpOyBleHRl cm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6OkR5bkFueTo6SW52 YWxpZFNlcSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6 OkFueSYsIENPUkJBOjpEeW5Bbnk6OkludmFsaWRTZXEqJik7CmV4dGVybiB2b2lkIG9wZXJhdG9y PDw9KENPUkJBOjpBbnkmLCBjb25zdCBDT1JCQTo6T1JCOjpJbmNvbnNpc3RlbnRUeXBlQ29kZSYp OyBleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiwgY29uc3QgQ09SQkE6Ok9SQjo6 SW5jb25zaXN0ZW50VHlwZUNvZGUqKTsgZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49 KGNvbnN0IENPUkJBOjpBbnkmLCBDT1JCQTo6T1JCOjpJbmNvbnNpc3RlbnRUeXBlQ29kZSomKTsK ZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYsIGNvbnN0IENPUkJBOjpPUkI6Oklu dmFsaWROYW1lJik7IGV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmLCBjb25zdCBD T1JCQTo6T1JCOjpJbnZhbGlkTmFtZSopOyBleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYsIENPUkJBOjpPUkI6OkludmFsaWROYW1lKiYpOwojIDI2MjMg Ii91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9DT1JCQS5oIiAyIDMKIyAxICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvcG9hLmgiIDEgMwojIDcwICIvdXNyL2xvY2FsL2luY2x1ZGUvb21u aU9SQjMvcG9hLmgiIDMKY2xhc3MgR0lPUF9TOwpjbGFzcyBvbW5pT3JiUE9BOwoKCm5hbWVzcGFj ZSBQb3J0YWJsZVNlcnZlcgp7CgoKCgoKICBjbGFzcyBQT0E7CiAgdHlwZWRlZiBQT0EqIFBPQV9w dHI7CiAgdHlwZWRlZiBQT0FfcHRyIFBPQVJlZjsKCiAgY2xhc3MgUE9BX0hlbHBlciB7CiAgcHVi bGljOgogICAgdHlwZWRlZiBQT0FfcHRyIF9wdHJfdHlwZTsKCiAgICBzdGF0aWMgX3B0cl90eXBl IF9uaWwoKTsKICAgIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICAg IHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICAgIHN0YXRpYyB2b2lkIGR1cGxpY2F0 ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIGlubGluZSBzaXplX3QgTlBfYWxpZ25lZFNpemUoX3B0 cl90eXBlLCBzaXplX3QpIHsgcmV0dXJuIDA7IH0KICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXJz aGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKSB7fQogICAgc3RhdGljIGlu bGluZSBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJikgeyByZXR1 cm4gMDsgfQogICAgc3RhdGljIGlubGluZSB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBN ZW1CdWZmZXJlZFN0cmVhbSYpIHt9CiAgICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSB1bm1hcnNo YWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKSB7IHJldHVybiAwOyB9CiAgfTsKCiAgY2xhc3Mg U2VydmFudEJhc2U7CiAgdHlwZWRlZiBTZXJ2YW50QmFzZSogU2VydmFudDsKCgoKCgoKICBjbGFz cyBQT0FMaXN0X3ZhcjsKCiAgY2xhc3MgUE9BTGlzdCA6IHB1YmxpYyBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlX09ialJlZjxQT0EsIF9DT1JCQV9PYmpSZWZfRWxlbWVudDxQT0EsIFBPQV9IZWxw ZXI+LCBQT0FfSGVscGVyPiB7CiAgcHVibGljOgogICAgdHlwZWRlZiBQT0FMaXN0X3ZhciBfdmFy X3R5cGU7CiAgICBpbmxpbmUgUE9BTGlzdCgpIHt9CiAgICBpbmxpbmUgUE9BTGlzdChjb25zdCBQ T0FMaXN0JiBzKQogICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVmPFBPQSwg X0NPUkJBX09ialJlZl9FbGVtZW50PFBPQSwgUE9BX0hlbHBlcj4sIFBPQV9IZWxwZXI+KHMpIHt9 CiAgICBpbmxpbmUgUE9BTGlzdChfQ09SQkFfVUxvbmcgX21heCkKICAgICAgOiBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX09ialJlZjxQT0EsIF9DT1JCQV9PYmpSZWZfRWxlbWVudDxQT0EsIFBP QV9IZWxwZXI+LCBQT0FfSGVscGVyPihfbWF4KSB7fQogICAgaW5saW5lIFBPQUxpc3QoX0NPUkJB X1VMb25nIF9tYXgsIF9DT1JCQV9VTG9uZyBfbGVuLCBQT0FfcHRyKiBfdmFsLCBfQ09SQkFfQm9v bGVhbiBfcmVsPTApCiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9PYmpSZWY8UE9B LCBfQ09SQkFfT2JqUmVmX0VsZW1lbnQ8UE9BLCBQT0FfSGVscGVyPiwgUE9BX0hlbHBlcj4oX21h eCwgX2xlbiwgX3ZhbCwgX3JlbCkge30KICAgIGlubGluZSBQT0FMaXN0JiBvcGVyYXRvciA9IChj b25zdCBQT0FMaXN0JiBzKSB7CiAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2VfT2JqUmVm PFBPQSwgX0NPUkJBX09ialJlZl9FbGVtZW50PFBPQSwgUE9BX0hlbHBlcj4sIFBPQV9IZWxwZXI+ OjpvcGVyYXRvcj0ocyk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICB9OwoKCiAgY2xhc3Mg UE9BTGlzdF92YXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgUE9BTGlzdCBUOwogICAgdHlwZWRl ZiBQT0FMaXN0X3ZhciBUX3ZhcjsKCiAgICBpbmxpbmUgUE9BTGlzdF92YXIoKSA6IHBkX3NlcSgw KSB7fQogICAgaW5saW5lIFBPQUxpc3RfdmFyKFQqIHMpIDogcGRfc2VxKHMpIHt9CiAgICBpbmxp bmUgUE9BTGlzdF92YXIoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYoIHMucGRfc2VxICkgcGRf c2VxID0gbmV3IFQoKnMucGRfc2VxKTsKICAgICAgZWxzZSBwZF9zZXEgPSAwOwogICAgfQogICAg aW5saW5lIH5QT0FMaXN0X3ZhcigpIHsgaWYoIHBkX3NlcSApIGRlbGV0ZSBwZF9zZXE7IH0KCiAg ICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgICAgaWYoIHBkX3NlcSApIGRl bGV0ZSBwZF9zZXE7CiAgICAgIHBkX3NlcSA9IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0K ICAgIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYo IHMucGRfc2VxICkgewogICAgICAgIGlmKCAhcGRfc2VxICkgcGRfc2VxID0gbmV3IFQ7CiAgICAg ICAgKnBkX3NlcSA9ICpzLnBkX3NlcTsKICAgICAgfSBlbHNlIGlmKCBwZF9zZXEgKSB7CiAgICAg ICAgZGVsZXRlIHBkX3NlcTsKICAgICAgICBwZF9zZXEgPSAwOwogICAgICB9CiAgICAgIHJldHVy biAqdGhpczsKICAgIH0KCiAgICBpbmxpbmUgX0NPUkJBX09ialJlZl9FbGVtZW50PFBPQSwgUE9B X0hlbHBlcj4gb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICAgIHJldHVybiAoKnBk X3NlcSlbc107CiAgICB9CiAgICBpbmxpbmUgVCogb3BlcmF0b3IgLT4gKCkgeyByZXR1cm4gcGRf c2VxOyB9CgoKCiAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4g KnBkX3NlcTsgfQogICAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpwZF9zZXE7IH0K CgogICAgaW5saW5lIGNvbnN0IFQmIGluKCkgY29uc3QgeyByZXR1cm4gKnBkX3NlcTsgfQogICAg aW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKnBkX3NlcTsgfQogICAgaW5saW5lIFQqJiBvdXQo KSB7CiAgICAgIGlmKCBwZF9zZXEgKSB7IGRlbGV0ZSBwZF9zZXE7IHBkX3NlcSA9IDA7IH0KICAg ICAgcmV0dXJuIHBkX3NlcTsKICAgIH0KICAgIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0g cGRfc2VxOyBwZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogIHByaXZhdGU6CiAgICBUKiBwZF9z ZXE7CiAgfTsKCgoKCgogIGNsYXNzIE9iamVjdElkX3ZhcjsKCiAgY2xhc3MgT2JqZWN0SWQgOiBw dWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZV9fT2N0ZXQgewogIHB1YmxpYzoKICAgIHR5 cGVkZWYgT2JqZWN0SWRfdmFyIF92YXJfdHlwZTsKICAgIGlubGluZSBPYmplY3RJZCgpIHt9CiAg ICBpbmxpbmUgT2JqZWN0SWQoY29uc3QgT2JqZWN0SWQmIHNlcSkKICAgICAgOiBfQ09SQkFfVW5i b3VuZGVkX1NlcXVlbmNlX19PY3RldChzZXEpIHt9CiAgICBpbmxpbmUgT2JqZWN0SWQoQ09SQkE6 OlVMb25nIG1heCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldChtYXgp IHt9CiAgICBpbmxpbmUgT2JqZWN0SWQoQ09SQkE6OlVMb25nIG1heCwgQ09SQkE6OlVMb25nIGxl biwgQ09SQkE6Ok9jdGV0KiB2YWwsIENPUkJBOjpCb29sZWFuIHJlbD0wKQogICAgICA6IF9DT1JC QV9VbmJvdW5kZWRfU2VxdWVuY2VfX09jdGV0KG1heCwgbGVuLCB2YWwsIHJlbCkge30KICAgIGlu bGluZSBPYmplY3RJZCYgb3BlcmF0b3IgPSAoY29uc3QgT2JqZWN0SWQmIHNlcSkgewogICAgICBf Q09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlX19PY3RldDo6b3BlcmF0b3I9KHNlcSk7CiAgICAgIHJl dHVybiAqdGhpczsKICAgIH0KICB9OwoKICBjbGFzcyBPYmplY3RJZF9vdXQ7CgogIGNsYXNzIE9i amVjdElkX3ZhciB7CiAgcHVibGljOgogICAgdHlwZWRlZiBPYmplY3RJZCBUOwogICAgdHlwZWRl ZiBPYmplY3RJZF92YXIgVF92YXI7CgogICAgaW5saW5lIE9iamVjdElkX3ZhcigpIDogcGRfc2Vx KDApIHt9CiAgICBpbmxpbmUgT2JqZWN0SWRfdmFyKFQqIHMpIDogcGRfc2VxKHMpIHt9CiAgICBp bmxpbmUgT2JqZWN0SWRfdmFyKGNvbnN0IFRfdmFyJiBzdikgewogICAgICBpZiggc3YucGRfc2Vx ICkgewogICAgICAgIHBkX3NlcSA9IG5ldyBUOwogICAgICAgICpwZF9zZXEgPSAqc3YucGRfc2Vx OwogICAgICB9IGVsc2UKICAgICAgICBwZF9zZXEgPSAwOwogICAgfQogICAgaW5saW5lIH5PYmpl Y3RJZF92YXIoKSB7IGlmKCBwZF9zZXEgKSBkZWxldGUgcGRfc2VxOyB9CgogICAgaW5saW5lIFRf dmFyJiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICAgIGlmKCBwZF9zZXEgKSBkZWxldGUgcGRfc2Vx OwogICAgICBwZF9zZXEgPSBzOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBpbmxpbmUg VF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzdikgewogICAgICBpZiggc3YucGRfc2Vx ICkgewogICAgICAgIGlmKCAhcGRfc2VxICkgcGRfc2VxID0gbmV3IFQ7CiAgICAgICAgKnBkX3Nl cSA9ICpzdi5wZF9zZXE7CiAgICAgIH0gZWxzZSBpZiggcGRfc2VxICkgewogICAgICAgIGRlbGV0 ZSBwZF9zZXE7CiAgICAgICAgcGRfc2VxID0gMDsKICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7 CiAgICB9CgogICAgaW5saW5lIENPUkJBOjpPY3RldCYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9u ZyBpKSB7IHJldHVybiAoKnBkX3NlcSlbaV07IH0KICAgIGlubGluZSBUKiBvcGVyYXRvciAtPiAo KSB7IHJldHVybiBwZF9zZXE7IH0KCgoKICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBj b25zdCB7IHJldHVybiAqcGRfc2VxOyB9CiAgICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1 cm4gKnBkX3NlcTsgfQoKCiAgICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVybiAq cGRfc2VxOyB9CiAgICBpbmxpbmUgVCYgaW5vdXQoKSB7IHJldHVybiAqcGRfc2VxOyB9CiAgICBp bmxpbmUgVComIG91dCgpIHsgaWYgKHBkX3NlcSkgeyBkZWxldGUgcGRfc2VxOyBwZF9zZXEgPSAw OyB9IHJldHVybiBwZF9zZXE7IH0KICAgIGlubGluZSBUKiBfcmV0bigpIHsgVCogdG1wID0gcGRf c2VxOyBwZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogICAgZnJpZW5kIGNsYXNzIE9iamVjdElk X291dDsKCiAgcHJpdmF0ZToKICAgIFQqIHBkX3NlcTsKICB9OwoKICBjbGFzcyBPYmplY3RJZF9v dXQgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgT2JqZWN0SWQgVDsKICAgIHR5cGVkZWYgT2JqZWN0 SWRfdmFyIFRfdmFyOwoKICAgIGlubGluZSBPYmplY3RJZF9vdXQoVComIHMpIDogX2RhdGEocykg eyBfZGF0YSA9IDA7IH0KICAgIGlubGluZSBPYmplY3RJZF9vdXQoVF92YXImIHN2KQogICAgICA6 IF9kYXRhKHN2LnBkX3NlcSkgeyBzdiA9IChUKikgMDsgfQogICAgaW5saW5lIE9iamVjdElkX291 dChjb25zdCBPYmplY3RJZF9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkgeyB9CiAgICBpbmxpbmUg T2JqZWN0SWRfb3V0JiBvcGVyYXRvcj0oY29uc3QgT2JqZWN0SWRfb3V0JiBzKSB7IF9kYXRhID0g cy5fZGF0YTsgcmV0dXJuICp0aGlzOyB9CiAgICBpbmxpbmUgT2JqZWN0SWRfb3V0JiBvcGVyYXRv cj0oVCogcykgeyBfZGF0YSA9IHM7IHJldHVybiAqdGhpczsgfQogICAgaW5saW5lIG9wZXJhdG9y IFQqJigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgICBpbmxpbmUgVComIHB0cigpIHsgcmV0dXJuIF9k YXRhOyB9CiAgICBpbmxpbmUgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIF9kYXRhOyB9CiAgICBp bmxpbmUgQ09SQkE6Ok9jdGV0JiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIGkpIHsgcmV0dXJu ICgqX2RhdGEpW2ldOyB9CiAgICBUKiYgX2RhdGE7CgogIHByaXZhdGU6CiAgICBPYmplY3RJZF9v dXQoKTsKICAgIE9iamVjdElkX291dCBvcGVyYXRvcj0oIGNvbnN0IFRfdmFyJik7CiAgfTsKCgoK CgogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPUkJBOjpVTG9uZwogICAgVEhSRUFEX1BP TElDWV9JRCA9IDE2OwoKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT1JCQTo6VUxvbmcK ICAgIExJRkVTUEFOX1BPTElDWV9JRCA9IDE3OwoKICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBDT1JCQTo6VUxvbmcKICAgIElEX1VOSVFVRU5FU1NfUE9MSUNZX0lEID0gMTg7CgogICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IENPUkJBOjpVTG9uZwogICAgSURfQVNTSUdOTUVOVF9QT0xJ Q1lfSUQgPSAxOTsKCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09SQkE6OlVMb25nCiAg ICBJTVBMSUNJVF9BQ1RJVkFUSU9OX1BPTElDWV9JRCA9IDIwOwoKICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBDT1JCQTo6VUxvbmcKICAgIFNFUlZBTlRfUkVURU5USU9OX1BPTElDWV9JRCA9 IDIxOwoKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT1JCQTo6VUxvbmcKICAgIFJFUVVF U1RfUFJPQ0VTU0lOR19QT0xJQ1lfSUQgPSAyMjsKCgogIGVudW0gVGhyZWFkUG9saWN5VmFsdWUg ewogICAgT1JCX0NUUkxfTU9ERUwsCiAgICBTSU5HTEVfVEhSRUFEX01PREVMCiAgfTsKCiAgZW51 bSBMaWZlc3BhblBvbGljeVZhbHVlIHsKICAgIFRSQU5TSUVOVCwKICAgIFBFUlNJU1RFTlQKICB9 OwoKICBlbnVtIElkVW5pcXVlbmVzc1BvbGljeVZhbHVlIHsKICAgIFVOSVFVRV9JRCwKICAgIE1V TFRJUExFX0lECiAgfTsKCiAgZW51bSBJZEFzc2lnbm1lbnRQb2xpY3lWYWx1ZSB7CiAgICBVU0VS X0lELAogICAgU1lTVEVNX0lECiAgfTsKCiAgZW51bSBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lW YWx1ZSB7CiAgICBJTVBMSUNJVF9BQ1RJVkFUSU9OLAogICAgTk9fSU1QTElDSVRfQUNUSVZBVElP TgogIH07CgogIGVudW0gU2VydmFudFJldGVudGlvblBvbGljeVZhbHVlIHsKICAgIFJFVEFJTiwK ICAgIE5PTl9SRVRBSU4KICB9OwoKICBlbnVtIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5VmFsdWUg ewogICAgVVNFX0FDVElWRV9PQkpFQ1RfTUFQX09OTFksCiAgICBVU0VfREVGQVVMVF9TRVJWQU5U LAogICAgVVNFX1NFUlZBTlRfTUFOQUdFUgogIH07CiMgMzcxICIvdXNyL2xvY2FsL2luY2x1ZGUv b21uaU9SQjMvcG9hLmgiIDMKICBjbGFzcyBUaHJlYWRQb2xpY3k7IHR5cGVkZWYgVGhyZWFkUG9s aWN5KiBUaHJlYWRQb2xpY3lfcHRyOyB0eXBlZGVmIFRocmVhZFBvbGljeV9wdHIgVGhyZWFkUG9s aWN5UmVmOyBjbGFzcyBUaHJlYWRQb2xpY3kgOiBwdWJsaWMgQ09SQkE6OlBvbGljeSB7IHB1Ymxp YzogaW5saW5lIFRocmVhZFBvbGljeShUaHJlYWRQb2xpY3lWYWx1ZSB2YWx1ZSkgOiBDT1JCQTo6 UG9saWN5KFRIUkVBRF9QT0xJQ1lfSUQpLCBwZF92YWx1ZSh2YWx1ZSkge30gaW5saW5lIFRocmVh ZFBvbGljeSgpIHt9IHZpcnR1YWwgflRocmVhZFBvbGljeSgpOyB2aXJ0dWFsIENPUkJBOjpQb2xp Y3lfcHRyIGNvcHkoKTsgdmlydHVhbCBUaHJlYWRQb2xpY3lWYWx1ZSB2YWx1ZSgpIHsgcmV0dXJu IHBkX3ZhbHVlOyB9IHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqIHJlcG9J ZCk7IHN0YXRpYyBUaHJlYWRQb2xpY3lfcHRyIF9kdXBsaWNhdGUoVGhyZWFkUG9saWN5X3B0ciBw KTsgc3RhdGljIFRocmVhZFBvbGljeV9wdHIgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0ciBwKTsg c3RhdGljIFRocmVhZFBvbGljeV9wdHIgX25pbCgpOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3Jl cG9JZDsgcHJpdmF0ZTogVGhyZWFkUG9saWN5VmFsdWUgcGRfdmFsdWU7IH07IHR5cGVkZWYgX0NP UkJBX1BzZXVkb09ial9WYXI8VGhyZWFkUG9saWN5PiBUaHJlYWRQb2xpY3lfdmFyOwogIGNsYXNz IExpZmVzcGFuUG9saWN5OyB0eXBlZGVmIExpZmVzcGFuUG9saWN5KiBMaWZlc3BhblBvbGljeV9w dHI7IHR5cGVkZWYgTGlmZXNwYW5Qb2xpY3lfcHRyIExpZmVzcGFuUG9saWN5UmVmOyBjbGFzcyBM aWZlc3BhblBvbGljeSA6IHB1YmxpYyBDT1JCQTo6UG9saWN5IHsgcHVibGljOiBpbmxpbmUgTGlm ZXNwYW5Qb2xpY3koTGlmZXNwYW5Qb2xpY3lWYWx1ZSB2YWx1ZSkgOiBDT1JCQTo6UG9saWN5KExJ RkVTUEFOX1BPTElDWV9JRCksIHBkX3ZhbHVlKHZhbHVlKSB7fSBpbmxpbmUgTGlmZXNwYW5Qb2xp Y3koKSB7fSB2aXJ0dWFsIH5MaWZlc3BhblBvbGljeSgpOyB2aXJ0dWFsIENPUkJBOjpQb2xpY3lf cHRyIGNvcHkoKTsgdmlydHVhbCBMaWZlc3BhblBvbGljeVZhbHVlIHZhbHVlKCkgeyByZXR1cm4g cGRfdmFsdWU7IH0gdmlydHVhbCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciogcmVwb0lk KTsgc3RhdGljIExpZmVzcGFuUG9saWN5X3B0ciBfZHVwbGljYXRlKExpZmVzcGFuUG9saWN5X3B0 ciBwKTsgc3RhdGljIExpZmVzcGFuUG9saWN5X3B0ciBfbmFycm93KENPUkJBOjpPYmplY3RfcHRy IHApOyBzdGF0aWMgTGlmZXNwYW5Qb2xpY3lfcHRyIF9uaWwoKTsgc3RhdGljIGNvbnN0IGNoYXIq IF9QRF9yZXBvSWQ7IHByaXZhdGU6IExpZmVzcGFuUG9saWN5VmFsdWUgcGRfdmFsdWU7IH07IHR5 cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8TGlmZXNwYW5Qb2xpY3k+IExpZmVzcGFuUG9saWN5 X3ZhcjsKICBjbGFzcyBJZFVuaXF1ZW5lc3NQb2xpY3k7IHR5cGVkZWYgSWRVbmlxdWVuZXNzUG9s aWN5KiBJZFVuaXF1ZW5lc3NQb2xpY3lfcHRyOyB0eXBlZGVmIElkVW5pcXVlbmVzc1BvbGljeV9w dHIgSWRVbmlxdWVuZXNzUG9saWN5UmVmOyBjbGFzcyBJZFVuaXF1ZW5lc3NQb2xpY3kgOiBwdWJs aWMgQ09SQkE6OlBvbGljeSB7IHB1YmxpYzogaW5saW5lIElkVW5pcXVlbmVzc1BvbGljeShJZFVu aXF1ZW5lc3NQb2xpY3lWYWx1ZSB2YWx1ZSkgOiBDT1JCQTo6UG9saWN5KElEX1VOSVFVRU5FU1Nf UE9MSUNZX0lEKSwgcGRfdmFsdWUodmFsdWUpIHt9IGlubGluZSBJZFVuaXF1ZW5lc3NQb2xpY3ko KSB7fSB2aXJ0dWFsIH5JZFVuaXF1ZW5lc3NQb2xpY3koKTsgdmlydHVhbCBDT1JCQTo6UG9saWN5 X3B0ciBjb3B5KCk7IHZpcnR1YWwgSWRVbmlxdWVuZXNzUG9saWN5VmFsdWUgdmFsdWUoKSB7IHJl dHVybiBwZF92YWx1ZTsgfSB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiBy ZXBvSWQpOyBzdGF0aWMgSWRVbmlxdWVuZXNzUG9saWN5X3B0ciBfZHVwbGljYXRlKElkVW5pcXVl bmVzc1BvbGljeV9wdHIgcCk7IHN0YXRpYyBJZFVuaXF1ZW5lc3NQb2xpY3lfcHRyIF9uYXJyb3co Q09SQkE6Ok9iamVjdF9wdHIgcCk7IHN0YXRpYyBJZFVuaXF1ZW5lc3NQb2xpY3lfcHRyIF9uaWwo KTsgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IElkVW5pcXVlbmVzc1Bv bGljeVZhbHVlIHBkX3ZhbHVlOyB9OyB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPElkVW5p cXVlbmVzc1BvbGljeT4gSWRVbmlxdWVuZXNzUG9saWN5X3ZhcjsKICBjbGFzcyBJZEFzc2lnbm1l bnRQb2xpY3k7IHR5cGVkZWYgSWRBc3NpZ25tZW50UG9saWN5KiBJZEFzc2lnbm1lbnRQb2xpY3lf cHRyOyB0eXBlZGVmIElkQXNzaWdubWVudFBvbGljeV9wdHIgSWRBc3NpZ25tZW50UG9saWN5UmVm OyBjbGFzcyBJZEFzc2lnbm1lbnRQb2xpY3kgOiBwdWJsaWMgQ09SQkE6OlBvbGljeSB7IHB1Ymxp YzogaW5saW5lIElkQXNzaWdubWVudFBvbGljeShJZEFzc2lnbm1lbnRQb2xpY3lWYWx1ZSB2YWx1 ZSkgOiBDT1JCQTo6UG9saWN5KElEX0FTU0lHTk1FTlRfUE9MSUNZX0lEKSwgcGRfdmFsdWUodmFs dWUpIHt9IGlubGluZSBJZEFzc2lnbm1lbnRQb2xpY3koKSB7fSB2aXJ0dWFsIH5JZEFzc2lnbm1l bnRQb2xpY3koKTsgdmlydHVhbCBDT1JCQTo6UG9saWN5X3B0ciBjb3B5KCk7IHZpcnR1YWwgSWRB c3NpZ25tZW50UG9saWN5VmFsdWUgdmFsdWUoKSB7IHJldHVybiBwZF92YWx1ZTsgfSB2aXJ0dWFs IHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpOyBzdGF0aWMgSWRBc3NpZ25t ZW50UG9saWN5X3B0ciBfZHVwbGljYXRlKElkQXNzaWdubWVudFBvbGljeV9wdHIgcCk7IHN0YXRp YyBJZEFzc2lnbm1lbnRQb2xpY3lfcHRyIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIgcCk7IHN0 YXRpYyBJZEFzc2lnbm1lbnRQb2xpY3lfcHRyIF9uaWwoKTsgc3RhdGljIGNvbnN0IGNoYXIqIF9Q RF9yZXBvSWQ7IHByaXZhdGU6IElkQXNzaWdubWVudFBvbGljeVZhbHVlIHBkX3ZhbHVlOyB9OyB0 eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPElkQXNzaWdubWVudFBvbGljeT4gSWRBc3NpZ25t ZW50UG9saWN5X3ZhcjsKICBjbGFzcyBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3k7IHR5cGVkZWYg SW1wbGljaXRBY3RpdmF0aW9uUG9saWN5KiBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lfcHRyOyB0 eXBlZGVmIEltcGxpY2l0QWN0aXZhdGlvblBvbGljeV9wdHIgSW1wbGljaXRBY3RpdmF0aW9uUG9s aWN5UmVmOyBjbGFzcyBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3kgOiBwdWJsaWMgQ09SQkE6OlBv bGljeSB7IHB1YmxpYzogaW5saW5lIEltcGxpY2l0QWN0aXZhdGlvblBvbGljeShJbXBsaWNpdEFj dGl2YXRpb25Qb2xpY3lWYWx1ZSB2YWx1ZSkgOiBDT1JCQTo6UG9saWN5KElNUExJQ0lUX0FDVElW QVRJT05fUE9MSUNZX0lEKSwgcGRfdmFsdWUodmFsdWUpIHt9IGlubGluZSBJbXBsaWNpdEFjdGl2 YXRpb25Qb2xpY3koKSB7fSB2aXJ0dWFsIH5JbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3koKTsgdmly dHVhbCBDT1JCQTo6UG9saWN5X3B0ciBjb3B5KCk7IHZpcnR1YWwgSW1wbGljaXRBY3RpdmF0aW9u UG9saWN5VmFsdWUgdmFsdWUoKSB7IHJldHVybiBwZF92YWx1ZTsgfSB2aXJ0dWFsIHZvaWQqIF9w dHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpOyBzdGF0aWMgSW1wbGljaXRBY3RpdmF0aW9u UG9saWN5X3B0ciBfZHVwbGljYXRlKEltcGxpY2l0QWN0aXZhdGlvblBvbGljeV9wdHIgcCk7IHN0 YXRpYyBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lfcHRyIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9w dHIgcCk7IHN0YXRpYyBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lfcHRyIF9uaWwoKTsgc3RhdGlj IGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IEltcGxpY2l0QWN0aXZhdGlvblBvbGlj eVZhbHVlIHBkX3ZhbHVlOyB9OyB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPEltcGxpY2l0 QWN0aXZhdGlvblBvbGljeT4gSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5X3ZhcjsKCiAgY2xhc3Mg U2VydmFudFJldGVudGlvblBvbGljeTsgdHlwZWRlZiBTZXJ2YW50UmV0ZW50aW9uUG9saWN5KiBT ZXJ2YW50UmV0ZW50aW9uUG9saWN5X3B0cjsgdHlwZWRlZiBTZXJ2YW50UmV0ZW50aW9uUG9saWN5 X3B0ciBTZXJ2YW50UmV0ZW50aW9uUG9saWN5UmVmOyBjbGFzcyBTZXJ2YW50UmV0ZW50aW9uUG9s aWN5IDogcHVibGljIENPUkJBOjpQb2xpY3kgeyBwdWJsaWM6IGlubGluZSBTZXJ2YW50UmV0ZW50 aW9uUG9saWN5KFNlcnZhbnRSZXRlbnRpb25Qb2xpY3lWYWx1ZSB2YWx1ZSkgOiBDT1JCQTo6UG9s aWN5KFNFUlZBTlRfUkVURU5USU9OX1BPTElDWV9JRCksIHBkX3ZhbHVlKHZhbHVlKSB7fSBpbmxp bmUgU2VydmFudFJldGVudGlvblBvbGljeSgpIHt9IHZpcnR1YWwgflNlcnZhbnRSZXRlbnRpb25Q b2xpY3koKTsgdmlydHVhbCBDT1JCQTo6UG9saWN5X3B0ciBjb3B5KCk7IHZpcnR1YWwgU2VydmFu dFJldGVudGlvblBvbGljeVZhbHVlIHZhbHVlKCkgeyByZXR1cm4gcGRfdmFsdWU7IH0gdmlydHVh bCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciogcmVwb0lkKTsgc3RhdGljIFNlcnZhbnRS ZXRlbnRpb25Qb2xpY3lfcHRyIF9kdXBsaWNhdGUoU2VydmFudFJldGVudGlvblBvbGljeV9wdHIg cCk7IHN0YXRpYyBTZXJ2YW50UmV0ZW50aW9uUG9saWN5X3B0ciBfbmFycm93KENPUkJBOjpPYmpl Y3RfcHRyIHApOyBzdGF0aWMgU2VydmFudFJldGVudGlvblBvbGljeV9wdHIgX25pbCgpOyBzdGF0 aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogU2VydmFudFJldGVudGlvblBvbGlj eVZhbHVlIHBkX3ZhbHVlOyB9OyB0eXBlZGVmIF9DT1JCQV9Qc2V1ZG9PYmpfVmFyPFNlcnZhbnRS ZXRlbnRpb25Qb2xpY3k+IFNlcnZhbnRSZXRlbnRpb25Qb2xpY3lfdmFyOwoKICBjbGFzcyBSZXF1 ZXN0UHJvY2Vzc2luZ1BvbGljeTsgdHlwZWRlZiBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeSogUmVx dWVzdFByb2Nlc3NpbmdQb2xpY3lfcHRyOyB0eXBlZGVmIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5 X3B0ciBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeVJlZjsgY2xhc3MgUmVxdWVzdFByb2Nlc3NpbmdQ b2xpY3kgOiBwdWJsaWMgQ09SQkE6OlBvbGljeSB7IHB1YmxpYzogaW5saW5lIFJlcXVlc3RQcm9j ZXNzaW5nUG9saWN5KFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5VmFsdWUgdmFsdWUpIDogQ09SQkE6 OlBvbGljeShSRVFVRVNUX1BST0NFU1NJTkdfUE9MSUNZX0lEKSwgcGRfdmFsdWUodmFsdWUpIHt9 IGlubGluZSBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeSgpIHt9IHZpcnR1YWwgflJlcXVlc3RQcm9j ZXNzaW5nUG9saWN5KCk7IHZpcnR1YWwgQ09SQkE6OlBvbGljeV9wdHIgY29weSgpOyB2aXJ0dWFs IFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5VmFsdWUgdmFsdWUoKSB7IHJldHVybiBwZF92YWx1ZTsg fSB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKiByZXBvSWQpOyBzdGF0aWMg UmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lfcHRyIF9kdXBsaWNhdGUoUmVxdWVzdFByb2Nlc3NpbmdQ b2xpY3lfcHRyIHApOyBzdGF0aWMgUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lfcHRyIF9uYXJyb3co Q09SQkE6Ok9iamVjdF9wdHIgcCk7IHN0YXRpYyBSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeV9wdHIg X25pbCgpOyBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogUmVxdWVzdFBy b2Nlc3NpbmdQb2xpY3lWYWx1ZSBwZF92YWx1ZTsgfTsgdHlwZWRlZiBfQ09SQkFfUHNldWRvT2Jq X1ZhcjxSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeT4gUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lfdmFy OwojIDM4OCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3BvYS5oIiAzCiAgY2xhc3MgUE9B TWFuYWdlcjsKICB0eXBlZGVmIFBPQU1hbmFnZXIqIFBPQU1hbmFnZXJfcHRyOwogIHR5cGVkZWYg UE9BTWFuYWdlcl9wdHIgUE9BTWFuYWdlclJlZjsKCiAgY2xhc3MgUE9BTWFuYWdlciA6IHB1Ymxp YyBDT1JCQTo6T2JqZWN0IHsKICBwdWJsaWM6CiAgICBjbGFzcyBBZGFwdGVySW5hY3RpdmUgOiBw dWJsaWMgQ09SQkE6OlVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBBZGFwdGVySW5hY3Rp dmUoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNlcnRUb0FueUZu TkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgQWRhcHRlckluYWN0aXZlKGNvbnN0IEFk YXB0ZXJJbmFjdGl2ZSYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxpbmUgQWRhcHRl ckluYWN0aXZlJiBvcGVyYXRvcj0oY29uc3QgQWRhcHRlckluYWN0aXZlJiBfZXgpIHsgKiAoQ09S QkE6OlVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+ QWRhcHRlckluYWN0aXZlKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGljIEFkYXB0ZXJJ bmFjdGl2ZSogX2Rvd25jYXN0KENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGNvbnN0IEFkYXB0 ZXJJbmFjdGl2ZSogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGlu bGluZSBBZGFwdGVySW5hY3RpdmUqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2V4KSB7IHJl dHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXpl X3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1 ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVy ZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0 cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikge30g c3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRpYyBpbnNlcnRF eGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3QgY2hhciogX1BE X3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRl KCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OyB2aXJ0dWFs IGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVhbCB2b2lkIF9O UF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFy c2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwoKICAgIHZpcnR1YWwgdm9pZCBhY3Rp dmF0ZSgpID0gMDsKICAgIHZpcnR1YWwgdm9pZCBob2xkX3JlcXVlc3RzKENPUkJBOjpCb29sZWFu IHdhaXRfZm9yX2NvbXBsZXRpb24pID0gMDsKICAgIHZpcnR1YWwgdm9pZCBkaXNjYXJkX3JlcXVl c3RzKENPUkJBOjpCb29sZWFuIHdhaXRfZm9yX2NvbXBsZXRpb24pID0gMDsKICAgIHZpcnR1YWwg dm9pZCBkZWFjdGl2YXRlKENPUkJBOjpCb29sZWFuIGV0aGVyZWFsaXplX29iamVjdHMsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBDT1JCQTo6Qm9vbGVhbiB3YWl0X2Zvcl9jb21wbGV0aW9u KSA9IDA7CgogICAgZW51bSBTdGF0ZSB7IEhPTERJTkcsIEFDVElWRSwgRElTQ0FSRElORywgSU5B Q1RJVkUgfTsKCiAgICB2aXJ0dWFsIFN0YXRlIGdldF9zdGF0ZSgpID0gMDsKCgoKICAgIHN0YXRp YyBQT0FNYW5hZ2VyX3B0ciBfZHVwbGljYXRlKFBPQU1hbmFnZXJfcHRyKTsKICAgIHN0YXRpYyBQ T0FNYW5hZ2VyX3B0ciBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICAgIHN0YXRpYyBQT0FN YW5hZ2VyX3B0ciBfbmlsKCk7CgoKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoK ICBwcm90ZWN0ZWQ6CiAgICBpbmxpbmUgUE9BTWFuYWdlcihpbnQgaXNfbmlsID0gMCkgewogICAg ICBfUFJfc2V0b2JqKChvbW5pT2JqUmVmKikgKGlzX25pbCA/IDA6MSkpOwogICAgfQogICAgdmly dHVhbCB+UE9BTWFuYWdlcigpOwoKICBwcml2YXRlOgogICAgUE9BTWFuYWdlcihjb25zdCBQT0FN YW5hZ2VyJik7CiAgICBQT0FNYW5hZ2VyJiBvcGVyYXRvcj0oY29uc3QgUE9BTWFuYWdlciYpOwog IH07CgogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09ial9WYXI8UE9BTWFuYWdlcj4gUE9BTWFuYWdl cl92YXI7CgoKCgoKICBjbGFzcyBfb2JqcmVmX0FkYXB0ZXJBY3RpdmF0b3I7CiAgY2xhc3MgX29i anJlZl9TZXJ2YW50TWFuYWdlcjsKCgogIGNsYXNzIFBPQSA6IHB1YmxpYyBDT1JCQTo6T2JqZWN0 IHsKICBwdWJsaWM6CgogICAgdHlwZWRlZiBQT0EqIF9wdHJfdHlwZTsKICAgIHR5cGVkZWYgX0NP UkJBX1BzZXVkb09ial9WYXI8UE9BPiBfdmFyX3R5cGU7CgoKCiAgICBjbGFzcyBBZGFwdGVyQWxy ZWFkeUV4aXN0cyA6IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5l IEFkYXB0ZXJBbHJlYWR5RXhpc3RzKCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlG bjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEFkYXB0 ZXJBbHJlYWR5RXhpc3RzKGNvbnN0IEFkYXB0ZXJBbHJlYWR5RXhpc3RzJiBfZXgpIDogVXNlckV4 Y2VwdGlvbihfZXgpIHt9IGlubGluZSBBZGFwdGVyQWxyZWFkeUV4aXN0cyYgb3BlcmF0b3I9KGNv bnN0IEFkYXB0ZXJBbHJlYWR5RXhpc3RzJiBfZXgpIHsgKiAoQ09SQkE6OlVzZXJFeGNlcHRpb24q KSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+QWRhcHRlckFscmVhZHlFeGlz dHMoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgQWRhcHRlckFscmVhZHlFeGlzdHMq IF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBBZGFwdGVyQWxyZWFk eUV4aXN0cyogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGlubGlu ZSBBZGFwdGVyQWxyZWFkeUV4aXN0cyogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgpIHsg cmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNp emVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0 QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZm ZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVk U3RyZWFtJikge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7 fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2Vy dEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBf UERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNh dGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1 YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQg X05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9t YXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBBZGFwdGVySW5h Y3RpdmUgOiBwdWJsaWMgQ09SQkE6OlVzZXJFeGNlcHRpb24geyBwdWJsaWM6IGlubGluZSBBZGFw dGVySW5hY3RpdmUoKSB7IHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOyBwZF9pbnNl cnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsgfSBpbmxpbmUgQWRhcHRlckluYWN0aXZl KGNvbnN0IEFkYXB0ZXJJbmFjdGl2ZSYgX2V4KSA6IFVzZXJFeGNlcHRpb24oX2V4KSB7fSBpbmxp bmUgQWRhcHRlckluYWN0aXZlJiBvcGVyYXRvcj0oY29uc3QgQWRhcHRlckluYWN0aXZlJiBfZXgp IHsgKiAoQ09SQkE6OlVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0g dmlydHVhbCB+QWRhcHRlckluYWN0aXZlKCk7IHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsgc3RhdGlj IEFkYXB0ZXJJbmFjdGl2ZSogX2Rvd25jYXN0KENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGNv bnN0IEFkYXB0ZXJJbmFjdGl2ZSogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsg c3RhdGljIGlubGluZSBBZGFwdGVySW5hY3RpdmUqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiog X2V4KSB7IHJldHVybiBfZG93bmNhc3QoX2V4KTsgfSBpbmxpbmUgc2l6ZV90IF9OUF9hbGlnbmVk U2l6ZShzaXplX3Qgb3MpIGNvbnN0IHsgcmV0dXJuIG9zOyB9IGlubGluZSB2b2lkIG9wZXJhdG9y Pj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0o TWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRC dWZmZXJlZFN0cmVhbSYpIHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3Ry ZWFtJikge30gc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47IHN0YXRp YyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOyBzdGF0aWMgY29uc3Qg Y2hhciogX1BEX3JlcG9JZDsgcHJpdmF0ZTogdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBf ZHVwbGljYXRlKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0 OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KiBzaXplKSBjb25zdDsgdmlydHVh bCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IHZpcnR1YWwgdm9p ZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB9OwogICAgY2xhc3MgQWRh cHRlck5vbkV4aXN0ZW50IDogcHVibGljIENPUkJBOjpVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBp bmxpbmUgQWRhcHRlck5vbkV4aXN0ZW50KCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9B bnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIEFk YXB0ZXJOb25FeGlzdGVudChjb25zdCBBZGFwdGVyTm9uRXhpc3RlbnQmIF9leCkgOiBVc2VyRXhj ZXB0aW9uKF9leCkge30gaW5saW5lIEFkYXB0ZXJOb25FeGlzdGVudCYgb3BlcmF0b3I9KGNvbnN0 IEFkYXB0ZXJOb25FeGlzdGVudCYgX2V4KSB7ICogKENPUkJBOjpVc2VyRXhjZXB0aW9uKikgdGhp cyA9IF9leDsgcmV0dXJuICp0aGlzOyB9IHZpcnR1YWwgfkFkYXB0ZXJOb25FeGlzdGVudCgpOyB2 aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBBZGFwdGVyTm9uRXhpc3RlbnQqIF9kb3duY2Fz dChDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBBZGFwdGVyTm9uRXhpc3RlbnQqIF9k b3duY2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBpbmxpbmUgQWRhcHRlck5v bkV4aXN0ZW50KiBfbmFycm93KENPUkJBOjpFeGNlcHRpb24qIF9leCkgeyByZXR1cm4gX2Rvd25j YXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IG9zKSBjb25z dCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVh bSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikg Y29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKSB7fSBp bmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVhbSYpIHt9IHN0YXRpYyBpbnNl cnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9B bnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHBy aXZhdGU6IHZpcnR1YWwgQ09SQkE6OkV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2 aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFy KiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChO ZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVm ZmVyZWRTdHJlYW0mKSBjb25zdDsgfTsKICAgIGNsYXNzIE5vU2VydmFudCA6IHB1YmxpYyBDT1JC QTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIE5vU2VydmFudCgpIHsgcGRfaW5zZXJ0 VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0Fu eUZuTkNQOyB9IGlubGluZSBOb1NlcnZhbnQoY29uc3QgTm9TZXJ2YW50JiBfZXgpIDogVXNlckV4 Y2VwdGlvbihfZXgpIHt9IGlubGluZSBOb1NlcnZhbnQmIG9wZXJhdG9yPShjb25zdCBOb1NlcnZh bnQmIF9leCkgeyAqIChDT1JCQTo6VXNlckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAq dGhpczsgfSB2aXJ0dWFsIH5Ob1NlcnZhbnQoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0 aWMgTm9TZXJ2YW50KiBfZG93bmNhc3QoQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3Qg Tm9TZXJ2YW50KiBfZG93bmNhc3QoY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgaW5s aW5lIE5vU2VydmFudCogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9k b3duY2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykg Y29uc3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRT dHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVh bSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikg e30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMg aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlv blRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lk OyBwcml2YXRlOiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25z dDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3Qg Y2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNo YWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1l bUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBPYmplY3RBbHJlYWR5QWN0aXZl IDogcHVibGljIENPUkJBOjpVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgT2JqZWN0QWxy ZWFkeUFjdGl2ZSgpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2Vy dFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBPYmplY3RBbHJlYWR5QWN0 aXZlKGNvbnN0IE9iamVjdEFscmVhZHlBY3RpdmUmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkg e30gaW5saW5lIE9iamVjdEFscmVhZHlBY3RpdmUmIG9wZXJhdG9yPShjb25zdCBPYmplY3RBbHJl YWR5QWN0aXZlJiBfZXgpIHsgKiAoQ09SQkE6OlVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyBy ZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+T2JqZWN0QWxyZWFkeUFjdGl2ZSgpOyB2aXJ0dWFsIHZv aWQgX3JhaXNlKCk7IHN0YXRpYyBPYmplY3RBbHJlYWR5QWN0aXZlKiBfZG93bmNhc3QoQ09SQkE6 OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgT2JqZWN0QWxyZWFkeUFjdGl2ZSogX2Rvd25jYXN0 KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBPYmplY3RBbHJlYWR5QWN0 aXZlKiBfbmFycm93KENPUkJBOjpFeGNlcHRpb24qIF9leCkgeyByZXR1cm4gX2Rvd25jYXN0KF9l eCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IG9zKSBjb25zdCB7IHJl dHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNv bnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qg e30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUg dm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVhbSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNl cHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1Ag aW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6 IHZpcnR1YWwgQ09SQkE6OkV4Y2VwdGlvbiogX05QX2R1cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFs IGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBf cmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZm ZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRT dHJlYW0mKSBjb25zdDsgfTsKICAgIGNsYXNzIE9iamVjdE5vdEFjdGl2ZSA6IHB1YmxpYyBDT1JC QTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIE9iamVjdE5vdEFjdGl2ZSgpIHsgcGRf aW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5OQ1AgPSBpbnNl cnRUb0FueUZuTkNQOyB9IGlubGluZSBPYmplY3ROb3RBY3RpdmUoY29uc3QgT2JqZWN0Tm90QWN0 aXZlJiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBPYmplY3ROb3RBY3RpdmUm IG9wZXJhdG9yPShjb25zdCBPYmplY3ROb3RBY3RpdmUmIF9leCkgeyAqIChDT1JCQTo6VXNlckV4 Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5PYmplY3ROb3RB Y3RpdmUoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgT2JqZWN0Tm90QWN0aXZlKiBf ZG93bmNhc3QoQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgT2JqZWN0Tm90QWN0aXZl KiBfZG93bmNhc3QoY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIE9iamVj dE5vdEFjdGl2ZSogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3du Y2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29u c3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJl YW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYp IGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30g aW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5z ZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRv QW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBw cml2YXRlOiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hh ciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwo TmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1 ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBTZXJ2YW50QWxyZWFkeUFjdGl2ZSA6 IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIFNlcnZhbnRBbHJl YWR5QWN0aXZlKCkgeyBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0 VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7IH0gaW5saW5lIFNlcnZhbnRBbHJlYWR5QWN0 aXZlKGNvbnN0IFNlcnZhbnRBbHJlYWR5QWN0aXZlJiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgp IHt9IGlubGluZSBTZXJ2YW50QWxyZWFkeUFjdGl2ZSYgb3BlcmF0b3I9KGNvbnN0IFNlcnZhbnRB bHJlYWR5QWN0aXZlJiBfZXgpIHsgKiAoQ09SQkE6OlVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4 OyByZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+U2VydmFudEFscmVhZHlBY3RpdmUoKTsgdmlydHVh bCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgU2VydmFudEFscmVhZHlBY3RpdmUqIF9kb3duY2FzdChD T1JCQTo6RXhjZXB0aW9uKik7IHN0YXRpYyBjb25zdCBTZXJ2YW50QWxyZWFkeUFjdGl2ZSogX2Rv d25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3RhdGljIGlubGluZSBTZXJ2YW50QWxy ZWFkeUFjdGl2ZSogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3du Y2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29u c3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJl YW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYp IGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30g aW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5z ZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRv QW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBw cml2YXRlOiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hh ciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwo TmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1 ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBTZXJ2YW50Tm90QWN0aXZlIDogcHVi bGljIENPUkJBOjpVc2VyRXhjZXB0aW9uIHsgcHVibGljOiBpbmxpbmUgU2VydmFudE5vdEFjdGl2 ZSgpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2VydFRvQW55Rm5O Q1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBTZXJ2YW50Tm90QWN0aXZlKGNvbnN0IFNl cnZhbnROb3RBY3RpdmUmIF9leCkgOiBVc2VyRXhjZXB0aW9uKF9leCkge30gaW5saW5lIFNlcnZh bnROb3RBY3RpdmUmIG9wZXJhdG9yPShjb25zdCBTZXJ2YW50Tm90QWN0aXZlJiBfZXgpIHsgKiAo Q09SQkE6OlVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyByZXR1cm4gKnRoaXM7IH0gdmlydHVh bCB+U2VydmFudE5vdEFjdGl2ZSgpOyB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7IHN0YXRpYyBTZXJ2 YW50Tm90QWN0aXZlKiBfZG93bmNhc3QoQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3Qg U2VydmFudE5vdEFjdGl2ZSogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsgc3Rh dGljIGlubGluZSBTZXJ2YW50Tm90QWN0aXZlKiBfbmFycm93KENPUkJBOjpFeGNlcHRpb24qIF9l eCkgeyByZXR1cm4gX2Rvd25jYXN0KF9leCk7IH0gaW5saW5lIHNpemVfdCBfTlBfYWxpZ25lZFNp emUoc2l6ZV90IG9zKSBjb25zdCB7IHJldHVybiBvczsgfSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+ PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1l bUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVm ZmVyZWRTdHJlYW0mKSB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVh bSYpIHt9IHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBpbnNlcnRUb0FueUZuOyBzdGF0aWMg aW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0VG9BbnlGbk5DUDsgc3RhdGljIGNvbnN0IGNo YXIqIF9QRF9yZXBvSWQ7IHByaXZhdGU6IHZpcnR1YWwgQ09SQkE6OkV4Y2VwdGlvbiogX05QX2R1 cGxpY2F0ZSgpIGNvbnN0OyB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsg dmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCogc2l6ZSkgY29uc3Q7IHZpcnR1YWwg dm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OyB2aXJ0dWFsIHZvaWQg X05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgfTsKICAgIGNsYXNzIFdyb25n QWRhcHRlciA6IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIFdy b25nQWRhcHRlcigpIHsgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47IHBkX2luc2Vy dFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOyB9IGlubGluZSBXcm9uZ0FkYXB0ZXIoY29u c3QgV3JvbmdBZGFwdGVyJiBfZXgpIDogVXNlckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBXcm9u Z0FkYXB0ZXImIG9wZXJhdG9yPShjb25zdCBXcm9uZ0FkYXB0ZXImIF9leCkgeyAqIChDT1JCQTo6 VXNlckV4Y2VwdGlvbiopIHRoaXMgPSBfZXg7IHJldHVybiAqdGhpczsgfSB2aXJ0dWFsIH5Xcm9u Z0FkYXB0ZXIoKTsgdmlydHVhbCB2b2lkIF9yYWlzZSgpOyBzdGF0aWMgV3JvbmdBZGFwdGVyKiBf ZG93bmNhc3QoQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgY29uc3QgV3JvbmdBZGFwdGVyKiBf ZG93bmNhc3QoY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiopOyBzdGF0aWMgaW5saW5lIFdyb25nQWRh cHRlciogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZXgpIHsgcmV0dXJuIF9kb3duY2FzdChf ZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBvcykgY29uc3QgeyBy ZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBj b25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0 IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikge30gaW5saW5l IHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhj ZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQ IGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOyBwcml2YXRl OiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsgdmlydHVh bCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7IHZpcnR1YWwgY29uc3QgY2hhciogX05Q X3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0QnVm ZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVk U3RyZWFtJikgY29uc3Q7IH07CiAgICBjbGFzcyBXcm9uZ1BvbGljeSA6IHB1YmxpYyBDT1JCQTo6 VXNlckV4Y2VwdGlvbiB7IHB1YmxpYzogaW5saW5lIFdyb25nUG9saWN5KCkgeyBwZF9pbnNlcnRU b0FueUZuID0gaW5zZXJ0VG9BbnlGbjsgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55 Rm5OQ1A7IH0gaW5saW5lIFdyb25nUG9saWN5KGNvbnN0IFdyb25nUG9saWN5JiBfZXgpIDogVXNl ckV4Y2VwdGlvbihfZXgpIHt9IGlubGluZSBXcm9uZ1BvbGljeSYgb3BlcmF0b3I9KGNvbnN0IFdy b25nUG9saWN5JiBfZXgpIHsgKiAoQ09SQkE6OlVzZXJFeGNlcHRpb24qKSB0aGlzID0gX2V4OyBy ZXR1cm4gKnRoaXM7IH0gdmlydHVhbCB+V3JvbmdQb2xpY3koKTsgdmlydHVhbCB2b2lkIF9yYWlz ZSgpOyBzdGF0aWMgV3JvbmdQb2xpY3kqIF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7IHN0 YXRpYyBjb25zdCBXcm9uZ1BvbGljeSogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24q KTsgc3RhdGljIGlubGluZSBXcm9uZ1BvbGljeSogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBf ZXgpIHsgcmV0dXJuIF9kb3duY2FzdChfZXgpOyB9IGlubGluZSBzaXplX3QgX05QX2FsaWduZWRT aXplKHNpemVfdCBvcykgY29uc3QgeyByZXR1cm4gb3M7IH0gaW5saW5lIHZvaWQgb3BlcmF0b3I+ Pj0oTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7fSBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShN ZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHt9IGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1 ZmZlcmVkU3RyZWFtJikge30gaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJl YW0mKSB7fSBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsgc3RhdGlj IGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7IHN0YXRpYyBjb25zdCBj aGFyKiBfUERfcmVwb0lkOyBwcml2YXRlOiB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9k dXBsaWNhdGUoKSBjb25zdDsgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7 IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqIHNpemUpIGNvbnN0OyB2aXJ0dWFs IHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsgdmlydHVhbCB2b2lk IF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7IH07CgogICAgY2xhc3MgSW52 YWxpZFBvbGljeSA6IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7CiAgICBwdWJsaWM6CiAg ICAgIENPUkJBOjpVU2hvcnQgaW5kZXg7CgogICAgICBpbmxpbmUgSW52YWxpZFBvbGljeSgpIHsK ICAgICAgICBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsKICAgICAgICBwZF9pbnNl cnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsKICAgICAgfQogICAgICBJbnZhbGlkUG9s aWN5KGNvbnN0IEludmFsaWRQb2xpY3kmKTsKICAgICAgSW52YWxpZFBvbGljeShDT1JCQTo6VVNo b3J0IGlfaW5kZXgpOwogICAgICBJbnZhbGlkUG9saWN5JiBvcGVyYXRvcj0oY29uc3QgSW52YWxp ZFBvbGljeSYpOwogICAgICB2aXJ0dWFsIH5JbnZhbGlkUG9saWN5KCk7CiAgICAgIHZpcnR1YWwg dm9pZCBfcmFpc2UoKTsKICAgICAgc3RhdGljIEludmFsaWRQb2xpY3kqIF9kb3duY2FzdChDT1JC QTo6RXhjZXB0aW9uKik7CiAgICAgIHN0YXRpYyBjb25zdCBJbnZhbGlkUG9saWN5KiBfZG93bmNh c3QoY29uc3QgQ09SQkE6OkV4Y2VwdGlvbiopOwogICAgICBzdGF0aWMgaW5saW5lIEludmFsaWRQ b2xpY3kqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogZSkgewogICAgICAgIHJldHVybiBfZG93 bmNhc3QoZSk7CiAgICAgIH0KCiAgICAgIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90KSBj b25zdDsKICAgICAgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0Owog ICAgICB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7CiAgICAgIHZv aWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgICAgdm9pZCBvcGVyYXRvcjw8 PShNZW1CdWZmZXJlZFN0cmVhbSYpOwoKICAgICAgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55 IGluc2VydFRvQW55Rm47CiAgICAgIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNl cnRUb0FueUZuTkNQOwoKICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgogICAg cHJpdmF0ZToKICAgICAgdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkg Y29uc3Q7CiAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OwogICAg ICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50KikgY29uc3Q7CiAgICAgIHZpcnR1 YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgICB2aXJ0 dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsKICAgIH07CgoK CiAgICB2aXJ0dWFsIFBPQV9wdHIgY3JlYXRlX1BPQShjb25zdCBjaGFyKiBhZGFwdGVyX25hbWUs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0FNYW5hZ2VyX3B0ciBhX1BPQU1hbmFn ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT1JCQTo6UG9saWN5TGlz dCYgcG9saWNpZXMpID0gMDsKCiAgICB2aXJ0dWFsIFBPQV9wdHIgZmluZF9QT0EoY29uc3QgY2hh ciogYWRhcHRlcl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUkJBOjpCb29s ZWFuIGFjdGl2YXRlX2l0KSA9IDA7CgogICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koQ09SQkE6OkJv b2xlYW4gZXRoZXJlYWxpemVfb2JqZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgIENPUkJB OjpCb29sZWFuIHdhaXRfZm9yX2NvbXBsZXRpb24pID0gMDsKCgoKICAgIHZpcnR1YWwgVGhyZWFk UG9saWN5X3B0cgogICAgICBjcmVhdGVfdGhyZWFkX3BvbGljeShUaHJlYWRQb2xpY3lWYWx1ZSB2 KTsKICAgIHZpcnR1YWwgTGlmZXNwYW5Qb2xpY3lfcHRyCiAgICAgIGNyZWF0ZV9saWZlc3Bhbl9w b2xpY3koTGlmZXNwYW5Qb2xpY3lWYWx1ZSB2KTsKICAgIHZpcnR1YWwgSWRVbmlxdWVuZXNzUG9s aWN5X3B0cgogICAgICBjcmVhdGVfaWRfdW5pcXVlbmVzc19wb2xpY3koSWRVbmlxdWVuZXNzUG9s aWN5VmFsdWUgdik7CiAgICB2aXJ0dWFsIElkQXNzaWdubWVudFBvbGljeV9wdHIKICAgICAgY3Jl YXRlX2lkX2Fzc2lnbm1lbnRfcG9saWN5KElkQXNzaWdubWVudFBvbGljeVZhbHVlIHYpOwogICAg dmlydHVhbCBJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lfcHRyCiAgICAgIGNyZWF0ZV9pbXBsaWNp dF9hY3RpdmF0aW9uX3BvbGljeShJbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lWYWx1ZSB2KTsKICAg IHZpcnR1YWwgU2VydmFudFJldGVudGlvblBvbGljeV9wdHIKICAgICAgY3JlYXRlX3NlcnZhbnRf cmV0ZW50aW9uX3BvbGljeShTZXJ2YW50UmV0ZW50aW9uUG9saWN5VmFsdWUgdik7CiAgICB2aXJ0 dWFsIFJlcXVlc3RQcm9jZXNzaW5nUG9saWN5X3B0cgogICAgICBjcmVhdGVfcmVxdWVzdF9wcm9j ZXNzaW5nX3BvbGljeShSZXF1ZXN0UHJvY2Vzc2luZ1BvbGljeVZhbHVlIHYpOwoKCgogICAgdmly dHVhbCBjaGFyKiB0aGVfbmFtZSgpID0gMDsKICAgIHZpcnR1YWwgUE9BX3B0ciB0aGVfcGFyZW50 KCkgPSAwOwogICAgdmlydHVhbCBQT0FMaXN0KiB0aGVfY2hpbGRyZW4oKSA9IDA7CiAgICB2aXJ0 dWFsIFBPQU1hbmFnZXJfcHRyIHRoZV9QT0FNYW5hZ2VyKCkgPSAwOwogICAgdmlydHVhbCBfb2Jq cmVmX0FkYXB0ZXJBY3RpdmF0b3IqIHRoZV9hY3RpdmF0b3IoKSA9IDA7CiAgICB2aXJ0dWFsIHZv aWQgdGhlX2FjdGl2YXRvcihfb2JqcmVmX0FkYXB0ZXJBY3RpdmF0b3IqIGFhKSA9IDA7CgoKCiAg ICB2aXJ0dWFsIF9vYmpyZWZfU2VydmFudE1hbmFnZXIqIGdldF9zZXJ2YW50X21hbmFnZXIoKSA9 IDA7CiAgICB2aXJ0dWFsIHZvaWQgc2V0X3NlcnZhbnRfbWFuYWdlcihfb2JqcmVmX1NlcnZhbnRN YW5hZ2VyKiBpbWdyKSA9IDA7CgoKCiAgICB2aXJ0dWFsIFNlcnZhbnQgZ2V0X3NlcnZhbnQoKSA9 IDA7CiAgICB2aXJ0dWFsIHZvaWQgc2V0X3NlcnZhbnQoU2VydmFudCBwX3NlcnZhbnQpID0gMDsK CgoKICAgIHZpcnR1YWwgT2JqZWN0SWQqIGFjdGl2YXRlX29iamVjdChTZXJ2YW50IHBfc2VydmFu dCkgPSAwOwogICAgdmlydHVhbCB2b2lkIGFjdGl2YXRlX29iamVjdF93aXRoX2lkKGNvbnN0IE9i amVjdElkJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2 YW50IHBfc2VydmFudCkgPSAwOwogICAgdmlydHVhbCB2b2lkIGRlYWN0aXZhdGVfb2JqZWN0KGNv bnN0IE9iamVjdElkJiBvaWQpID0gMDsKCgoKICAgIHZpcnR1YWwgQ09SQkE6Ok9iamVjdF9wdHIg Y3JlYXRlX3JlZmVyZW5jZShjb25zdCBjaGFyKiBpbnRmKSA9IDA7CiAgICB2aXJ0dWFsIENPUkJB OjpPYmplY3RfcHRyIGNyZWF0ZV9yZWZlcmVuY2Vfd2l0aF9pZChjb25zdCBPYmplY3RJZCYgb2lk LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNo YXIqIGludGYpID0gMDsKCgoKICAgIHZpcnR1YWwgT2JqZWN0SWQqIHNlcnZhbnRfdG9faWQoU2Vy dmFudCBwX3NlcnZhbnQpID0gMDsKICAgIHZpcnR1YWwgQ09SQkE6Ok9iamVjdF9wdHIgc2VydmFu dF90b19yZWZlcmVuY2UoU2VydmFudCBwX3NlcnZhbnQpID0gMDsKICAgIHZpcnR1YWwgU2VydmFu dCByZWZlcmVuY2VfdG9fc2VydmFudChDT1JCQTo6T2JqZWN0X3B0ciByZWZlcmVuY2UpID0gMDsK ICAgIHZpcnR1YWwgT2JqZWN0SWQqIHJlZmVyZW5jZV90b19pZChDT1JCQTo6T2JqZWN0X3B0ciBy ZWZlcmVuY2UpID0gMDsKICAgIHZpcnR1YWwgU2VydmFudCBpZF90b19zZXJ2YW50KGNvbnN0IE9i amVjdElkJiBvaWQpID0gMDsKICAgIHZpcnR1YWwgQ09SQkE6Ok9iamVjdF9wdHIgaWRfdG9fcmVm ZXJlbmNlKGNvbnN0IE9iamVjdElkJiBvaWQpID0gMDsKCgoKCgogICAgc3RhdGljIFBPQV9wdHIg X2R1cGxpY2F0ZShQT0FfcHRyKTsKICAgIHN0YXRpYyBQT0FfcHRyIF9uYXJyb3coQ09SQkE6Ok9i amVjdF9wdHIpOwogICAgc3RhdGljIFBPQV9wdHIgX25pbCgpOwoKCiAgICBzdGF0aWMgY29uc3Qg Y2hhciogX1BEX3JlcG9JZDsKICAgIHN0YXRpYyBQT0FfcHRyIF90aGVfcm9vdF9wb2EoKTsKCiAg cHJvdGVjdGVkOgogICAgaW5saW5lIFBPQShpbnQgbmlsKSB7IF9QUl9zZXRvYmooKG9tbmlPYmpS ZWYqKSAobmlsID8gMDoxKSk7IH0KICAgIHZpcnR1YWwgflBPQSgpOwoKICBwcml2YXRlOgogICAg UE9BKGNvbnN0IFBPQSYpOwogICAgUE9BJiBvcGVyYXRvcj0oY29uc3QgUE9BJik7CiAgfTsKCiAg dHlwZWRlZiBQT0E6Ol92YXJfdHlwZSBQT0FfdmFyOwogIHR5cGVkZWYgX0NPUkJBX1BzZXVkb09i al9NZW1iZXI8UE9BLCBQT0FfdmFyPiBQT0FfbWVtYmVyOwojIDYxOSAiL3Vzci9sb2NhbC9pbmNs dWRlL29tbmlPUkIzL3BvYS5oIiAzCiAgY2xhc3MgU2VydmFudEJhc2UgOiBwdWJsaWMgdmlydHVh bCBvbW5pU2VydmFudCB7CiAgcHVibGljOgogICAgdmlydHVhbCB+U2VydmFudEJhc2UoKTsKCiAg ICB2aXJ0dWFsIFBPQV9wdHIgX2RlZmF1bHRfUE9BKCk7CgoKCgogICAgdmlydHVhbCBDT1JCQTo6 X29ianJlZl9JbnRlcmZhY2VEZWYqIF9nZXRfaW50ZXJmYWNlKCk7CiMgNjQxICIvdXNyL2xvY2Fs L2luY2x1ZGUvb21uaU9SQjMvcG9hLmgiIDMKICAgIHZpcnR1YWwgdm9pZCBfYWRkX3JlZigpOwog ICAgdmlydHVhbCB2b2lkIF9yZW1vdmVfcmVmKCk7CgogIHByb3RlY3RlZDoKICAgIGlubGluZSBT ZXJ2YW50QmFzZSgpIHt9CiAgICBpbmxpbmUgU2VydmFudEJhc2UoY29uc3QgU2VydmFudEJhc2Um KSB7fQogICAgaW5saW5lIFNlcnZhbnRCYXNlJiBvcGVyYXRvciA9IChjb25zdCBTZXJ2YW50QmFz ZSYpIHsgcmV0dXJuICp0aGlzOyB9CgogICAgdm9pZCogX2RvX3RoaXMoY29uc3QgY2hhciogcmVw b0lkKTsKCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgb21uaU9ialJlZiogX2RvX2dldF9pbnRlcmZh Y2UoKTsKICAgIHZpcnR1YWwgdm9pZCogX2Rvd25jYXN0KCk7CgogIH07CgoKCgoKICBjbGFzcyBS ZWZDb3VudFNlcnZhbnRCYXNlIDogcHVibGljIHZpcnR1YWwgU2VydmFudEJhc2UgewogIHB1Ymxp YzoKICAgIHZpcnR1YWwgflJlZkNvdW50U2VydmFudEJhc2UoKTsKCiAgICB2aXJ0dWFsIHZvaWQg X2FkZF9yZWYoKTsKICAgIHZpcnR1YWwgdm9pZCBfcmVtb3ZlX3JlZigpOwoKICBwcm90ZWN0ZWQ6 CiAgICBpbmxpbmUgUmVmQ291bnRTZXJ2YW50QmFzZSgpIDogcGRfcmVmQ291bnQoMSkge30KICAg IGlubGluZSBSZWZDb3VudFNlcnZhbnRCYXNlKGNvbnN0IFJlZkNvdW50U2VydmFudEJhc2UmKSA6 IHBkX3JlZkNvdW50KDEpIHt9CiAgICBpbmxpbmUgUmVmQ291bnRTZXJ2YW50QmFzZSYgb3BlcmF0 b3IgPSAoY29uc3QgUmVmQ291bnRTZXJ2YW50QmFzZSYpCiAgICAgIHsgcmV0dXJuICp0aGlzOyB9 CgogIHByaXZhdGU6CiAgICBpbnQgcGRfcmVmQ291bnQ7CiAgfTsKCgoKCgogIGNsYXNzIFNlcnZh bnRCYXNlX3ZhciB7CiAgcHVibGljOgogICAgdHlwZWRlZiBTZXJ2YW50QmFzZSogVF9wdHI7CiAg ICB0eXBlZGVmIFNlcnZhbnRCYXNlX3ZhciBUX3ZhcjsKCiAgICBpbmxpbmUgU2VydmFudEJhc2Vf dmFyKCkgOiBwZF9kYXRhKDApIHt9CiAgICBpbmxpbmUgU2VydmFudEJhc2VfdmFyKFRfcHRyIHAp IDogcGRfZGF0YShwKSB7fQogICAgaW5saW5lIFNlcnZhbnRCYXNlX3Zhcihjb25zdCBUX3ZhciYg dikgOiBwZF9kYXRhKHYucGRfZGF0YSkKICAgICAgeyBpZiggcGRfZGF0YSApIHBkX2RhdGEtPl9h ZGRfcmVmKCk7IH0KCiAgICBpbmxpbmUgflNlcnZhbnRCYXNlX3ZhcigpIHsgaWYoIHBkX2RhdGEg KSBwZF9kYXRhLT5fcmVtb3ZlX3JlZigpOyB9CgogICAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9 IChUX3B0ciBwKSB7CiAgICAgIGlmKCBwZF9kYXRhICkgcGRfZGF0YS0+X3JlbW92ZV9yZWYoKTsK ICAgICAgcGRfZGF0YSA9IHA7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGlubGluZSBU X3ZhciYgb3BlcmF0b3IgPSAoVF92YXIgdikgewogICAgICBpZiggcGRfZGF0YSApIHBkX2RhdGEt Pl9yZW1vdmVfcmVmKCk7CiAgICAgIGlmKCAocGRfZGF0YSA9IHYucGRfZGF0YSkgKSBwZF9kYXRh LT5fYWRkX3JlZigpOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgaW5saW5lIG9wZXJh dG9yIFRfcHRyICgpIGNvbnN0IHsgcmV0dXJuIHBkX2RhdGE7IH0KICAgIGlubGluZSBUX3B0ciBv cGVyYXRvciAtPiAoKSBjb25zdCB7IHJldHVybiBwZF9kYXRhOyB9CgogICAgaW5saW5lIFRfcHRy IGluKCkgY29uc3QgeyByZXR1cm4gcGRfZGF0YTsgfQogICAgaW5saW5lIFRfcHRyJiBpbm91dCgp IHsgcmV0dXJuIHBkX2RhdGE7IH0KICAgIGlubGluZSBUX3B0ciYgb3V0KCkgewogICAgICBpZigg cGRfZGF0YSApIHsgcGRfZGF0YS0+X3JlbW92ZV9yZWYoKTsgcGRfZGF0YSA9IDA7IH0KICAgICAg cmV0dXJuIHBkX2RhdGE7CiAgICB9CiAgICBpbmxpbmUgVF9wdHIgX3JldG4oKSB7IFRfcHRyIHRt cCA9IHBkX2RhdGE7IHBkX2RhdGEgPSAwOyByZXR1cm4gdG1wOyB9CgogIHByaXZhdGU6CiAgICBU X3B0ciBwZF9kYXRhOwogIH07CgoKCgoKICBjbGFzcyBEeW5hbWljSW1wbGVtZW50YXRpb24gOiBw dWJsaWMgdmlydHVhbCBTZXJ2YW50QmFzZSB7CiAgcHVibGljOgogICAgdmlydHVhbCB+RHluYW1p Y0ltcGxlbWVudGF0aW9uKCk7CgogICAgQ09SQkE6Ok9iamVjdF9wdHIgX3RoaXMoKTsKCiAgICB2 aXJ0dWFsIHZvaWQgaW52b2tlKENPUkJBOjpTZXJ2ZXJSZXF1ZXN0X3B0ciByZXF1ZXN0KSA9IDA7 CiAgICB2aXJ0dWFsIGNoYXIqIF9wcmltYXJ5X2ludGVyZmFjZShjb25zdCBPYmplY3RJZCYgb2lk LCBQT0FfcHRyIHBvYSkgPSAwOwoKCiAgICB2aXJ0dWFsIENPUkJBOjpCb29sZWFuIF9pc19hKGNv bnN0IGNoYXIqIGxvZ2ljYWxfdHlwZV9pZCk7CgoKCgogICAgdmlydHVhbCBfQ09SQkFfQm9vbGVh biBfZGlzcGF0Y2goR0lPUF9TJik7CgoKCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgb21uaU9ialJl ZiogX2RvX2dldF9pbnRlcmZhY2UoKTsKICB9OwoKCgoKCiAgICAgICAgICAgICAgICAgICBjaGFy KiBPYmplY3RJZF90b19zdHJpbmcoY29uc3QgT2JqZWN0SWQmIGlkKTsKICAgICAgICAgICAgICAg ICAgIE9iamVjdElkKiBzdHJpbmdfdG9fT2JqZWN0SWQoY29uc3QgY2hhciogcyk7CgoKIyAxICIv dXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcG9hX2RlZnMuaCIgMSAzCiMgNjIgIi91c3IvbG9j YWwvaW5jbHVkZS9vbW5pT1JCMy9wb2FfZGVmcy5oIiAzCmNsYXNzIEZvcndhcmRSZXF1ZXN0IDog cHVibGljIENPUkJBOjpVc2VyRXhjZXB0aW9uIHsKcHVibGljOgogIENPUkJBOjpPYmplY3RfTWVt YmVyIGZvcndhcmRfcmVmZXJlbmNlOwoKICBpbmxpbmUgRm9yd2FyZFJlcXVlc3QoKSB7CiAgICBw ZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0VG9BbnlGbjsKICAgIHBkX2luc2VydFRvQW55Rm5OQ1Ag PSBpbnNlcnRUb0FueUZuTkNQOwogIH0KICBGb3J3YXJkUmVxdWVzdChjb25zdCBGb3J3YXJkUmVx dWVzdCYpOwogIEZvcndhcmRSZXF1ZXN0KENPUkJBOjpPYmplY3RfcHRyIGlfZm9yd2FyZF9yZWZl cmVuY2UpOwogIEZvcndhcmRSZXF1ZXN0JiBvcGVyYXRvcj0oY29uc3QgRm9yd2FyZFJlcXVlc3Qm KTsKICB2aXJ0dWFsIH5Gb3J3YXJkUmVxdWVzdCgpOwogIHZpcnR1YWwgdm9pZCBfcmFpc2UoKTsK ICBzdGF0aWMgRm9yd2FyZFJlcXVlc3QqIF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7CiAg c3RhdGljIGNvbnN0IEZvcndhcmRSZXF1ZXN0KiBfZG93bmNhc3QoY29uc3QgQ09SQkE6OkV4Y2Vw dGlvbiopOwogIHN0YXRpYyBpbmxpbmUgRm9yd2FyZFJlcXVlc3QqIF9uYXJyb3coQ09SQkE6OkV4 Y2VwdGlvbiogZSkgewogICAgcmV0dXJuIF9kb3duY2FzdChlKTsKICB9CgogIHNpemVfdCBfTlBf YWxpZ25lZFNpemUoc2l6ZV90KSBjb25zdDsKICB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVk U3RyZWFtJikgY29uc3Q7CiAgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNv bnN0OwogIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKTsKICB2b2lkIG9wZXJh dG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0Fu eSBpbnNlcnRUb0FueUZuOwogIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRU b0FueUZuTkNQOwoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCnByaXZhdGU6CiAg dmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7CiAgdmlydHVh bCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBf TlBfcmVwb0lkKGludCopIGNvbnN0OwogIHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZm ZXJlZFN0cmVhbSYpIGNvbnN0OwogIHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJl ZFN0cmVhbSYpIGNvbnN0Owp9OwoKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90 Y19Gb3J3YXJkUmVxdWVzdDsKIyAxMTAgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9wb2Ff ZGVmcy5oIiAzCmNsYXNzIF9vYmpyZWZfQWRhcHRlckFjdGl2YXRvcjsKdHlwZWRlZiBfb2JqcmVm X0FkYXB0ZXJBY3RpdmF0b3IqIEFkYXB0ZXJBY3RpdmF0b3JfcHRyOwp0eXBlZGVmIEFkYXB0ZXJB Y3RpdmF0b3JfcHRyIEFkYXB0ZXJBY3RpdmF0b3JSZWY7CgpjbGFzcyBBZGFwdGVyQWN0aXZhdG9y X0hlbHBlciB7CnB1YmxpYzoKICB0eXBlZGVmIEFkYXB0ZXJBY3RpdmF0b3JfcHRyIF9wdHJfdHlw ZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlz X25pbChfcHRyX3R5cGUpOwogIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0 aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRT aXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9i alJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0 cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFs T2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFy PF9vYmpyZWZfQWRhcHRlckFjdGl2YXRvciwgQWRhcHRlckFjdGl2YXRvcl9IZWxwZXI+IEFkYXB0 ZXJBY3RpdmF0b3JfdmFyOwp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX0Fk YXB0ZXJBY3RpdmF0b3IsQWRhcHRlckFjdGl2YXRvcl9IZWxwZXIgPiBBZGFwdGVyQWN0aXZhdG9y X291dDsKCgoKCmNsYXNzIEFkYXB0ZXJBY3RpdmF0b3IgewpwdWJsaWM6CgogIHR5cGVkZWYgQWRh cHRlckFjdGl2YXRvcl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgQWRhcHRlckFjdGl2YXRvcl92 YXIgX3Zhcl90eXBlOwoKICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsK ICBzdGF0aWMgX3B0cl90eXBlIF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBf cHRyX3R5cGUgX25pbCgpOwoKICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0 cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRy X3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBf cHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09S QkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBz KTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFz ZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBl IF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmpl Y3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBf cHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsK ICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsK CgoKfTsKCgpjbGFzcyBfb2JqcmVmX0FkYXB0ZXJBY3RpdmF0b3IgOgogIHB1YmxpYyB2aXJ0dWFs IENPUkJBOjpPYmplY3QsIHB1YmxpYyB2aXJ0dWFsIG9tbmlPYmpSZWYKewpwdWJsaWM6CiAgQ09S QkE6OkJvb2xlYW4gdW5rbm93bl9hZGFwdGVyKFBPQV9wdHIgcGFyZW50LCBjb25zdCBjaGFyKiBu YW1lKTsKCiAgaW5saW5lIF9vYmpyZWZfQWRhcHRlckFjdGl2YXRvcigpIHsgX1BSX3NldG9iaigw KTsgfQogIF9vYmpyZWZfQWRhcHRlckFjdGl2YXRvcihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQ cm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7Cgpwcm90ZWN0 ZWQ6CiAgdmlydHVhbCB+X29ianJlZl9BZGFwdGVyQWN0aXZhdG9yKCk7Cgpwcml2YXRlOgogIHZp cnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9BZGFwdGVy QWN0aXZhdG9yKGNvbnN0IF9vYmpyZWZfQWRhcHRlckFjdGl2YXRvciYpOwogIF9vYmpyZWZfQWRh cHRlckFjdGl2YXRvciYgb3BlcmF0b3IgPSAoY29uc3QgX29ianJlZl9BZGFwdGVyQWN0aXZhdG9y Jik7Cgp9OwoKCmNsYXNzIF9wb2ZfQWRhcHRlckFjdGl2YXRvciA6IHB1YmxpYyBwcm94eU9iamVj dEZhY3RvcnkgewpwdWJsaWM6CiAgaW5saW5lIF9wb2ZfQWRhcHRlckFjdGl2YXRvcigpIDogcHJv eHlPYmplY3RGYWN0b3J5KEFkYXB0ZXJBY3RpdmF0b3I6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVh bCB+X3BvZl9BZGFwdGVyQWN0aXZhdG9yKCk7CgogIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2Jq UmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwogIHZp cnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7Cn07CgoKY2xhc3Mg X2ltcGxfQWRhcHRlckFjdGl2YXRvciA6CiAgcHVibGljIHZpcnR1YWwgb21uaVNlcnZhbnQKewpw dWJsaWM6CiAgdmlydHVhbCB+X2ltcGxfQWRhcHRlckFjdGl2YXRvcigpOwoKICB2aXJ0dWFsIENP UkJBOjpCb29sZWFuIHVua25vd25fYWRhcHRlcihQT0FfcHRyIHBhcmVudCwgY29uc3QgY2hhciog bmFtZSkgPSAwOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNo KEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25z dCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKfTsK CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQWRhcHRlckFjdGl2YXRvcjsK IyAyMjggIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9wb2FfZGVmcy5oIiAzCmNsYXNzIF9v YmpyZWZfU2VydmFudE1hbmFnZXI7CnR5cGVkZWYgX29ianJlZl9TZXJ2YW50TWFuYWdlciogU2Vy dmFudE1hbmFnZXJfcHRyOwp0eXBlZGVmIFNlcnZhbnRNYW5hZ2VyX3B0ciBTZXJ2YW50TWFuYWdl clJlZjsKCmNsYXNzIFNlcnZhbnRNYW5hZ2VyX0hlbHBlciB7CnB1YmxpYzoKICB0eXBlZGVmIFNl cnZhbnRNYW5hZ2VyX3B0ciBfcHRyX3R5cGU7CgogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwog IHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19uaWwoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBy ZWxlYXNlKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAg c3RhdGljIHNpemVfdCBOUF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgc3RhdGlj IHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3Rh dGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICBzdGF0 aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICBz dGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwp9OwoK dHlwZWRlZiBfQ09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX1NlcnZhbnRNYW5hZ2VyLCBTZXJ2YW50 TWFuYWdlcl9IZWxwZXI+IFNlcnZhbnRNYW5hZ2VyX3ZhcjsKdHlwZWRlZiBfQ09SQkFfT2JqUmVm X09VVF9hcmc8X29ianJlZl9TZXJ2YW50TWFuYWdlcixTZXJ2YW50TWFuYWdlcl9IZWxwZXIgPiBT ZXJ2YW50TWFuYWdlcl9vdXQ7CgoKCgpjbGFzcyBTZXJ2YW50TWFuYWdlciB7CnB1YmxpYzoKCiAg dHlwZWRlZiBTZXJ2YW50TWFuYWdlcl9wdHIgX3B0cl90eXBlOwogIHR5cGVkZWYgU2VydmFudE1h bmFnZXJfdmFyIF92YXJfdHlwZTsKCiAgc3RhdGljIF9wdHJfdHlwZSBfZHVwbGljYXRlKF9wdHJf dHlwZSk7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICBz dGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKCiAgc3RhdGljIGlubGluZSBzaXplX3QgX2FsaWduZWRT aXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpS ZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBpbmxpbmUgdm9pZCBf bWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogIHN0YXRpYyBp bmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsK ICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3Jl cG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgQ09SQkE6 OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBzdGF0aWMgaW5saW5lIF9w dHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JC QTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMp OwogICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNl KG9iaik7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9y ZXBvSWQ7CgoKCn07CgoKY2xhc3MgX29ianJlZl9TZXJ2YW50TWFuYWdlciA6CiAgcHVibGljIHZp cnR1YWwgQ09SQkE6Ok9iamVjdCwgcHVibGljIHZpcnR1YWwgb21uaU9ialJlZgp7CnB1YmxpYzoK CiAgaW5saW5lIF9vYmpyZWZfU2VydmFudE1hbmFnZXIoKSB7IF9QUl9zZXRvYmooMCk7IH0KICBf b2JqcmVmX1NlcnZhbnRNYW5hZ2VyKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0 Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0 dWFsIH5fb2JqcmVmX1NlcnZhbnRNYW5hZ2VyKCk7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCog X3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgX29ianJlZl9TZXJ2YW50TWFuYWdlcihjb25z dCBfb2JqcmVmX1NlcnZhbnRNYW5hZ2VyJik7CiAgX29ianJlZl9TZXJ2YW50TWFuYWdlciYgb3Bl cmF0b3IgPSAoY29uc3QgX29ianJlZl9TZXJ2YW50TWFuYWdlciYpOwoKfTsKCgpjbGFzcyBfcG9m X1NlcnZhbnRNYW5hZ2VyIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1YmxpYzoKICBp bmxpbmUgX3BvZl9TZXJ2YW50TWFuYWdlcigpIDogcHJveHlPYmplY3RGYWN0b3J5KFNlcnZhbnRN YW5hZ2VyOjpfUERfcmVwb0lkKSB7fQogIHZpcnR1YWwgfl9wb2ZfU2VydmFudE1hbmFnZXIoKTsK CiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2Vk UHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJZGVudGl0 eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNv bnN0IGNoYXIqKSBjb25zdDsKfTsKCgpjbGFzcyBfaW1wbF9TZXJ2YW50TWFuYWdlciA6CiAgcHVi bGljIHZpcnR1YWwgb21uaVNlcnZhbnQKewpwdWJsaWM6CiAgdmlydHVhbCB+X2ltcGxfU2VydmFu dE1hbmFnZXIoKTsKCgpwcm90ZWN0ZWQ6CiAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0 Y2goR0lPUF9TJik7Cgpwcml2YXRlOgogIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNv bnN0IGNoYXIqKTsKICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwp9 OwoKCmV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19TZXJ2YW50TWFuYWdlcjsK IyAzNDQgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9wb2FfZGVmcy5oIiAzCmNsYXNzIF9v YmpyZWZfU2VydmFudEFjdGl2YXRvcjsKdHlwZWRlZiBfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3Iq IFNlcnZhbnRBY3RpdmF0b3JfcHRyOwp0eXBlZGVmIFNlcnZhbnRBY3RpdmF0b3JfcHRyIFNlcnZh bnRBY3RpdmF0b3JSZWY7CgpjbGFzcyBTZXJ2YW50QWN0aXZhdG9yX0hlbHBlciB7CnB1YmxpYzoK ICB0eXBlZGVmIFNlcnZhbnRBY3RpdmF0b3JfcHRyIF9wdHJfdHlwZTsKCiAgc3RhdGljIF9wdHJf dHlwZSBfbmlsKCk7CiAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwog IHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUo X3B0cl90eXBlKTsKICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6 ZV90KTsKICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRT dHJlYW0mKTsKICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0 cmVhbSYpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJl ZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVk U3RyZWFtJik7Cn07Cgp0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfU2VydmFudEFj dGl2YXRvciwgU2VydmFudEFjdGl2YXRvcl9IZWxwZXI+IFNlcnZhbnRBY3RpdmF0b3JfdmFyOwp0 eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3IsU2Vy dmFudEFjdGl2YXRvcl9IZWxwZXIgPiBTZXJ2YW50QWN0aXZhdG9yX291dDsKCgoKCmNsYXNzIFNl cnZhbnRBY3RpdmF0b3IgewpwdWJsaWM6CgogIHR5cGVkZWYgU2VydmFudEFjdGl2YXRvcl9wdHIg X3B0cl90eXBlOwogIHR5cGVkZWYgU2VydmFudEFjdGl2YXRvcl92YXIgX3Zhcl90eXBlOwoKICBz dGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICBzdGF0aWMgX3B0cl90eXBl IF9uYXJyb3coQ09SQkE6Ok9iamVjdF9wdHIpOwogIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoK ICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwog IHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVk U3RyZWFtJik7CiAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwg TWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hh bE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2Jq ID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSBy ZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJu IHJlc3VsdDsKICB9CgogIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYo TWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJB OjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICBfcHRyX3R5cGUgcmVzdWx0ID0g X25hcnJvdyhvYmopOwogICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgIHJldHVybiByZXN1bHQ7 CiAgfQoKICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgoKfTsKCgpjbGFzcyBfb2Jq cmVmX1NlcnZhbnRBY3RpdmF0b3IgOgogIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZfU2VydmFudE1h bmFnZXIKewpwdWJsaWM6CiAgU2VydmFudCBpbmNhcm5hdGUoY29uc3QgT2JqZWN0SWQmIG9pZCwg UE9BX3B0ciBhZGFwdGVyKTsKICB2b2lkIGV0aGVyZWFsaXplKGNvbnN0IE9iamVjdElkJiBvaWQs IFBPQV9wdHIgYWRhcHRlciwgU2VydmFudCBzZXJ2LCBDT1JCQTo6Qm9vbGVhbiBjbGVhbnVwX2lu X3Byb2dyZXNzLCBDT1JCQTo6Qm9vbGVhbiByZW1haW5pbmdfYWN0aXZhdGlvbnMpOwoKICBpbmxp bmUgX29ianJlZl9TZXJ2YW50QWN0aXZhdG9yKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgX29ianJl Zl9TZXJ2YW50QWN0aXZhdG9yKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwg b21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCnByb3RlY3RlZDoKICB2aXJ0dWFs IH5fb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3IoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBf cHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3IoY29u c3QgX29ianJlZl9TZXJ2YW50QWN0aXZhdG9yJik7CiAgX29ianJlZl9TZXJ2YW50QWN0aXZhdG9y JiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX1NlcnZhbnRBY3RpdmF0b3ImKTsKCn07CgoKY2xh c3MgX3BvZl9TZXJ2YW50QWN0aXZhdG9yIDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CnB1 YmxpYzoKICBpbmxpbmUgX3BvZl9TZXJ2YW50QWN0aXZhdG9yKCkgOiBwcm94eU9iamVjdEZhY3Rv cnkoU2VydmFudEFjdGl2YXRvcjo6X1BEX3JlcG9JZCkge30KICB2aXJ0dWFsIH5fcG9mX1NlcnZh bnRBY3RpdmF0b3IoKTsKCiAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hh ciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgdmlydHVhbCBfQ09SQkFf Qm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqKSBjb25zdDsKfTsKCgpjbGFzcyBfaW1wbF9TZXJ2YW50 QWN0aXZhdG9yIDoKICBwdWJsaWMgdmlydHVhbCBfaW1wbF9TZXJ2YW50TWFuYWdlcgp7CnB1Ymxp YzoKICB2aXJ0dWFsIH5faW1wbF9TZXJ2YW50QWN0aXZhdG9yKCk7CgogIHZpcnR1YWwgU2VydmFu dCBpbmNhcm5hdGUoY29uc3QgT2JqZWN0SWQmIG9pZCwgUE9BX3B0ciBhZGFwdGVyKSA9IDA7CiAg dmlydHVhbCB2b2lkIGV0aGVyZWFsaXplKGNvbnN0IE9iamVjdElkJiBvaWQsIFBPQV9wdHIgYWRh cHRlciwgU2VydmFudCBzZXJ2LCBDT1JCQTo6Qm9vbGVhbiBjbGVhbnVwX2luX3Byb2dyZXNzLCBD T1JCQTo6Qm9vbGVhbiByZW1haW5pbmdfYWN0aXZhdGlvbnMpID0gMDsKCnByb3RlY3RlZDoKICB2 aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCnByaXZhdGU6CiAgdmly dHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogIHZpcnR1YWwgY29uc3Qg Y2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7Cn07CgoKZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBl Q29kZV9wdHIgX3RjX1NlcnZhbnRBY3RpdmF0b3I7CiMgNDY0ICIvdXNyL2xvY2FsL2luY2x1ZGUv b21uaU9SQjMvcG9hX2RlZnMuaCIgMwpjbGFzcyBfb2JqcmVmX1NlcnZhbnRMb2NhdG9yOwp0eXBl ZGVmIF9vYmpyZWZfU2VydmFudExvY2F0b3IqIFNlcnZhbnRMb2NhdG9yX3B0cjsKdHlwZWRlZiBT ZXJ2YW50TG9jYXRvcl9wdHIgU2VydmFudExvY2F0b3JSZWY7CgpjbGFzcyBTZXJ2YW50TG9jYXRv cl9IZWxwZXIgewpwdWJsaWM6CiAgdHlwZWRlZiBTZXJ2YW50TG9jYXRvcl9wdHIgX3B0cl90eXBl OwoKICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKICBzdGF0aWMgX0NPUkJBX0Jvb2xlYW4gaXNf bmlsKF9wdHJfdHlwZSk7CiAgc3RhdGljIHZvaWQgcmVsZWFzZShfcHRyX3R5cGUpOwogIHN0YXRp YyB2b2lkIGR1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBzaXplX3QgTlBfYWxpZ25lZFNp emUoX3B0cl90eXBlLCBzaXplX3QpOwogIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90 eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogIHN0YXRpYyBfcHRyX3R5cGUgdW5tYXJzaGFsT2Jq UmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRy X3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxP YmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKTsKfTsKCnR5cGVkZWYgX0NPUkJBX09ialJlZl9WYXI8 X29ianJlZl9TZXJ2YW50TG9jYXRvciwgU2VydmFudExvY2F0b3JfSGVscGVyPiBTZXJ2YW50TG9j YXRvcl92YXI7CnR5cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfU2VydmFudExv Y2F0b3IsU2VydmFudExvY2F0b3JfSGVscGVyID4gU2VydmFudExvY2F0b3Jfb3V0OwoKCgoKY2xh c3MgU2VydmFudExvY2F0b3IgewpwdWJsaWM6CgogIHR5cGVkZWYgU2VydmFudExvY2F0b3JfcHRy IF9wdHJfdHlwZTsKICB0eXBlZGVmIFNlcnZhbnRMb2NhdG9yX3ZhciBfdmFyX3R5cGU7CgogIHN0 YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogIHN0YXRpYyBfcHRyX3R5cGUg X25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7Cgog IHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAg c3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRT dHJlYW0mKTsKICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBN ZW1CdWZmZXJlZFN0cmVhbSYpOwoKICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFs T2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmog PSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgX3B0cl90eXBlIHJl c3VsdCA9IF9uYXJyb3cob2JqKTsKICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICByZXR1cm4g cmVzdWx0OwogIH0KCiAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihN ZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6 OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgIF9wdHJfdHlwZSByZXN1bHQgPSBf bmFycm93KG9iaik7CiAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgcmV0dXJuIHJlc3VsdDsK ICB9CgogIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgogIHN0YXRpYyBjb25zdCBD T1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Db29raWU7CiAgdHlwZWRlZiB2b2lkKiBDb29raWU7Cn07 CgoKY2xhc3MgX29ianJlZl9TZXJ2YW50TG9jYXRvciA6CiAgcHVibGljIHZpcnR1YWwgX29ianJl Zl9TZXJ2YW50TWFuYWdlcgp7CnB1YmxpYzoKICBTZXJ2YW50IHByZWludm9rZShjb25zdCBPYmpl Y3RJZCYgb2lkLCBQT0FfcHRyIGFkYXB0ZXIsIGNvbnN0IGNoYXIqIG9wZXJhdGlvbiwgU2VydmFu dExvY2F0b3I6OkNvb2tpZSYgdGhlX2Nvb2tpZSk7CiAgdm9pZCBwb3N0aW52b2tlKGNvbnN0IE9i amVjdElkJiBvaWQsIFBPQV9wdHIgYWRhcHRlciwgY29uc3QgY2hhciogb3BlcmF0aW9uLCBTZXJ2 YW50TG9jYXRvcjo6Q29va2llIHRoZV9jb29raWUsIFNlcnZhbnQgdGhlX3NlcnZhbnQpOwoKICBp bmxpbmUgX29ianJlZl9TZXJ2YW50TG9jYXRvcigpIHsgX1BSX3NldG9iaigwKTsgfQogIF9vYmpy ZWZfU2VydmFudExvY2F0b3IoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBv bW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwg fl9vYmpyZWZfU2VydmFudExvY2F0b3IoKTsKCnByaXZhdGU6CiAgdmlydHVhbCB2b2lkKiBfcHRy VG9PYmpSZWYoY29uc3QgY2hhciopOwoKICBfb2JqcmVmX1NlcnZhbnRMb2NhdG9yKGNvbnN0IF9v YmpyZWZfU2VydmFudExvY2F0b3ImKTsKICBfb2JqcmVmX1NlcnZhbnRMb2NhdG9yJiBvcGVyYXRv ciA9IChjb25zdCBfb2JqcmVmX1NlcnZhbnRMb2NhdG9yJik7Cgp9OwoKCmNsYXNzIF9wb2ZfU2Vy dmFudExvY2F0b3IgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKcHVibGljOgogIGlubGlu ZSBfcG9mX1NlcnZhbnRMb2NhdG9yKCkgOiBwcm94eU9iamVjdEZhY3RvcnkoU2VydmFudExvY2F0 b3I6Ol9QRF9yZXBvSWQpIHt9CiAgdmlydHVhbCB+X3BvZl9TZXJ2YW50TG9jYXRvcigpOwoKICB2 aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9m aWxlTGlzdCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwg b21uaUxvY2FsSWRlbnRpdHkqKTsKICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3Qg Y2hhciopIGNvbnN0Owp9OwoKCmNsYXNzIF9pbXBsX1NlcnZhbnRMb2NhdG9yIDoKICBwdWJsaWMg dmlydHVhbCBfaW1wbF9TZXJ2YW50TWFuYWdlcgp7CnB1YmxpYzoKICB2aXJ0dWFsIH5faW1wbF9T ZXJ2YW50TG9jYXRvcigpOwoKICB2aXJ0dWFsIFNlcnZhbnQgcHJlaW52b2tlKGNvbnN0IE9iamVj dElkJiBvaWQsIFBPQV9wdHIgYWRhcHRlciwgY29uc3QgY2hhciogb3BlcmF0aW9uLCBTZXJ2YW50 TG9jYXRvcjo6Q29va2llJiB0aGVfY29va2llKSA9IDA7CiAgdmlydHVhbCB2b2lkIHBvc3RpbnZv a2UoY29uc3QgT2JqZWN0SWQmIG9pZCwgUE9BX3B0ciBhZGFwdGVyLCBjb25zdCBjaGFyKiBvcGVy YXRpb24sIFNlcnZhbnRMb2NhdG9yOjpDb29raWUgdGhlX2Nvb2tpZSwgU2VydmFudCB0aGVfc2Vy dmFudCkgPSAwOwoKcHJvdGVjdGVkOgogIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNo KEdJT1BfUyYpOwoKcHJpdmF0ZToKICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25z dCBjaGFyKik7CiAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKfTsK CgpleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfU2VydmFudExvY2F0b3I7CiMg NzU2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcG9hLmgiIDIgMwoKCgoKCgoKfQoKCiMg MSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3BvYV9vcGVyYXRvcnMuaCIgMSAzCiMgNDQg Ii91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9wb2Ffb3BlcmF0b3JzLmgiIDMKaW5saW5lIHNp emVfdApQb3J0YWJsZVNlcnZlcjo6QWRhcHRlckFjdGl2YXRvcjo6X2FsaWduZWRTaXplKFBvcnRh YmxlU2VydmVyOjpBZGFwdGVyQWN0aXZhdG9yX3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICBy ZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0OCwgb2Zmc2V0KTsK fQoKaW5saW5lIHZvaWQKUG9ydGFibGVTZXJ2ZXI6OkFkYXB0ZXJBY3RpdmF0b3I6Ol9tYXJzaGFs T2JqUmVmKFBvcnRhYmxlU2VydmVyOjpBZGFwdGVyQWN0aXZhdG9yX3B0ciBvYmosIE5ldEJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0 OCwgcyk7Cn0KCmlubGluZSB2b2lkClBvcnRhYmxlU2VydmVyOjpBZGFwdGVyQWN0aXZhdG9yOjpf bWFyc2hhbE9ialJlZihQb3J0YWJsZVNlcnZlcjo6QWRhcHRlckFjdGl2YXRvcl9wdHIgb2JqLCBN ZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3Jl cG9JZCwgNDgsIHMpOwp9CgoKaW5saW5lIHNpemVfdApQb3J0YWJsZVNlcnZlcjo6U2VydmFudE1h bmFnZXI6Ol9hbGlnbmVkU2l6ZShQb3J0YWJsZVNlcnZlcjo6U2VydmFudE1hbmFnZXJfcHRyIG9i aiwgc2l6ZV90IG9mZnNldCkgewogIHJldHVybiBDT1JCQTo6QWxpZ25lZE9ialJlZihvYmosIF9Q RF9yZXBvSWQsIDQ2LCBvZmZzZXQpOwp9CgppbmxpbmUgdm9pZApQb3J0YWJsZVNlcnZlcjo6U2Vy dmFudE1hbmFnZXI6Ol9tYXJzaGFsT2JqUmVmKFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFuYWdl cl9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVm KG9iaiwgX1BEX3JlcG9JZCwgNDYsIHMpOwp9CgppbmxpbmUgdm9pZApQb3J0YWJsZVNlcnZlcjo6 U2VydmFudE1hbmFnZXI6Ol9tYXJzaGFsT2JqUmVmKFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TWFu YWdlcl9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2Jq UmVmKG9iaiwgX1BEX3JlcG9JZCwgNDYsIHMpOwp9CgoKaW5saW5lIHNpemVfdApQb3J0YWJsZVNl cnZlcjo6U2VydmFudEFjdGl2YXRvcjo6X2FsaWduZWRTaXplKFBvcnRhYmxlU2VydmVyOjpTZXJ2 YW50QWN0aXZhdG9yX3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFs aWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0OCwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQK UG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRBY3RpdmF0b3I6Ol9tYXJzaGFsT2JqUmVmKFBvcnRhYmxl U2VydmVyOjpTZXJ2YW50QWN0aXZhdG9yX3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7 CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0OCwgcyk7Cn0KCmlubGlu ZSB2b2lkClBvcnRhYmxlU2VydmVyOjpTZXJ2YW50QWN0aXZhdG9yOjpfbWFyc2hhbE9ialJlZihQ b3J0YWJsZVNlcnZlcjo6U2VydmFudEFjdGl2YXRvcl9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVh bSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgNDgsIHMpOwp9 CgoKaW5saW5lIHNpemVfdApQb3J0YWJsZVNlcnZlcjo6U2VydmFudExvY2F0b3I6Ol9hbGlnbmVk U2l6ZShQb3J0YWJsZVNlcnZlcjo6U2VydmFudExvY2F0b3JfcHRyIG9iaiwgc2l6ZV90IG9mZnNl dCkgewogIHJldHVybiBDT1JCQTo6QWxpZ25lZE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDQ2LCBv ZmZzZXQpOwp9CgppbmxpbmUgdm9pZApQb3J0YWJsZVNlcnZlcjo6U2VydmFudExvY2F0b3I6Ol9t YXJzaGFsT2JqUmVmKFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TG9jYXRvcl9wdHIgb2JqLCBOZXRC dWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9J ZCwgNDYsIHMpOwp9CgppbmxpbmUgdm9pZApQb3J0YWJsZVNlcnZlcjo6U2VydmFudExvY2F0b3I6 Ol9tYXJzaGFsT2JqUmVmKFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50TG9jYXRvcl9wdHIgb2JqLCBN ZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3Jl cG9JZCwgNDYsIHMpOwp9CiMgNzY3ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcG9hLmgi IDIgMwojIDEgIi91c3IvbG9jYWwvaW5jbHVkZS9vbW5pT1JCMy9wb2FfcG9hLmgiIDEgMwojIDQ0 ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvcG9hX3BvYS5oIiAzCm5hbWVzcGFjZSBQT0Ff UG9ydGFibGVTZXJ2ZXIKewoKCmNsYXNzIEFkYXB0ZXJBY3RpdmF0b3IgOgogICAgcHVibGljIHZp cnR1YWwgUG9ydGFibGVTZXJ2ZXI6Ol9pbXBsX0FkYXB0ZXJBY3RpdmF0b3IsCiAgICBwdWJsaWMg dmlydHVhbCBQb3J0YWJsZVNlcnZlcjo6U2VydmFudEJhc2UKewpwdWJsaWM6CiAgdmlydHVhbCB+ QWRhcHRlckFjdGl2YXRvcigpOwoKICBpbmxpbmUgUG9ydGFibGVTZXJ2ZXI6OkFkYXB0ZXJBY3Rp dmF0b3JfcHRyIF90aGlzKCkgewogICAgcmV0dXJuIChQb3J0YWJsZVNlcnZlcjo6QWRhcHRlckFj dGl2YXRvcl9wdHIpIF9kb190aGlzKFBvcnRhYmxlU2VydmVyOjpBZGFwdGVyQWN0aXZhdG9yOjpf UERfcmVwb0lkKTsKICB9Cn07CgoKY2xhc3MgU2VydmFudE1hbmFnZXIgOgogICAgcHVibGljIHZp cnR1YWwgUG9ydGFibGVTZXJ2ZXI6Ol9pbXBsX1NlcnZhbnRNYW5hZ2VyLAogICAgcHVibGljIHZp cnR1YWwgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRCYXNlCnsKcHVibGljOgogIHZpcnR1YWwgflNl cnZhbnRNYW5hZ2VyKCk7CgogIGlubGluZSBQb3J0YWJsZVNlcnZlcjo6U2VydmFudE1hbmFnZXJf cHRyIF90aGlzKCkgewogICAgcmV0dXJuIChQb3J0YWJsZVNlcnZlcjo6U2VydmFudE1hbmFnZXJf cHRyKSBfZG9fdGhpcyhQb3J0YWJsZVNlcnZlcjo6U2VydmFudE1hbmFnZXI6Ol9QRF9yZXBvSWQp OwogIH0KfTsKCgpjbGFzcyBTZXJ2YW50QWN0aXZhdG9yIDoKICAgIHB1YmxpYyB2aXJ0dWFsIFBv cnRhYmxlU2VydmVyOjpfaW1wbF9TZXJ2YW50QWN0aXZhdG9yLAogICAgcHVibGljIHZpcnR1YWwg UG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRCYXNlCnsKcHVibGljOgogIHZpcnR1YWwgflNlcnZhbnRB Y3RpdmF0b3IoKTsKCiAgaW5saW5lIFBvcnRhYmxlU2VydmVyOjpTZXJ2YW50QWN0aXZhdG9yX3B0 ciBfdGhpcygpIHsKICAgIHJldHVybiAoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRBY3RpdmF0b3Jf cHRyKSBfZG9fdGhpcyhQb3J0YWJsZVNlcnZlcjo6U2VydmFudEFjdGl2YXRvcjo6X1BEX3JlcG9J ZCk7CiAgfQp9OwoKCmNsYXNzIFNlcnZhbnRMb2NhdG9yIDoKICAgIHB1YmxpYyB2aXJ0dWFsIFBv cnRhYmxlU2VydmVyOjpfaW1wbF9TZXJ2YW50TG9jYXRvciwKICAgIHB1YmxpYyB2aXJ0dWFsIFBv cnRhYmxlU2VydmVyOjpTZXJ2YW50QmFzZQp7CnB1YmxpYzoKICB2aXJ0dWFsIH5TZXJ2YW50TG9j YXRvcigpOwoKICBpbmxpbmUgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRMb2NhdG9yX3B0ciBfdGhp cygpIHsKICAgIHJldHVybiAoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRMb2NhdG9yX3B0cikgX2Rv X3RoaXMoUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRMb2NhdG9yOjpfUERfcmVwb0lkKTsKICB9Cn07 CgoKfQojIDc2OCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL3BvYS5oIiAyIDMKIyAyNjI0 ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMiAzCgoKCmV4dGVybiBDT1JC QTo6Qm9vbGVhbgpfb21uaV9jYWxsVHJhbnNpZW50RXhjZXB0aW9uSGFuZGxlcihvbW5pT2JqUmVm KiBvYmosIENPUkJBOjpVTG9uZyByZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBDT1JCQTo6VFJBTlNJRU5UJiBleCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVh bgpfb21uaV9jYWxsQ29tbUZhaWx1cmVFeGNlcHRpb25IYW5kbGVyKG9tbmlPYmpSZWYqIG9iaiwg Q09SQkE6OlVMb25nIHJldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgQ09SQkE6OkNPTU1fRkFJTFVSRSYgZXgpOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4K X29tbmlfY2FsbFN5c3RlbUV4Y2VwdGlvbkhhbmRsZXIob21uaU9ialJlZiogb2JqLCBDT1JCQTo6 VUxvbmcgcmV0cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09S QkE6OlN5c3RlbUV4Y2VwdGlvbiYgZXgpOwoKCmV4dGVybiB2b2lkIF9vbW5pX3NldF9OYW1lU2Vy dmljZShDT1JCQTo6T2JqZWN0X3B0cik7CgoKIyAxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9S QjMvY29yYmFpZGxfb3BlcmF0b3JzLmhoIiAxIDMKCgoKCmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9 KENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6U3RydWN0TWVtYmVyJiBfcyk7CmV4dGVybiB2 b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6U3RydWN0TWVtYmVyKiBfc3Ap OwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2Es IENPUkJBOjpTdHJ1Y3RNZW1iZXIqJiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0 b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpTdHJ1Y3RNZW1iZXIqJiBf c3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09S QkE6OlN0cnVjdE1lbWJlclNlcSYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENPUkJB OjpBbnkmIF9hLCBDT1JCQTo6U3RydWN0TWVtYmVyU2VxKiBfc3ApIHsKICBfYSA8PD0gKl9zcDsK ICBkZWxldGUgX3NwOwp9CmV4dGVybiBfQ09SQkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0 IENPUkJBOjpBbnkmIF9hLCBDT1JCQTo6U3RydWN0TWVtYmVyU2VxKiYgX3NwKTsKZXh0ZXJuIF9D T1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENP UkJBOjpTdHJ1Y3RNZW1iZXJTZXEqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09S QkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpVbmlvbk1lbWJlciYgX3MpOwpleHRlcm4gdm9pZCBv cGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ09SQkE6OlVuaW9uTWVtYmVyKiBfc3ApOwpleHRl cm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJB OjpVbmlvbk1lbWJlciomIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShj b25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgQ09SQkE6OlVuaW9uTWVtYmVyKiYgX3NwKTsKCmV4 dGVybiB2b2lkIG9wZXJhdG9yIDw8PSAoQ09SQkE6OkFueSYgX2EsIGNvbnN0IENPUkJBOjpVbmlv bk1lbWJlclNlcSYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9h LCBDT1JCQTo6VW5pb25NZW1iZXJTZXEqIF9zcCkgewogIF9hIDw8PSAqX3NwOwogIGRlbGV0ZSBf c3A7Cn0KZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFu eSYgX2EsIENPUkJBOjpVbmlvbk1lbWJlclNlcSomIF9zcCk7CmV4dGVybiBfQ09SQkFfQm9vbGVh biBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDT1JCQTo6VW5pb25N ZW1iZXJTZXEqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBf YSwgY29uc3QgQ09SQkE6OkVudW1NZW1iZXJTZXEmIF9zKTsKaW5saW5lIHZvaWQgb3BlcmF0b3Ig PDw9IChDT1JCQTo6QW55JiBfYSwgQ09SQkE6OkVudW1NZW1iZXJTZXEqIF9zcCkgewogIF9hIDw8 PSAqX3NwOwogIGRlbGV0ZSBfc3A7Cn0KZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+ PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIENPUkJBOjpFbnVtTWVtYmVyU2VxKiYgX3NwKTsKZXh0 ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIGNv bnN0IENPUkJBOjpFbnVtTWVtYmVyU2VxKiYgX3NwKTsKIyAyNjQyICIvdXNyL2xvY2FsL2luY2x1 ZGUvb21uaU9SQjMvQ09SQkEuaCIgMiAzCgoKCgoKCm5hbWVzcGFjZSBQT0FfQ09SQkEKewoKIyAx ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvY29yYmFpZGxfcG9hLmhoIiAxIDMKIyAyNjUy ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMiAzCgoKCgp9CgoKIyAxICIv dXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvYm9hLmgiIDEgMwojIDUyICIvdXNyL2xvY2FsL2lu Y2x1ZGUvb21uaU9SQjMvYm9hLmgiIDMKY2xhc3Mgb21uaU9yYkJvYVNlcnZhbnQgOiBwdWJsaWMg dmlydHVhbCBvbW5pU2VydmFudCB7CnB1YmxpYzoKICB2aXJ0dWFsIH5vbW5pT3JiQm9hU2VydmFu dCgpOwoKICBvbW5pT3JiQm9hU2VydmFudCgpOwogIGlubGluZSBvbW5pT3JiQm9hU2VydmFudChj b25zdCBvbW5pT3JiQm9hS2V5JiBrKQogICAgOiBwZF9rZXkoaykge30KCiAgdm9pZCBfZGlzcG9z ZSgpOwoKCgoKCgogIHZvaWQgX29ial9pc19yZWFkeSgpOwoKCiAgdm9pZCogX3RoaXMoY29uc3Qg Y2hhciogcmVwb0lkKTsKCgoKICBpbmxpbmUgY29uc3Qgb21uaU9yYkJvYUtleSYgX2tleSgpIGNv bnN0IHsgcmV0dXJuIHBkX2tleTsgfQogIGlubGluZSB2b2lkIF9vYmpfaXNfcmVhZHkoQ09SQkE6 OkJPQV9wdHIpIHsgX29ial9pc19yZWFkeSgpOyB9CiAgaW5saW5lIENPUkJBOjpCT0FfcHRyIF9i b2EoKSB7IHJldHVybiBDT1JCQTo6Qk9BOjpnZXRCT0EoKTsgfQoKcHJpdmF0ZToKICB2aXJ0dWFs IG9tbmlPYmpSZWYqIF9kb19nZXRfaW50ZXJmYWNlKCk7CgoKcHJvdGVjdGVkOgogIG9tbmlPcmJC b2FLZXkgcGRfa2V5OwoKCgoKfTsKIyAyNjYwICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMv Q09SQkEuaCIgMiAzCiMgMjY3NSAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL0NPUkJBLmgi IDMKIyAxICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvTmFtaW5nLmhoIiAxIDMKIyA0OSAi L3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL05hbWluZy5oaCIgMwpuYW1lc3BhY2UgQ29zTmFt aW5nCgp7CgogIGV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Jc3RyaW5nOwoK ICB0eXBlZGVmIGNoYXIqIElzdHJpbmc7CiAgdHlwZWRlZiBDT1JCQTo6U3RyaW5nX3ZhciBJc3Ry aW5nX3ZhcjsKCiAgc3RydWN0IE5hbWVDb21wb25lbnQgewogICAgdHlwZWRlZiBfQ09SQkFfQ29u c3RyVHlwZV9WYXJpYWJsZV9WYXI8TmFtZUNvbXBvbmVudD4gX3Zhcl90eXBlOwoKICAgIENPUkJB OjpTdHJpbmdfbWVtYmVyIGlkOwoKICAgIENPUkJBOjpTdHJpbmdfbWVtYmVyIGtpbmQ7CgogICAg c2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgICB2 b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICAgIHZvaWQgb3Bl cmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogICAgdm9pZCBvcGVyYXRvcj4+PSAoTWVt QnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJl ZFN0cmVhbSAmKTsKICB9OwoKICB0eXBlZGVmIE5hbWVDb21wb25lbnQ6Ol92YXJfdHlwZSBOYW1l Q29tcG9uZW50X3ZhcjsKCiAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9PVVRf YXJnPCBOYW1lQ29tcG9uZW50LE5hbWVDb21wb25lbnRfdmFyID4gTmFtZUNvbXBvbmVudF9vdXQ7 CgogIGV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19OYW1lQ29tcG9uZW50OwoK ICBleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfTmFtZTsKCiAgY2xhc3MgTmFt ZV92YXI7CgogIGNsYXNzIE5hbWUgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwg TmFtZUNvbXBvbmVudD4gewogIHB1YmxpYzoKICAgIHR5cGVkZWYgTmFtZV92YXIgX3Zhcl90eXBl OwogICAgaW5saW5lIE5hbWUoKSB7fQogICAgaW5saW5lIE5hbWUoY29uc3QgTmFtZSYgcykKICAg ICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBOYW1lQ29tcG9uZW50PiAocykge30KCiAg ICBpbmxpbmUgTmFtZShfQ09SQkFfVUxvbmcgX21heCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlPCBOYW1lQ29tcG9uZW50PiAoX21heCkge30KICAgIGlubGluZSBOYW1lKF9DT1JC QV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgTmFtZUNvbXBvbmVudCogX3ZhbCwgX0NP UkJBX0Jvb2xlYW4gX3JlbD0wKQogICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IE5h bWVDb21wb25lbnQ+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICAgIGlubGluZSBOYW1l JiBvcGVyYXRvciA9IChjb25zdCBOYW1lJiBzKSB7CiAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2U8IE5hbWVDb21wb25lbnQ+IDo6b3BlcmF0b3I9KHMpOwogICAgICByZXR1cm4gKnRoaXM7 CiAgICB9CiAgfTsKCiAgY2xhc3MgTmFtZV9vdXQ7CgogIGNsYXNzIE5hbWVfdmFyIHsKICBwdWJs aWM6CiAgICB0eXBlZGVmIE5hbWUgVDsKICAgIHR5cGVkZWYgTmFtZV92YXIgVF92YXI7CgogICAg aW5saW5lIE5hbWVfdmFyKCkgOiBfcGRfc2VxKDApIHt9CiAgICBpbmxpbmUgTmFtZV92YXIoVCog cykgOiBfcGRfc2VxKHMpIHt9CiAgICBpbmxpbmUgTmFtZV92YXIoY29uc3QgVF92YXImIHMpIHsK ICAgICAgaWYoIHMuX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRfc2VxKTsKICAgICAg ZWxzZSBfcGRfc2VxID0gMDsKICAgIH0KICAgIGlubGluZSB+TmFtZV92YXIoKSB7IGlmKCBfcGRf c2VxICkgZGVsZXRlIF9wZF9zZXE7IH0KCiAgICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQq IHMpIHsKICAgICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgICAgX3BkX3NlcSA9 IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGlubGluZSBUX3ZhciYgb3BlcmF0b3Ig PSAoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYoIHMuX3BkX3NlcSApIHsKICAgICAgICBpZigg IV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICAgKl9wZF9zZXEgPSAqcy5fcGRfc2Vx OwogICAgICB9IGVsc2UgaWYoIF9wZF9zZXEgKSB7CiAgICAgICAgZGVsZXRlIF9wZF9zZXE7CiAg ICAgICAgX3BkX3NlcSA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAg IGlubGluZSBOYW1lQ29tcG9uZW50JiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIHMpIHsKICAg ICAgcmV0dXJuICgqX3BkX3NlcSlbc107CiAgICB9CgogICAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ ICgpIHsgcmV0dXJuIF9wZF9zZXE7IH0KCgoKICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAo KSBjb25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQogICAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsg cmV0dXJuICpfcGRfc2VxOyB9CgoKICAgIGlubGluZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0 dXJuICpfcGRfc2VxOyB9CiAgICBpbmxpbmUgVCYgaW5vdXQoKSB7IHJldHVybiAqX3BkX3NlcTsg fQogICAgaW5saW5lIFQqJiBvdXQoKSB7CiAgICAgIGlmKCBfcGRfc2VxICkgeyBkZWxldGUgX3Bk X3NlcTsgX3BkX3NlcSA9IDA7IH0KICAgICAgcmV0dXJuIF9wZF9zZXE7CiAgICB9CiAgICBpbmxp bmUgVCogX3JldG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1w OyB9CgogICAgZnJpZW5kIGNsYXNzIE5hbWVfb3V0OwoKICBwcml2YXRlOgogICAgVCogX3BkX3Nl cTsKICB9OwoKICBjbGFzcyBOYW1lX291dCB7CiAgcHVibGljOgogICAgdHlwZWRlZiBOYW1lIFQ7 CiAgICB0eXBlZGVmIE5hbWVfdmFyIFRfdmFyOwoKICAgIGlubGluZSBOYW1lX291dChUKiYgcykg OiBfZGF0YShzKSB7IF9kYXRhID0gMDsgfQogICAgaW5saW5lIE5hbWVfb3V0KFRfdmFyJiBzKQog ICAgICA6IF9kYXRhKHMuX3BkX3NlcSkgeyBzID0gKFQqKSAwOyB9CiAgICBpbmxpbmUgTmFtZV9v dXQoY29uc3QgTmFtZV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICAgIGlubGluZSBOYW1l X291dCYgb3BlcmF0b3IgPSAoY29uc3QgTmFtZV9vdXQmIHMpIHsKICAgICAgX2RhdGEgPSBzLl9k YXRhOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9IGlubGluZSBOYW1lX291dCYgb3BlcmF0b3Ig PSAoVCogcykgewogICAgICBfZGF0YSA9IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAg IGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogICAgaW5saW5lIFQqJiBw dHIoKSB7IHJldHVybiBfZGF0YTsgfQogICAgaW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVy biBfZGF0YTsgfQoKICAgIGlubGluZSBOYW1lQ29tcG9uZW50JiBvcGVyYXRvciBbXSAoX0NPUkJB X1VMb25nIGkpIHsKICAgICAgcmV0dXJuICgqX2RhdGEpW2ldOwogICAgfQoKICAgIFQqJiBfZGF0 YTsKCiAgcHJpdmF0ZToKICAgIE5hbWVfb3V0KCk7CiAgICBOYW1lX291dCYgb3BlcmF0b3I9KGNv bnN0IFRfdmFyJik7CiAgfTsKCiAgZW51bSBCaW5kaW5nVHlwZSB7IG5vYmplY3QsIG5jb250ZXh0 IH07CiAgdHlwZWRlZiBCaW5kaW5nVHlwZSYgQmluZGluZ1R5cGVfb3V0OwoKICBleHRlcm4gY29u c3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfQmluZGluZ1R5cGU7CgogIHN0cnVjdCBCaW5kaW5n IHsKICAgIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfVmFyaWFibGVfVmFyPEJpbmRpbmc+IF92 YXJfdHlwZTsKCiAgICBOYW1lIGJpbmRpbmdfbmFtZTsKCiAgICBCaW5kaW5nVHlwZSBiaW5kaW5n X3R5cGU7CgogICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkg Y29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsK ICAgIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogICAgdm9pZCBvcGVy YXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9 IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsKICB9OwoKICB0eXBlZGVmIEJpbmRpbmc6Ol92YXJfdHlw ZSBCaW5kaW5nX3ZhcjsKCiAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9PVVRf YXJnPCBCaW5kaW5nLEJpbmRpbmdfdmFyID4gQmluZGluZ19vdXQ7CgogIGV4dGVybiBjb25zdCBD T1JCQTo6VHlwZUNvZGVfcHRyIF90Y19CaW5kaW5nOwoKICBleHRlcm4gY29uc3QgQ09SQkE6OlR5 cGVDb2RlX3B0ciBfdGNfQmluZGluZ0xpc3Q7CgogIGNsYXNzIEJpbmRpbmdMaXN0X3ZhcjsKCiAg Y2xhc3MgQmluZGluZ0xpc3QgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgQmlu ZGluZz4gewogIHB1YmxpYzoKICAgIHR5cGVkZWYgQmluZGluZ0xpc3RfdmFyIF92YXJfdHlwZTsK ICAgIGlubGluZSBCaW5kaW5nTGlzdCgpIHt9CiAgICBpbmxpbmUgQmluZGluZ0xpc3QoY29uc3Qg QmluZGluZ0xpc3QmIHMpCiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgQmluZGlu Zz4gKHMpIHt9CgogICAgaW5saW5lIEJpbmRpbmdMaXN0KF9DT1JCQV9VTG9uZyBfbWF4KQogICAg ICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IEJpbmRpbmc+IChfbWF4KSB7fQogICAgaW5s aW5lIEJpbmRpbmdMaXN0KF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgQmlu ZGluZyogX3ZhbCwgX0NPUkJBX0Jvb2xlYW4gX3JlbD0wKQogICAgICA6IF9DT1JCQV9VbmJvdW5k ZWRfU2VxdWVuY2U8IEJpbmRpbmc+IChfbWF4LCBfbGVuLCBfdmFsLCBfcmVsKSB7fQoKICAgIGlu bGluZSBCaW5kaW5nTGlzdCYgb3BlcmF0b3IgPSAoY29uc3QgQmluZGluZ0xpc3QmIHMpIHsKICAg ICAgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgQmluZGluZz4gOjpvcGVyYXRvcj0ocyk7CiAg ICAgIHJldHVybiAqdGhpczsKICAgIH0KICB9OwoKICBjbGFzcyBCaW5kaW5nTGlzdF9vdXQ7Cgog IGNsYXNzIEJpbmRpbmdMaXN0X3ZhciB7CiAgcHVibGljOgogICAgdHlwZWRlZiBCaW5kaW5nTGlz dCBUOwogICAgdHlwZWRlZiBCaW5kaW5nTGlzdF92YXIgVF92YXI7CgogICAgaW5saW5lIEJpbmRp bmdMaXN0X3ZhcigpIDogX3BkX3NlcSgwKSB7fQogICAgaW5saW5lIEJpbmRpbmdMaXN0X3ZhcihU KiBzKSA6IF9wZF9zZXEocykge30KICAgIGlubGluZSBCaW5kaW5nTGlzdF92YXIoY29uc3QgVF92 YXImIHMpIHsKICAgICAgaWYoIHMuX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRfc2Vx KTsKICAgICAgZWxzZSBfcGRfc2VxID0gMDsKICAgIH0KICAgIGlubGluZSB+QmluZGluZ0xpc3Rf dmFyKCkgeyBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOyB9CgogICAgaW5saW5lIFRfdmFy JiBvcGVyYXRvciA9IChUKiBzKSB7CiAgICAgIGlmKCBfcGRfc2VxICkgZGVsZXRlIF9wZF9zZXE7 CiAgICAgIF9wZF9zZXEgPSBzOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBpbmxpbmUg VF92YXImIG9wZXJhdG9yID0gKGNvbnN0IFRfdmFyJiBzKSB7CiAgICAgIGlmKCBzLl9wZF9zZXEg KSB7CiAgICAgICAgaWYoICFfcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUOwogICAgICAgICpfcGRf c2VxID0gKnMuX3BkX3NlcTsKICAgICAgfSBlbHNlIGlmKCBfcGRfc2VxICkgewogICAgICAgIGRl bGV0ZSBfcGRfc2VxOwogICAgICAgIF9wZF9zZXEgPSAwOwogICAgICB9CiAgICAgIHJldHVybiAq dGhpczsKICAgIH0KCiAgICBpbmxpbmUgQmluZGluZyYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9u ZyBzKSB7CiAgICAgIHJldHVybiAoKl9wZF9zZXEpW3NdOwogICAgfQoKICAgIGlubGluZSBUKiBv cGVyYXRvciAtPiAoKSB7IHJldHVybiBfcGRfc2VxOyB9CgoKCiAgICBpbmxpbmUgb3BlcmF0b3Ig Y29uc3QgVCYgKCkgY29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICAgIGlubGluZSBvcGVyYXRv ciBUJiAoKSB7IHJldHVybiAqX3BkX3NlcTsgfQoKCiAgICBpbmxpbmUgY29uc3QgVCYgaW4oKSBj b25zdCB7IHJldHVybiAqX3BkX3NlcTsgfQogICAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4g Kl9wZF9zZXE7IH0KICAgIGlubGluZSBUKiYgb3V0KCkgewogICAgICBpZiggX3BkX3NlcSApIHsg ZGVsZXRlIF9wZF9zZXE7IF9wZF9zZXEgPSAwOyB9CiAgICAgIHJldHVybiBfcGRfc2VxOwogICAg fQogICAgaW5saW5lIFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRfc2VxID0gMDsg cmV0dXJuIHRtcDsgfQoKICAgIGZyaWVuZCBjbGFzcyBCaW5kaW5nTGlzdF9vdXQ7CgogIHByaXZh dGU6CiAgICBUKiBfcGRfc2VxOwogIH07CgogIGNsYXNzIEJpbmRpbmdMaXN0X291dCB7CiAgcHVi bGljOgogICAgdHlwZWRlZiBCaW5kaW5nTGlzdCBUOwogICAgdHlwZWRlZiBCaW5kaW5nTGlzdF92 YXIgVF92YXI7CgogICAgaW5saW5lIEJpbmRpbmdMaXN0X291dChUKiYgcykgOiBfZGF0YShzKSB7 IF9kYXRhID0gMDsgfQogICAgaW5saW5lIEJpbmRpbmdMaXN0X291dChUX3ZhciYgcykKICAgICAg OiBfZGF0YShzLl9wZF9zZXEpIHsgcyA9IChUKikgMDsgfQogICAgaW5saW5lIEJpbmRpbmdMaXN0 X291dChjb25zdCBCaW5kaW5nTGlzdF9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICAgIGlu bGluZSBCaW5kaW5nTGlzdF9vdXQmIG9wZXJhdG9yID0gKGNvbnN0IEJpbmRpbmdMaXN0X291dCYg cykgewogICAgICBfZGF0YSA9IHMuX2RhdGE7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0gaW5s aW5lIEJpbmRpbmdMaXN0X291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgICBfZGF0YSA9IHM7 CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJl dHVybiBfZGF0YTsgfQogICAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogICAg aW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICAgIGlubGluZSBCaW5k aW5nJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIGkpIHsKICAgICAgcmV0dXJuICgqX2RhdGEp W2ldOwogICAgfQoKICAgIFQqJiBfZGF0YTsKCiAgcHJpdmF0ZToKICAgIEJpbmRpbmdMaXN0X291 dCgpOwogICAgQmluZGluZ0xpc3Rfb3V0JiBvcGVyYXRvcj0oY29uc3QgVF92YXImKTsKICB9OwoK CgoKICBjbGFzcyBCaW5kaW5nSXRlcmF0b3I7CiAgY2xhc3MgX29ianJlZl9CaW5kaW5nSXRlcmF0 b3I7CiAgY2xhc3MgX2ltcGxfQmluZGluZ0l0ZXJhdG9yOwoKICB0eXBlZGVmIF9vYmpyZWZfQmlu ZGluZ0l0ZXJhdG9yKiBCaW5kaW5nSXRlcmF0b3JfcHRyOwogIHR5cGVkZWYgQmluZGluZ0l0ZXJh dG9yX3B0ciBCaW5kaW5nSXRlcmF0b3JSZWY7CgogIGNsYXNzIEJpbmRpbmdJdGVyYXRvcl9IZWxw ZXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgQmluZGluZ0l0ZXJhdG9yX3B0ciBfcHRyX3R5cGU7 CgogICAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgICBzdGF0aWMgX0NPUkJBX0Jvb2xlYW4g aXNfbmlsKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgdm9pZCByZWxlYXNlKF9wdHJfdHlwZSk7CiAg ICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICAgIHN0YXRpYyBzaXplX3QgTlBf YWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogICAgc3RhdGljIHZvaWQgbWFyc2hhbE9i alJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgICBzdGF0aWMgX3B0cl90eXBl IHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIHZvaWQgbWFy c2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgICBzdGF0aWMgX3B0 cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYpOwogIH07CgogIHR5cGVk ZWYgX0NPUkJBX09ialJlZl9WYXI8X29ianJlZl9CaW5kaW5nSXRlcmF0b3IsIEJpbmRpbmdJdGVy YXRvcl9IZWxwZXI+IEJpbmRpbmdJdGVyYXRvcl92YXI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVm X09VVF9hcmc8X29ianJlZl9CaW5kaW5nSXRlcmF0b3IsQmluZGluZ0l0ZXJhdG9yX0hlbHBlciA+ IEJpbmRpbmdJdGVyYXRvcl9vdXQ7CgoKCgoKCiAgY2xhc3MgTmFtaW5nQ29udGV4dDsKICBjbGFz cyBfb2JqcmVmX05hbWluZ0NvbnRleHQ7CiAgY2xhc3MgX2ltcGxfTmFtaW5nQ29udGV4dDsKCiAg dHlwZWRlZiBfb2JqcmVmX05hbWluZ0NvbnRleHQqIE5hbWluZ0NvbnRleHRfcHRyOwogIHR5cGVk ZWYgTmFtaW5nQ29udGV4dF9wdHIgTmFtaW5nQ29udGV4dFJlZjsKCiAgY2xhc3MgTmFtaW5nQ29u dGV4dF9IZWxwZXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgTmFtaW5nQ29udGV4dF9wdHIgX3B0 cl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogICAgc3RhdGljIF9DT1JCQV9C b29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQgcmVsZWFzZShfcHRyX3R5 cGUpOwogICAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgc2l6 ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICAgIHN0YXRpYyB2b2lkIG1h cnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIF9w dHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyB2 b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogICAgc3Rh dGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKTsKICB9OwoK ICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfTmFtaW5nQ29udGV4dCwgTmFtaW5n Q29udGV4dF9IZWxwZXI+IE5hbWluZ0NvbnRleHRfdmFyOwogIHR5cGVkZWYgX0NPUkJBX09ialJl Zl9PVVRfYXJnPF9vYmpyZWZfTmFtaW5nQ29udGV4dCxOYW1pbmdDb250ZXh0X0hlbHBlciA+IE5h bWluZ0NvbnRleHRfb3V0OwoKCgogIGNsYXNzIE5hbWluZ0NvbnRleHQgewogIHB1YmxpYzoKCiAg ICB0eXBlZGVmIE5hbWluZ0NvbnRleHRfcHRyIF9wdHJfdHlwZTsKICAgIHR5cGVkZWYgTmFtaW5n Q29udGV4dF92YXIgX3Zhcl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShf cHRyX3R5cGUpOwogICAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRy KTsKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICAgIHN0YXRpYyBpbmxpbmUgc2l6ZV90 IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMgaW5saW5lIHZvaWQg X21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGlj IGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0m KTsKCiAgICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZl cmVkU3RyZWFtJiBzKSB7CiAgICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1h cnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFy cm93KG9iaik7CiAgICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICAgIHJldHVybiByZXN1bHQ7 CiAgICB9CgogICAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1C dWZmZXJlZFN0cmVhbSYgcykgewogICAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6 VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgICBfcHRyX3R5cGUgcmVzdWx0ID0g X25hcnJvdyhvYmopOwogICAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgICByZXR1cm4gcmVz dWx0OwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCiAgICBlbnVt IE5vdEZvdW5kUmVhc29uIHsgbWlzc2luZ19ub2RlLCBub3RfY29udGV4dCwgbm90X29iamVjdCB9 OwogICAgdHlwZWRlZiBOb3RGb3VuZFJlYXNvbiYgTm90Rm91bmRSZWFzb25fb3V0OwoKICAgIHN0 YXRpYyBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Ob3RGb3VuZFJlYXNvbjsKCiAgICBj bGFzcyBOb3RGb3VuZCA6IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7CiAgICBwdWJsaWM6 CgogICAgICBOb3RGb3VuZFJlYXNvbiB3aHk7CgogICAgICBOYW1lIHJlc3Rfb2ZfbmFtZTsKCiAg ICAgIGlubGluZSBOb3RGb3VuZCgpIHsKICAgICAgICBwZF9pbnNlcnRUb0FueUZuID0gaW5zZXJ0 VG9BbnlGbjsKICAgICAgICBwZF9pbnNlcnRUb0FueUZuTkNQID0gaW5zZXJ0VG9BbnlGbk5DUDsK ICAgICAgfQogICAgICBOb3RGb3VuZChjb25zdCBOb3RGb3VuZCYpOwogICAgICBOb3RGb3VuZChO b3RGb3VuZFJlYXNvbiBpX3doeSwgY29uc3QgTmFtZSBpX3Jlc3Rfb2ZfbmFtZSk7CiAgICAgIE5v dEZvdW5kJiBvcGVyYXRvcj0oY29uc3QgTm90Rm91bmQmKTsKICAgICAgdmlydHVhbCB+Tm90Rm91 bmQoKTsKICAgICAgdmlydHVhbCB2b2lkIF9yYWlzZSgpOwogICAgICBzdGF0aWMgTm90Rm91bmQq IF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7CiAgICAgIHN0YXRpYyBjb25zdCBOb3RGb3Vu ZCogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsKICAgICAgc3RhdGljIGlubGlu ZSBOb3RGb3VuZCogX25hcnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZSkgewogICAgICAgIHJldHVy biBfZG93bmNhc3QoX2UpOwogICAgICB9CgogICAgICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNp emVfdCkgY29uc3Q7CgogICAgICB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikg Y29uc3QgOwogICAgICB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Qg OwogICAgICB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3RyZWFtJikgOwogICAgICB2b2lk IG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFtJikgOwoKICAgICAgc3RhdGljIGluc2VydEV4 Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47CiAgICAgIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25U b0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOwoKICAgICAgdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9u KiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7CgogICAgICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3Jl cG9JZDsKCiAgICBwcml2YXRlOgogICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQo KSBjb25zdDsKICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCopIGNvbnN0 OwogICAgICB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25z dDsKICAgICAgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29u c3Q7CiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Ob3RG b3VuZDsKCiAgICBjbGFzcyBDYW5ub3RQcm9jZWVkIDogcHVibGljIENPUkJBOjpVc2VyRXhjZXB0 aW9uIHsKICAgIHB1YmxpYzoKCiAgICAgIF9DT1JCQV9PYmpSZWZfTWVtYmVyPCBfb2JqcmVmX05h bWluZ0NvbnRleHQsIE5hbWluZ0NvbnRleHRfSGVscGVyPiBjeHQ7CgogICAgICBOYW1lIHJlc3Rf b2ZfbmFtZTsKCiAgICAgIGlubGluZSBDYW5ub3RQcm9jZWVkKCkgewogICAgICAgIHBkX2luc2Vy dFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOwogICAgICAgIHBkX2luc2VydFRvQW55Rm5OQ1AgPSBp bnNlcnRUb0FueUZuTkNQOwogICAgICB9CiAgICAgIENhbm5vdFByb2NlZWQoY29uc3QgQ2Fubm90 UHJvY2VlZCYpOwogICAgICBDYW5ub3RQcm9jZWVkKE5hbWluZ0NvbnRleHRfcHRyIGlfY3h0LCBj b25zdCBOYW1lIGlfcmVzdF9vZl9uYW1lKTsKICAgICAgQ2Fubm90UHJvY2VlZCYgb3BlcmF0b3I9 KGNvbnN0IENhbm5vdFByb2NlZWQmKTsKICAgICAgdmlydHVhbCB+Q2Fubm90UHJvY2VlZCgpOwog ICAgICB2aXJ0dWFsIHZvaWQgX3JhaXNlKCk7CiAgICAgIHN0YXRpYyBDYW5ub3RQcm9jZWVkKiBf ZG93bmNhc3QoQ09SQkE6OkV4Y2VwdGlvbiopOwogICAgICBzdGF0aWMgY29uc3QgQ2Fubm90UHJv Y2VlZCogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsKICAgICAgc3RhdGljIGlu bGluZSBDYW5ub3RQcm9jZWVkKiBfbmFycm93KENPUkJBOjpFeGNlcHRpb24qIF9lKSB7CiAgICAg ICAgcmV0dXJuIF9kb3duY2FzdChfZSk7CiAgICAgIH0KCiAgICAgIHNpemVfdCBfTlBfYWxpZ25l ZFNpemUoc2l6ZV90KSBjb25zdDsKCiAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVmZmVyZWRT dHJlYW0mKSBjb25zdCA7CiAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oTWVtQnVmZmVyZWRTdHJlYW0m KSBjb25zdCA7CiAgICAgIHZvaWQgb3BlcmF0b3I8PD0oTmV0QnVmZmVyZWRTdHJlYW0mKSA7CiAg ICAgIHZvaWQgb3BlcmF0b3I8PD0oTWVtQnVmZmVyZWRTdHJlYW0mKSA7CgogICAgICBzdGF0aWMg aW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsKICAgICAgc3RhdGljIGluc2VydEV4 Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7CgogICAgICB2aXJ0dWFsIENPUkJBOjpF eGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsKCiAgICAgIHN0YXRpYyBjb25zdCBjaGFy KiBfUERfcmVwb0lkOwoKICAgIHByaXZhdGU6CiAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogX05Q X3R5cGVJZCgpIGNvbnN0OwogICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF9yZXBvSWQoaW50 KikgY29uc3Q7CiAgICAgIHZpcnR1YWwgdm9pZCBfTlBfbWFyc2hhbChOZXRCdWZmZXJlZFN0cmVh bSYpIGNvbnN0OwogICAgICB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTWVtQnVmZmVyZWRTdHJl YW0mKSBjb25zdDsKICAgIH07CgogICAgc3RhdGljIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIg X3RjX0Nhbm5vdFByb2NlZWQ7CgogICAgY2xhc3MgSW52YWxpZE5hbWUgOiBwdWJsaWMgQ09SQkE6 OlVzZXJFeGNlcHRpb24gewogICAgcHVibGljOgoKICAgICAgaW5saW5lIEludmFsaWROYW1lKCkg ewogICAgICAgIHBkX2luc2VydFRvQW55Rm4gPSBpbnNlcnRUb0FueUZuOwogICAgICAgIHBkX2lu c2VydFRvQW55Rm5OQ1AgPSBpbnNlcnRUb0FueUZuTkNQOwogICAgICB9CiAgICAgIEludmFsaWRO YW1lKGNvbnN0IEludmFsaWROYW1lJik7CgogICAgICBJbnZhbGlkTmFtZSYgb3BlcmF0b3I9KGNv bnN0IEludmFsaWROYW1lJik7CiAgICAgIHZpcnR1YWwgfkludmFsaWROYW1lKCk7CiAgICAgIHZp cnR1YWwgdm9pZCBfcmFpc2UoKTsKICAgICAgc3RhdGljIEludmFsaWROYW1lKiBfZG93bmNhc3Qo Q09SQkE6OkV4Y2VwdGlvbiopOwogICAgICBzdGF0aWMgY29uc3QgSW52YWxpZE5hbWUqIF9kb3du Y2FzdChjb25zdCBDT1JCQTo6RXhjZXB0aW9uKik7CiAgICAgIHN0YXRpYyBpbmxpbmUgSW52YWxp ZE5hbWUqIF9uYXJyb3coQ09SQkE6OkV4Y2VwdGlvbiogX2UpIHsKICAgICAgICByZXR1cm4gX2Rv d25jYXN0KF9lKTsKICAgICAgfQoKICAgICAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTmV0QnVm ZmVyZWRTdHJlYW0mKSBjb25zdCB7IH0KICAgICAgaW5saW5lIHZvaWQgb3BlcmF0b3I+Pj0oTWVt QnVmZmVyZWRTdHJlYW0mKSBjb25zdCB7IH0KICAgICAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0o TmV0QnVmZmVyZWRTdHJlYW0mKSB7IH0KICAgICAgaW5saW5lIHZvaWQgb3BlcmF0b3I8PD0oTWVt QnVmZmVyZWRTdHJlYW0mKSB7IH0KCiAgICAgIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueSBp bnNlcnRUb0FueUZuOwogICAgICBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnlOQ1AgaW5zZXJ0 VG9BbnlGbk5DUDsKCiAgICAgIHZpcnR1YWwgQ09SQkE6OkV4Y2VwdGlvbiogX05QX2R1cGxpY2F0 ZSgpIGNvbnN0OwoKICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIF9QRF9yZXBvSWQ7CgogICAgcHJp dmF0ZToKICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfdHlwZUlkKCkgY29uc3Q7CiAgICAg IHZpcnR1YWwgY29uc3QgY2hhciogX05QX3JlcG9JZChpbnQqKSBjb25zdDsKICAgICAgdmlydHVh bCB2b2lkIF9OUF9tYXJzaGFsKE5ldEJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7CiAgICAgIHZpcnR1 YWwgdm9pZCBfTlBfbWFyc2hhbChNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgfTsKCiAg ICBzdGF0aWMgY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfSW52YWxpZE5hbWU7CgogICAg Y2xhc3MgQWxyZWFkeUJvdW5kIDogcHVibGljIENPUkJBOjpVc2VyRXhjZXB0aW9uIHsKICAgIHB1 YmxpYzoKCiAgICAgIGlubGluZSBBbHJlYWR5Qm91bmQoKSB7CiAgICAgICAgcGRfaW5zZXJ0VG9B bnlGbiA9IGluc2VydFRvQW55Rm47CiAgICAgICAgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2Vy dFRvQW55Rm5OQ1A7CiAgICAgIH0KICAgICAgQWxyZWFkeUJvdW5kKGNvbnN0IEFscmVhZHlCb3Vu ZCYpOwoKICAgICAgQWxyZWFkeUJvdW5kJiBvcGVyYXRvcj0oY29uc3QgQWxyZWFkeUJvdW5kJik7 CiAgICAgIHZpcnR1YWwgfkFscmVhZHlCb3VuZCgpOwogICAgICB2aXJ0dWFsIHZvaWQgX3JhaXNl KCk7CiAgICAgIHN0YXRpYyBBbHJlYWR5Qm91bmQqIF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9u Kik7CiAgICAgIHN0YXRpYyBjb25zdCBBbHJlYWR5Qm91bmQqIF9kb3duY2FzdChjb25zdCBDT1JC QTo6RXhjZXB0aW9uKik7CiAgICAgIHN0YXRpYyBpbmxpbmUgQWxyZWFkeUJvdW5kKiBfbmFycm93 KENPUkJBOjpFeGNlcHRpb24qIF9lKSB7CiAgICAgICAgcmV0dXJuIF9kb3duY2FzdChfZSk7CiAg ICAgIH0KCiAgICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE5ldEJ1ZmZlcmVkU3RyZWFtJikg Y29uc3QgeyB9CiAgICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPj49KE1lbUJ1ZmZlcmVkU3RyZWFt JikgY29uc3QgeyB9CiAgICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE5ldEJ1ZmZlcmVkU3Ry ZWFtJikgeyB9CiAgICAgIGlubGluZSB2b2lkIG9wZXJhdG9yPDw9KE1lbUJ1ZmZlcmVkU3RyZWFt JikgeyB9CgogICAgICBzdGF0aWMgaW5zZXJ0RXhjZXB0aW9uVG9BbnkgaW5zZXJ0VG9BbnlGbjsK ICAgICAgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55TkNQIGluc2VydFRvQW55Rm5OQ1A7Cgog ICAgICB2aXJ0dWFsIENPUkJBOjpFeGNlcHRpb24qIF9OUF9kdXBsaWNhdGUoKSBjb25zdDsKCiAg ICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKICAgIHByaXZhdGU6CiAgICAgIHZp cnR1YWwgY29uc3QgY2hhciogX05QX3R5cGVJZCgpIGNvbnN0OwogICAgICB2aXJ0dWFsIGNvbnN0 IGNoYXIqIF9OUF9yZXBvSWQoaW50KikgY29uc3Q7CiAgICAgIHZpcnR1YWwgdm9pZCBfTlBfbWFy c2hhbChOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0OwogICAgICB2aXJ0dWFsIHZvaWQgX05QX21h cnNoYWwoTWVtQnVmZmVyZWRTdHJlYW0mKSBjb25zdDsKICAgIH07CgogICAgc3RhdGljIGNvbnN0 IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX0FscmVhZHlCb3VuZDsKCiAgICBjbGFzcyBOb3RFbXB0 eSA6IHB1YmxpYyBDT1JCQTo6VXNlckV4Y2VwdGlvbiB7CiAgICBwdWJsaWM6CgogICAgICBpbmxp bmUgTm90RW1wdHkoKSB7CiAgICAgICAgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47 CiAgICAgICAgcGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7CiAgICAgIH0K ICAgICAgTm90RW1wdHkoY29uc3QgTm90RW1wdHkmKTsKCiAgICAgIE5vdEVtcHR5JiBvcGVyYXRv cj0oY29uc3QgTm90RW1wdHkmKTsKICAgICAgdmlydHVhbCB+Tm90RW1wdHkoKTsKICAgICAgdmly dHVhbCB2b2lkIF9yYWlzZSgpOwogICAgICBzdGF0aWMgTm90RW1wdHkqIF9kb3duY2FzdChDT1JC QTo6RXhjZXB0aW9uKik7CiAgICAgIHN0YXRpYyBjb25zdCBOb3RFbXB0eSogX2Rvd25jYXN0KGNv bnN0IENPUkJBOjpFeGNlcHRpb24qKTsKICAgICAgc3RhdGljIGlubGluZSBOb3RFbXB0eSogX25h cnJvdyhDT1JCQTo6RXhjZXB0aW9uKiBfZSkgewogICAgICAgIHJldHVybiBfZG93bmNhc3QoX2Up OwogICAgICB9CgogICAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVh bSYpIGNvbnN0IHsgfQogICAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0 cmVhbSYpIGNvbnN0IHsgfQogICAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJl ZFN0cmVhbSYpIHsgfQogICAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0 cmVhbSYpIHsgfQoKICAgICAgc3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55 Rm47CiAgICAgIHN0YXRpYyBpbnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQ OwoKICAgICAgdmlydHVhbCBDT1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7 CgogICAgICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCiAgICBwcml2YXRlOgogICAg ICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9OUF90eXBlSWQoKSBjb25zdDsKICAgICAgdmlydHVhbCBj b25zdCBjaGFyKiBfTlBfcmVwb0lkKGludCopIGNvbnN0OwogICAgICB2aXJ0dWFsIHZvaWQgX05Q X21hcnNoYWwoTmV0QnVmZmVyZWRTdHJlYW0mKSBjb25zdDsKICAgICAgdmlydHVhbCB2b2lkIF9O UF9tYXJzaGFsKE1lbUJ1ZmZlcmVkU3RyZWFtJikgY29uc3Q7CiAgICB9OwoKICAgIHN0YXRpYyBj b25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Ob3RFbXB0eTsKCiAgfTsKCiAgY2xhc3MgX29i anJlZl9OYW1pbmdDb250ZXh0IDoKICAgIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpPYmplY3QsIHB1 YmxpYyB2aXJ0dWFsIG9tbmlPYmpSZWYKICB7CiAgcHVibGljOgogICAgdm9pZCBiaW5kKGNvbnN0 IE5hbWUmIG4sIENPUkJBOjpPYmplY3RfcHRyIG9iaik7CiAgICB2b2lkIHJlYmluZChjb25zdCBO YW1lJiBuLCBDT1JCQTo6T2JqZWN0X3B0ciBvYmopOwogICAgdm9pZCBiaW5kX2NvbnRleHQoY29u c3QgTmFtZSYgbiwgTmFtaW5nQ29udGV4dF9wdHIgbmMpOwogICAgdm9pZCByZWJpbmRfY29udGV4 dChjb25zdCBOYW1lJiBuLCBOYW1pbmdDb250ZXh0X3B0ciBuYyk7CiAgICBDT1JCQTo6T2JqZWN0 X3B0ciByZXNvbHZlKGNvbnN0IE5hbWUmIG4pOwogICAgdm9pZCB1bmJpbmQoY29uc3QgTmFtZSYg bik7CiAgICBOYW1pbmdDb250ZXh0X3B0ciBuZXdfY29udGV4dCgpOwogICAgTmFtaW5nQ29udGV4 dF9wdHIgYmluZF9uZXdfY29udGV4dChjb25zdCBOYW1lJiBuKTsKICAgIHZvaWQgZGVzdHJveSgp OwogICAgdm9pZCBsaXN0KENPUkJBOjpVTG9uZyBob3dfbWFueSwgQmluZGluZ0xpc3Rfb3V0IGJs LCBfQ09SQkFfT2JqUmVmX09VVF9hcmc8IENvc05hbWluZzo6X29ianJlZl9CaW5kaW5nSXRlcmF0 b3IsIEJpbmRpbmdJdGVyYXRvcl9IZWxwZXIgPiBiaSk7CgogICAgaW5saW5lIF9vYmpyZWZfTmFt aW5nQ29udGV4dCgpIHsgX1BSX3NldG9iaigwKTsgfQogICAgX29ianJlZl9OYW1pbmdDb250ZXh0 KGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21u aUxvY2FsSWRlbnRpdHkqKTsKCiAgcHJvdGVjdGVkOgogICAgdmlydHVhbCB+X29ianJlZl9OYW1p bmdDb250ZXh0KCk7CgogIHByaXZhdGU6CiAgICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihj b25zdCBjaGFyKik7CgogICAgX29ianJlZl9OYW1pbmdDb250ZXh0KGNvbnN0IF9vYmpyZWZfTmFt aW5nQ29udGV4dCYpOwogICAgX29ianJlZl9OYW1pbmdDb250ZXh0JiBvcGVyYXRvciA9IChjb25z dCBfb2JqcmVmX05hbWluZ0NvbnRleHQmKTsKCiAgfTsKCiAgY2xhc3MgX3BvZl9OYW1pbmdDb250 ZXh0IDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CiAgcHVibGljOgogICAgaW5saW5lIF9w b2ZfTmFtaW5nQ29udGV4dCgpIDogcHJveHlPYmplY3RGYWN0b3J5KE5hbWluZ0NvbnRleHQ6Ol9Q RF9yZXBvSWQpIHt9CiAgICB2aXJ0dWFsIH5fcG9mX05hbWluZ0NvbnRleHQoKTsKCiAgICB2aXJ0 dWFsIG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxl TGlzdCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBv bW5pTG9jYWxJZGVudGl0eSopOwogICAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0 IGNoYXIqKSBjb25zdDsKICB9OwoKICBjbGFzcyBfaW1wbF9OYW1pbmdDb250ZXh0IDoKICAgIHB1 YmxpYyB2aXJ0dWFsIG9tbmlTZXJ2YW50CiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfl9pbXBs X05hbWluZ0NvbnRleHQoKTsKCiAgICB2aXJ0dWFsIHZvaWQgYmluZChjb25zdCBOYW1lJiBuLCBD T1JCQTo6T2JqZWN0X3B0ciBvYmopID0gMDsKICAgIHZpcnR1YWwgdm9pZCByZWJpbmQoY29uc3Qg TmFtZSYgbiwgQ09SQkE6Ok9iamVjdF9wdHIgb2JqKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgYmlu ZF9jb250ZXh0KGNvbnN0IE5hbWUmIG4sIE5hbWluZ0NvbnRleHRfcHRyIG5jKSA9IDA7CiAgICB2 aXJ0dWFsIHZvaWQgcmViaW5kX2NvbnRleHQoY29uc3QgTmFtZSYgbiwgTmFtaW5nQ29udGV4dF9w dHIgbmMpID0gMDsKICAgIHZpcnR1YWwgQ09SQkE6Ok9iamVjdF9wdHIgcmVzb2x2ZShjb25zdCBO YW1lJiBuKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgdW5iaW5kKGNvbnN0IE5hbWUmIG4pID0gMDsK ICAgIHZpcnR1YWwgTmFtaW5nQ29udGV4dF9wdHIgbmV3X2NvbnRleHQoKSA9IDA7CiAgICB2aXJ0 dWFsIE5hbWluZ0NvbnRleHRfcHRyIGJpbmRfbmV3X2NvbnRleHQoY29uc3QgTmFtZSYgbikgPSAw OwogICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgbGlzdChD T1JCQTo6VUxvbmcgaG93X21hbnksIEJpbmRpbmdMaXN0X291dCBibCwgX0NPUkJBX09ialJlZl9P VVRfYXJnPCBDb3NOYW1pbmc6Ol9vYmpyZWZfQmluZGluZ0l0ZXJhdG9yLCBCaW5kaW5nSXRlcmF0 b3JfSGVscGVyID4gYmkpID0gMDsKCiAgcHVibGljOgogICAgdmlydHVhbCBfQ09SQkFfQm9vbGVh biBfZGlzcGF0Y2goR0lPUF9TJik7CgogIHByaXZhdGU6CiAgICB2aXJ0dWFsIHZvaWQqIF9wdHJU b0ludGVyZmFjZShjb25zdCBjaGFyKik7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVy aXZlZFJlcG9JZCgpOwogIH07CgogIGV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90 Y19OYW1pbmdDb250ZXh0OwojIDcyNCAiL3Vzci9sb2NhbC9pbmNsdWRlL29tbmlPUkIzL05hbWlu Zy5oaCIgMwogIGNsYXNzIEJpbmRpbmdJdGVyYXRvciB7CiAgcHVibGljOgoKICAgIHR5cGVkZWYg QmluZGluZ0l0ZXJhdG9yX3B0ciBfcHRyX3R5cGU7CiAgICB0eXBlZGVmIEJpbmRpbmdJdGVyYXRv cl92YXIgX3Zhcl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5 cGUpOwogICAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICAg IHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICAgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGln bmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNo YWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIGlubGlu ZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAg ICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxP YmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9i aik7CiAgICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9 CgogICAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJl ZFN0cmVhbSYgcykgewogICAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJz aGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJv dyhvYmopOwogICAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgICByZXR1cm4gcmVzdWx0Owog ICAgfQoKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgogIH07CgogIGNsYXNz IF9vYmpyZWZfQmluZGluZ0l0ZXJhdG9yIDoKICAgIHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpPYmpl Y3QsIHB1YmxpYyB2aXJ0dWFsIG9tbmlPYmpSZWYKICB7CiAgcHVibGljOgogICAgQ09SQkE6OkJv b2xlYW4gbmV4dF9vbmUoQmluZGluZ19vdXQgYik7CiAgICBDT1JCQTo6Qm9vbGVhbiBuZXh0X24o Q09SQkE6OlVMb25nIGhvd19tYW55LCBCaW5kaW5nTGlzdF9vdXQgYmwpOwogICAgdm9pZCBkZXN0 cm95KCk7CgogICAgaW5saW5lIF9vYmpyZWZfQmluZGluZ0l0ZXJhdG9yKCkgeyBfUFJfc2V0b2Jq KDApOyB9CiAgICBfb2JqcmVmX0JpbmRpbmdJdGVyYXRvcihjb25zdCBjaGFyKiwgSU9QOjpUYWdn ZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CgogIHBy b3RlY3RlZDoKICAgIHZpcnR1YWwgfl9vYmpyZWZfQmluZGluZ0l0ZXJhdG9yKCk7CgogIHByaXZh dGU6CiAgICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKik7CgogICAgX29i anJlZl9CaW5kaW5nSXRlcmF0b3IoY29uc3QgX29ianJlZl9CaW5kaW5nSXRlcmF0b3ImKTsKICAg IF9vYmpyZWZfQmluZGluZ0l0ZXJhdG9yJiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX0JpbmRp bmdJdGVyYXRvciYpOwoKICB9OwoKICBjbGFzcyBfcG9mX0JpbmRpbmdJdGVyYXRvciA6IHB1Ymxp YyBwcm94eU9iamVjdEZhY3RvcnkgewogIHB1YmxpYzoKICAgIGlubGluZSBfcG9mX0JpbmRpbmdJ dGVyYXRvcigpIDogcHJveHlPYmplY3RGYWN0b3J5KEJpbmRpbmdJdGVyYXRvcjo6X1BEX3JlcG9J ZCkge30KICAgIHZpcnR1YWwgfl9wb2ZfQmluZGluZ0l0ZXJhdG9yKCk7CgogICAgdmlydHVhbCBv bW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3Qq LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxv Y2FsSWRlbnRpdHkqKTsKICAgIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFy KikgY29uc3Q7CiAgfTsKCiAgY2xhc3MgX2ltcGxfQmluZGluZ0l0ZXJhdG9yIDoKICAgIHB1Ymxp YyB2aXJ0dWFsIG9tbmlTZXJ2YW50CiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfl9pbXBsX0Jp bmRpbmdJdGVyYXRvcigpOwoKICAgIHZpcnR1YWwgQ09SQkE6OkJvb2xlYW4gbmV4dF9vbmUoQmlu ZGluZ19vdXQgYikgPSAwOwogICAgdmlydHVhbCBDT1JCQTo6Qm9vbGVhbiBuZXh0X24oQ09SQkE6 OlVMb25nIGhvd19tYW55LCBCaW5kaW5nTGlzdF9vdXQgYmwpID0gMDsKICAgIHZpcnR1YWwgdm9p ZCBkZXN0cm95KCkgPSAwOwoKICBwdWJsaWM6CiAgICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9k aXNwYXRjaChHSU9QX1MmKTsKCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgdm9pZCogX3B0clRvSW50 ZXJmYWNlKGNvbnN0IGNoYXIqKTsKICAgIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVk UmVwb0lkKCk7CiAgfTsKCiAgZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX0Jp bmRpbmdJdGVyYXRvcjsKCgoKCiAgY2xhc3MgTmFtaW5nQ29udGV4dEV4dDsKICBjbGFzcyBfb2Jq cmVmX05hbWluZ0NvbnRleHRFeHQ7CiAgY2xhc3MgX2ltcGxfTmFtaW5nQ29udGV4dEV4dDsKCiAg dHlwZWRlZiBfb2JqcmVmX05hbWluZ0NvbnRleHRFeHQqIE5hbWluZ0NvbnRleHRFeHRfcHRyOwog IHR5cGVkZWYgTmFtaW5nQ29udGV4dEV4dF9wdHIgTmFtaW5nQ29udGV4dEV4dFJlZjsKCiAgY2xh c3MgTmFtaW5nQ29udGV4dEV4dF9IZWxwZXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgTmFtaW5n Q29udGV4dEV4dF9wdHIgX3B0cl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwog ICAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogICAgc3RhdGljIHZv aWQgcmVsZWFzZShfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlw ZSk7CiAgICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsK ICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVh bSYpOwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJl YW0mKTsKICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJl ZFN0cmVhbSYpOwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVy ZWRTdHJlYW0mKTsKICB9OwoKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfTmFt aW5nQ29udGV4dEV4dCwgTmFtaW5nQ29udGV4dEV4dF9IZWxwZXI+IE5hbWluZ0NvbnRleHRFeHRf dmFyOwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfTmFtaW5nQ29udGV4 dEV4dCxOYW1pbmdDb250ZXh0RXh0X0hlbHBlciA+IE5hbWluZ0NvbnRleHRFeHRfb3V0OwoKCgog IGNsYXNzIE5hbWluZ0NvbnRleHRFeHQgewogIHB1YmxpYzoKCiAgICB0eXBlZGVmIE5hbWluZ0Nv bnRleHRFeHRfcHRyIF9wdHJfdHlwZTsKICAgIHR5cGVkZWYgTmFtaW5nQ29udGV4dEV4dF92YXIg X3Zhcl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwog ICAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICAgIHN0YXRp YyBfcHRyX3R5cGUgX25pbCgpOwoKICAgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6 ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpS ZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIGlubGluZSB2b2lk IF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgICBzdGF0 aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBz KSB7CiAgICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYo X1BEX3JlcG9JZCwgcyk7CiAgICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAg ICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAg c3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVh bSYgcykgewogICAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2Jq UmVmKF9QRF9yZXBvSWQsIHMpOwogICAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmop OwogICAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoK ICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCiAgICBzdGF0aWMgY29uc3QgQ09S QkE6OlR5cGVDb2RlX3B0ciBfdGNfU3RyaW5nTmFtZTsKCiAgICB0eXBlZGVmIGNoYXIqIFN0cmlu Z05hbWU7CiAgICB0eXBlZGVmIENPUkJBOjpTdHJpbmdfdmFyIFN0cmluZ05hbWVfdmFyOwoKICAg IHN0YXRpYyBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19BZGRyZXNzOwoKICAgIHR5cGVk ZWYgY2hhciogQWRkcmVzczsKICAgIHR5cGVkZWYgQ09SQkE6OlN0cmluZ192YXIgQWRkcmVzc192 YXI7CgogICAgc3RhdGljIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX1VSTFN0cmluZzsK CiAgICB0eXBlZGVmIGNoYXIqIFVSTFN0cmluZzsKICAgIHR5cGVkZWYgQ09SQkE6OlN0cmluZ192 YXIgVVJMU3RyaW5nX3ZhcjsKCiAgICBjbGFzcyBJbnZhbGlkQWRkcmVzcyA6IHB1YmxpYyBDT1JC QTo6VXNlckV4Y2VwdGlvbiB7CiAgICBwdWJsaWM6CgogICAgICBpbmxpbmUgSW52YWxpZEFkZHJl c3MoKSB7CiAgICAgICAgcGRfaW5zZXJ0VG9BbnlGbiA9IGluc2VydFRvQW55Rm47CiAgICAgICAg cGRfaW5zZXJ0VG9BbnlGbk5DUCA9IGluc2VydFRvQW55Rm5OQ1A7CiAgICAgIH0KICAgICAgSW52 YWxpZEFkZHJlc3MoY29uc3QgSW52YWxpZEFkZHJlc3MmKTsKCiAgICAgIEludmFsaWRBZGRyZXNz JiBvcGVyYXRvcj0oY29uc3QgSW52YWxpZEFkZHJlc3MmKTsKICAgICAgdmlydHVhbCB+SW52YWxp ZEFkZHJlc3MoKTsKICAgICAgdmlydHVhbCB2b2lkIF9yYWlzZSgpOwogICAgICBzdGF0aWMgSW52 YWxpZEFkZHJlc3MqIF9kb3duY2FzdChDT1JCQTo6RXhjZXB0aW9uKik7CiAgICAgIHN0YXRpYyBj b25zdCBJbnZhbGlkQWRkcmVzcyogX2Rvd25jYXN0KGNvbnN0IENPUkJBOjpFeGNlcHRpb24qKTsK ICAgICAgc3RhdGljIGlubGluZSBJbnZhbGlkQWRkcmVzcyogX25hcnJvdyhDT1JCQTo6RXhjZXB0 aW9uKiBfZSkgewogICAgICAgIHJldHVybiBfZG93bmNhc3QoX2UpOwogICAgICB9CgogICAgICBp bmxpbmUgdm9pZCBvcGVyYXRvcj4+PShOZXRCdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHsgfQogICAg ICBpbmxpbmUgdm9pZCBvcGVyYXRvcj4+PShNZW1CdWZmZXJlZFN0cmVhbSYpIGNvbnN0IHsgfQog ICAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShOZXRCdWZmZXJlZFN0cmVhbSYpIHsgfQogICAg ICBpbmxpbmUgdm9pZCBvcGVyYXRvcjw8PShNZW1CdWZmZXJlZFN0cmVhbSYpIHsgfQoKICAgICAg c3RhdGljIGluc2VydEV4Y2VwdGlvblRvQW55IGluc2VydFRvQW55Rm47CiAgICAgIHN0YXRpYyBp bnNlcnRFeGNlcHRpb25Ub0FueU5DUCBpbnNlcnRUb0FueUZuTkNQOwoKICAgICAgdmlydHVhbCBD T1JCQTo6RXhjZXB0aW9uKiBfTlBfZHVwbGljYXRlKCkgY29uc3Q7CgogICAgICBzdGF0aWMgY29u c3QgY2hhciogX1BEX3JlcG9JZDsKCiAgICBwcml2YXRlOgogICAgICB2aXJ0dWFsIGNvbnN0IGNo YXIqIF9OUF90eXBlSWQoKSBjb25zdDsKICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBfTlBfcmVw b0lkKGludCopIGNvbnN0OwogICAgICB2aXJ0dWFsIHZvaWQgX05QX21hcnNoYWwoTmV0QnVmZmVy ZWRTdHJlYW0mKSBjb25zdDsKICAgICAgdmlydHVhbCB2b2lkIF9OUF9tYXJzaGFsKE1lbUJ1ZmZl cmVkU3RyZWFtJikgY29uc3Q7CiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCBDT1JCQTo6VHlwZUNv ZGVfcHRyIF90Y19JbnZhbGlkQWRkcmVzczsKCiAgfTsKCiAgY2xhc3MgX29ianJlZl9OYW1pbmdD b250ZXh0RXh0IDoKICAgIHB1YmxpYyB2aXJ0dWFsIF9vYmpyZWZfTmFtaW5nQ29udGV4dAogIHsK ICBwdWJsaWM6CiAgICBjaGFyKiB0b19zdHJpbmcoY29uc3QgTmFtZSYgbik7CiAgICBOYW1lKiB0 b19uYW1lKGNvbnN0IGNoYXIqIHNuKTsKICAgIGNoYXIqIHRvX3VybChjb25zdCBjaGFyKiBhZGRy LCBjb25zdCBjaGFyKiBzbik7CiAgICBDT1JCQTo6T2JqZWN0X3B0ciByZXNvbHZlX3N0cihjb25z dCBjaGFyKiBuKTsKCiAgICBpbmxpbmUgX29ianJlZl9OYW1pbmdDb250ZXh0RXh0KCkgeyBfUFJf c2V0b2JqKDApOyB9CiAgICBfb2JqcmVmX05hbWluZ0NvbnRleHRFeHQoY29uc3QgY2hhciosIElP UDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSop OwoKICBwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIH5fb2JqcmVmX05hbWluZ0NvbnRleHRFeHQoKTsK CiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsK CiAgICBfb2JqcmVmX05hbWluZ0NvbnRleHRFeHQoY29uc3QgX29ianJlZl9OYW1pbmdDb250ZXh0 RXh0Jik7CiAgICBfb2JqcmVmX05hbWluZ0NvbnRleHRFeHQmIG9wZXJhdG9yID0gKGNvbnN0IF9v YmpyZWZfTmFtaW5nQ29udGV4dEV4dCYpOwoKICB9OwoKICBjbGFzcyBfcG9mX05hbWluZ0NvbnRl eHRFeHQgOiBwdWJsaWMgcHJveHlPYmplY3RGYWN0b3J5IHsKICBwdWJsaWM6CiAgICBpbmxpbmUg X3BvZl9OYW1pbmdDb250ZXh0RXh0KCkgOiBwcm94eU9iamVjdEZhY3RvcnkoTmFtaW5nQ29udGV4 dEV4dDo6X1BEX3JlcG9JZCkge30KICAgIHZpcnR1YWwgfl9wb2ZfTmFtaW5nQ29udGV4dEV4dCgp OwoKICAgIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJT1A6OlRh Z2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tbmlJ ZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFu IGlzX2EoY29uc3QgY2hhciopIGNvbnN0OwogIH07CgogIGNsYXNzIF9pbXBsX05hbWluZ0NvbnRl eHRFeHQgOgogICAgcHVibGljIHZpcnR1YWwgX2ltcGxfTmFtaW5nQ29udGV4dAogIHsKICBwdWJs aWM6CiAgICB2aXJ0dWFsIH5faW1wbF9OYW1pbmdDb250ZXh0RXh0KCk7CgogICAgdmlydHVhbCBj aGFyKiB0b19zdHJpbmcoY29uc3QgTmFtZSYgbikgPSAwOwogICAgdmlydHVhbCBOYW1lKiB0b19u YW1lKGNvbnN0IGNoYXIqIHNuKSA9IDA7CiAgICB2aXJ0dWFsIGNoYXIqIHRvX3VybChjb25zdCBj aGFyKiBhZGRyLCBjb25zdCBjaGFyKiBzbikgPSAwOwogICAgdmlydHVhbCBDT1JCQTo6T2JqZWN0 X3B0ciByZXNvbHZlX3N0cihjb25zdCBjaGFyKiBuKSA9IDA7CgogIHB1YmxpYzoKICAgIHZpcnR1 YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYpOwoKICBwcml2YXRlOgogICAgdmly dHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogICAgdmlydHVhbCBjb25z dCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKICB9OwoKICBleHRlcm4gY29uc3QgQ09SQkE6 OlR5cGVDb2RlX3B0ciBfdGNfTmFtaW5nQ29udGV4dEV4dDsKCn0KCm5hbWVzcGFjZSBQT0FfQ29z TmFtaW5nCnsKCiAgY2xhc3MgTmFtaW5nQ29udGV4dCA6CiAgICBwdWJsaWMgdmlydHVhbCBDb3NO YW1pbmc6Ol9pbXBsX05hbWluZ0NvbnRleHQsCiAgICBwdWJsaWMgdmlydHVhbCBQb3J0YWJsZVNl cnZlcjo6U2VydmFudEJhc2UKICB7CiAgcHVibGljOgogICAgdmlydHVhbCB+TmFtaW5nQ29udGV4 dCgpOwoKICAgIGlubGluZSBDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHRfcHRyIF90aGlzKCkgewog ICAgICByZXR1cm4gKENvc05hbWluZzo6TmFtaW5nQ29udGV4dF9wdHIpIF9kb190aGlzKENvc05h bWluZzo6TmFtaW5nQ29udGV4dDo6X1BEX3JlcG9JZCk7CiAgICB9CiAgfTsKCiAgY2xhc3MgQmlu ZGluZ0l0ZXJhdG9yIDoKICAgIHB1YmxpYyB2aXJ0dWFsIENvc05hbWluZzo6X2ltcGxfQmluZGlu Z0l0ZXJhdG9yLAogICAgcHVibGljIHZpcnR1YWwgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRCYXNl CiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfkJpbmRpbmdJdGVyYXRvcigpOwoKICAgIGlubGlu ZSBDb3NOYW1pbmc6OkJpbmRpbmdJdGVyYXRvcl9wdHIgX3RoaXMoKSB7CiAgICAgIHJldHVybiAo Q29zTmFtaW5nOjpCaW5kaW5nSXRlcmF0b3JfcHRyKSBfZG9fdGhpcyhDb3NOYW1pbmc6OkJpbmRp bmdJdGVyYXRvcjo6X1BEX3JlcG9JZCk7CiAgICB9CiAgfTsKCiAgY2xhc3MgTmFtaW5nQ29udGV4 dEV4dCA6CiAgICBwdWJsaWMgdmlydHVhbCBDb3NOYW1pbmc6Ol9pbXBsX05hbWluZ0NvbnRleHRF eHQsCiAgICBwdWJsaWMgdmlydHVhbCBOYW1pbmdDb250ZXh0CiAgewogIHB1YmxpYzoKICAgIHZp cnR1YWwgfk5hbWluZ0NvbnRleHRFeHQoKTsKCiAgICBpbmxpbmUgQ29zTmFtaW5nOjpOYW1pbmdD b250ZXh0RXh0X3B0ciBfdGhpcygpIHsKICAgICAgcmV0dXJuIChDb3NOYW1pbmc6Ok5hbWluZ0Nv bnRleHRFeHRfcHRyKSBfZG9fdGhpcyhDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHRFeHQ6Ol9QRF9y ZXBvSWQpOwogICAgfQogIH07Cgp9CgoKCgpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6 QW55JiBfYSwgY29uc3QgQ29zTmFtaW5nOjpOYW1lQ29tcG9uZW50JiBfcyk7CmV4dGVybiB2b2lk IG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDb3NOYW1pbmc6Ok5hbWVDb21wb25lbnQqIF9z cCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBf YSwgQ29zTmFtaW5nOjpOYW1lQ29tcG9uZW50KiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFu IG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDb3NOYW1pbmc6Ok5hbWVD b21wb25lbnQqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBf YSwgY29uc3QgQ29zTmFtaW5nOjpOYW1lJiBfcyk7CmlubGluZSB2b2lkIG9wZXJhdG9yIDw8PSAo Q09SQkE6OkFueSYgX2EsIENvc05hbWluZzo6TmFtZSogX3NwKSB7CiAgX2EgPDw9ICpfc3A7CiAg ZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBD T1JCQTo6QW55JiBfYSwgQ29zTmFtaW5nOjpOYW1lKiYgX3NwKTsKZXh0ZXJuIF9DT1JCQV9Cb29s ZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENvc05hbWluZzo6 TmFtZSomIF9zcCk7CgppbmxpbmUgdm9pZCBvcGVyYXRvciA+Pj0oQ29zTmFtaW5nOjpCaW5kaW5n VHlwZSBfZSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICA6Om9wZXJhdG9yPj49KChDT1JCQTo6 VUxvbmcpX2UsIHMpOwp9CgppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENvc05hbWluZzo6Qmlu ZGluZ1R5cGUmIF9lLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpVTG9uZyBfMFJM X2U7CiAgOjpvcGVyYXRvcjw8PShfMFJMX2Uscyk7CiAgc3dpdGNoIChfMFJMX2UpIHsKICAgIGNh c2UgQ29zTmFtaW5nOjpub2JqZWN0OgoKICAgIGNhc2UgQ29zTmFtaW5nOjpuY29udGV4dDoKCiAg ICBfZSA9IChDb3NOYW1pbmc6OkJpbmRpbmdUeXBlKSBfMFJMX2U7CiAgICBicmVhazsKICBkZWZh dWx0OgogICAgX0NPUkJBX21hcnNoYWxfZXJyb3IoKTsKICB9Cn0KCmlubGluZSB2b2lkIG9wZXJh dG9yID4+PShDb3NOYW1pbmc6OkJpbmRpbmdUeXBlIF9lLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykg ewogIDo6b3BlcmF0b3I+Pj0oKENPUkJBOjpVTG9uZylfZSwgcyk7Cn0KCmlubGluZSB2b2lkIG9w ZXJhdG9yIDw8PSAoQ29zTmFtaW5nOjpCaW5kaW5nVHlwZSYgX2UsIE1lbUJ1ZmZlcmVkU3RyZWFt JiBzKSB7CiAgQ09SQkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJhdG9yPDw9KF8wUkxfZSxzKTsK ICBzd2l0Y2ggKF8wUkxfZSkgewogICAgY2FzZSBDb3NOYW1pbmc6Om5vYmplY3Q6CgogICAgY2Fz ZSBDb3NOYW1pbmc6Om5jb250ZXh0OgoKICAgIF9lID0gKENvc05hbWluZzo6QmluZGluZ1R5cGUp IF8wUkxfZTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBfQ09SQkFfbWFyc2hhbF9lcnJvcigp OwogIH0KfQoKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ29zTmFtaW5nOjpCaW5k aW5nVHlwZSBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkm IF9hLCBDb3NOYW1pbmc6OkJpbmRpbmdUeXBlJiBfcyk7CgpleHRlcm4gdm9pZCBvcGVyYXRvcjw8 PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ29zTmFtaW5nOjpCaW5kaW5nJiBfcyk7CmV4dGVybiB2 b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDb3NOYW1pbmc6OkJpbmRpbmcqIF9zcCk7 CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwg Q29zTmFtaW5nOjpCaW5kaW5nKiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9y Pj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDb3NOYW1pbmc6OkJpbmRpbmcqJiBfc3Ap OwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgQ29zTmFt aW5nOjpCaW5kaW5nTGlzdCYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpB bnkmIF9hLCBDb3NOYW1pbmc6OkJpbmRpbmdMaXN0KiBfc3ApIHsKICBfYSA8PD0gKl9zcDsKICBk ZWxldGUgX3NwOwp9CmV4dGVybiBfQ09SQkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0IENP UkJBOjpBbnkmIF9hLCBDb3NOYW1pbmc6OkJpbmRpbmdMaXN0KiYgX3NwKTsKZXh0ZXJuIF9DT1JC QV9Cb29sZWFuIG9wZXJhdG9yID4+PSAoY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENvc05h bWluZzo6QmluZGluZ0xpc3QqJiBfc3ApOwoKaW5saW5lIHZvaWQgb3BlcmF0b3IgPj49KENvc05h bWluZzo6TmFtaW5nQ29udGV4dDo6Tm90Rm91bmRSZWFzb24gX2UsIE5ldEJ1ZmZlcmVkU3RyZWFt JiBzKSB7CiAgOjpvcGVyYXRvcj4+PSgoQ09SQkE6OlVMb25nKV9lLCBzKTsKfQoKaW5saW5lIHZv aWQgb3BlcmF0b3IgPDw9IChDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHQ6Ok5vdEZvdW5kUmVhc29u JiBfZSwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6VUxvbmcgXzBSTF9lOwogIDo6 b3BlcmF0b3I8PD0oXzBSTF9lLHMpOwogIHN3aXRjaCAoXzBSTF9lKSB7CiAgICBjYXNlIENvc05h bWluZzo6TmFtaW5nQ29udGV4dDo6bWlzc2luZ19ub2RlOgoKICAgIGNhc2UgQ29zTmFtaW5nOjpO YW1pbmdDb250ZXh0Ojpub3RfY29udGV4dDoKCiAgICBjYXNlIENvc05hbWluZzo6TmFtaW5nQ29u dGV4dDo6bm90X29iamVjdDoKCiAgICBfZSA9IChDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHQ6Ok5v dEZvdW5kUmVhc29uKSBfMFJMX2U7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgX0NPUkJBX21h cnNoYWxfZXJyb3IoKTsKICB9Cn0KCmlubGluZSB2b2lkIG9wZXJhdG9yID4+PShDb3NOYW1pbmc6 Ok5hbWluZ0NvbnRleHQ6Ok5vdEZvdW5kUmVhc29uIF9lLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykg ewogIDo6b3BlcmF0b3I+Pj0oKENPUkJBOjpVTG9uZylfZSwgcyk7Cn0KCmlubGluZSB2b2lkIG9w ZXJhdG9yIDw8PSAoQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0OjpOb3RGb3VuZFJlYXNvbiYgX2Us IE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6OlVMb25nIF8wUkxfZTsKICA6Om9wZXJh dG9yPDw9KF8wUkxfZSxzKTsKICBzd2l0Y2ggKF8wUkxfZSkgewogICAgY2FzZSBDb3NOYW1pbmc6 Ok5hbWluZ0NvbnRleHQ6Om1pc3Npbmdfbm9kZToKCiAgICBjYXNlIENvc05hbWluZzo6TmFtaW5n Q29udGV4dDo6bm90X2NvbnRleHQ6CgogICAgY2FzZSBDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHQ6 Om5vdF9vYmplY3Q6CgogICAgX2UgPSAoQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0OjpOb3RGb3Vu ZFJlYXNvbikgXzBSTF9lOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIF9DT1JCQV9tYXJzaGFs X2Vycm9yKCk7CiAgfQp9Cgp2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDb3NOYW1p bmc6Ok5hbWluZ0NvbnRleHQ6Ok5vdEZvdW5kUmVhc29uIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3Bl cmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIENvc05hbWluZzo6TmFtaW5nQ29udGV4dDo6 Tm90Rm91bmRSZWFzb24mIF9zKTsKCnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNv bnN0IENvc05hbWluZzo6TmFtaW5nQ29udGV4dDo6Tm90Rm91bmQmIF9zKTsKdm9pZCBvcGVyYXRv cjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0OjpOb3RG b3VuZCogX3NwKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYg X2EsIGNvbnN0IENvc05hbWluZzo6TmFtaW5nQ29udGV4dDo6Tm90Rm91bmQqJiBfc3ApOwoKdm9p ZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ29zTmFtaW5nOjpOYW1pbmdDb250 ZXh0OjpDYW5ub3RQcm9jZWVkJiBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2Es IGNvbnN0IENvc05hbWluZzo6TmFtaW5nQ29udGV4dDo6Q2Fubm90UHJvY2VlZCogX3NwKTsKQ09S QkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENvc05h bWluZzo6TmFtaW5nQ29udGV4dDo6Q2Fubm90UHJvY2VlZComIF9zcCk7Cgp2b2lkIG9wZXJhdG9y PDw9KENPUkJBOjpBbnkmIF9hLCBjb25zdCBDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHQ6OkludmFs aWROYW1lJiBfcyk7CnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNvbnN0IENvc05h bWluZzo6TmFtaW5nQ29udGV4dDo6SW52YWxpZE5hbWUqIF9zcCk7CkNPUkJBOjpCb29sZWFuIG9w ZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBjb25zdCBDb3NOYW1pbmc6Ok5hbWluZ0Nv bnRleHQ6OkludmFsaWROYW1lKiYgX3NwKTsKCnZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYg X2EsIGNvbnN0IENvc05hbWluZzo6TmFtaW5nQ29udGV4dDo6QWxyZWFkeUJvdW5kJiBfcyk7CnZv aWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNvbnN0IENvc05hbWluZzo6TmFtaW5nQ29u dGV4dDo6QWxyZWFkeUJvdW5kKiBfc3ApOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25z dCBDT1JCQTo6QW55JiBfYSwgY29uc3QgQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0OjpBbHJlYWR5 Qm91bmQqJiBfc3ApOwoKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ29z TmFtaW5nOjpOYW1pbmdDb250ZXh0OjpOb3RFbXB0eSYgX3MpOwp2b2lkIG9wZXJhdG9yPDw9KENP UkJBOjpBbnkmIF9hLCBjb25zdCBDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHQ6Ok5vdEVtcHR5KiBf c3ApOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29u c3QgQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0OjpOb3RFbXB0eSomIF9zcCk7Cgp2b2lkIG9wZXJh dG9yPDw9KENPUkJBOjpBbnkmIF9hLCBDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHRfcHRyIF9zKTsK dm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0 X3B0ciogX3MpOwpDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBf YSwgQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0X3B0ciYgX3MpOwoKdm9pZCBvcGVyYXRvcjw8PShD T1JCQTo6QW55JiBfYSwgQ29zTmFtaW5nOjpCaW5kaW5nSXRlcmF0b3JfcHRyIF9zKTsKdm9pZCBv cGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgQ29zTmFtaW5nOjpCaW5kaW5nSXRlcmF0b3JfcHRy KiBfcyk7CkNPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBD b3NOYW1pbmc6OkJpbmRpbmdJdGVyYXRvcl9wdHImIF9zKTsKCnZvaWQgb3BlcmF0b3I8PD0oQ09S QkE6OkFueSYgX2EsIGNvbnN0IENvc05hbWluZzo6TmFtaW5nQ29udGV4dEV4dDo6SW52YWxpZEFk ZHJlc3MmIF9zKTsKdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55JiBfYSwgY29uc3QgQ29zTmFt aW5nOjpOYW1pbmdDb250ZXh0RXh0OjpJbnZhbGlkQWRkcmVzcyogX3NwKTsKQ09SQkE6OkJvb2xl YW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IENvc05hbWluZzo6TmFt aW5nQ29udGV4dEV4dDo6SW52YWxpZEFkZHJlc3MqJiBfc3ApOwoKdm9pZCBvcGVyYXRvcjw8PShD T1JCQTo6QW55JiBfYSwgQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0RXh0X3B0ciBfcyk7CnZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIENvc05hbWluZzo6TmFtaW5nQ29udGV4dEV4dF9w dHIqIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+Pj0oY29uc3QgQ09SQkE6OkFueSYgX2Es IENvc05hbWluZzo6TmFtaW5nQ29udGV4dEV4dF9wdHImIF9zKTsKCmlubGluZSBzaXplX3QKQ29z TmFtaW5nOjpOYW1pbmdDb250ZXh0OjpfYWxpZ25lZFNpemUoQ29zTmFtaW5nOjpOYW1pbmdDb250 ZXh0X3B0ciBvYmosIHNpemVfdCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpS ZWYob2JqLCBfUERfcmVwb0lkLCA0MCwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ29zTmFtaW5n OjpOYW1pbmdDb250ZXh0OjpfbWFyc2hhbE9ialJlZihDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHRf cHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihv YmosIF9QRF9yZXBvSWQsIDQwLCBzKTsKfQoKaW5saW5lIHZvaWQKQ29zTmFtaW5nOjpOYW1pbmdD b250ZXh0OjpfbWFyc2hhbE9ialJlZihDb3NOYW1pbmc6Ok5hbWluZ0NvbnRleHRfcHRyIG9iaiwg TWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9y ZXBvSWQsIDQwLCBzKTsKfQoKaW5saW5lIHNpemVfdApDb3NOYW1pbmc6OkJpbmRpbmdJdGVyYXRv cjo6X2FsaWduZWRTaXplKENvc05hbWluZzo6QmluZGluZ0l0ZXJhdG9yX3B0ciBvYmosIHNpemVf dCBvZmZzZXQpIHsKICByZXR1cm4gQ09SQkE6OkFsaWduZWRPYmpSZWYob2JqLCBfUERfcmVwb0lk LCA0Miwgb2Zmc2V0KTsKfQoKaW5saW5lIHZvaWQKQ29zTmFtaW5nOjpCaW5kaW5nSXRlcmF0b3I6 Ol9tYXJzaGFsT2JqUmVmKENvc05hbWluZzo6QmluZGluZ0l0ZXJhdG9yX3B0ciBvYmosIE5ldEJ1 ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lk LCA0Miwgcyk7Cn0KCmlubGluZSB2b2lkCkNvc05hbWluZzo6QmluZGluZ0l0ZXJhdG9yOjpfbWFy c2hhbE9ialJlZihDb3NOYW1pbmc6OkJpbmRpbmdJdGVyYXRvcl9wdHIgb2JqLCBNZW1CdWZmZXJl ZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgNDIs IHMpOwp9CgppbmxpbmUgc2l6ZV90CkNvc05hbWluZzo6TmFtaW5nQ29udGV4dEV4dDo6X2FsaWdu ZWRTaXplKENvc05hbWluZzo6TmFtaW5nQ29udGV4dEV4dF9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0 KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgNDMsIG9m ZnNldCk7Cn0KCmlubGluZSB2b2lkCkNvc05hbWluZzo6TmFtaW5nQ29udGV4dEV4dDo6X21hcnNo YWxPYmpSZWYoQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0RXh0X3B0ciBvYmosIE5ldEJ1ZmZlcmVk U3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0Mywg cyk7Cn0KCmlubGluZSB2b2lkCkNvc05hbWluZzo6TmFtaW5nQ29udGV4dEV4dDo6X21hcnNoYWxP YmpSZWYoQ29zTmFtaW5nOjpOYW1pbmdDb250ZXh0RXh0X3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3Ry ZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCA0Mywgcyk7 Cn0KIyAyNjc2ICIvdXNyL2xvY2FsL2luY2x1ZGUvb21uaU9SQjMvQ09SQkEuaCIgMiAzCiMgMTEg Ii4uLy4uL2luY2x1ZGUvV2Fyc2F3L1RlbGx0YWxlLmhoIiAyCiMgMjIgIi4uLy4uL2luY2x1ZGUv V2Fyc2F3L1RlbGx0YWxlLmhoIgojIDEgIi4uLy4uL2luY2x1ZGUvV2Fyc2F3L1R5cGVzLmhoIiAx CiMgNDkgIi4uLy4uL2luY2x1ZGUvV2Fyc2F3L1R5cGVzLmhoIgpuYW1lc3BhY2UgV2Fyc2F3Cgp7 CgogIGV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19UYWc7CgogIHR5cGVkZWYg Q09SQkE6OlVMb25nIFRhZzsKCiAgZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3Rj X0Nvb3JkOwoKICB0eXBlZGVmIENPUkJBOjpEb3VibGUgQ29vcmQ7CgogIGV4dGVybiBjb25zdCBD T1JCQTo6VHlwZUNvZGVfcHRyIF90Y19QaXhlbENvb3JkOwoKICB0eXBlZGVmIENPUkJBOjpMb25n IFBpeGVsQ29vcmQ7CgogIGVudW0gQXhpcyB7IHhheGlzLCB5YXhpcywgemF4aXMgfTsKICB0eXBl ZGVmIEF4aXMmIEF4aXNfb3V0OwoKICBleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBf dGNfQXhpczsKCiAgc3RydWN0IFZlcnRleCB7CiAgICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBl X0ZpeF9WYXI8VmVydGV4PiBfdmFyX3R5cGU7CgogICAgQ29vcmQgeDsKCiAgICBDb29yZCB5OwoK ICAgIENvb3JkIHo7CgogICAgc2l6ZV90IF9OUF9hbGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9m ZnNldCkgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBj b25zdDsKICAgIHZvaWQgb3BlcmF0b3I8PD0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpOwogICAgdm9p ZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJh dG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsKICB9OwoKICB0eXBlZGVmIFZlcnRleDo6X3Zh cl90eXBlIFZlcnRleF92YXI7CgogIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfRml4X09VVF9h cmc8IFZlcnRleCxWZXJ0ZXhfdmFyID4gVmVydGV4X291dDsKCiAgZXh0ZXJuIGNvbnN0IENPUkJB OjpUeXBlQ29kZV9wdHIgX3RjX1ZlcnRleDsKCiAgZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29k ZV9wdHIgX3RjX1ZlcnRpY2VzOwoKICBjbGFzcyBWZXJ0aWNlc192YXI7CgogIGNsYXNzIFZlcnRp Y2VzIDogcHVibGljIF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFZlcnRleD4gewogIHB1Ymxp YzoKICAgIHR5cGVkZWYgVmVydGljZXNfdmFyIF92YXJfdHlwZTsKICAgIGlubGluZSBWZXJ0aWNl cygpIHt9CiAgICBpbmxpbmUgVmVydGljZXMoY29uc3QgVmVydGljZXMmIHMpCiAgICAgIDogX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgVmVydGV4PiAocykge30KCiAgICBpbmxpbmUgVmVydGlj ZXMoX0NPUkJBX1VMb25nIF9tYXgpCiAgICAgIDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwg VmVydGV4PiAoX21heCkge30KICAgIGlubGluZSBWZXJ0aWNlcyhfQ09SQkFfVUxvbmcgX21heCwg X0NPUkJBX1VMb25nIF9sZW4sIFZlcnRleCogX3ZhbCwgX0NPUkJBX0Jvb2xlYW4gX3JlbD0wKQog ICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFZlcnRleD4gKF9tYXgsIF9sZW4sIF92 YWwsIF9yZWwpIHt9CgogICAgaW5saW5lIFZlcnRpY2VzJiBvcGVyYXRvciA9IChjb25zdCBWZXJ0 aWNlcyYgcykgewogICAgICBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBWZXJ0ZXg+IDo6b3Bl cmF0b3I9KHMpOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgfTsKCiAgY2xhc3MgVmVydGlj ZXNfb3V0OwoKICBjbGFzcyBWZXJ0aWNlc192YXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgVmVy dGljZXMgVDsKICAgIHR5cGVkZWYgVmVydGljZXNfdmFyIFRfdmFyOwoKICAgIGlubGluZSBWZXJ0 aWNlc192YXIoKSA6IF9wZF9zZXEoMCkge30KICAgIGlubGluZSBWZXJ0aWNlc192YXIoVCogcykg OiBfcGRfc2VxKHMpIHt9CiAgICBpbmxpbmUgVmVydGljZXNfdmFyKGNvbnN0IFRfdmFyJiBzKSB7 CiAgICAgIGlmKCBzLl9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQoKnMuX3BkX3NlcSk7CiAgICAg IGVsc2UgX3BkX3NlcSA9IDA7CiAgICB9CiAgICBpbmxpbmUgflZlcnRpY2VzX3ZhcigpIHsgaWYo IF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsgfQoKICAgIGlubGluZSBUX3ZhciYgb3BlcmF0b3Ig PSAoVCogcykgewogICAgICBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOwogICAgICBfcGRf c2VxID0gczsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgaW5saW5lIFRfdmFyJiBvcGVy YXRvciA9IChjb25zdCBUX3ZhciYgcykgewogICAgICBpZiggcy5fcGRfc2VxICkgewogICAgICAg IGlmKCAhX3BkX3NlcSApIF9wZF9zZXEgPSBuZXcgVDsKICAgICAgICAqX3BkX3NlcSA9ICpzLl9w ZF9zZXE7CiAgICAgIH0gZWxzZSBpZiggX3BkX3NlcSApIHsKICAgICAgICBkZWxldGUgX3BkX3Nl cTsKICAgICAgICBfcGRfc2VxID0gMDsKICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9 CgogICAgaW5saW5lIFZlcnRleCYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICAg IHJldHVybiAoKl9wZF9zZXEpW3NdOwogICAgfQoKICAgIGlubGluZSBUKiBvcGVyYXRvciAtPiAo KSB7IHJldHVybiBfcGRfc2VxOyB9CgoKCiAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkg Y29uc3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICAgIGlubGluZSBvcGVyYXRvciBUJiAoKSB7IHJl dHVybiAqX3BkX3NlcTsgfQoKCiAgICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVy biAqX3BkX3NlcTsgfQogICAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0K ICAgIGlubGluZSBUKiYgb3V0KCkgewogICAgICBpZiggX3BkX3NlcSApIHsgZGVsZXRlIF9wZF9z ZXE7IF9wZF9zZXEgPSAwOyB9CiAgICAgIHJldHVybiBfcGRfc2VxOwogICAgfQogICAgaW5saW5l IFQqIF9yZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsg fQoKICAgIGZyaWVuZCBjbGFzcyBWZXJ0aWNlc19vdXQ7CgogIHByaXZhdGU6CiAgICBUKiBfcGRf c2VxOwogIH07CgogIGNsYXNzIFZlcnRpY2VzX291dCB7CiAgcHVibGljOgogICAgdHlwZWRlZiBW ZXJ0aWNlcyBUOwogICAgdHlwZWRlZiBWZXJ0aWNlc192YXIgVF92YXI7CgogICAgaW5saW5lIFZl cnRpY2VzX291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsgfQogICAgaW5saW5lIFZl cnRpY2VzX291dChUX3ZhciYgcykKICAgICAgOiBfZGF0YShzLl9wZF9zZXEpIHsgcyA9IChUKikg MDsgfQogICAgaW5saW5lIFZlcnRpY2VzX291dChjb25zdCBWZXJ0aWNlc19vdXQmIHMpIDogX2Rh dGEocy5fZGF0YSkge30KICAgIGlubGluZSBWZXJ0aWNlc19vdXQmIG9wZXJhdG9yID0gKGNvbnN0 IFZlcnRpY2VzX291dCYgcykgewogICAgICBfZGF0YSA9IHMuX2RhdGE7CiAgICAgIHJldHVybiAq dGhpczsKICAgIH0gaW5saW5lIFZlcnRpY2VzX291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAg ICBfZGF0YSA9IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGlubGluZSBvcGVyYXRv ciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQogICAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVybiBf ZGF0YTsgfQogICAgaW5saW5lIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICAg IGlubGluZSBWZXJ0ZXgmIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgICByZXR1 cm4gKCpfZGF0YSlbaV07CiAgICB9CgogICAgVComIF9kYXRhOwoKICBwcml2YXRlOgogICAgVmVy dGljZXNfb3V0KCk7CiAgICBWZXJ0aWNlc19vdXQmIG9wZXJhdG9yPShjb25zdCBUX3ZhciYpOwog IH07CgogIHN0cnVjdCBUZXhDb29yZCB7CiAgICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBlX0Zp eF9WYXI8VGV4Q29vcmQ+IF92YXJfdHlwZTsKCiAgICBDb29yZCB1OwoKICAgIENvb3JkIHY7Cgog ICAgQ29vcmQgdzsKCiAgICBzaXplX3QgX05QX2FsaWduZWRTaXplKHNpemVfdCBpbml0aWFsb2Zm c2V0KSBjb25zdDsKICAgIHZvaWQgb3BlcmF0b3I+Pj0gKE5ldEJ1ZmZlcmVkU3RyZWFtICYpIGNv bnN0OwogICAgdm9pZCBvcGVyYXRvcjw8PSAoTmV0QnVmZmVyZWRTdHJlYW0gJik7CiAgICB2b2lk IG9wZXJhdG9yPj49IChNZW1CdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICAgIHZvaWQgb3BlcmF0 b3I8PD0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpOwogIH07CgogIHR5cGVkZWYgVGV4Q29vcmQ6Ol92 YXJfdHlwZSBUZXhDb29yZF92YXI7CgogIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfRml4X09V VF9hcmc8IFRleENvb3JkLFRleENvb3JkX3ZhciA+IFRleENvb3JkX291dDsKCiAgZXh0ZXJuIGNv bnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX1RleENvb3JkOwoKICBleHRlcm4gY29uc3QgQ09S QkE6OlR5cGVDb2RlX3B0ciBfdGNfVGV4Q29vcmRzOwoKICBjbGFzcyBUZXhDb29yZHNfdmFyOwoK ICBjbGFzcyBUZXhDb29yZHMgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgVGV4 Q29vcmQ+IHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIFRleENvb3Jkc192YXIgX3Zhcl90eXBlOwog ICAgaW5saW5lIFRleENvb3JkcygpIHt9CiAgICBpbmxpbmUgVGV4Q29vcmRzKGNvbnN0IFRleENv b3JkcyYgcykKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBUZXhDb29yZD4gKHMp IHt9CgogICAgaW5saW5lIFRleENvb3JkcyhfQ09SQkFfVUxvbmcgX21heCkKICAgICAgOiBfQ09S QkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBUZXhDb29yZD4gKF9tYXgpIHt9CiAgICBpbmxpbmUgVGV4 Q29vcmRzKF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFfVUxvbmcgX2xlbiwgVGV4Q29vcmQqIF92 YWwsIF9DT1JCQV9Cb29sZWFuIF9yZWw9MCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVkX1NlcXVl bmNlPCBUZXhDb29yZD4gKF9tYXgsIF9sZW4sIF92YWwsIF9yZWwpIHt9CgogICAgaW5saW5lIFRl eENvb3JkcyYgb3BlcmF0b3IgPSAoY29uc3QgVGV4Q29vcmRzJiBzKSB7CiAgICAgIF9DT1JCQV9V bmJvdW5kZWRfU2VxdWVuY2U8IFRleENvb3JkPiA6Om9wZXJhdG9yPShzKTsKICAgICAgcmV0dXJu ICp0aGlzOwogICAgfQogIH07CgogIGNsYXNzIFRleENvb3Jkc19vdXQ7CgogIGNsYXNzIFRleENv b3Jkc192YXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgVGV4Q29vcmRzIFQ7CiAgICB0eXBlZGVm IFRleENvb3Jkc192YXIgVF92YXI7CgogICAgaW5saW5lIFRleENvb3Jkc192YXIoKSA6IF9wZF9z ZXEoMCkge30KICAgIGlubGluZSBUZXhDb29yZHNfdmFyKFQqIHMpIDogX3BkX3NlcShzKSB7fQog ICAgaW5saW5lIFRleENvb3Jkc192YXIoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYoIHMuX3Bk X3NlcSApIF9wZF9zZXEgPSBuZXcgVCgqcy5fcGRfc2VxKTsKICAgICAgZWxzZSBfcGRfc2VxID0g MDsKICAgIH0KICAgIGlubGluZSB+VGV4Q29vcmRzX3ZhcigpIHsgaWYoIF9wZF9zZXEgKSBkZWxl dGUgX3BkX3NlcTsgfQoKICAgIGlubGluZSBUX3ZhciYgb3BlcmF0b3IgPSAoVCogcykgewogICAg ICBpZiggX3BkX3NlcSApIGRlbGV0ZSBfcGRfc2VxOwogICAgICBfcGRfc2VxID0gczsKICAgICAg cmV0dXJuICp0aGlzOwogICAgfQogICAgaW5saW5lIFRfdmFyJiBvcGVyYXRvciA9IChjb25zdCBU X3ZhciYgcykgewogICAgICBpZiggcy5fcGRfc2VxICkgewogICAgICAgIGlmKCAhX3BkX3NlcSAp IF9wZF9zZXEgPSBuZXcgVDsKICAgICAgICAqX3BkX3NlcSA9ICpzLl9wZF9zZXE7CiAgICAgIH0g ZWxzZSBpZiggX3BkX3NlcSApIHsKICAgICAgICBkZWxldGUgX3BkX3NlcTsKICAgICAgICBfcGRf c2VxID0gMDsKICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgaW5saW5lIFRl eENvb3JkJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIHMpIHsKICAgICAgcmV0dXJuICgqX3Bk X3NlcSlbc107CiAgICB9CgogICAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsgcmV0dXJuIF9w ZF9zZXE7IH0KCgoKICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVy biAqX3BkX3NlcTsgfQogICAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJuICpfcGRfc2Vx OyB9CgoKICAgIGlubGluZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJuICpfcGRfc2VxOyB9 CiAgICBpbmxpbmUgVCYgaW5vdXQoKSB7IHJldHVybiAqX3BkX3NlcTsgfQogICAgaW5saW5lIFQq JiBvdXQoKSB7CiAgICAgIGlmKCBfcGRfc2VxICkgeyBkZWxldGUgX3BkX3NlcTsgX3BkX3NlcSA9 IDA7IH0KICAgICAgcmV0dXJuIF9wZF9zZXE7CiAgICB9CiAgICBpbmxpbmUgVCogX3JldG4oKSB7 IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9CgogICAgZnJpZW5k IGNsYXNzIFRleENvb3Jkc19vdXQ7CgogIHByaXZhdGU6CiAgICBUKiBfcGRfc2VxOwogIH07Cgog IGNsYXNzIFRleENvb3Jkc19vdXQgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgVGV4Q29vcmRzIFQ7 CiAgICB0eXBlZGVmIFRleENvb3Jkc192YXIgVF92YXI7CgogICAgaW5saW5lIFRleENvb3Jkc19v dXQoVComIHMpIDogX2RhdGEocykgeyBfZGF0YSA9IDA7IH0KICAgIGlubGluZSBUZXhDb29yZHNf b3V0KFRfdmFyJiBzKQogICAgICA6IF9kYXRhKHMuX3BkX3NlcSkgeyBzID0gKFQqKSAwOyB9CiAg ICBpbmxpbmUgVGV4Q29vcmRzX291dChjb25zdCBUZXhDb29yZHNfb3V0JiBzKSA6IF9kYXRhKHMu X2RhdGEpIHt9CiAgICBpbmxpbmUgVGV4Q29vcmRzX291dCYgb3BlcmF0b3IgPSAoY29uc3QgVGV4 Q29vcmRzX291dCYgcykgewogICAgICBfZGF0YSA9IHMuX2RhdGE7CiAgICAgIHJldHVybiAqdGhp czsKICAgIH0gaW5saW5lIFRleENvb3Jkc19vdXQmIG9wZXJhdG9yID0gKFQqIHMpIHsKICAgICAg X2RhdGEgPSBzOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBpbmxpbmUgb3BlcmF0b3Ig VComKCkgeyByZXR1cm4gX2RhdGE7IH0KICAgIGlubGluZSBUKiYgcHRyKCkgeyByZXR1cm4gX2Rh dGE7IH0KICAgIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7IH0KCiAgICBp bmxpbmUgVGV4Q29vcmQmIG9wZXJhdG9yIFtdIChfQ09SQkFfVUxvbmcgaSkgewogICAgICByZXR1 cm4gKCpfZGF0YSlbaV07CiAgICB9CgogICAgVComIF9kYXRhOwoKICBwcml2YXRlOgogICAgVGV4 Q29vcmRzX291dCgpOwogICAgVGV4Q29vcmRzX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJik7 CiAgfTsKCiAgZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX0FsaWdubWVudDsK CiAgdHlwZWRlZiBDT1JCQTo6RG91YmxlIEFsaWdubWVudDsKCiAgc3RydWN0IENvbG9yIHsKICAg IHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfRml4X1ZhcjxDb2xvcj4gX3Zhcl90eXBlOwoKICAg IENPUkJBOjpEb3VibGUgcmVkOwoKICAgIENPUkJBOjpEb3VibGUgZ3JlZW47CgogICAgQ09SQkE6 OkRvdWJsZSBibHVlOwoKICAgIENPUkJBOjpEb3VibGUgYWxwaGE7CgogICAgc2l6ZV90IF9OUF9h bGlnbmVkU2l6ZShzaXplX3QgaW5pdGlhbG9mZnNldCkgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9y Pj49IChOZXRCdWZmZXJlZFN0cmVhbSAmKSBjb25zdDsKICAgIHZvaWQgb3BlcmF0b3I8PD0gKE5l dEJ1ZmZlcmVkU3RyZWFtICYpOwogICAgdm9pZCBvcGVyYXRvcj4+PSAoTWVtQnVmZmVyZWRTdHJl YW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChNZW1CdWZmZXJlZFN0cmVhbSAmKTsK ICB9OwoKICB0eXBlZGVmIENvbG9yOjpfdmFyX3R5cGUgQ29sb3JfdmFyOwoKICB0eXBlZGVmIF9D T1JCQV9Db25zdHJUeXBlX0ZpeF9PVVRfYXJnPCBDb2xvcixDb2xvcl92YXIgPiBDb2xvcl9vdXQ7 CgogIGV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Db2xvcjsKCiAgZXh0ZXJu IGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX1BhdGg7CgogIHR5cGVkZWYgVmVydGljZXMg UGF0aDsKICB0eXBlZGVmIFZlcnRpY2VzX3ZhciBQYXRoX3ZhcjsKICB0eXBlZGVmIFZlcnRpY2Vz X291dCBQYXRoX291dDsKCiAgc3RydWN0IFRyaWFuZ2xlIHsKICAgIHR5cGVkZWYgX0NPUkJBX0Nv bnN0clR5cGVfRml4X1ZhcjxUcmlhbmdsZT4gX3Zhcl90eXBlOwoKICAgIENPUkJBOjpMb25nIGE7 CgogICAgQ09SQkE6OkxvbmcgYjsKCiAgICBDT1JCQTo6TG9uZyBjOwoKICAgIHNpemVfdCBfTlBf YWxpZ25lZFNpemUoc2l6ZV90IGluaXRpYWxvZmZzZXQpIGNvbnN0OwogICAgdm9pZCBvcGVyYXRv cj4+PSAoTmV0QnVmZmVyZWRTdHJlYW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChO ZXRCdWZmZXJlZFN0cmVhbSAmKTsKICAgIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3Ry ZWFtICYpIGNvbnN0OwogICAgdm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJik7 CiAgfTsKCiAgdHlwZWRlZiBUcmlhbmdsZTo6X3Zhcl90eXBlIFRyaWFuZ2xlX3ZhcjsKCiAgdHlw ZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9GaXhfT1VUX2FyZzwgVHJpYW5nbGUsVHJpYW5nbGVfdmFy ID4gVHJpYW5nbGVfb3V0OwoKICBleHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNf VHJpYW5nbGU7CgogIGV4dGVybiBjb25zdCBDT1JCQTo6VHlwZUNvZGVfcHRyIF90Y19Ucmlhbmds ZVNlcTsKCiAgY2xhc3MgVHJpYW5nbGVTZXFfdmFyOwoKICBjbGFzcyBUcmlhbmdsZVNlcSA6IHB1 YmxpYyBfQ09SQkFfVW5ib3VuZGVkX1NlcXVlbmNlPCBUcmlhbmdsZT4gewogIHB1YmxpYzoKICAg IHR5cGVkZWYgVHJpYW5nbGVTZXFfdmFyIF92YXJfdHlwZTsKICAgIGlubGluZSBUcmlhbmdsZVNl cSgpIHt9CiAgICBpbmxpbmUgVHJpYW5nbGVTZXEoY29uc3QgVHJpYW5nbGVTZXEmIHMpCiAgICAg IDogX0NPUkJBX1VuYm91bmRlZF9TZXF1ZW5jZTwgVHJpYW5nbGU+IChzKSB7fQoKICAgIGlubGlu ZSBUcmlhbmdsZVNlcShfQ09SQkFfVUxvbmcgX21heCkKICAgICAgOiBfQ09SQkFfVW5ib3VuZGVk X1NlcXVlbmNlPCBUcmlhbmdsZT4gKF9tYXgpIHt9CiAgICBpbmxpbmUgVHJpYW5nbGVTZXEoX0NP UkJBX1VMb25nIF9tYXgsIF9DT1JCQV9VTG9uZyBfbGVuLCBUcmlhbmdsZSogX3ZhbCwgX0NPUkJB X0Jvb2xlYW4gX3JlbD0wKQogICAgICA6IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2U8IFRyaWFu Z2xlPiAoX21heCwgX2xlbiwgX3ZhbCwgX3JlbCkge30KCiAgICBpbmxpbmUgVHJpYW5nbGVTZXEm IG9wZXJhdG9yID0gKGNvbnN0IFRyaWFuZ2xlU2VxJiBzKSB7CiAgICAgIF9DT1JCQV9VbmJvdW5k ZWRfU2VxdWVuY2U8IFRyaWFuZ2xlPiA6Om9wZXJhdG9yPShzKTsKICAgICAgcmV0dXJuICp0aGlz OwogICAgfQogIH07CgogIGNsYXNzIFRyaWFuZ2xlU2VxX291dDsKCiAgY2xhc3MgVHJpYW5nbGVT ZXFfdmFyIHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIFRyaWFuZ2xlU2VxIFQ7CiAgICB0eXBlZGVm IFRyaWFuZ2xlU2VxX3ZhciBUX3ZhcjsKCiAgICBpbmxpbmUgVHJpYW5nbGVTZXFfdmFyKCkgOiBf cGRfc2VxKDApIHt9CiAgICBpbmxpbmUgVHJpYW5nbGVTZXFfdmFyKFQqIHMpIDogX3BkX3NlcShz KSB7fQogICAgaW5saW5lIFRyaWFuZ2xlU2VxX3Zhcihjb25zdCBUX3ZhciYgcykgewogICAgICBp Ziggcy5fcGRfc2VxICkgX3BkX3NlcSA9IG5ldyBUKCpzLl9wZF9zZXEpOwogICAgICBlbHNlIF9w ZF9zZXEgPSAwOwogICAgfQogICAgaW5saW5lIH5UcmlhbmdsZVNlcV92YXIoKSB7IGlmKCBfcGRf c2VxICkgZGVsZXRlIF9wZF9zZXE7IH0KCiAgICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQq IHMpIHsKICAgICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgICAgX3BkX3NlcSA9 IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGlubGluZSBUX3ZhciYgb3BlcmF0b3Ig PSAoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYoIHMuX3BkX3NlcSApIHsKICAgICAgICBpZigg IV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICAgKl9wZF9zZXEgPSAqcy5fcGRfc2Vx OwogICAgICB9IGVsc2UgaWYoIF9wZF9zZXEgKSB7CiAgICAgICAgZGVsZXRlIF9wZF9zZXE7CiAg ICAgICAgX3BkX3NlcSA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAg IGlubGluZSBUcmlhbmdsZSYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBzKSB7CiAgICAgIHJl dHVybiAoKl9wZF9zZXEpW3NdOwogICAgfQoKICAgIGlubGluZSBUKiBvcGVyYXRvciAtPiAoKSB7 IHJldHVybiBfcGRfc2VxOyB9CgoKCiAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgVCYgKCkgY29u c3QgeyByZXR1cm4gKl9wZF9zZXE7IH0KICAgIGlubGluZSBvcGVyYXRvciBUJiAoKSB7IHJldHVy biAqX3BkX3NlcTsgfQoKCiAgICBpbmxpbmUgY29uc3QgVCYgaW4oKSBjb25zdCB7IHJldHVybiAq X3BkX3NlcTsgfQogICAgaW5saW5lIFQmIGlub3V0KCkgeyByZXR1cm4gKl9wZF9zZXE7IH0KICAg IGlubGluZSBUKiYgb3V0KCkgewogICAgICBpZiggX3BkX3NlcSApIHsgZGVsZXRlIF9wZF9zZXE7 IF9wZF9zZXEgPSAwOyB9CiAgICAgIHJldHVybiBfcGRfc2VxOwogICAgfQogICAgaW5saW5lIFQq IF9yZXRuKCkgeyBUKiB0bXAgPSBfcGRfc2VxOyBfcGRfc2VxID0gMDsgcmV0dXJuIHRtcDsgfQoK ICAgIGZyaWVuZCBjbGFzcyBUcmlhbmdsZVNlcV9vdXQ7CgogIHByaXZhdGU6CiAgICBUKiBfcGRf c2VxOwogIH07CgogIGNsYXNzIFRyaWFuZ2xlU2VxX291dCB7CiAgcHVibGljOgogICAgdHlwZWRl ZiBUcmlhbmdsZVNlcSBUOwogICAgdHlwZWRlZiBUcmlhbmdsZVNlcV92YXIgVF92YXI7CgogICAg aW5saW5lIFRyaWFuZ2xlU2VxX291dChUKiYgcykgOiBfZGF0YShzKSB7IF9kYXRhID0gMDsgfQog ICAgaW5saW5lIFRyaWFuZ2xlU2VxX291dChUX3ZhciYgcykKICAgICAgOiBfZGF0YShzLl9wZF9z ZXEpIHsgcyA9IChUKikgMDsgfQogICAgaW5saW5lIFRyaWFuZ2xlU2VxX291dChjb25zdCBUcmlh bmdsZVNlcV9vdXQmIHMpIDogX2RhdGEocy5fZGF0YSkge30KICAgIGlubGluZSBUcmlhbmdsZVNl cV9vdXQmIG9wZXJhdG9yID0gKGNvbnN0IFRyaWFuZ2xlU2VxX291dCYgcykgewogICAgICBfZGF0 YSA9IHMuX2RhdGE7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0gaW5saW5lIFRyaWFuZ2xlU2Vx X291dCYgb3BlcmF0b3IgPSAoVCogcykgewogICAgICBfZGF0YSA9IHM7CiAgICAgIHJldHVybiAq dGhpczsKICAgIH0KICAgIGlubGluZSBvcGVyYXRvciBUKiYoKSB7IHJldHVybiBfZGF0YTsgfQog ICAgaW5saW5lIFQqJiBwdHIoKSB7IHJldHVybiBfZGF0YTsgfQogICAgaW5saW5lIFQqIG9wZXJh dG9yLT4oKSB7IHJldHVybiBfZGF0YTsgfQoKICAgIGlubGluZSBUcmlhbmdsZSYgb3BlcmF0b3Ig W10gKF9DT1JCQV9VTG9uZyBpKSB7CiAgICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICAgIH0KCiAg ICBUKiYgX2RhdGE7CgogIHByaXZhdGU6CiAgICBUcmlhbmdsZVNlcV9vdXQoKTsKICAgIFRyaWFu Z2xlU2VxX291dCYgb3BlcmF0b3I9KGNvbnN0IFRfdmFyJik7CiAgfTsKCiAgc3RydWN0IE1lc2gg ewogICAgdHlwZWRlZiBfQ09SQkFfQ29uc3RyVHlwZV9WYXJpYWJsZV9WYXI8TWVzaD4gX3Zhcl90 eXBlOwoKICAgIFZlcnRpY2VzIG5vZGVzOwoKICAgIFRyaWFuZ2xlU2VxIHRyaWFuZ2xlczsKCiAg ICBWZXJ0aWNlcyBub3JtYWxzOwoKICAgIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90IGlu aXRpYWxvZmZzZXQpIGNvbnN0OwogICAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRTdHJl YW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAmKTsK ICAgIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpIGNvbnN0OwogICAgdm9p ZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJik7CiAgfTsKCiAgdHlwZWRlZiBNZXNo OjpfdmFyX3R5cGUgTWVzaF92YXI7CgogIHR5cGVkZWYgX0NPUkJBX0NvbnN0clR5cGVfVmFyaWFi bGVfT1VUX2FyZzwgTWVzaCxNZXNoX3ZhciA+IE1lc2hfb3V0OwoKICBleHRlcm4gY29uc3QgQ09S QkE6OlR5cGVDb2RlX3B0ciBfdGNfTWVzaDsKCiAgZXh0ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29k ZV9wdHIgX3RjX1VuaWNoYXI7CgogIHR5cGVkZWYgQ09SQkE6OlVTaG9ydCBVbmljaGFyOwoKICBl eHRlcm4gY29uc3QgQ09SQkE6OlR5cGVDb2RlX3B0ciBfdGNfVW5pc3RyaW5nOwoKICBjbGFzcyBV bmlzdHJpbmdfdmFyOwoKICBjbGFzcyBVbmlzdHJpbmcgOiBwdWJsaWMgX0NPUkJBX1VuYm91bmRl ZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PCBVbmljaGFyLCAyLCAyPiB7CiAgcHVibGljOgog ICAgdHlwZWRlZiBVbmlzdHJpbmdfdmFyIF92YXJfdHlwZTsKICAgIGlubGluZSBVbmlzdHJpbmco KSB7fQogICAgaW5saW5lIFVuaXN0cmluZyhjb25zdCBVbmlzdHJpbmcmIHMpCiAgICAgIDogX0NP UkJBX1VuYm91bmRlZF9TZXF1ZW5jZV93X0ZpeFNpemVFbGVtZW50PCBVbmljaGFyLCAyLCAyPiAo cykge30KCiAgICBpbmxpbmUgVW5pc3RyaW5nKF9DT1JCQV9VTG9uZyBfbWF4KQogICAgICA6IF9D T1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDwgVW5pY2hhciwgMiwgMj4g KF9tYXgpIHt9CiAgICBpbmxpbmUgVW5pc3RyaW5nKF9DT1JCQV9VTG9uZyBfbWF4LCBfQ09SQkFf VUxvbmcgX2xlbiwgVW5pY2hhciogX3ZhbCwgX0NPUkJBX0Jvb2xlYW4gX3JlbD0wKQogICAgICA6 IF9DT1JCQV9VbmJvdW5kZWRfU2VxdWVuY2Vfd19GaXhTaXplRWxlbWVudDwgVW5pY2hhciwgMiwg Mj4gKF9tYXgsIF9sZW4sIF92YWwsIF9yZWwpIHt9CgogICAgaW5saW5lIFVuaXN0cmluZyYgb3Bl cmF0b3IgPSAoY29uc3QgVW5pc3RyaW5nJiBzKSB7CiAgICAgIF9DT1JCQV9VbmJvdW5kZWRfU2Vx dWVuY2Vfd19GaXhTaXplRWxlbWVudDwgVW5pY2hhciwgMiwgMj4gOjpvcGVyYXRvcj0ocyk7CiAg ICAgIHJldHVybiAqdGhpczsKICAgIH0KICB9OwoKICBjbGFzcyBVbmlzdHJpbmdfb3V0OwoKICBj bGFzcyBVbmlzdHJpbmdfdmFyIHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIFVuaXN0cmluZyBUOwog ICAgdHlwZWRlZiBVbmlzdHJpbmdfdmFyIFRfdmFyOwoKICAgIGlubGluZSBVbmlzdHJpbmdfdmFy KCkgOiBfcGRfc2VxKDApIHt9CiAgICBpbmxpbmUgVW5pc3RyaW5nX3ZhcihUKiBzKSA6IF9wZF9z ZXEocykge30KICAgIGlubGluZSBVbmlzdHJpbmdfdmFyKGNvbnN0IFRfdmFyJiBzKSB7CiAgICAg IGlmKCBzLl9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQoKnMuX3BkX3NlcSk7CiAgICAgIGVsc2Ug X3BkX3NlcSA9IDA7CiAgICB9CiAgICBpbmxpbmUgflVuaXN0cmluZ192YXIoKSB7IGlmKCBfcGRf c2VxICkgZGVsZXRlIF9wZF9zZXE7IH0KCiAgICBpbmxpbmUgVF92YXImIG9wZXJhdG9yID0gKFQq IHMpIHsKICAgICAgaWYoIF9wZF9zZXEgKSBkZWxldGUgX3BkX3NlcTsKICAgICAgX3BkX3NlcSA9 IHM7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGlubGluZSBUX3ZhciYgb3BlcmF0b3Ig PSAoY29uc3QgVF92YXImIHMpIHsKICAgICAgaWYoIHMuX3BkX3NlcSApIHsKICAgICAgICBpZigg IV9wZF9zZXEgKSBfcGRfc2VxID0gbmV3IFQ7CiAgICAgICAgKl9wZF9zZXEgPSAqcy5fcGRfc2Vx OwogICAgICB9IGVsc2UgaWYoIF9wZF9zZXEgKSB7CiAgICAgICAgZGVsZXRlIF9wZF9zZXE7CiAg ICAgICAgX3BkX3NlcSA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAg IGlubGluZSBVbmljaGFyJiBvcGVyYXRvciBbXSAoX0NPUkJBX1VMb25nIHMpIHsKICAgICAgcmV0 dXJuICgqX3BkX3NlcSlbc107CiAgICB9CgogICAgaW5saW5lIFQqIG9wZXJhdG9yIC0+ICgpIHsg cmV0dXJuIF9wZF9zZXE7IH0KCgoKICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBjb25z dCB7IHJldHVybiAqX3BkX3NlcTsgfQogICAgaW5saW5lIG9wZXJhdG9yIFQmICgpIHsgcmV0dXJu ICpfcGRfc2VxOyB9CgoKICAgIGlubGluZSBjb25zdCBUJiBpbigpIGNvbnN0IHsgcmV0dXJuICpf cGRfc2VxOyB9CiAgICBpbmxpbmUgVCYgaW5vdXQoKSB7IHJldHVybiAqX3BkX3NlcTsgfQogICAg aW5saW5lIFQqJiBvdXQoKSB7CiAgICAgIGlmKCBfcGRfc2VxICkgeyBkZWxldGUgX3BkX3NlcTsg X3BkX3NlcSA9IDA7IH0KICAgICAgcmV0dXJuIF9wZF9zZXE7CiAgICB9CiAgICBpbmxpbmUgVCog X3JldG4oKSB7IFQqIHRtcCA9IF9wZF9zZXE7IF9wZF9zZXEgPSAwOyByZXR1cm4gdG1wOyB9Cgog ICAgZnJpZW5kIGNsYXNzIFVuaXN0cmluZ19vdXQ7CgogIHByaXZhdGU6CiAgICBUKiBfcGRfc2Vx OwogIH07CgogIGNsYXNzIFVuaXN0cmluZ19vdXQgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgVW5p c3RyaW5nIFQ7CiAgICB0eXBlZGVmIFVuaXN0cmluZ192YXIgVF92YXI7CgogICAgaW5saW5lIFVu aXN0cmluZ19vdXQoVComIHMpIDogX2RhdGEocykgeyBfZGF0YSA9IDA7IH0KICAgIGlubGluZSBV bmlzdHJpbmdfb3V0KFRfdmFyJiBzKQogICAgICA6IF9kYXRhKHMuX3BkX3NlcSkgeyBzID0gKFQq KSAwOyB9CiAgICBpbmxpbmUgVW5pc3RyaW5nX291dChjb25zdCBVbmlzdHJpbmdfb3V0JiBzKSA6 IF9kYXRhKHMuX2RhdGEpIHt9CiAgICBpbmxpbmUgVW5pc3RyaW5nX291dCYgb3BlcmF0b3IgPSAo Y29uc3QgVW5pc3RyaW5nX291dCYgcykgewogICAgICBfZGF0YSA9IHMuX2RhdGE7CiAgICAgIHJl dHVybiAqdGhpczsKICAgIH0gaW5saW5lIFVuaXN0cmluZ19vdXQmIG9wZXJhdG9yID0gKFQqIHMp IHsKICAgICAgX2RhdGEgPSBzOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBpbmxpbmUg b3BlcmF0b3IgVComKCkgeyByZXR1cm4gX2RhdGE7IH0KICAgIGlubGluZSBUKiYgcHRyKCkgeyBy ZXR1cm4gX2RhdGE7IH0KICAgIGlubGluZSBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gX2RhdGE7 IH0KCiAgICBpbmxpbmUgVW5pY2hhciYgb3BlcmF0b3IgW10gKF9DT1JCQV9VTG9uZyBpKSB7CiAg ICAgIHJldHVybiAoKl9kYXRhKVtpXTsKICAgIH0KCiAgICBUKiYgX2RhdGE7CgogIHByaXZhdGU6 CiAgICBVbmlzdHJpbmdfb3V0KCk7CiAgICBVbmlzdHJpbmdfb3V0JiBvcGVyYXRvcj0oY29uc3Qg VF92YXImKTsKICB9OwoKICBzdHJ1Y3QgTlZQYWlyIHsKICAgIHR5cGVkZWYgX0NPUkJBX0NvbnN0 clR5cGVfVmFyaWFibGVfVmFyPE5WUGFpcj4gX3Zhcl90eXBlOwoKICAgIFVuaXN0cmluZyBuYW1l OwoKICAgIENPUkJBOjpBbnkgdmFsOwoKICAgIHNpemVfdCBfTlBfYWxpZ25lZFNpemUoc2l6ZV90 IGluaXRpYWxvZmZzZXQpIGNvbnN0OwogICAgdm9pZCBvcGVyYXRvcj4+PSAoTmV0QnVmZmVyZWRT dHJlYW0gJikgY29uc3Q7CiAgICB2b2lkIG9wZXJhdG9yPDw9IChOZXRCdWZmZXJlZFN0cmVhbSAm KTsKICAgIHZvaWQgb3BlcmF0b3I+Pj0gKE1lbUJ1ZmZlcmVkU3RyZWFtICYpIGNvbnN0OwogICAg dm9pZCBvcGVyYXRvcjw8PSAoTWVtQnVmZmVyZWRTdHJlYW0gJik7CiAgfTsKCiAgdHlwZWRlZiBO VlBhaXI6Ol92YXJfdHlwZSBOVlBhaXJfdmFyOwoKICB0eXBlZGVmIF9DT1JCQV9Db25zdHJUeXBl X1ZhcmlhYmxlX09VVF9hcmc8IE5WUGFpcixOVlBhaXJfdmFyID4gTlZQYWlyX291dDsKCiAgZXh0 ZXJuIGNvbnN0IENPUkJBOjpUeXBlQ29kZV9wdHIgX3RjX05WUGFpcjsKCn0KCm5hbWVzcGFjZSBQ T0FfV2Fyc2F3CnsKCn0KCgoKCmlubGluZSB2b2lkIG9wZXJhdG9yID4+PShXYXJzYXc6OkF4aXMg X2UsIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgOjpvcGVyYXRvcj4+PSgoQ09SQkE6OlVMb25n KV9lLCBzKTsKfQoKaW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChXYXJzYXc6OkF4aXMmIF9lLCBO ZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpVTG9uZyBfMFJMX2U7CiAgOjpvcGVyYXRv cjw8PShfMFJMX2Uscyk7CiAgc3dpdGNoIChfMFJMX2UpIHsKICAgIGNhc2UgV2Fyc2F3Ojp4YXhp czoKCiAgICBjYXNlIFdhcnNhdzo6eWF4aXM6CgogICAgY2FzZSBXYXJzYXc6OnpheGlzOgoKICAg IF9lID0gKFdhcnNhdzo6QXhpcykgXzBSTF9lOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIF9D T1JCQV9tYXJzaGFsX2Vycm9yKCk7CiAgfQp9CgppbmxpbmUgdm9pZCBvcGVyYXRvciA+Pj0oV2Fy c2F3OjpBeGlzIF9lLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIDo6b3BlcmF0b3I+Pj0oKENP UkJBOjpVTG9uZylfZSwgcyk7Cn0KCmlubGluZSB2b2lkIG9wZXJhdG9yIDw8PSAoV2Fyc2F3OjpB eGlzJiBfZSwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6VUxvbmcgXzBSTF9lOwog IDo6b3BlcmF0b3I8PD0oXzBSTF9lLHMpOwogIHN3aXRjaCAoXzBSTF9lKSB7CiAgICBjYXNlIFdh cnNhdzo6eGF4aXM6CgogICAgY2FzZSBXYXJzYXc6OnlheGlzOgoKICAgIGNhc2UgV2Fyc2F3Ojp6 YXhpczoKCiAgICBfZSA9IChXYXJzYXc6OkF4aXMpIF8wUkxfZTsKICAgIGJyZWFrOwogIGRlZmF1 bHQ6CiAgICBfQ09SQkFfbWFyc2hhbF9lcnJvcigpOwogIH0KfQoKdm9pZCBvcGVyYXRvcjw8PShD T1JCQTo6QW55JiBfYSwgV2Fyc2F3OjpBeGlzIF9zKTsKQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIFdhcnNhdzo6QXhpcyYgX3MpOwoKZXh0ZXJuIHZvaWQg b3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNvbnN0IFdhcnNhdzo6VmVydGV4JiBfcyk7CmV4 dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBXYXJzYXc6OlZlcnRleCogX3Nw KTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9h LCBXYXJzYXc6OlZlcnRleComIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+ PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgV2Fyc2F3OjpWZXJ0ZXgqJiBfc3ApOwoKZXh0 ZXJuIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgY29uc3QgV2Fyc2F3OjpWZXJ0 aWNlcyYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBXYXJz YXc6OlZlcnRpY2VzKiBfc3ApIHsKICBfYSA8PD0gKl9zcDsKICBkZWxldGUgX3NwOwp9CmV4dGVy biBfQ09SQkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0IENPUkJBOjpBbnkmIF9hLCBXYXJz YXc6OlZlcnRpY2VzKiYgX3NwKTsKZXh0ZXJuIF9DT1JCQV9Cb29sZWFuIG9wZXJhdG9yID4+PSAo Y29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IFdhcnNhdzo6VmVydGljZXMqJiBfc3ApOwoKZXh0 ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNvbnN0IFdhcnNhdzo6VGV4Q29v cmQmIF9zKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIFdhcnNhdzo6 VGV4Q29vcmQqIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBD T1JCQTo6QW55JiBfYSwgV2Fyc2F3OjpUZXhDb29yZComIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9v bGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgV2Fyc2F3OjpUZXhD b29yZComIF9zcCk7CgpleHRlcm4gdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBj b25zdCBXYXJzYXc6OlRleENvb3JkcyYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENP UkJBOjpBbnkmIF9hLCBXYXJzYXc6OlRleENvb3JkcyogX3NwKSB7CiAgX2EgPDw9ICpfc3A7CiAg ZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBD T1JCQTo6QW55JiBfYSwgV2Fyc2F3OjpUZXhDb29yZHMqJiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jv b2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgV2Fyc2F3OjpU ZXhDb29yZHMqJiBfc3ApOwoKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2Es IGNvbnN0IFdhcnNhdzo6Q29sb3ImIF9zKTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6 OkFueSYgX2EsIFdhcnNhdzo6Q29sb3IqIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVhbiBvcGVy YXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgV2Fyc2F3OjpDb2xvciomIF9zcCk7CmV4dGVy biBDT1JCQTo6Qm9vbGVhbiBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3Qg V2Fyc2F3OjpDb2xvciomIF9zcCk7CgpleHRlcm4gdm9pZCBvcGVyYXRvcjw8PShDT1JCQTo6QW55 JiBfYSwgY29uc3QgV2Fyc2F3OjpUcmlhbmdsZSYgX3MpOwpleHRlcm4gdm9pZCBvcGVyYXRvcjw8 PShDT1JCQTo6QW55JiBfYSwgV2Fyc2F3OjpUcmlhbmdsZSogX3NwKTsKZXh0ZXJuIENPUkJBOjpC b29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkmIF9hLCBXYXJzYXc6OlRyaWFuZ2xl KiYgX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpB bnkmIF9hLCBjb25zdCBXYXJzYXc6OlRyaWFuZ2xlKiYgX3NwKTsKCmV4dGVybiB2b2lkIG9wZXJh dG9yIDw8PSAoQ09SQkE6OkFueSYgX2EsIGNvbnN0IFdhcnNhdzo6VHJpYW5nbGVTZXEmIF9zKTsK aW5saW5lIHZvaWQgb3BlcmF0b3IgPDw9IChDT1JCQTo6QW55JiBfYSwgV2Fyc2F3OjpUcmlhbmds ZVNlcSogX3NwKSB7CiAgX2EgPDw9ICpfc3A7CiAgZGVsZXRlIF9zcDsKfQpleHRlcm4gX0NPUkJB X0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBDT1JCQTo6QW55JiBfYSwgV2Fyc2F3OjpUcmlh bmdsZVNlcSomIF9zcCk7CmV4dGVybiBfQ09SQkFfQm9vbGVhbiBvcGVyYXRvciA+Pj0gKGNvbnN0 IENPUkJBOjpBbnkmIF9hLCBjb25zdCBXYXJzYXc6OlRyaWFuZ2xlU2VxKiYgX3NwKTsKCmV4dGVy biB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBjb25zdCBXYXJzYXc6Ok1lc2gmIF9z KTsKZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIFdhcnNhdzo6TWVzaCog X3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENPUkJBOjpBbnkm IF9hLCBXYXJzYXc6Ok1lc2gqJiBfc3ApOwpleHRlcm4gQ09SQkE6OkJvb2xlYW4gb3BlcmF0b3I+ Pj0oY29uc3QgQ09SQkE6OkFueSYgX2EsIGNvbnN0IFdhcnNhdzo6TWVzaComIF9zcCk7CgpleHRl cm4gdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBjb25zdCBXYXJzYXc6OlVuaXN0 cmluZyYgX3MpOwppbmxpbmUgdm9pZCBvcGVyYXRvciA8PD0gKENPUkJBOjpBbnkmIF9hLCBXYXJz YXc6OlVuaXN0cmluZyogX3NwKSB7CiAgX2EgPDw9ICpfc3A7CiAgZGVsZXRlIF9zcDsKfQpleHRl cm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49IChjb25zdCBDT1JCQTo6QW55JiBfYSwgV2Fy c2F3OjpVbmlzdHJpbmcqJiBfc3ApOwpleHRlcm4gX0NPUkJBX0Jvb2xlYW4gb3BlcmF0b3IgPj49 IChjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgV2Fyc2F3OjpVbmlzdHJpbmcqJiBfc3ApOwoK ZXh0ZXJuIHZvaWQgb3BlcmF0b3I8PD0oQ09SQkE6OkFueSYgX2EsIGNvbnN0IFdhcnNhdzo6TlZQ YWlyJiBfcyk7CmV4dGVybiB2b2lkIG9wZXJhdG9yPDw9KENPUkJBOjpBbnkmIF9hLCBXYXJzYXc6 Ok5WUGFpciogX3NwKTsKZXh0ZXJuIENPUkJBOjpCb29sZWFuIG9wZXJhdG9yPj49KGNvbnN0IENP UkJBOjpBbnkmIF9hLCBXYXJzYXc6Ok5WUGFpciomIF9zcCk7CmV4dGVybiBDT1JCQTo6Qm9vbGVh biBvcGVyYXRvcj4+PShjb25zdCBDT1JCQTo6QW55JiBfYSwgY29uc3QgV2Fyc2F3OjpOVlBhaXIq JiBfc3ApOwojIDIzICIuLi8uLi9pbmNsdWRlL1dhcnNhdy9UZWxsdGFsZS5oaCIgMgoKCgojIDEg Ii4uLy4uL2luY2x1ZGUvV2Fyc2F3L1JlZkNvdW50QmFzZS5oaCIgMQojIDQ5ICIuLi8uLi9pbmNs dWRlL1dhcnNhdy9SZWZDb3VudEJhc2UuaGgiCm5hbWVzcGFjZSBXYXJzYXcKCnsKCgoKCiAgY2xh c3MgUmVmQ291bnRCYXNlOwogIGNsYXNzIF9vYmpyZWZfUmVmQ291bnRCYXNlOwogIGNsYXNzIF9p bXBsX1JlZkNvdW50QmFzZTsKCiAgdHlwZWRlZiBfb2JqcmVmX1JlZkNvdW50QmFzZSogUmVmQ291 bnRCYXNlX3B0cjsKICB0eXBlZGVmIFJlZkNvdW50QmFzZV9wdHIgUmVmQ291bnRCYXNlUmVmOwoK ICBjbGFzcyBSZWZDb3VudEJhc2VfSGVscGVyIHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIFJlZkNv dW50QmFzZV9wdHIgX3B0cl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogICAg c3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQg cmVsZWFzZShfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7 CiAgICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICAg IHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYp OwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0m KTsKICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0 cmVhbSYpOwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRT dHJlYW0mKTsKICB9OwoKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfUmVmQ291 bnRCYXNlLCBSZWZDb3VudEJhc2VfSGVscGVyPiBSZWZDb3VudEJhc2VfdmFyOwogIHR5cGVkZWYg X0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfUmVmQ291bnRCYXNlLFJlZkNvdW50QmFzZV9I ZWxwZXIgPiBSZWZDb3VudEJhc2Vfb3V0OwoKCgogIGNsYXNzIFJlZkNvdW50QmFzZSB7CiAgcHVi bGljOgoKICAgIHR5cGVkZWYgUmVmQ291bnRCYXNlX3B0ciBfcHRyX3R5cGU7CiAgICB0eXBlZGVm IFJlZkNvdW50QmFzZV92YXIgX3Zhcl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxp Y2F0ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmpl Y3RfcHRyKTsKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICAgIHN0YXRpYyBpbmxpbmUg c2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMgaW5saW5l IHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAg c3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRT dHJlYW0mKTsKCiAgICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5l dEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJB OjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICAgIF9wdHJfdHlwZSByZXN1bHQg PSBfbmFycm93KG9iaik7CiAgICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICAgIHJldHVybiBy ZXN1bHQ7CiAgICB9CgogICAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJl ZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBD T1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgICBfcHRyX3R5cGUgcmVz dWx0ID0gX25hcnJvdyhvYmopOwogICAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgICByZXR1 cm4gcmVzdWx0OwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgog IH07CgogIGNsYXNzIF9vYmpyZWZfUmVmQ291bnRCYXNlIDoKICAgIHB1YmxpYyB2aXJ0dWFsIENP UkJBOjpPYmplY3QsIHB1YmxpYyB2aXJ0dWFsIG9tbmlPYmpSZWYKICB7CiAgcHVibGljOgogICAg dm9pZCBpbmNyZW1lbnQoKTsKICAgIHZvaWQgZGVjcmVtZW50KCk7CgogICAgaW5saW5lIF9vYmpy ZWZfUmVmQ291bnRCYXNlKCkgeyBfUFJfc2V0b2JqKDApOyB9CiAgICBfb2JqcmVmX1JlZkNvdW50 QmFzZShjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSos IG9tbmlMb2NhbElkZW50aXR5Kik7CgogIHByb3RlY3RlZDoKICAgIHZpcnR1YWwgfl9vYmpyZWZf UmVmQ291bnRCYXNlKCk7CgogIHByaXZhdGU6CiAgICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJl Zihjb25zdCBjaGFyKik7CgogICAgX29ianJlZl9SZWZDb3VudEJhc2UoY29uc3QgX29ianJlZl9S ZWZDb3VudEJhc2UmKTsKICAgIF9vYmpyZWZfUmVmQ291bnRCYXNlJiBvcGVyYXRvciA9IChjb25z dCBfb2JqcmVmX1JlZkNvdW50QmFzZSYpOwoKICB9OwoKICBjbGFzcyBfcG9mX1JlZkNvdW50QmFz ZSA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3RvcnkgewogIHB1YmxpYzoKICAgIGlubGluZSBfcG9m X1JlZkNvdW50QmFzZSgpIDogcHJveHlPYmplY3RGYWN0b3J5KFJlZkNvdW50QmFzZTo6X1BEX3Jl cG9JZCkge30KICAgIHZpcnR1YWwgfl9wb2ZfUmVmQ291bnRCYXNlKCk7CgogICAgdmlydHVhbCBv bW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3Qq LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxv Y2FsSWRlbnRpdHkqKTsKICAgIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFy KikgY29uc3Q7CiAgfTsKCiAgY2xhc3MgX2ltcGxfUmVmQ291bnRCYXNlIDoKICAgIHB1YmxpYyB2 aXJ0dWFsIG9tbmlTZXJ2YW50CiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfl9pbXBsX1JlZkNv dW50QmFzZSgpOwoKICAgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnQoKSA9IDA7CiAgICB2aXJ0dWFs IHZvaWQgZGVjcmVtZW50KCkgPSAwOwoKICBwdWJsaWM6CiAgICB2aXJ0dWFsIF9DT1JCQV9Cb29s ZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgdm9pZCogX3B0 clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqKTsKICAgIHZpcnR1YWwgY29uc3QgY2hhciogX21vc3RE ZXJpdmVkUmVwb0lkKCk7CiAgfTsKCn0KCm5hbWVzcGFjZSBQT0FfV2Fyc2F3CnsKCiAgY2xhc3Mg UmVmQ291bnRCYXNlIDoKICAgIHB1YmxpYyB2aXJ0dWFsIFdhcnNhdzo6X2ltcGxfUmVmQ291bnRC YXNlLAogICAgcHVibGljIHZpcnR1YWwgUG9ydGFibGVTZXJ2ZXI6OlNlcnZhbnRCYXNlCiAgewog IHB1YmxpYzoKICAgIHZpcnR1YWwgflJlZkNvdW50QmFzZSgpOwoKICAgIGlubGluZSBXYXJzYXc6 OlJlZkNvdW50QmFzZV9wdHIgX3RoaXMoKSB7CiAgICAgIHJldHVybiAoV2Fyc2F3OjpSZWZDb3Vu dEJhc2VfcHRyKSBfZG9fdGhpcyhXYXJzYXc6OlJlZkNvdW50QmFzZTo6X1BEX3JlcG9JZCk7CiAg ICB9CiAgfTsKCn0KCgoKCmlubGluZSBzaXplX3QKV2Fyc2F3OjpSZWZDb3VudEJhc2U6Ol9hbGln bmVkU2l6ZShXYXJzYXc6OlJlZkNvdW50QmFzZV9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAg cmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMjgsIG9mZnNldCk7 Cn0KCmlubGluZSB2b2lkCldhcnNhdzo6UmVmQ291bnRCYXNlOjpfbWFyc2hhbE9ialJlZihXYXJz YXc6OlJlZkNvdW50QmFzZV9wdHIgb2JqLCBOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJB OjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMjgsIHMpOwp9CgppbmxpbmUgdm9pZApX YXJzYXc6OlJlZkNvdW50QmFzZTo6X21hcnNoYWxPYmpSZWYoV2Fyc2F3OjpSZWZDb3VudEJhc2Vf cHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihv YmosIF9QRF9yZXBvSWQsIDI4LCBzKTsKfQojIDI3ICIuLi8uLi9pbmNsdWRlL1dhcnNhdy9UZWxs dGFsZS5oaCIgMgoKCgojIDEgIi4uLy4uL2luY2x1ZGUvV2Fyc2F3L0lkZW50aWZpYWJsZS5oaCIg MQojIDQ5ICIuLi8uLi9pbmNsdWRlL1dhcnNhdy9JZGVudGlmaWFibGUuaGgiCm5hbWVzcGFjZSBX YXJzYXcKCnsKCgoKCiAgY2xhc3MgSWRlbnRpZmlhYmxlOwogIGNsYXNzIF9vYmpyZWZfSWRlbnRp ZmlhYmxlOwogIGNsYXNzIF9pbXBsX0lkZW50aWZpYWJsZTsKCiAgdHlwZWRlZiBfb2JqcmVmX0lk ZW50aWZpYWJsZSogSWRlbnRpZmlhYmxlX3B0cjsKICB0eXBlZGVmIElkZW50aWZpYWJsZV9wdHIg SWRlbnRpZmlhYmxlUmVmOwoKICBjbGFzcyBJZGVudGlmaWFibGVfSGVscGVyIHsKICBwdWJsaWM6 CiAgICB0eXBlZGVmIElkZW50aWZpYWJsZV9wdHIgX3B0cl90eXBlOwoKICAgIHN0YXRpYyBfcHRy X3R5cGUgX25pbCgpOwogICAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUp OwogICAgc3RhdGljIHZvaWQgcmVsZWFzZShfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQgZHVw bGljYXRlKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJf dHlwZSwgc2l6ZV90KTsKICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBO ZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYo TmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90 eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxP YmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKTsKICB9OwoKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZf VmFyPF9vYmpyZWZfSWRlbnRpZmlhYmxlLCBJZGVudGlmaWFibGVfSGVscGVyPiBJZGVudGlmaWFi bGVfdmFyOwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfSWRlbnRpZmlh YmxlLElkZW50aWZpYWJsZV9IZWxwZXIgPiBJZGVudGlmaWFibGVfb3V0OwoKCgogIGNsYXNzIElk ZW50aWZpYWJsZSB7CiAgcHVibGljOgoKICAgIHR5cGVkZWYgSWRlbnRpZmlhYmxlX3B0ciBfcHRy X3R5cGU7CiAgICB0eXBlZGVmIElkZW50aWZpYWJsZV92YXIgX3Zhcl90eXBlOwoKICAgIHN0YXRp YyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIF9wdHJfdHlwZSBf bmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoK ICAgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7 CiAgICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZm ZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJf dHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBf dW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICAgIENPUkJBOjpPYmpl Y3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICAg IF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICAgIENPUkJBOjpyZWxlYXNlKG9i aik7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgc3RhdGljIGlubGluZSBfcHRyX3R5 cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgICBDT1JCQTo6 T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwog ICAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgICBDT1JCQTo6cmVsZWFz ZShvYmopOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBjaGFy KiBfUERfcmVwb0lkOwoKCgogIH07CgogIGNsYXNzIF9vYmpyZWZfSWRlbnRpZmlhYmxlIDoKICAg IHB1YmxpYyB2aXJ0dWFsIENPUkJBOjpPYmplY3QsIHB1YmxpYyB2aXJ0dWFsIG9tbmlPYmpSZWYK ICB7CiAgcHVibGljOgogICAgQ09SQkE6OkJvb2xlYW4gaXNfaWRlbnRpY2FsKElkZW50aWZpYWJs ZV9wdHIgaSk7CgogICAgaW5saW5lIF9vYmpyZWZfSWRlbnRpZmlhYmxlKCkgeyBfUFJfc2V0b2Jq KDApOyB9CiAgICBfb2JqcmVmX0lkZW50aWZpYWJsZShjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQ cm9maWxlTGlzdCosIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CgogIHByb3Rl Y3RlZDoKICAgIHZpcnR1YWwgfl9vYmpyZWZfSWRlbnRpZmlhYmxlKCk7CgogIHByaXZhdGU6CiAg ICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihjb25zdCBjaGFyKik7CgogICAgX29ianJlZl9J ZGVudGlmaWFibGUoY29uc3QgX29ianJlZl9JZGVudGlmaWFibGUmKTsKICAgIF9vYmpyZWZfSWRl bnRpZmlhYmxlJiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX0lkZW50aWZpYWJsZSYpOwoKICB9 OwoKICBjbGFzcyBfcG9mX0lkZW50aWZpYWJsZSA6IHB1YmxpYyBwcm94eU9iamVjdEZhY3Rvcnkg ewogIHB1YmxpYzoKICAgIGlubGluZSBfcG9mX0lkZW50aWZpYWJsZSgpIDogcHJveHlPYmplY3RG YWN0b3J5KElkZW50aWZpYWJsZTo6X1BEX3JlcG9JZCkge30KICAgIHZpcnR1YWwgfl9wb2ZfSWRl bnRpZmlhYmxlKCk7CgogICAgdmlydHVhbCBvbW5pT2JqUmVmKiBuZXdPYmpSZWYoY29uc3QgY2hh ciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKICAgIHZpcnR1YWwgX0NP UkJBX0Jvb2xlYW4gaXNfYShjb25zdCBjaGFyKikgY29uc3Q7CiAgfTsKCiAgY2xhc3MgX2ltcGxf SWRlbnRpZmlhYmxlIDoKICAgIHB1YmxpYyB2aXJ0dWFsIG9tbmlTZXJ2YW50CiAgewogIHB1Ymxp YzoKICAgIHZpcnR1YWwgfl9pbXBsX0lkZW50aWZpYWJsZSgpOwoKICAgIHZpcnR1YWwgQ09SQkE6 OkJvb2xlYW4gaXNfaWRlbnRpY2FsKElkZW50aWZpYWJsZV9wdHIgaSkgPSAwOwoKICBwdWJsaWM6 CiAgICB2aXJ0dWFsIF9DT1JCQV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCiAgcHJpdmF0 ZToKICAgIHZpcnR1YWwgdm9pZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqKTsKICAgIHZp cnR1YWwgY29uc3QgY2hhciogX21vc3REZXJpdmVkUmVwb0lkKCk7CiAgfTsKCn0KCm5hbWVzcGFj ZSBQT0FfV2Fyc2F3CnsKCiAgY2xhc3MgSWRlbnRpZmlhYmxlIDoKICAgIHB1YmxpYyB2aXJ0dWFs IFdhcnNhdzo6X2ltcGxfSWRlbnRpZmlhYmxlLAogICAgcHVibGljIHZpcnR1YWwgUG9ydGFibGVT ZXJ2ZXI6OlNlcnZhbnRCYXNlCiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfklkZW50aWZpYWJs ZSgpOwoKICAgIGlubGluZSBXYXJzYXc6OklkZW50aWZpYWJsZV9wdHIgX3RoaXMoKSB7CiAgICAg IHJldHVybiAoV2Fyc2F3OjpJZGVudGlmaWFibGVfcHRyKSBfZG9fdGhpcyhXYXJzYXc6OklkZW50 aWZpYWJsZTo6X1BEX3JlcG9JZCk7CiAgICB9CiAgfTsKCn0KCgoKCmlubGluZSBzaXplX3QKV2Fy c2F3OjpJZGVudGlmaWFibGU6Ol9hbGlnbmVkU2l6ZShXYXJzYXc6OklkZW50aWZpYWJsZV9wdHIg b2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwg X1BEX3JlcG9JZCwgMjgsIG9mZnNldCk7Cn0KCmlubGluZSB2b2lkCldhcnNhdzo6SWRlbnRpZmlh YmxlOjpfbWFyc2hhbE9ialJlZihXYXJzYXc6OklkZW50aWZpYWJsZV9wdHIgb2JqLCBOZXRCdWZm ZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwg MjgsIHMpOwp9CgppbmxpbmUgdm9pZApXYXJzYXc6OklkZW50aWZpYWJsZTo6X21hcnNoYWxPYmpS ZWYoV2Fyc2F3OjpJZGVudGlmaWFibGVfcHRyIG9iaiwgTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsK ICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDI4LCBzKTsKfQojIDMxICIu Li8uLi9pbmNsdWRlL1dhcnNhdy9UZWxsdGFsZS5oaCIgMgoKCgojIDEgIi4uLy4uL2luY2x1ZGUv V2Fyc2F3L1N1YmplY3QuaGgiIDEKIyA2MiAiLi4vLi4vaW5jbHVkZS9XYXJzYXcvU3ViamVjdC5o aCIKbmFtZXNwYWNlIFdhcnNhdwoKewoKCgoKICBjbGFzcyBPYnNlcnZlcjsKICBjbGFzcyBfb2Jq cmVmX09ic2VydmVyOwogIGNsYXNzIF9pbXBsX09ic2VydmVyOwoKICB0eXBlZGVmIF9vYmpyZWZf T2JzZXJ2ZXIqIE9ic2VydmVyX3B0cjsKICB0eXBlZGVmIE9ic2VydmVyX3B0ciBPYnNlcnZlclJl ZjsKCiAgY2xhc3MgT2JzZXJ2ZXJfSGVscGVyIHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIE9ic2Vy dmVyX3B0ciBfcHRyX3R5cGU7CgogICAgc3RhdGljIF9wdHJfdHlwZSBfbmlsKCk7CiAgICBzdGF0 aWMgX0NPUkJBX0Jvb2xlYW4gaXNfbmlsKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgdm9pZCByZWxl YXNlKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgdm9pZCBkdXBsaWNhdGUoX3B0cl90eXBlKTsKICAg IHN0YXRpYyBzaXplX3QgTlBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogICAgc3Rh dGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAg ICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYpOwog ICAgc3RhdGljIHZvaWQgbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFt Jik7CiAgICBzdGF0aWMgX3B0cl90eXBlIHVubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVh bSYpOwogIH07CgogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9WYXI8X29ianJlZl9PYnNlcnZlciwg T2JzZXJ2ZXJfSGVscGVyPiBPYnNlcnZlcl92YXI7CiAgdHlwZWRlZiBfQ09SQkFfT2JqUmVmX09V VF9hcmc8X29ianJlZl9PYnNlcnZlcixPYnNlcnZlcl9IZWxwZXIgPiBPYnNlcnZlcl9vdXQ7CgoK CgoKCiAgY2xhc3MgU3ViamVjdDsKICBjbGFzcyBfb2JqcmVmX1N1YmplY3Q7CiAgY2xhc3MgX2lt cGxfU3ViamVjdDsKCiAgdHlwZWRlZiBfb2JqcmVmX1N1YmplY3QqIFN1YmplY3RfcHRyOwogIHR5 cGVkZWYgU3ViamVjdF9wdHIgU3ViamVjdFJlZjsKCiAgY2xhc3MgU3ViamVjdF9IZWxwZXIgewog IHB1YmxpYzoKICAgIHR5cGVkZWYgU3ViamVjdF9wdHIgX3B0cl90eXBlOwoKICAgIHN0YXRpYyBf cHRyX3R5cGUgX25pbCgpOwogICAgc3RhdGljIF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5 cGUpOwogICAgc3RhdGljIHZvaWQgcmVsZWFzZShfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQg ZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgICBzdGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9w dHJfdHlwZSwgc2l6ZV90KTsKICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBl LCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpS ZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0 cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNo YWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mKTsKICB9OwoKICB0eXBlZGVmIF9DT1JCQV9PYmpS ZWZfVmFyPF9vYmpyZWZfU3ViamVjdCwgU3ViamVjdF9IZWxwZXI+IFN1YmplY3RfdmFyOwogIHR5 cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfU3ViamVjdCxTdWJqZWN0X0hlbHBl ciA+IFN1YmplY3Rfb3V0OwoKCgogIGNsYXNzIFN1YmplY3QgewogIHB1YmxpYzoKCiAgICB0eXBl ZGVmIFN1YmplY3RfcHRyIF9wdHJfdHlwZTsKICAgIHR5cGVkZWYgU3ViamVjdF92YXIgX3Zhcl90 eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxpY2F0ZShfcHRyX3R5cGUpOwogICAgc3Rh dGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmplY3RfcHRyKTsKICAgIHN0YXRpYyBfcHRy X3R5cGUgX25pbCgpOwoKICAgIHN0YXRpYyBpbmxpbmUgc2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRy X3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMgaW5saW5lIHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0 cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJz aGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKCiAgICBzdGF0aWMgaW5s aW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAg ICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJBOjpVbk1hcnNoYWxPYmpSZWYoX1BEX3Jl cG9JZCwgcyk7CiAgICAgIF9wdHJfdHlwZSByZXN1bHQgPSBfbmFycm93KG9iaik7CiAgICAgIENP UkJBOjpyZWxlYXNlKG9iaik7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgc3RhdGlj IGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihNZW1CdWZmZXJlZFN0cmVhbSYgcykg ewogICAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9Q RF9yZXBvSWQsIHMpOwogICAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAg ICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHN0 YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgogIH07CgogIGNsYXNzIF9vYmpyZWZfU3Vi amVjdCA6CiAgICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX1JlZkNvdW50QmFzZSwKICAgIHB1Ymxp YyB2aXJ0dWFsIF9vYmpyZWZfSWRlbnRpZmlhYmxlCiAgewogIHB1YmxpYzoKICAgIHZvaWQgYXR0 YWNoKE9ic2VydmVyX3B0ciBvKTsKICAgIHZvaWQgZGV0YWNoKE9ic2VydmVyX3B0ciBvKTsKICAg IHZvaWQgbm90aWZ5KGNvbnN0IENPUkJBOjpBbnkmIGEpOwogICAgdm9pZCBibG9jayhDT1JCQTo6 Qm9vbGVhbiBiKTsKCiAgICBpbmxpbmUgX29ianJlZl9TdWJqZWN0KCkgeyBfUFJfc2V0b2JqKDAp OyB9CiAgICBfb2JqcmVmX1N1YmplY3QoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxp c3QqLCBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwoKICBwcm90ZWN0ZWQ6CiAg ICB2aXJ0dWFsIH5fb2JqcmVmX1N1YmplY3QoKTsKCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgdm9p ZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAgICBfb2JqcmVmX1N1YmplY3QoY29uc3Qg X29ianJlZl9TdWJqZWN0Jik7CiAgICBfb2JqcmVmX1N1YmplY3QmIG9wZXJhdG9yID0gKGNvbnN0 IF9vYmpyZWZfU3ViamVjdCYpOwoKICB9OwoKICBjbGFzcyBfcG9mX1N1YmplY3QgOiBwdWJsaWMg cHJveHlPYmplY3RGYWN0b3J5IHsKICBwdWJsaWM6CiAgICBpbmxpbmUgX3BvZl9TdWJqZWN0KCkg OiBwcm94eU9iamVjdEZhY3RvcnkoU3ViamVjdDo6X1BEX3JlcG9JZCkge30KICAgIHZpcnR1YWwg fl9wb2ZfU3ViamVjdCgpOwoKICAgIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2JqUmVmKGNvbnN0 IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgICB2aXJ0dWFs IF9DT1JCQV9Cb29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0OwogIH07CgogIGNsYXNzIF9p bXBsX1N1YmplY3QgOgogICAgcHVibGljIHZpcnR1YWwgX2ltcGxfUmVmQ291bnRCYXNlLAogICAg cHVibGljIHZpcnR1YWwgX2ltcGxfSWRlbnRpZmlhYmxlCiAgewogIHB1YmxpYzoKICAgIHZpcnR1 YWwgfl9pbXBsX1N1YmplY3QoKTsKCiAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKE9ic2VydmVyX3B0 ciBvKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKE9ic2VydmVyX3B0ciBvKSA9IDA7CiAg ICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGNvbnN0IENPUkJBOjpBbnkmIGEpID0gMDsKICAgIHZpcnR1 YWwgdm9pZCBibG9jayhDT1JCQTo6Qm9vbGVhbiBiKSA9IDA7CgogIHB1YmxpYzoKICAgIHZpcnR1 YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYpOwoKICBwcml2YXRlOgogICAgdmly dHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hhciopOwogICAgdmlydHVhbCBjb25z dCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKICB9OwoKfQoKbmFtZXNwYWNlIFBPQV9XYXJz YXcKewoKICBjbGFzcyBTdWJqZWN0IDoKICAgIHB1YmxpYyB2aXJ0dWFsIFdhcnNhdzo6X2ltcGxf U3ViamVjdCwKICAgIHB1YmxpYyB2aXJ0dWFsIFJlZkNvdW50QmFzZSwKICAgICAgcHVibGljIHZp cnR1YWwgSWRlbnRpZmlhYmxlCiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgflN1YmplY3QoKTsK CiAgICBpbmxpbmUgV2Fyc2F3OjpTdWJqZWN0X3B0ciBfdGhpcygpIHsKICAgICAgcmV0dXJuIChX YXJzYXc6OlN1YmplY3RfcHRyKSBfZG9fdGhpcyhXYXJzYXc6OlN1YmplY3Q6Ol9QRF9yZXBvSWQp OwogICAgfQogIH07Cgp9CgoKCgppbmxpbmUgc2l6ZV90CldhcnNhdzo6U3ViamVjdDo6X2FsaWdu ZWRTaXplKFdhcnNhdzo6U3ViamVjdF9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJu IENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMjMsIG9mZnNldCk7Cn0KCmlu bGluZSB2b2lkCldhcnNhdzo6U3ViamVjdDo6X21hcnNoYWxPYmpSZWYoV2Fyc2F3OjpTdWJqZWN0 X3B0ciBvYmosIE5ldEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYo b2JqLCBfUERfcmVwb0lkLCAyMywgcyk7Cn0KCmlubGluZSB2b2lkCldhcnNhdzo6U3ViamVjdDo6 X21hcnNoYWxPYmpSZWYoV2Fyc2F3OjpTdWJqZWN0X3B0ciBvYmosIE1lbUJ1ZmZlcmVkU3RyZWFt JiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2JqLCBfUERfcmVwb0lkLCAyMywgcyk7Cn0K IyAzNSAiLi4vLi4vaW5jbHVkZS9XYXJzYXcvVGVsbHRhbGUuaGgiIDIKIyA2NiAiLi4vLi4vaW5j bHVkZS9XYXJzYXcvVGVsbHRhbGUuaGgiCm5hbWVzcGFjZSBXYXJzYXcKCnsKCgoKCiAgY2xhc3Mg VGVsbHRhbGVDb25zdHJhaW50OwogIGNsYXNzIF9vYmpyZWZfVGVsbHRhbGVDb25zdHJhaW50Owog IGNsYXNzIF9pbXBsX1RlbGx0YWxlQ29uc3RyYWludDsKCiAgdHlwZWRlZiBfb2JqcmVmX1RlbGx0 YWxlQ29uc3RyYWludCogVGVsbHRhbGVDb25zdHJhaW50X3B0cjsKICB0eXBlZGVmIFRlbGx0YWxl Q29uc3RyYWludF9wdHIgVGVsbHRhbGVDb25zdHJhaW50UmVmOwoKICBjbGFzcyBUZWxsdGFsZUNv bnN0cmFpbnRfSGVscGVyIHsKICBwdWJsaWM6CiAgICB0eXBlZGVmIFRlbGx0YWxlQ29uc3RyYWlu dF9wdHIgX3B0cl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwogICAgc3RhdGlj IF9DT1JCQV9Cb29sZWFuIGlzX25pbChfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQgcmVsZWFz ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIHZvaWQgZHVwbGljYXRlKF9wdHJfdHlwZSk7CiAgICBz dGF0aWMgc2l6ZV90IE5QX2FsaWduZWRTaXplKF9wdHJfdHlwZSwgc2l6ZV90KTsKICAgIHN0YXRp YyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAg c3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAg IHN0YXRpYyB2b2lkIG1hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBNZW1CdWZmZXJlZFN0cmVhbSYp OwogICAgc3RhdGljIF9wdHJfdHlwZSB1bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0m KTsKICB9OwoKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfVmFyPF9vYmpyZWZfVGVsbHRhbGVDb25z dHJhaW50LCBUZWxsdGFsZUNvbnN0cmFpbnRfSGVscGVyPiBUZWxsdGFsZUNvbnN0cmFpbnRfdmFy OwogIHR5cGVkZWYgX0NPUkJBX09ialJlZl9PVVRfYXJnPF9vYmpyZWZfVGVsbHRhbGVDb25zdHJh aW50LFRlbGx0YWxlQ29uc3RyYWludF9IZWxwZXIgPiBUZWxsdGFsZUNvbnN0cmFpbnRfb3V0OwoK CgoKCgogIGNsYXNzIFRlbGx0YWxlOwogIGNsYXNzIF9vYmpyZWZfVGVsbHRhbGU7CiAgY2xhc3Mg X2ltcGxfVGVsbHRhbGU7CgogIHR5cGVkZWYgX29ianJlZl9UZWxsdGFsZSogVGVsbHRhbGVfcHRy OwogIHR5cGVkZWYgVGVsbHRhbGVfcHRyIFRlbGx0YWxlUmVmOwoKICBjbGFzcyBUZWxsdGFsZV9I ZWxwZXIgewogIHB1YmxpYzoKICAgIHR5cGVkZWYgVGVsbHRhbGVfcHRyIF9wdHJfdHlwZTsKCiAg ICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKICAgIHN0YXRpYyBfQ09SQkFfQm9vbGVhbiBpc19u aWwoX3B0cl90eXBlKTsKICAgIHN0YXRpYyB2b2lkIHJlbGVhc2UoX3B0cl90eXBlKTsKICAgIHN0 YXRpYyB2b2lkIGR1cGxpY2F0ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIHNpemVfdCBOUF9hbGln bmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMgdm9pZCBtYXJzaGFsT2JqUmVm KF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyBfcHRyX3R5cGUgdW5t YXJzaGFsT2JqUmVmKE5ldEJ1ZmZlcmVkU3RyZWFtJik7CiAgICBzdGF0aWMgdm9pZCBtYXJzaGFs T2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyBfcHRyX3R5 cGUgdW5tYXJzaGFsT2JqUmVmKE1lbUJ1ZmZlcmVkU3RyZWFtJik7CiAgfTsKCiAgdHlwZWRlZiBf Q09SQkFfT2JqUmVmX1Zhcjxfb2JqcmVmX1RlbGx0YWxlLCBUZWxsdGFsZV9IZWxwZXI+IFRlbGx0 YWxlX3ZhcjsKICB0eXBlZGVmIF9DT1JCQV9PYmpSZWZfT1VUX2FyZzxfb2JqcmVmX1RlbGx0YWxl LFRlbGx0YWxlX0hlbHBlciA+IFRlbGx0YWxlX291dDsKCgoKICBjbGFzcyBUZWxsdGFsZSB7CiAg cHVibGljOgoKICAgIHR5cGVkZWYgVGVsbHRhbGVfcHRyIF9wdHJfdHlwZTsKICAgIHR5cGVkZWYg VGVsbHRhbGVfdmFyIF92YXJfdHlwZTsKCiAgICBzdGF0aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUo X3B0cl90eXBlKTsKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0 cik7CiAgICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsKCiAgICBzdGF0aWMgaW5saW5lIHNpemVf dCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3QpOwogICAgc3RhdGljIGlubGluZSB2b2lk IF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVmZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRp YyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRyX3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFt Jik7CgogICAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJlZihOZXRCdWZm ZXJlZFN0cmVhbSYgcykgewogICAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5N YXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgICBfcHRyX3R5cGUgcmVzdWx0ID0gX25h cnJvdyhvYmopOwogICAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgICByZXR1cm4gcmVzdWx0 OwogICAgfQoKICAgIHN0YXRpYyBpbmxpbmUgX3B0cl90eXBlIF91bm1hcnNoYWxPYmpSZWYoTWVt QnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgICAgQ09SQkE6Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6 OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsKICAgICAgX3B0cl90eXBlIHJlc3VsdCA9 IF9uYXJyb3cob2JqKTsKICAgICAgQ09SQkE6OnJlbGVhc2Uob2JqKTsKICAgICAgcmV0dXJuIHJl c3VsdDsKICAgIH0KCiAgICBzdGF0aWMgY29uc3QgY2hhciogX1BEX3JlcG9JZDsKCgogICAgdHlw ZWRlZiBDT1JCQTo6VUxvbmcgTWFzazsKCiAgfTsKCiAgY2xhc3MgX29ianJlZl9UZWxsdGFsZSA6 CiAgICBwdWJsaWMgdmlydHVhbCBfb2JqcmVmX1N1YmplY3QKICB7CiAgcHVibGljOgogICAgdm9p ZCBzZXQoVGVsbHRhbGU6Ok1hc2sgbSk7CiAgICB2b2lkIGNsZWFyKFRlbGx0YWxlOjpNYXNrIG0p OwogICAgQ09SQkE6OkJvb2xlYW4gdGVzdChUZWxsdGFsZTo6TWFzayBtKTsKICAgIHZvaWQgbW9k aWZ5KFRlbGx0YWxlOjpNYXNrIG0sIENPUkJBOjpCb29sZWFuIGIpOwoKICAgIFRlbGx0YWxlQ29u c3RyYWludF9wdHIgY29uc3RyYWludCgpOwogICAgdm9pZCBjb25zdHJhaW50KFRlbGx0YWxlQ29u c3RyYWludF9wdHIpOwoKICAgIGlubGluZSBfb2JqcmVmX1RlbGx0YWxlKCkgeyBfUFJfc2V0b2Jq KDApOyB9CiAgICBfb2JqcmVmX1RlbGx0YWxlKGNvbnN0IGNoYXIqLCBJT1A6OlRhZ2dlZFByb2Zp bGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCiAgcHJvdGVjdGVk OgogICAgdmlydHVhbCB+X29ianJlZl9UZWxsdGFsZSgpOwoKICBwcml2YXRlOgogICAgdmlydHVh bCB2b2lkKiBfcHRyVG9PYmpSZWYoY29uc3QgY2hhciopOwoKICAgIF9vYmpyZWZfVGVsbHRhbGUo Y29uc3QgX29ianJlZl9UZWxsdGFsZSYpOwogICAgX29ianJlZl9UZWxsdGFsZSYgb3BlcmF0b3Ig PSAoY29uc3QgX29ianJlZl9UZWxsdGFsZSYpOwoKICB9OwoKICBjbGFzcyBfcG9mX1RlbGx0YWxl IDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CiAgcHVibGljOgogICAgaW5saW5lIF9wb2Zf VGVsbHRhbGUoKSA6IHByb3h5T2JqZWN0RmFjdG9yeShUZWxsdGFsZTo6X1BEX3JlcG9JZCkge30K ICAgIHZpcnR1YWwgfl9wb2ZfVGVsbHRhbGUoKTsKCiAgICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5l d09ialJlZihjb25zdCBjaGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSop OwogICAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqKSBjb25zdDsKICB9 OwoKICBjbGFzcyBfaW1wbF9UZWxsdGFsZSA6CiAgICBwdWJsaWMgdmlydHVhbCBfaW1wbF9TdWJq ZWN0CiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfl9pbXBsX1RlbGx0YWxlKCk7CgogICAgdmly dHVhbCB2b2lkIHNldChUZWxsdGFsZTo6TWFzayBtKSA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgY2xl YXIoVGVsbHRhbGU6Ok1hc2sgbSkgPSAwOwogICAgdmlydHVhbCBDT1JCQTo6Qm9vbGVhbiB0ZXN0 KFRlbGx0YWxlOjpNYXNrIG0pID0gMDsKICAgIHZpcnR1YWwgdm9pZCBtb2RpZnkoVGVsbHRhbGU6 Ok1hc2sgbSwgQ09SQkE6OkJvb2xlYW4gYikgPSAwOwoKICAgIHZpcnR1YWwgVGVsbHRhbGVDb25z dHJhaW50X3B0ciBjb25zdHJhaW50KCkgPSAwOwogICAgdmlydHVhbCB2b2lkIGNvbnN0cmFpbnQo VGVsbHRhbGVDb25zdHJhaW50X3B0cikgPSAwOwoKICBwdWJsaWM6CiAgICB2aXJ0dWFsIF9DT1JC QV9Cb29sZWFuIF9kaXNwYXRjaChHSU9QX1MmKTsKCiAgcHJpdmF0ZToKICAgIHZpcnR1YWwgdm9p ZCogX3B0clRvSW50ZXJmYWNlKGNvbnN0IGNoYXIqKTsKICAgIHZpcnR1YWwgY29uc3QgY2hhciog X21vc3REZXJpdmVkUmVwb0lkKCk7CiAgfTsKIyAyNTMgIi4uLy4uL2luY2x1ZGUvV2Fyc2F3L1Rl bGx0YWxlLmhoIgogIGNsYXNzIFRlbGx0YWxlQ29uc3RyYWludCB7CiAgcHVibGljOgoKICAgIHR5 cGVkZWYgVGVsbHRhbGVDb25zdHJhaW50X3B0ciBfcHRyX3R5cGU7CiAgICB0eXBlZGVmIFRlbGx0 YWxlQ29uc3RyYWludF92YXIgX3Zhcl90eXBlOwoKICAgIHN0YXRpYyBfcHRyX3R5cGUgX2R1cGxp Y2F0ZShfcHRyX3R5cGUpOwogICAgc3RhdGljIF9wdHJfdHlwZSBfbmFycm93KENPUkJBOjpPYmpl Y3RfcHRyKTsKICAgIHN0YXRpYyBfcHRyX3R5cGUgX25pbCgpOwoKICAgIHN0YXRpYyBpbmxpbmUg c2l6ZV90IF9hbGlnbmVkU2l6ZShfcHRyX3R5cGUsIHNpemVfdCk7CiAgICBzdGF0aWMgaW5saW5l IHZvaWQgX21hcnNoYWxPYmpSZWYoX3B0cl90eXBlLCBOZXRCdWZmZXJlZFN0cmVhbSYpOwogICAg c3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTWVtQnVmZmVyZWRT dHJlYW0mKTsKCiAgICBzdGF0aWMgaW5saW5lIF9wdHJfdHlwZSBfdW5tYXJzaGFsT2JqUmVmKE5l dEJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgICAgIENPUkJBOjpPYmplY3RfcHRyIG9iaiA9IENPUkJB OjpVbk1hcnNoYWxPYmpSZWYoX1BEX3JlcG9JZCwgcyk7CiAgICAgIF9wdHJfdHlwZSByZXN1bHQg PSBfbmFycm93KG9iaik7CiAgICAgIENPUkJBOjpyZWxlYXNlKG9iaik7CiAgICAgIHJldHVybiBy ZXN1bHQ7CiAgICB9CgogICAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUgX3VubWFyc2hhbE9ialJl ZihNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogICAgICBDT1JCQTo6T2JqZWN0X3B0ciBvYmogPSBD T1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAgICBfcHRyX3R5cGUgcmVz dWx0ID0gX25hcnJvdyhvYmopOwogICAgICBDT1JCQTo6cmVsZWFzZShvYmopOwogICAgICByZXR1 cm4gcmVzdWx0OwogICAgfQoKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfUERfcmVwb0lkOwoKCgog IH07CgogIGNsYXNzIF9vYmpyZWZfVGVsbHRhbGVDb25zdHJhaW50IDoKICAgIHB1YmxpYyB2aXJ0 dWFsIF9vYmpyZWZfUmVmQ291bnRCYXNlCiAgewogIHB1YmxpYzoKICAgIHZvaWQgYWRkKFRlbGx0 YWxlX3B0ciB0KTsKICAgIHZvaWQgcmVtb3ZlKFRlbGx0YWxlX3B0ciB0KTsKICAgIHZvaWQgdHJ5 bW9kaWZ5KFRlbGx0YWxlX3B0ciB0LCBUZWxsdGFsZTo6TWFzayBtLCBDT1JCQTo6Qm9vbGVhbiBi KTsKCiAgICBpbmxpbmUgX29ianJlZl9UZWxsdGFsZUNvbnN0cmFpbnQoKSB7IF9QUl9zZXRvYmoo MCk7IH0KICAgIF9vYmpyZWZfVGVsbHRhbGVDb25zdHJhaW50KGNvbnN0IGNoYXIqLCBJT1A6OlRh Z2dlZFByb2ZpbGVMaXN0Kiwgb21uaUlkZW50aXR5Kiwgb21uaUxvY2FsSWRlbnRpdHkqKTsKCiAg cHJvdGVjdGVkOgogICAgdmlydHVhbCB+X29ianJlZl9UZWxsdGFsZUNvbnN0cmFpbnQoKTsKCiAg cHJpdmF0ZToKICAgIHZpcnR1YWwgdm9pZCogX3B0clRvT2JqUmVmKGNvbnN0IGNoYXIqKTsKCiAg ICBfb2JqcmVmX1RlbGx0YWxlQ29uc3RyYWludChjb25zdCBfb2JqcmVmX1RlbGx0YWxlQ29uc3Ry YWludCYpOwogICAgX29ianJlZl9UZWxsdGFsZUNvbnN0cmFpbnQmIG9wZXJhdG9yID0gKGNvbnN0 IF9vYmpyZWZfVGVsbHRhbGVDb25zdHJhaW50Jik7CgogIH07CgogIGNsYXNzIF9wb2ZfVGVsbHRh bGVDb25zdHJhaW50IDogcHVibGljIHByb3h5T2JqZWN0RmFjdG9yeSB7CiAgcHVibGljOgogICAg aW5saW5lIF9wb2ZfVGVsbHRhbGVDb25zdHJhaW50KCkgOiBwcm94eU9iamVjdEZhY3RvcnkoVGVs bHRhbGVDb25zdHJhaW50OjpfUERfcmVwb0lkKSB7fQogICAgdmlydHVhbCB+X3BvZl9UZWxsdGFs ZUNvbnN0cmFpbnQoKTsKCiAgICB2aXJ0dWFsIG9tbmlPYmpSZWYqIG5ld09ialJlZihjb25zdCBj aGFyKiwgSU9QOjpUYWdnZWRQcm9maWxlTGlzdCosCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBvbW5pSWRlbnRpdHkqLCBvbW5pTG9jYWxJZGVudGl0eSopOwogICAgdmlydHVhbCBf Q09SQkFfQm9vbGVhbiBpc19hKGNvbnN0IGNoYXIqKSBjb25zdDsKICB9OwoKICBjbGFzcyBfaW1w bF9UZWxsdGFsZUNvbnN0cmFpbnQgOgogICAgcHVibGljIHZpcnR1YWwgX2ltcGxfUmVmQ291bnRC YXNlCiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfl9pbXBsX1RlbGx0YWxlQ29uc3RyYWludCgp OwoKICAgIHZpcnR1YWwgdm9pZCBhZGQoVGVsbHRhbGVfcHRyIHQpID0gMDsKICAgIHZpcnR1YWwg dm9pZCByZW1vdmUoVGVsbHRhbGVfcHRyIHQpID0gMDsKICAgIHZpcnR1YWwgdm9pZCB0cnltb2Rp ZnkoVGVsbHRhbGVfcHRyIHQsIFRlbGx0YWxlOjpNYXNrIG0sIENPUkJBOjpCb29sZWFuIGIpID0g MDsKCiAgcHVibGljOgogICAgdmlydHVhbCBfQ09SQkFfQm9vbGVhbiBfZGlzcGF0Y2goR0lPUF9T Jik7CgogIHByaXZhdGU6CiAgICB2aXJ0dWFsIHZvaWQqIF9wdHJUb0ludGVyZmFjZShjb25zdCBj aGFyKik7CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIF9tb3N0RGVyaXZlZFJlcG9JZCgpOwogIH07 Cgp9CgpuYW1lc3BhY2UgUE9BX1dhcnNhdwp7CgogIGNsYXNzIFRlbGx0YWxlIDoKICAgIHB1Ymxp YyB2aXJ0dWFsIFdhcnNhdzo6X2ltcGxfVGVsbHRhbGUsCiAgICBwdWJsaWMgdmlydHVhbCBTdWJq ZWN0CiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgflRlbGx0YWxlKCk7CgogICAgaW5saW5lIFdh cnNhdzo6VGVsbHRhbGVfcHRyIF90aGlzKCkgewogICAgICByZXR1cm4gKFdhcnNhdzo6VGVsbHRh bGVfcHRyKSBfZG9fdGhpcyhXYXJzYXc6OlRlbGx0YWxlOjpfUERfcmVwb0lkKTsKICAgIH0KICB9 OwoKICBjbGFzcyBUZWxsdGFsZUNvbnN0cmFpbnQgOgogICAgcHVibGljIHZpcnR1YWwgV2Fyc2F3 OjpfaW1wbF9UZWxsdGFsZUNvbnN0cmFpbnQsCiAgICBwdWJsaWMgdmlydHVhbCBSZWZDb3VudEJh c2UKICB7CiAgcHVibGljOgogICAgdmlydHVhbCB+VGVsbHRhbGVDb25zdHJhaW50KCk7CgogICAg aW5saW5lIFdhcnNhdzo6VGVsbHRhbGVDb25zdHJhaW50X3B0ciBfdGhpcygpIHsKICAgICAgcmV0 dXJuIChXYXJzYXc6OlRlbGx0YWxlQ29uc3RyYWludF9wdHIpIF9kb190aGlzKFdhcnNhdzo6VGVs bHRhbGVDb25zdHJhaW50OjpfUERfcmVwb0lkKTsKICAgIH0KICB9OwoKfQoKCgoKaW5saW5lIHNp emVfdApXYXJzYXc6OlRlbGx0YWxlOjpfYWxpZ25lZFNpemUoV2Fyc2F3OjpUZWxsdGFsZV9wdHIg b2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJBOjpBbGlnbmVkT2JqUmVmKG9iaiwg X1BEX3JlcG9JZCwgMjQsIG9mZnNldCk7Cn0KCmlubGluZSB2b2lkCldhcnNhdzo6VGVsbHRhbGU6 Ol9tYXJzaGFsT2JqUmVmKFdhcnNhdzo6VGVsbHRhbGVfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJl YW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmosIF9QRF9yZXBvSWQsIDI0LCBzKTsK fQoKaW5saW5lIHZvaWQKV2Fyc2F3OjpUZWxsdGFsZTo6X21hcnNoYWxPYmpSZWYoV2Fyc2F3OjpU ZWxsdGFsZV9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYgcykgewogIENPUkJBOjpNYXJzaGFs T2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMjQsIHMpOwp9CgppbmxpbmUgc2l6ZV90CldhcnNhdzo6 VGVsbHRhbGVDb25zdHJhaW50OjpfYWxpZ25lZFNpemUoV2Fyc2F3OjpUZWxsdGFsZUNvbnN0cmFp bnRfcHRyIG9iaiwgc2l6ZV90IG9mZnNldCkgewogIHJldHVybiBDT1JCQTo6QWxpZ25lZE9ialJl ZihvYmosIF9QRF9yZXBvSWQsIDM0LCBvZmZzZXQpOwp9CgppbmxpbmUgdm9pZApXYXJzYXc6OlRl bGx0YWxlQ29uc3RyYWludDo6X21hcnNoYWxPYmpSZWYoV2Fyc2F3OjpUZWxsdGFsZUNvbnN0cmFp bnRfcHRyIG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJl ZihvYmosIF9QRF9yZXBvSWQsIDM0LCBzKTsKfQoKaW5saW5lIHZvaWQKV2Fyc2F3OjpUZWxsdGFs ZUNvbnN0cmFpbnQ6Ol9tYXJzaGFsT2JqUmVmKFdhcnNhdzo6VGVsbHRhbGVDb25zdHJhaW50X3B0 ciBvYmosIE1lbUJ1ZmZlcmVkU3RyZWFtJiBzKSB7CiAgQ09SQkE6Ok1hcnNoYWxPYmpSZWYob2Jq LCBfUERfcmVwb0lkLCAzNCwgcyk7Cn0KIyAyOCAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4v aW5jbHVkZS9Db21tYW5kL1RlbGx0YWxlSW1wbC5oaCIgMgojIDEgIi9ob21lL3N0ZWZhbi9CZXJs aW4vQmVybGluL2luY2x1ZGUvQmVybGluL1N1YmplY3RJbXBsLmhoIiAxCiMgMjUgIi9ob21lL3N0 ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGluL1N1YmplY3RJbXBsLmhoIgojIDEgIi4u Ly4uL2luY2x1ZGUvV2Fyc2F3L2NvbmZpZy5oaCIgMQojIDI2ICIvaG9tZS9zdGVmYW4vQmVybGlu L0Jlcmxpbi9pbmNsdWRlL0Jlcmxpbi9TdWJqZWN0SW1wbC5oaCIgMgojIDEgIi4uLy4uL2luY2x1 ZGUvV2Fyc2F3L1N1YmplY3QuaGgiIDEKIyAyNyAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4v aW5jbHVkZS9CZXJsaW4vU3ViamVjdEltcGwuaGgiIDIKIyAxICIuLi8uLi9pbmNsdWRlL1dhcnNh dy9PYnNlcnZlci5oaCIgMQojIDU0ICIuLi8uLi9pbmNsdWRlL1dhcnNhdy9PYnNlcnZlci5oaCIK bmFtZXNwYWNlIFdhcnNhdwoKewojIDg4ICIuLi8uLi9pbmNsdWRlL1dhcnNhdy9PYnNlcnZlci5o aCIKICBjbGFzcyBPYnNlcnZlciB7CiAgcHVibGljOgoKICAgIHR5cGVkZWYgT2JzZXJ2ZXJfcHRy IF9wdHJfdHlwZTsKICAgIHR5cGVkZWYgT2JzZXJ2ZXJfdmFyIF92YXJfdHlwZTsKCiAgICBzdGF0 aWMgX3B0cl90eXBlIF9kdXBsaWNhdGUoX3B0cl90eXBlKTsKICAgIHN0YXRpYyBfcHRyX3R5cGUg X25hcnJvdyhDT1JCQTo6T2JqZWN0X3B0cik7CiAgICBzdGF0aWMgX3B0cl90eXBlIF9uaWwoKTsK CiAgICBzdGF0aWMgaW5saW5lIHNpemVfdCBfYWxpZ25lZFNpemUoX3B0cl90eXBlLCBzaXplX3Qp OwogICAgc3RhdGljIGlubGluZSB2b2lkIF9tYXJzaGFsT2JqUmVmKF9wdHJfdHlwZSwgTmV0QnVm ZmVyZWRTdHJlYW0mKTsKICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBfbWFyc2hhbE9ialJlZihfcHRy X3R5cGUsIE1lbUJ1ZmZlcmVkU3RyZWFtJik7CgogICAgc3RhdGljIGlubGluZSBfcHRyX3R5cGUg X3VubWFyc2hhbE9ialJlZihOZXRCdWZmZXJlZFN0cmVhbSYgcykgewogICAgICBDT1JCQTo6T2Jq ZWN0X3B0ciBvYmogPSBDT1JCQTo6VW5NYXJzaGFsT2JqUmVmKF9QRF9yZXBvSWQsIHMpOwogICAg ICBfcHRyX3R5cGUgcmVzdWx0ID0gX25hcnJvdyhvYmopOwogICAgICBDT1JCQTo6cmVsZWFzZShv YmopOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHN0YXRpYyBpbmxpbmUgX3B0cl90 eXBlIF91bm1hcnNoYWxPYmpSZWYoTWVtQnVmZmVyZWRTdHJlYW0mIHMpIHsKICAgICAgQ09SQkE6 Ok9iamVjdF9wdHIgb2JqID0gQ09SQkE6OlVuTWFyc2hhbE9ialJlZihfUERfcmVwb0lkLCBzKTsK ICAgICAgX3B0cl90eXBlIHJlc3VsdCA9IF9uYXJyb3cob2JqKTsKICAgICAgQ09SQkE6OnJlbGVh c2Uob2JqKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBzdGF0aWMgY29uc3QgY2hh ciogX1BEX3JlcG9JZDsKCgoKICB9OwoKICBjbGFzcyBfb2JqcmVmX09ic2VydmVyIDoKICAgIHB1 YmxpYyB2aXJ0dWFsIF9vYmpyZWZfSWRlbnRpZmlhYmxlCiAgewogIHB1YmxpYzoKICAgIHZvaWQg dXBkYXRlKGNvbnN0IENPUkJBOjpBbnkmIGEpOwogICAgdm9pZCBkZXN0cm95KCk7CgogICAgaW5s aW5lIF9vYmpyZWZfT2JzZXJ2ZXIoKSB7IF9QUl9zZXRvYmooMCk7IH0KICAgIF9vYmpyZWZfT2Jz ZXJ2ZXIoY29uc3QgY2hhciosIElPUDo6VGFnZ2VkUHJvZmlsZUxpc3QqLCBvbW5pSWRlbnRpdHkq LCBvbW5pTG9jYWxJZGVudGl0eSopOwoKICBwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIH5fb2JqcmVm X09ic2VydmVyKCk7CgogIHByaXZhdGU6CiAgICB2aXJ0dWFsIHZvaWQqIF9wdHJUb09ialJlZihj b25zdCBjaGFyKik7CgogICAgX29ianJlZl9PYnNlcnZlcihjb25zdCBfb2JqcmVmX09ic2VydmVy Jik7CiAgICBfb2JqcmVmX09ic2VydmVyJiBvcGVyYXRvciA9IChjb25zdCBfb2JqcmVmX09ic2Vy dmVyJik7CgogIH07CgogIGNsYXNzIF9wb2ZfT2JzZXJ2ZXIgOiBwdWJsaWMgcHJveHlPYmplY3RG YWN0b3J5IHsKICBwdWJsaWM6CiAgICBpbmxpbmUgX3BvZl9PYnNlcnZlcigpIDogcHJveHlPYmpl Y3RGYWN0b3J5KE9ic2VydmVyOjpfUERfcmVwb0lkKSB7fQogICAgdmlydHVhbCB+X3BvZl9PYnNl cnZlcigpOwoKICAgIHZpcnR1YWwgb21uaU9ialJlZiogbmV3T2JqUmVmKGNvbnN0IGNoYXIqLCBJ T1A6OlRhZ2dlZFByb2ZpbGVMaXN0KiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG9tbmlJZGVudGl0eSosIG9tbmlMb2NhbElkZW50aXR5Kik7CiAgICB2aXJ0dWFsIF9DT1JCQV9C b29sZWFuIGlzX2EoY29uc3QgY2hhciopIGNvbnN0OwogIH07CgogIGNsYXNzIF9pbXBsX09ic2Vy dmVyIDoKICAgIHB1YmxpYyB2aXJ0dWFsIF9pbXBsX0lkZW50aWZpYWJsZQogIHsKICBwdWJsaWM6 CiAgICB2aXJ0dWFsIH5faW1wbF9PYnNlcnZlcigpOwoKICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUo Y29uc3QgQ09SQkE6OkFueSYgYSkgPSAwOwogICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKSA9IDA7 CgogIHB1YmxpYzoKICAgIHZpcnR1YWwgX0NPUkJBX0Jvb2xlYW4gX2Rpc3BhdGNoKEdJT1BfUyYp OwoKICBwcml2YXRlOgogICAgdmlydHVhbCB2b2lkKiBfcHRyVG9JbnRlcmZhY2UoY29uc3QgY2hh ciopOwogICAgdmlydHVhbCBjb25zdCBjaGFyKiBfbW9zdERlcml2ZWRSZXBvSWQoKTsKICB9OwoK fQoKbmFtZXNwYWNlIFBPQV9XYXJzYXcKewoKICBjbGFzcyBPYnNlcnZlciA6CiAgICBwdWJsaWMg dmlydHVhbCBXYXJzYXc6Ol9pbXBsX09ic2VydmVyLAogICAgcHVibGljIHZpcnR1YWwgSWRlbnRp ZmlhYmxlCiAgewogIHB1YmxpYzoKICAgIHZpcnR1YWwgfk9ic2VydmVyKCk7CgogICAgaW5saW5l IFdhcnNhdzo6T2JzZXJ2ZXJfcHRyIF90aGlzKCkgewogICAgICByZXR1cm4gKFdhcnNhdzo6T2Jz ZXJ2ZXJfcHRyKSBfZG9fdGhpcyhXYXJzYXc6Ok9ic2VydmVyOjpfUERfcmVwb0lkKTsKICAgIH0K ICB9OwoKfQoKCgoKaW5saW5lIHNpemVfdApXYXJzYXc6Ok9ic2VydmVyOjpfYWxpZ25lZFNpemUo V2Fyc2F3OjpPYnNlcnZlcl9wdHIgb2JqLCBzaXplX3Qgb2Zmc2V0KSB7CiAgcmV0dXJuIENPUkJB OjpBbGlnbmVkT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMjQsIG9mZnNldCk7Cn0KCmlubGluZSB2 b2lkCldhcnNhdzo6T2JzZXJ2ZXI6Ol9tYXJzaGFsT2JqUmVmKFdhcnNhdzo6T2JzZXJ2ZXJfcHRy IG9iaiwgTmV0QnVmZmVyZWRTdHJlYW0mIHMpIHsKICBDT1JCQTo6TWFyc2hhbE9ialJlZihvYmos IF9QRF9yZXBvSWQsIDI0LCBzKTsKfQoKaW5saW5lIHZvaWQKV2Fyc2F3OjpPYnNlcnZlcjo6X21h cnNoYWxPYmpSZWYoV2Fyc2F3OjpPYnNlcnZlcl9wdHIgb2JqLCBNZW1CdWZmZXJlZFN0cmVhbSYg cykgewogIENPUkJBOjpNYXJzaGFsT2JqUmVmKG9iaiwgX1BEX3JlcG9JZCwgMjQsIHMpOwp9CiMg MjggIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGluL1N1YmplY3RJbXBs LmhoIiAyCiMgMSAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9QcmFndWUvU3lz L1RocmVhZC5oaCIgMQojIDI2ICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9pbmNsdWRlL1By YWd1ZS9TeXMvVGhyZWFkLmhoIgojIDEgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1 ZGUvUHJhZ3VlL1N5cy9UaW1lLmhoIiAxCiMgMjUgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGlu L2luY2x1ZGUvUHJhZ3VlL1N5cy9UaW1lLmhoIgojIDEgIi91c3IvaW5jbHVkZS9zeXMvdGltZS5o IiAxIDMKIyAyMiAiL3Vzci9pbmNsdWRlL3N5cy90aW1lLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUv ZmVhdHVyZXMuaCIgMSAzCiMgMjMgIi91c3IvaW5jbHVkZS9zeXMvdGltZS5oIiAyIDMKCiMgMSAi L3Vzci9pbmNsdWRlL3RpbWUuaCIgMSAzCiMgMjUgIi91c3IvaW5jbHVkZS9zeXMvdGltZS5oIiAy IDMKIyAxICIvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIiAxIDMKIyAyNSAiL3Vzci9pbmNsdWRl L3N5cy9zZWxlY3QuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAyNiAi L3Vzci9pbmNsdWRlL3N5cy9zZWxlY3QuaCIgMiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90 eXBlcy5oIiAxIDMKIyAyOSAiL3Vzci9pbmNsdWRlL3N5cy9zZWxlY3QuaCIgMiAzCgoKIyAxICIv dXNyL2luY2x1ZGUvYml0cy9zZWxlY3QuaCIgMSAzCiMgMzIgIi91c3IvaW5jbHVkZS9zeXMvc2Vs ZWN0LmgiIDIgMwoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvc2lnc2V0LmgiIDEgMwojIDM1ICIv dXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIiAyIDMKCgoKIyAxICIvdXNyL2luY2x1ZGUvdGltZS5o IiAxIDMKIyAzOSAiL3Vzci9pbmNsdWRlL3N5cy9zZWxlY3QuaCIgMiAzCgpleHRlcm4gIkMiIHsK CgoKCgpzdHJ1Y3QgdGltZXZhbDsKCnR5cGVkZWYgX19mZF9tYXNrIGZkX21hc2s7CgoKdHlwZWRl ZiBfX2ZkX3NldCBmZF9zZXQ7CiMgNzQgIi91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgiIDMKZXh0 ZXJuIGludCBfX3NlbGVjdCAoaW50IF9fbmZkcywgX19mZF9zZXQgKl9fcmVhZGZkcywgX19mZF9z ZXQgKl9fd3JpdGVmZHMsIF9fZmRfc2V0ICpfX2V4Y2VwdGZkcywgc3RydWN0IHRpbWV2YWwgKl9f dGltZW91dCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBzZWxlY3QgKGludCBfX25mZHMsIF9fZmRf c2V0ICpfX3JlYWRmZHMsIF9fZmRfc2V0ICpfX3dyaXRlZmRzLCBfX2ZkX3NldCAqX19leGNlcHRm ZHMsIHN0cnVjdCB0aW1ldmFsICpfX3RpbWVvdXQpIHRocm93ICgpOwojIDg3ICIvdXNyL2luY2x1 ZGUvc3lzL3NlbGVjdC5oIiAzCmV4dGVybiBpbnQgcHNlbGVjdCAoaW50IF9fbmZkcywgX19mZF9z ZXQgKl9fcmVhZGZkcywgX19mZF9zZXQgKl9fd3JpdGVmZHMsIF9fZmRfc2V0ICpfX2V4Y2VwdGZk cywgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RpbWVvdXQsIGNvbnN0IF9fc2lnc2V0X3QgKl9f c2lnbWFzaykgdGhyb3cgKCk7CgoKCgoKfQojIDI2ICIvdXNyL2luY2x1ZGUvc3lzL3RpbWUuaCIg MiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90aW1lLmgiIDEgMwojIDQ5ICIvdXNyL2luY2x1 ZGUvYml0cy90aW1lLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIyA1 MCAiL3Vzci9pbmNsdWRlL2JpdHMvdGltZS5oIiAyIDMKCgoKc3RydWN0IHRpbWV2YWwKICB7CiAg ICBfX3RpbWVfdCB0dl9zZWM7CiAgICBfX3RpbWVfdCB0dl91c2VjOwogIH07CiMgMjkgIi91c3Iv aW5jbHVkZS9zeXMvdGltZS5oIiAyIDMKCgpleHRlcm4gIkMiIHsKIyA0NiAiL3Vzci9pbmNsdWRl L3N5cy90aW1lLmgiIDMKc3RydWN0IHRpbWV6b25lCiAgewogICAgaW50IHR6X21pbnV0ZXN3ZXN0 OwogICAgaW50IHR6X2RzdHRpbWU7CiAgfTsKCgoKCgoKZXh0ZXJuIGludCBnZXR0aW1lb2ZkYXkg KHN0cnVjdCB0aW1ldmFsICpfX3R2LCBzdHJ1Y3QgdGltZXpvbmUgKl9fdHopIHRocm93ICgpOwoK CgoKZXh0ZXJuIGludCBzZXR0aW1lb2ZkYXkgKF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fdHYs IF9fY29uc3Qgc3RydWN0IHRpbWV6b25lICpfX3R6KSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGlu dCBhZGp0aW1lIChfX2NvbnN0IHN0cnVjdCB0aW1ldmFsICpfX2RlbHRhLCBzdHJ1Y3QgdGltZXZh bCAqX19vbGRkZWx0YSkgdGhyb3cgKCk7CgoKCgplbnVtIF9faXRpbWVyX3doaWNoCiAgewoKICAg IElUSU1FUl9SRUFMID0gMCwKCgogICAgSVRJTUVSX1ZJUlRVQUwgPSAxLAoKCgogICAgSVRJTUVS X1BST0YgPSAyCgogIH07CgoKCnN0cnVjdCBpdGltZXJ2YWwKICB7CgogICAgc3RydWN0IHRpbWV2 YWwgaXRfaW50ZXJ2YWw7CgogICAgc3RydWN0IHRpbWV2YWwgaXRfdmFsdWU7CiAgfTsKCgoKZXh0 ZXJuIGludCBnZXRpdGltZXIgKGVudW0gX19pdGltZXJfd2hpY2ggX193aGljaCwgc3RydWN0IGl0 aW1lcnZhbCAqX192YWx1ZSkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIGludCBzZXRpdGltZXIgKGVu dW0gX19pdGltZXJfd2hpY2ggX193aGljaCwgX19jb25zdCBzdHJ1Y3QgaXRpbWVydmFsICpfX25l dywgc3RydWN0IGl0aW1lcnZhbCAqX19vbGQpIHRocm93ICgpOwoKCgoKCmV4dGVybiBpbnQgdXRp bWVzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgc3RydWN0IHRpbWV2YWwgX190dnBbMl0pIHRocm93 ICgpOwojIDE0MyAiL3Vzci9pbmNsdWRlL3N5cy90aW1lLmgiIDMKfQojIDI2ICIvaG9tZS9zdGVm YW4vQmVybGluL0Jlcmxpbi9pbmNsdWRlL1ByYWd1ZS9TeXMvVGltZS5oaCIgMgojIDEgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9jdGltZSIgMSAzCiMgMzEgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9jdGltZSIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0ZF9jdGltZS5oIiAxIDMKIyAzNyAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2N0aW1lLmgiIDMKIyAxICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3N0ZGRlZi5oIiAxIDMKIyAzOCAiL3Vzci9s b2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdGRkZWYuaCIgMwojIDEgIi91 c3IvbG9jYWwvZ2NjLTMuMC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVk ZS9zdGRkZWYuaCIgMSAzCiMgMzkgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i aXRzL3N0ZF9jc3RkZGVmLmgiIDIgMwoKbmFtZXNwYWNlIHN0ZAp7CiAgdXNpbmcgOjpwdHJkaWZm X3Q7CiAgdXNpbmcgOjpzaXplX3Q7Cn0KIyAzOCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX2N0aW1lLmgiIDIgMwojIDQwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5j bHVkZS9nKystdjMvYml0cy9zdGRfY3RpbWUuaCIgMwojIDEgIi91c3IvaW5jbHVkZS90aW1lLmgi IDEgMwojIDQxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3Rp bWUuaCIgMiAzCiMgNTMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0 ZF9jdGltZS5oIiAzCm5hbWVzcGFjZSBzdGQKewogIHVzaW5nIDo6Y2xvY2tfdDsKICB1c2luZyA6 OnRpbWVfdDsKICB1c2luZyA6OnRtOwoKICB1c2luZyA6OmNsb2NrOwogIHVzaW5nIDo6ZGlmZnRp bWU7CiAgdXNpbmcgOjpta3RpbWU7CiAgdXNpbmcgOjp0aW1lOwogIHVzaW5nIDo6YXNjdGltZTsK ICB1c2luZyA6OmN0aW1lOwogIHVzaW5nIDo6Z210aW1lOwogIHVzaW5nIDo6bG9jYWx0aW1lOwog IHVzaW5nIDo6c3RyZnRpbWU7Cn0KIyAzMiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysr LXYzL2N0aW1lIiAyIDMKIyAyNyAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9Q cmFndWUvU3lzL1RpbWUuaGgiIDIKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKyst djMvaW9zdHJlYW0iIDEgMwojIDMxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv aW9zdHJlYW0iIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9z dGRfaW9zdHJlYW0uaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12 My9iaXRzL3N0ZF9pb3N0cmVhbS5oIiAzCgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL2MrK2NvbmZpZy5oIiAxIDMKIyAzNCAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvYysr Y29uZmlnLmgiIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1w Yy1saW51eC1nbnUvYml0cy9vc19kZWZpbmVzLmgiIDEgMwojIDM3ICIvdXNyL2xvY2FsL2djYy0z LjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9vc19kZWZpbmVzLmgiIDMK IyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMu MC9pbmNsdWRlL2crKy12My9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL29zX2RlZmluZXMuaCIgMiAz CiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9pNjg2LXBjLWxpbnV4LWdu dS9iaXRzL2MrK2NvbmZpZy5oIiAyIDMKIyA0MCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX2lvc3RyZWFtLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0ZF9vc3RyZWFtLmgiIDEgMwojIDM4ICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfb3N0cmVhbS5oIiAzCgojIDEgIi91c3IvbG9j YWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pb3MuaCIgMSAzCiMgMzggIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pb3MuaCIgMwoKIyAxICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9zZndkLmgiIDEgMwojIDM4 ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9zZndkLmgiIDMK CiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251 L2JpdHMvYysrY29uZmlnLmgiIDEgMwojIDQwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9zdGRfaW9zZndkLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9iaXRzL3N0cmluZ2Z3ZC5oIiAxIDMKIyAzOCAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RyaW5nZndkLmgiIDMKCiMgMSAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvYysrY29uZmlnLmgiIDEg MwojIDQwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdHJpbmdmd2Qu aCIgMiAzCgpuYW1lc3BhY2Ugc3RkCnsKICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CiAgICBzdHJ1 Y3QgY2hhcl90cmFpdHM7CgogIHRlbXBsYXRlPD4gY2xhc3MgY2hhcl90cmFpdHM8Y2hhcj47CgoK CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KICAgIGNsYXNzIGFsbG9jYXRvcjsKCiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0No YXJUPiwKICAgICAgICAgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CiAg ICBjbGFzcyBiYXNpY19zdHJpbmc7CgogIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXI+IHN0cmlu ZzsKCgoKfQojIDQxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRf aW9zZndkLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRz L2Zwb3MuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRz L2Zwb3MuaCIgMwoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1w Yy1saW51eC1nbnUvYml0cy9jKytpby5oIiAxIDMKIyAzNSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvYysraW8uaCIgMwojIDEgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9jc3RkaW8iIDEgMwojIDMxICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvY3N0ZGlvIiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdGRpby5oIiAxIDMKIyAzNyAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdGRpby5oIiAzCiMgMSAiL3Vzci9sb2Nh bC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvYysrY29uZmln LmgiIDEgMwojIDM4ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRf Y3N0ZGlvLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRz L3N0ZF9jc3RkZGVmLmgiIDEgMwojIDM5ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKyst djMvYml0cy9zdGRfY3N0ZGlvLmgiIDIgMwojIDQxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVk ZS9nKystdjMvYml0cy9zdGRfY3N0ZGlvLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIg MSAzCiMgMjcgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1 cmVzLmgiIDEgMwojIDI4ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAzCgpleHRlcm4gIkMiIHsK CgoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUv My4wL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDM0ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAz CgoKCgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdu dS8zLjAvaW5jbHVkZS9zdGRhcmcuaCIgMSAzCiMgNDMgIi91c3IvbG9jYWwvZ2NjLTMuMC9saWIv Z2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRhcmcuaCIgMwp0eXBlZGVm IF9fYnVpbHRpbl92YV9saXN0IF9fZ251Y192YV9saXN0OwojIDExMCAiL3Vzci9sb2NhbC9nY2Mt My4wL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzMuMC9pbmNsdWRlL3N0ZGFyZy5oIiAz CnR5cGVkZWYgX19nbnVjX3ZhX2xpc3QgdmFfbGlzdDsKIyAzOSAiL3Vzci9pbmNsdWRlL3N0ZGlv LmgiIDIgMwoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIyA0MSAiL3Vzci9p bmNsdWRlL3N0ZGlvLmgiIDIgMwoKCgoKCgoKdHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgRklMRTsK IyA1NyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvbGliaW8uaCIg MSAzCiMgMzAgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL19HX2Nv bmZpZy5oIiAxIDMKIyA5ICIvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgiIDMKIyAxICIvdXNyL2lu Y2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIyAxMCAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIiAy IDMKCgoKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgt Z251LzMuMC9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKIyAzMTIgIi91c3IvbG9jYWwvZ2NjLTMuMC9s aWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRkZWYuaCIgMwp0eXBl ZGVmIHVuc2lnbmVkIGludCB3aW50X3Q7CiMgMTUgIi91c3IvaW5jbHVkZS9fR19jb25maWcuaCIg MiAzCiMgMzUgIi91c3IvaW5jbHVkZS9fR19jb25maWcuaCIgMwp0eXBlZGVmIGludCBfR19pbnQx Nl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkpOwp0eXBlZGVmIGludCBfR19p bnQzMl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9fKSkpOwp0eXBlZGVmIHVuc2ln bmVkIGludCBfR191aW50MTZfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsK dHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWludDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9f IChfX1NJX18pKSk7CiMgMzEgIi91c3IvaW5jbHVkZS9saWJpby5oIiAyIDMKIyA0OCAiL3Vzci9p bmNsdWRlL2xpYmlvLmgiIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4 Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1ZGUvc3RkYXJnLmgiIDEgMwojIDQ5ICIvdXNyL2luY2x1 ZGUvbGliaW8uaCIgMiAzCiMgMTU0ICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMwpzdHJ1Y3QgX0lP X2p1bXBfdDsgc3RydWN0IF9JT19GSUxFOwojIDE2NCAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMK dHlwZWRlZiB2b2lkIF9JT19sb2NrX3Q7CgoKCgoKc3RydWN0IF9JT19tYXJrZXIgewogIHN0cnVj dCBfSU9fbWFya2VyICpfbmV4dDsKICBzdHJ1Y3QgX0lPX0ZJTEUgKl9zYnVmOwoKCgogIGludCBf cG9zOwojIDE4NyAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKfTsKCnN0cnVjdCBfSU9fRklMRSB7 CiAgaW50IF9mbGFnczsKCgoKCiAgY2hhciogX0lPX3JlYWRfcHRyOwogIGNoYXIqIF9JT19yZWFk X2VuZDsKICBjaGFyKiBfSU9fcmVhZF9iYXNlOwogIGNoYXIqIF9JT193cml0ZV9iYXNlOwogIGNo YXIqIF9JT193cml0ZV9wdHI7CiAgY2hhciogX0lPX3dyaXRlX2VuZDsKICBjaGFyKiBfSU9fYnVm X2Jhc2U7CiAgY2hhciogX0lPX2J1Zl9lbmQ7CgogIGNoYXIgKl9JT19zYXZlX2Jhc2U7CiAgY2hh ciAqX0lPX2JhY2t1cF9iYXNlOwogIGNoYXIgKl9JT19zYXZlX2VuZDsKCiAgc3RydWN0IF9JT19t YXJrZXIgKl9tYXJrZXJzOwoKICBzdHJ1Y3QgX0lPX0ZJTEUgKl9jaGFpbjsKCiAgaW50IF9maWxl bm87CiAgaW50IF9ibGtzaXplOwogIF9fb2ZmX3QgX29sZF9vZmZzZXQ7CgoKCiAgdW5zaWduZWQg c2hvcnQgX2N1cl9jb2x1bW47CiAgc2lnbmVkIGNoYXIgX3Z0YWJsZV9vZmZzZXQ7CiAgY2hhciBf c2hvcnRidWZbMV07CgoKCiAgX0lPX2xvY2tfdCAqX2xvY2s7CiMgMjMzICIvdXNyL2luY2x1ZGUv bGliaW8uaCIgMwogIF9fb2ZmNjRfdCBfb2Zmc2V0OwoKICBpbnQgX3VudXNlZDJbMTZdOwoKfTsK CgoKCgpzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9J T18yXzFfc3RkaW5fOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRvdXRf OwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRlcnJfOwojIDI2MiAiL3Vz ci9pbmNsdWRlL2xpYmlvLmgiIDMKdHlwZWRlZiBfX3NzaXplX3QgX19pb19yZWFkX2ZuICh2b2lk ICogX19jb29raWUsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMpOwojIDI3MSAiL3Vzci9p bmNsdWRlL2xpYmlvLmgiIDMKdHlwZWRlZiBfX3NzaXplX3QgX19pb193cml0ZV9mbiAodm9pZCAq IF9fY29va2llLCBfX2NvbnN0IGNoYXIgKl9fYnVmLCBzaXplX3QgX19uKTsKIyAyODAgIi91c3Iv aW5jbHVkZS9saWJpby5oIiAzCnR5cGVkZWYgaW50IF9faW9fc2Vla19mbiAodm9pZCAqIF9fY29v a2llLCBfX29mZl90IF9fcG9zLCBpbnQgX193KTsKCgp0eXBlZGVmIGludCBfX2lvX2Nsb3NlX2Zu ICh2b2lkICogX19jb29raWUpOwoKCgoKdHlwZWRlZiBfX2lvX3JlYWRfZm4gY29va2llX3JlYWRf ZnVuY3Rpb25fdDsKdHlwZWRlZiBfX2lvX3dyaXRlX2ZuIGNvb2tpZV93cml0ZV9mdW5jdGlvbl90 Owp0eXBlZGVmIF9faW9fc2Vla19mbiBjb29raWVfc2Vla19mdW5jdGlvbl90Owp0eXBlZGVmIF9f aW9fY2xvc2VfZm4gY29va2llX2Nsb3NlX2Z1bmN0aW9uX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QKewog IF9faW9fcmVhZF9mbiAqcmVhZDsKICBfX2lvX3dyaXRlX2ZuICp3cml0ZTsKICBfX2lvX3NlZWtf Zm4gKnNlZWs7CiAgX19pb19jbG9zZV9mbiAqY2xvc2U7Cn0gX0lPX2Nvb2tpZV9pb19mdW5jdGlv bnNfdDsKdHlwZWRlZiBfSU9fY29va2llX2lvX2Z1bmN0aW9uc190IGNvb2tpZV9pb19mdW5jdGlv bnNfdDsKCgpzdHJ1Y3QgX0lPX2Nvb2tpZV9maWxlCnsKICBzdHJ1Y3QgX0lPX0ZJTEUgX19maWxl OwogIGNvbnN0IHZvaWQgKl9fdnRhYmxlOwogIHZvaWQgKl9fY29va2llOwogIF9JT19jb29raWVf aW9fZnVuY3Rpb25zX3QgX19pb19mdW5jdGlvbnM7Cn07CgoKCgpleHRlcm4gIkMiIHsKCgpleHRl cm4gaW50IF9fdW5kZXJmbG93IChfSU9fRklMRSAqKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX3Vm bG93IChfSU9fRklMRSAqKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfX292ZXJmbG93IChfSU9fRklM RSAqLCBpbnQpIHRocm93ICgpOwojIDMzNyAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKZXh0ZXJu IGludCBfSU9fZ2V0YyAoX0lPX0ZJTEUgKl9fZnApIHRocm93ICgpOwpleHRlcm4gaW50IF9JT19w dXRjIChpbnQgX19jLCBfSU9fRklMRSAqX19mcCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgX0lPX2Zl b2YgKF9JT19GSUxFICpfX2ZwKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfSU9fZmVycm9yIChfSU9f RklMRSAqX19mcCkgdGhyb3cgKCk7CgpleHRlcm4gaW50IF9JT19wZWVrY19sb2NrZWQgKF9JT19G SUxFICpfX2ZwKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gdm9pZCBfSU9fZmxvY2tmaWxlIChfSU9f RklMRSAqKSB0aHJvdyAoKTsKZXh0ZXJuIHZvaWQgX0lPX2Z1bmxvY2tmaWxlIChfSU9fRklMRSAq KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBfSU9fZnRyeWxvY2tmaWxlIChfSU9fRklMRSAqKSB0aHJv dyAoKTsKIyAzNjMgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCmV4dGVybiBpbnQgX0lPX3Zmc2Nh bmYgKF9JT19GSUxFICogX19yZXN0cmljdCwgY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIF9fZ251 Y192YV9saXN0LCBpbnQgKl9fcmVzdHJpY3QpIHRocm93ICgpOwoKZXh0ZXJuIGludCBfSU9fdmZw cmludGYgKF9JT19GSUxFICpfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0LCBfX2du dWNfdmFfbGlzdCkgdGhyb3cgKCk7CgpleHRlcm4gX19zc2l6ZV90IF9JT19wYWRuIChfSU9fRklM RSAqLCBpbnQsIF9fc3NpemVfdCkgdGhyb3cgKCk7CmV4dGVybiBzaXplX3QgX0lPX3NnZXRuIChf SU9fRklMRSAqLCB2b2lkICosIHNpemVfdCkgdGhyb3cgKCk7CgpleHRlcm4gX19vZmY2NF90IF9J T19zZWVrb2ZmIChfSU9fRklMRSAqLCBfX29mZjY0X3QsIGludCwgaW50KSB0aHJvdyAoKTsKZXh0 ZXJuIF9fb2ZmNjRfdCBfSU9fc2Vla3BvcyAoX0lPX0ZJTEUgKiwgX19vZmY2NF90LCBpbnQpIHRo cm93ICgpOwoKZXh0ZXJuIHZvaWQgX0lPX2ZyZWVfYmFja3VwX2FyZWEgKF9JT19GSUxFICopIHRo cm93ICgpOwoKCn0KIyA1OCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDIgMwoKCgp0eXBlZGVmIF9f b2ZmX3QgZnBvc190OwoKCgoKdHlwZWRlZiBfX29mZjY0X3QgZnBvczY0X3Q7CiMgMTEwICIvdXNy L2luY2x1ZGUvc3RkaW8uaCIgMwojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvX2xpbS5oIiAx IDMKIyAxMTEgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAyIDMKCgoKZXh0ZXJuIEZJTEUgKnN0ZGlu OwpleHRlcm4gRklMRSAqc3Rkb3V0OwpleHRlcm4gRklMRSAqc3RkZXJyOwoKCgoKCgoKZXh0ZXJu IGludCByZW1vdmUgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgdGhyb3cgKCk7CgpleHRlcm4g aW50IHJlbmFtZSAoX19jb25zdCBjaGFyICpfX29sZCwgX19jb25zdCBjaGFyICpfX25ldykgdGhy b3cgKCk7CgoKCgpleHRlcm4gRklMRSAqdG1wZmlsZSAodm9pZCkgdGhyb3cgKCk7CiMgMTQwICIv dXNyL2luY2x1ZGUvc3RkaW8uaCIgMwpleHRlcm4gRklMRSAqdG1wZmlsZTY0ICh2b2lkKSB0aHJv dyAoKTsKCgpleHRlcm4gY2hhciAqdG1wbmFtIChjaGFyICpfX3MpIHRocm93ICgpOwoKCgoKZXh0 ZXJuIGNoYXIgKnRtcG5hbV9yIChjaGFyICpfX3MpIHRocm93ICgpOwojIDE2MCAiL3Vzci9pbmNs dWRlL3N0ZGlvLmgiIDMKZXh0ZXJuIGNoYXIgKnRlbXBuYW0gKF9fY29uc3QgY2hhciAqX19kaXIs IF9fY29uc3QgY2hhciAqX19wZngpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGludCBmY2xvc2UgKEZJ TEUgKl9fc3RyZWFtKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgZmZsdXNoIChGSUxFICpfX3N0cmVh bSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgZmZsdXNoX3VubG9ja2VkIChGSUxFICpfX3N0cmVh bSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gaW50IGZjbG9zZWFsbCAodm9pZCkgdGhyb3cgKCk7CgoK CgoKZXh0ZXJuIEZJTEUgKmZvcGVuIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFt ZSwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMpIHRocm93ICgpOwoKCmV4dGVybiBG SUxFICpmcmVvcGVuIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwgX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMsIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIHRo cm93ICgpOwojIDIwMyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKZXh0ZXJuIEZJTEUgKmZvcGVu NjQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGVuYW1lLCBfX2NvbnN0IGNoYXIgKl9f cmVzdHJpY3QgX19tb2RlcykgdGhyb3cgKCk7CgpleHRlcm4gRklMRSAqZnJlb3BlbjY0IChfX2Nv bnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fbW9kZXMsIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIHRocm93ICgpOwoKCgoKCgpleHRl cm4gRklMRSAqZmRvcGVuIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX21vZGVzKSB0aHJvdyAo KTsKCgoKCgpleHRlcm4gRklMRSAqZm9wZW5jb29raWUgKHZvaWQgKl9fcmVzdHJpY3QgX19tYWdp Y19jb29raWUsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVzLCBfSU9fY29va2llX2lv X2Z1bmN0aW9uc190IF9faW9fZnVuY3MpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gRklMRSAqb3Bl bl9tZW1zdHJlYW0gKGNoYXIgKipfX3Jlc3RyaWN0IF9fYnVmbG9jLCBzaXplX3QgKl9fcmVzdHJp Y3QgX19zaXplbG9jKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIHZvaWQgc2V0YnVmIChGSUxFICpf X3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJvdyAoKTsKCgoK ZXh0ZXJuIGludCBzZXR2YnVmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFyICpfX3Jl c3RyaWN0IF9fYnVmLCBpbnQgX19tb2Rlcywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgoKZXh0 ZXJuIHZvaWQgc2V0YnVmZmVyIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFyICpfX3Jl c3RyaWN0IF9fYnVmLCBzaXplX3QgX19zaXplKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIHZvaWQgc2V0 bGluZWJ1ZiAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpOwoKCgoKZXh0ZXJuIGludCBmcHJpbnRm IChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19m b3JtYXQsIC4uLikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBwcmludGYgKF9fY29uc3QgY2hhciAq X19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgc3ByaW50ZiAo Y2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwg Li4uKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBf X3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX19nbnVjX3ZhX2xpc3QgX19h cmcpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0 cmljdCBfX2Zvcm1hdCwgX19nbnVjX3ZhX2xpc3QgX19hcmcpIHRocm93ICgpOwoKCmV4dGVybiBp bnQgdnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19mb3JtYXQsIF9fZ251Y192YV9saXN0IF9fYXJnKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4g aW50IHNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLCBfX2Nv bnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgdGhyb3cgKCkKCiAgICAgX19hdHRy aWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CgpleHRlcm4gaW50IF9f dnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLCBfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9fZ251Y192YV9saXN0IF9fYXJnKSB0aHJvdyAo KQoKCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7 CmV4dGVybiBpbnQgdnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4 bGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9fZ251Y192YV9saXN0IF9f YXJnKSB0aHJvdyAoKQoKCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRm X18sIDMsIDApKSk7CgoKCgoKZXh0ZXJuIGludCB2YXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0 IF9fcHRyLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mLCBfX2dudWNfdmFfbGlzdCBfX2Fy ZykgdGhyb3cgKCkKCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18s IDIsIDApKSk7CmV4dGVybiBpbnQgX19hc3ByaW50ZiAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIs IF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSB0aHJvdyAoKQoKICAgICBfX2F0 dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKZXh0ZXJuIGludCBh c3ByaW50ZiAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsIF9fY29uc3QgY2hhciAqX19yZXN0cmlj dCBfX2ZtdCwgLi4uKSB0aHJvdyAoKQoKICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAo X19wcmludGZfXywgMiwgMykpKTsKCgpleHRlcm4gaW50IHZkcHJpbnRmIChpbnQgX19mZCwgX19j b25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FyZykgdGhyb3cg KCkKCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSk7 CmV4dGVybiBpbnQgZHByaW50ZiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X2ZtdCwgLi4uKSB0aHJvdyAoKQogICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3By aW50Zl9fLCAyLCAzKSkpOwoKCgoKZXh0ZXJuIGludCBmc2NhbmYgKEZJTEUgKl9fcmVzdHJpY3Qg X19zdHJlYW0sIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IHNjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQs IC4uLikgdGhyb3cgKCk7CgpleHRlcm4gaW50IHNzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3Ry aWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIHRocm93ICgp OwoKCgoKZXh0ZXJuIGludCB2ZnNjYW5mIChGSUxFICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBj aGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfX2dudWNfdmFfbGlzdCBfX2FyZykgdGhyb3cgKCkK CgogICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3NjYW5mX18sIDIsIDApKSk7CgoK ZXh0ZXJuIGludCB2c2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX19n bnVjX3ZhX2xpc3QgX19hcmcpIHRocm93ICgpCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0 X18gKF9fc2NhbmZfXywgMSwgMCkpKTsKCgpleHRlcm4gaW50IHZzc2NhbmYgKF9fY29uc3QgY2hh ciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX19n bnVjX3ZhX2xpc3QgX19hcmcpIHRocm93ICgpCgoKICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3Jt YXRfXyAoX19zY2FuZl9fLCAyLCAwKSkpOwoKCgoKZXh0ZXJuIGludCBmZ2V0YyAoRklMRSAqX19z dHJlYW0pIHRocm93ICgpOwpleHRlcm4gaW50IGdldGMgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IGdldGNoYXIgKHZvaWQpIHRocm93ICgpOwoKCgoKCgoKZXh0ZXJuIGlu dCBnZXRjX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CmV4dGVybiBpbnQgZ2V0 Y2hhcl91bmxvY2tlZCAodm9pZCkgdGhyb3cgKCk7CgoKCgpleHRlcm4gaW50IGZnZXRjX3VubG9j a2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gaW50IGZwdXRjIChpbnQg X19jLCBGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CmV4dGVybiBpbnQgcHV0YyAoaW50IF9fYywg RklMRSAqX19zdHJlYW0pIHRocm93ICgpOwoKCmV4dGVybiBpbnQgcHV0Y2hhciAoaW50IF9fYykg dGhyb3cgKCk7CgoKCgoKCgpleHRlcm4gaW50IGZwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxF ICpfX3N0cmVhbSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gaW50IHB1dGNfdW5sb2NrZWQgKGludCBf X2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKTsKZXh0ZXJuIGludCBwdXRjaGFyX3VubG9ja2Vk IChpbnQgX19jKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gaW50IGdldHcgKEZJTEUgKl9fc3RyZWFt KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHB1dHcgKGludCBfX3csIEZJTEUgKl9fc3RyZWFtKSB0 aHJvdyAoKTsKCgoKCmV4dGVybiBjaGFyICpmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGlu dCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIHRocm93ICgpOwoKCgoKZXh0ZXJuIGNo YXIgKmZnZXRzX3VubG9ja2VkIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgRklMRSAq X19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIGNoYXIgKmdldHMgKGNo YXIgKl9fcykgdGhyb3cgKCk7CiMgNDEzICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwpleHRlcm4g X19zc2l6ZV90IF9fZ2V0ZGVsaW0gKGNoYXIgKipfX3Jlc3RyaWN0IF9fbGluZXB0ciwgc2l6ZV90 ICpfX3Jlc3RyaWN0IF9fbiwgaW50IF9fZGVsaW1pdGVyLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3Ry ZWFtKSB0aHJvdyAoKTsKCgpleHRlcm4gX19zc2l6ZV90IGdldGRlbGltIChjaGFyICoqX19yZXN0 cmljdCBfX2xpbmVwdHIsIHNpemVfdCAqX19yZXN0cmljdCBfX24sIGludCBfX2RlbGltaXRlciwg RklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCk7CgoKCgpleHRlcm4gX19zc2l6ZV90 IGdldGxpbmUgKGNoYXIgKipfX3Jlc3RyaWN0IF9fbGluZXB0ciwgc2l6ZV90ICpfX3Jlc3RyaWN0 IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBp bnQgZnB1dHMgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIEZJTEUgKl9fcmVzdHJpY3Qg X19zdHJlYW0pIHRocm93ICgpOwoKCgoKZXh0ZXJuIGludCBmcHV0c191bmxvY2tlZCAoX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cg KCk7CgoKCgpleHRlcm4gaW50IHB1dHMgKF9fY29uc3QgY2hhciAqX19zKSB0aHJvdyAoKTsKCgoK ZXh0ZXJuIGludCB1bmdldGMgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKTsKCgoK ZXh0ZXJuIHNpemVfdCBmcmVhZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6 ZSwgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCk7CgoKZXh0 ZXJuIHNpemVfdCBmd3JpdGUgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90 IF9fc2l6ZSwgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3MpIHRocm93ICgpOwoKCgoK ZXh0ZXJuIHNpemVfdCBmcmVhZF91bmxvY2tlZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6 ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cg KCk7CgpleHRlcm4gc2l6ZV90IGZ3cml0ZV91bmxvY2tlZCAoX19jb25zdCB2b2lkICpfX3Jlc3Ry aWN0IF9fcHRyLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9f c3RyZWFtKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGludCBmc2VlayAoRklMRSAqX19zdHJlYW0s IGxvbmcgaW50IF9fb2ZmLCBpbnQgX193aGVuY2UpIHRocm93ICgpOwoKZXh0ZXJuIGxvbmcgaW50 IGZ0ZWxsIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CgpleHRlcm4gdm9pZCByZXdpbmQgKEZJ TEUgKl9fc3RyZWFtKSB0aHJvdyAoKTsKIyA0NzcgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAzCnR5 cGVkZWYgX19vZmZfdCBvZmZfdDsKCgoKCgoKCnR5cGVkZWYgX19vZmY2NF90IG9mZjY0X3Q7CgoK CgoKCgpleHRlcm4gaW50IGZzZWVrbyAoRklMRSAqX19zdHJlYW0sIF9fb2ZmX3QgX19vZmYsIGlu dCBfX3doZW5jZSkgdGhyb3cgKCk7CgpleHRlcm4gX19vZmZfdCBmdGVsbG8gKEZJTEUgKl9fc3Ry ZWFtKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBmZ2V0cG9zIChGSUxFICpfX3Jlc3RyaWN0IF9f c3RyZWFtLCBmcG9zX3QgKl9fcmVzdHJpY3QgX19wb3MpIHRocm93ICgpOwoKCmV4dGVybiBpbnQg ZnNldHBvcyAoRklMRSAqX19zdHJlYW0sIF9fY29uc3QgZnBvc190ICpfX3BvcykgdGhyb3cgKCk7 CiMgNTI3ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwpleHRlcm4gaW50IGZzZWVrbzY0IChGSUxF ICpfX3N0cmVhbSwgX19vZmY2NF90IF9fb2ZmLCBpbnQgX193aGVuY2UpIHRocm93ICgpOwpleHRl cm4gX19vZmY2NF90IGZ0ZWxsbzY0IChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CgpleHRlcm4g aW50IGZnZXRwb3M2NCAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgZnBvczY0X3QgKl9fcmVz dHJpY3QgX19wb3MpIHRocm93ICgpOwoKZXh0ZXJuIGludCBmc2V0cG9zNjQgKEZJTEUgKl9fc3Ry ZWFtLCBfX2NvbnN0IGZwb3M2NF90ICpfX3BvcykgdGhyb3cgKCk7CgoKCmV4dGVybiB2b2lkIGNs ZWFyZXJyIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CgpleHRlcm4gaW50IGZlb2YgKEZJTEUg Kl9fc3RyZWFtKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgZmVycm9yIChGSUxFICpfX3N0cmVhbSkg dGhyb3cgKCk7CgoKCmV4dGVybiB2b2lkIGNsZWFyZXJyX3VubG9ja2VkIChGSUxFICpfX3N0cmVh bSkgdGhyb3cgKCk7CmV4dGVybiBpbnQgZmVvZl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIHRo cm93ICgpOwpleHRlcm4gaW50IGZlcnJvcl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIHRocm93 ICgpOwoKCgoKZXh0ZXJuIHZvaWQgcGVycm9yIChfX2NvbnN0IGNoYXIgKl9fcykgdGhyb3cgKCk7 CgoKCgpleHRlcm4gaW50IHN5c19uZXJyOwpleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5 c19lcnJsaXN0W107CgoKZXh0ZXJuIGludCBfc3lzX25lcnI7CmV4dGVybiBfX2NvbnN0IGNoYXIg Kl9fY29uc3QgX3N5c19lcnJsaXN0W107CgoKCgoKZXh0ZXJuIGludCBmaWxlbm8gKEZJTEUgKl9f c3RyZWFtKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBpbnQgZmlsZW5vX3VubG9ja2VkIChGSUxFICpf X3N0cmVhbSkgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiBGSUxFICpwb3BlbiAoX19jb25zdCBjaGFy ICpfX2NvbW1hbmQsIF9fY29uc3QgY2hhciAqX19tb2RlcykgdGhyb3cgKCk7CgoKZXh0ZXJuIGlu dCBwY2xvc2UgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gY2hhciAqY3Rl cm1pZCAoY2hhciAqX19zKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gY2hhciAqY3VzZXJpZCAoY2hh ciAqX19zKSB0aHJvdyAoKTsKCgoKCnN0cnVjdCBvYnN0YWNrOwoKCmV4dGVybiBpbnQgb2JzdGFj a19wcmludGYgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywgX19jb25zdCBj aGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIHRocm93ICgpOwoKZXh0ZXJuIGludCBvYnN0 YWNrX3ZwcmludGYgKHN0cnVjdCBvYnN0YWNrICpfX3Jlc3RyaWN0IF9fb2JzdGFjaywgX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfX2dudWNfdmFfbGlzdCBfX2FyZ3MpIHRocm93 ICgpOwojIDYxNCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKZXh0ZXJuIHZvaWQgZmxvY2tmaWxl IChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgZnRyeWxvY2tmaWxlIChG SUxFICpfX3N0cmVhbSkgdGhyb3cgKCk7CgoKZXh0ZXJuIHZvaWQgZnVubG9ja2ZpbGUgKEZJTEUg Kl9fc3RyZWFtKSB0aHJvdyAoKTsKIyA2MzggIi91c3IvaW5jbHVkZS9zdGRpby5oIiAzCn0KIyA0 MiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdGRpby5oIiAy IDMKIyA4NiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdGRp by5oIiAzCm5hbWVzcGFjZSBzdGQKewogIHVzaW5nIDo6RklMRTsKICB1c2luZyA6OmZwb3NfdDsK CiAgdXNpbmcgOjpjbGVhcmVycjsKICB1c2luZyA6OmZjbG9zZTsKICB1c2luZyA6OmZlb2Y7CiAg dXNpbmcgOjpmZXJyb3I7CiAgdXNpbmcgOjpmZmx1c2g7CiAgdXNpbmcgOjpmZ2V0YzsKICB1c2lu ZyA6OmZnZXRwb3M7CiAgdXNpbmcgOjpmZ2V0czsKICB1c2luZyA6OmZvcGVuOwogIHVzaW5nIDo6 ZnByaW50ZjsKICB1c2luZyA6OmZwdXRjOwogIHVzaW5nIDo6ZnB1dHM7CiAgdXNpbmcgOjpmcmVh ZDsKICB1c2luZyA6OmZyZW9wZW47CiAgdXNpbmcgOjpmc2NhbmY7CiAgdXNpbmcgOjpmc2VlazsK ICB1c2luZyA6OmZzZXRwb3M7CiAgdXNpbmcgOjpmdGVsbDsKICB1c2luZyA6OmZ3cml0ZTsKICB1 c2luZyA6OmdldGM7CiAgdXNpbmcgOjpnZXRjaGFyOwogIHVzaW5nIDo6Z2V0czsKICB1c2luZyA6 OnBlcnJvcjsKICB1c2luZyA6OnByaW50ZjsKICB1c2luZyA6OnB1dGM7CiAgdXNpbmcgOjpwdXRj aGFyOwogIHVzaW5nIDo6cHV0czsKICB1c2luZyA6OnJlbW92ZTsKICB1c2luZyA6OnJlbmFtZTsK ICB1c2luZyA6OnJld2luZDsKICB1c2luZyA6OnNjYW5mOwogIHVzaW5nIDo6c2V0YnVmOwogIHVz aW5nIDo6c2V0dmJ1ZjsKICB1c2luZyA6OnNwcmludGY7CiAgdXNpbmcgOjpzc2NhbmY7CiAgdXNp bmcgOjp0bXBmaWxlOwogIHVzaW5nIDo6dG1wbmFtOwogIHVzaW5nIDo6dW5nZXRjOwogIHVzaW5n IDo6dmZwcmludGY7CiAgdXNpbmcgOjp2cHJpbnRmOwogIHVzaW5nIDo6dnNwcmludGY7Cn0KIyAx NDIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3RkaW8uaCIg MwpuYW1lc3BhY2UgX19nbnVfY3h4CnsKICB1c2luZyA6OnNucHJpbnRmOwogIHVzaW5nIDo6dmZz Y2FuZjsKICB1c2luZyA6OnZzY2FuZjsKICB1c2luZyA6OnZzbnByaW50ZjsKICB1c2luZyA6OnZz c2NhbmY7Cn0KCm5hbWVzcGFjZSBzdGQKewogIHVzaW5nIF9fZ251X2N4eDo6c25wcmludGY7CiAg dXNpbmcgX19nbnVfY3h4Ojp2ZnNjYW5mOwogIHVzaW5nIF9fZ251X2N4eDo6dnNjYW5mOwogIHVz aW5nIF9fZ251X2N4eDo6dnNucHJpbnRmOwogIHVzaW5nIF9fZ251X2N4eDo6dnNzY2FuZjsKfQoj IDMyICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvY3N0ZGlvIiAyIDMKIyAzNiAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMv YysraW8uaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2NzdGRk ZWYiIDEgMwojIDM3ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1s aW51eC1nbnUvYml0cy9jKytpby5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVk ZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9ndGhyLmgiIDEgMwojIDk4ICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9ndGhyLmgi IDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1n bnUvYml0cy9ndGhyLWRlZmF1bHQuaCIgMSAzCiMgMzcgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL2d0aHItZGVmYXVsdC5oIiAzCiMgMSAi L3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL2d0aHItZGVmYXVsdC5oIiAyIDMKCnR5 cGVkZWYgcHRocmVhZF9rZXlfdCBfX2d0aHJlYWRfa2V5X3Q7CnR5cGVkZWYgcHRocmVhZF9vbmNl X3QgX19ndGhyZWFkX29uY2VfdDsKdHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX211 dGV4X3Q7CgoKCgoKCiNwcmFnbWEgd2VhayBwdGhyZWFkX29uY2UKI3ByYWdtYSB3ZWFrIHB0aHJl YWRfa2V5X2NyZWF0ZQojcHJhZ21hIHdlYWsgcHRocmVhZF9rZXlfZGVsZXRlCiNwcmFnbWEgd2Vh ayBwdGhyZWFkX2dldHNwZWNpZmljCiNwcmFnbWEgd2VhayBwdGhyZWFkX3NldHNwZWNpZmljCiNw cmFnbWEgd2VhayBwdGhyZWFkX2NyZWF0ZQoKI3ByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhfbG9j awojcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleF90cnlsb2NrCiNwcmFnbWEgd2VhayBwdGhyZWFk X211dGV4X3VubG9jawojIDc4ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4 Ni1wYy1saW51eC1nbnUvYml0cy9ndGhyLWRlZmF1bHQuaCIgMwpzdGF0aWMgdm9pZCAqX19ndGhy ZWFkX2FjdGl2ZV9wdHIgPSAodm9pZCAqKSAmcHRocmVhZF9jcmVhdGU7CgpzdGF0aWMgaW5saW5l IGludApfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCnsKICByZXR1cm4gX19ndGhyZWFkX2FjdGl2 ZV9wdHIgIT0gMDsKfQojIDQyNyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2 ODYtcGMtbGludXgtZ251L2JpdHMvZ3Roci1kZWZhdWx0LmgiIDMKc3RhdGljIGlubGluZSBpbnQK X19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKm9uY2UsIHZvaWQgKCpmdW5jKSAodm9p ZCkpCnsKICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQogICAgcmV0dXJuIHB0aHJlYWRfb25j ZSAob25jZSwgZnVuYyk7CiAgZWxzZQogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW5saW5lIGlu dApfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICprZXksIHZvaWQgKCpkdG9y KSAodm9pZCAqKSkKewogIHJldHVybiBwdGhyZWFkX2tleV9jcmVhdGUgKGtleSwgZHRvcik7Cn0K CnN0YXRpYyBpbmxpbmUgaW50Cl9fZ3RocmVhZF9rZXlfZHRvciAoX19ndGhyZWFkX2tleV90IGtl eSwgdm9pZCAqcHRyKQp7CgogIGlmIChwdHIpCiAgICByZXR1cm4gcHRocmVhZF9zZXRzcGVjaWZp YyAoa2V5LCAwKTsKICBlbHNlCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSBpbnQKX19n dGhyZWFkX2tleV9kZWxldGUgKF9fZ3RocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gcHRocmVh ZF9rZXlfZGVsZXRlIChrZXkpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgKgpfX2d0aHJlYWRfZ2V0 c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gcHRocmVhZF9nZXRzcGVj aWZpYyAoa2V5KTsKfQoKc3RhdGljIGlubGluZSBpbnQKX19ndGhyZWFkX3NldHNwZWNpZmljIChf X2d0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwdHIpCnsKICByZXR1cm4gcHRocmVhZF9z ZXRzcGVjaWZpYyAoa2V5LCBwdHIpOwp9CgpzdGF0aWMgaW5saW5lIGludApfX2d0aHJlYWRfbXV0 ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKF9fZ3RocmVhZF9hY3Rp dmVfcCAoKSkKICAgIHJldHVybiBwdGhyZWFkX211dGV4X2xvY2sgKG11dGV4KTsKICBlbHNlCiAg ICByZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSBpbnQKX19ndGhyZWFkX211dGV4X3RyeWxvY2sg KF9fZ3RocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkp CiAgICByZXR1cm4gcHRocmVhZF9tdXRleF90cnlsb2NrIChtdXRleCk7CiAgZWxzZQogICAgcmV0 dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50Cl9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3Ro cmVhZF9tdXRleF90ICptdXRleCkKewogIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCiAgICBy ZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2sgKG11dGV4KTsKICBlbHNlCiAgICByZXR1cm4gMDsK fQojIDk5ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1n bnUvYml0cy9ndGhyLmgiIDIgMwojIDM4ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKyst djMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytpby5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewoK ICB0eXBlZGVmIGxvbmcgc3RyZWFtb2ZmOwogIHR5cGVkZWYgcHRyZGlmZl90IHN0cmVhbXNpemU7 CgoKCiAgdHlwZWRlZiBmcG9zX3QgX19jX3N0cmVhbXBvczsKCiAgdHlwZWRlZiBfX2d0aHJlYWRf bXV0ZXhfdCBfX2NfbG9jazsKCgoKICB0eXBlZGVmIEZJTEUgX19jX2ZpbGVfdHlwZTsKCgogIHN0 cnVjdCBfX2lvc19mbGFncwogIHsKICAgIHR5cGVkZWYgc2hvcnQgX19pbnRfdHlwZTsKCiAgICBz dGF0aWMgY29uc3QgX19pbnRfdHlwZSBfU19ib29sYWxwaGEgPSAweDAwMDE7CiAgICBzdGF0aWMg Y29uc3QgX19pbnRfdHlwZSBfU19kZWMgPSAweDAwMDI7CiAgICBzdGF0aWMgY29uc3QgX19pbnRf dHlwZSBfU19maXhlZCA9IDB4MDAwNDsKICAgIHN0YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX2hl eCA9IDB4MDAwODsKICAgIHN0YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX2ludGVybmFsID0gMHgw MDEwOwogICAgc3RhdGljIGNvbnN0IF9faW50X3R5cGUgX1NfbGVmdCA9IDB4MDAyMDsKICAgIHN0 YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX29jdCA9IDB4MDA0MDsKICAgIHN0YXRpYyBjb25zdCBf X2ludF90eXBlIF9TX3JpZ2h0ID0gMHgwMDgwOwogICAgc3RhdGljIGNvbnN0IF9faW50X3R5cGUg X1Nfc2NpZW50aWZpYyA9IDB4MDEwMDsKICAgIHN0YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX3No b3diYXNlID0gMHgwMjAwOwogICAgc3RhdGljIGNvbnN0IF9faW50X3R5cGUgX1Nfc2hvd3BvaW50 ID0gMHgwNDAwOwogICAgc3RhdGljIGNvbnN0IF9faW50X3R5cGUgX1Nfc2hvd3BvcyA9IDB4MDgw MDsKICAgIHN0YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX3NraXB3cyA9IDB4MTAwMDsKICAgIHN0 YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX3VuaXRidWYgPSAweDIwMDA7CiAgICBzdGF0aWMgY29u c3QgX19pbnRfdHlwZSBfU191cHBlcmNhc2UgPSAweDQwMDA7CiAgICBzdGF0aWMgY29uc3QgX19p bnRfdHlwZSBfU19hZGp1c3RmaWVsZCA9IDB4MDAyMCB8IDB4MDA4MCB8IDB4MDAxMDsKICAgIHN0 YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX2Jhc2VmaWVsZCA9IDB4MDAwMiB8IDB4MDA0MCB8IDB4 MDAwODsKICAgIHN0YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX2Zsb2F0ZmllbGQgPSAweDAxMDAg fCAweDAwMDQ7CgoKICAgIHN0YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX2JhZGJpdCA9IDB4MDE7 CiAgICBzdGF0aWMgY29uc3QgX19pbnRfdHlwZSBfU19lb2ZiaXQgPSAweDAyOwogICAgc3RhdGlj IGNvbnN0IF9faW50X3R5cGUgX1NfZmFpbGJpdCA9IDB4MDQ7CgoKICAgIHN0YXRpYyBjb25zdCBf X2ludF90eXBlIF9TX2FwcCA9IDB4MDE7CiAgICBzdGF0aWMgY29uc3QgX19pbnRfdHlwZSBfU19h dGUgPSAweDAyOwogICAgc3RhdGljIGNvbnN0IF9faW50X3R5cGUgX1NfYmluID0gMHgwNDsKICAg IHN0YXRpYyBjb25zdCBfX2ludF90eXBlIF9TX2luID0gMHgwODsKICAgIHN0YXRpYyBjb25zdCBf X2ludF90eXBlIF9TX291dCA9IDB4MTA7CiAgICBzdGF0aWMgY29uc3QgX19pbnRfdHlwZSBfU190 cnVuYyA9IDB4MjA7CiAgfTsKfQojIDQwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKyst djMvYml0cy9mcG9zLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12 My9iaXRzL3N0ZF9jd2NoYXIuaCIgMSAzCiMgMzcgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL3N0ZF9jd2NoYXIuaCIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL2MrK2NvbmZpZy5oIiAxIDMKIyAzOCAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2N3Y2hhci5oIiAyIDMK IyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3N0ZGRlZi5o IiAxIDMKIyAzOSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2N3 Y2hhci5oIiAyIDMKIyA0MiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv c3RkX2N3Y2hhci5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDEgMwojIDI3ICIvdXNy L2luY2x1ZGUvd2NoYXIuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAy OCAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDIgMwoKCgojIDEgIi91c3IvaW5jbHVkZS9zdGRpby5o IiAxIDMKIyAzMiAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDIgMwoKCgoKCgojIDEgIi91c3IvbG9j YWwvZ2NjLTMuMC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRk ZWYuaCIgMSAzCiMgMzkgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAyIDMKIyA1MyAiL3Vzci9pbmNs dWRlL3djaGFyLmgiIDMKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBjb3VudDsKICB3aW50X3QgdmFs dWU7Cn0gbWJzdGF0ZV90OwojIDc3ICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMwpzdHJ1Y3QgdG07 CgoKZXh0ZXJuICJDIiB7CgoKZXh0ZXJuIHdjaGFyX3QgKndjc2NweSAod2NoYXJfdCAqX19yZXN0 cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYykgdGhyb3cgKCk7 CgoKZXh0ZXJuIHdjaGFyX3QgKndjc25jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LCBf X2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pIHRocm93ICgpOwoK CgpleHRlcm4gd2NoYXJfdCAqd2NzY2F0ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19j b25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSB0aHJvdyAoKTsKCgpleHRlcm4gd2NoYXJf dCAqd2NzbmNhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAq X19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCmV4dGVybiBpbnQgd2Nz Y21wIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMikgdGhyb3cg KCk7CgpleHRlcm4gaW50IHdjc25jbXAgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3 Y2hhcl90ICpfX3MyLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBpbnQgd2NzY2Fz ZWNtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIpIHRocm93 ICgpOwoKCmV4dGVybiBpbnQgd2NzbmNhc2VjbXAgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19j b25zdCB3Y2hhcl90ICpfX3MyLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCiMgMSAiL3Vzci9p bmNsdWRlL3hsb2NhbGUuaCIgMSAzCiMgMTEzICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMiAzCgpl eHRlcm4gaW50IF9fd2NzY2FzZWNtcF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qg d2NoYXJfdCAqX19zMiwgX19sb2NhbGVfdCBfX2xvYykgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBf X3djc25jYXNlY21wX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpf X3MyLCBzaXplX3QgX19uLCBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4g aW50IHdjc2NvbGwgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3My KSB0aHJvdyAoKTsKCgoKZXh0ZXJuIHNpemVfdCB3Y3N4ZnJtICh3Y2hhcl90ICpfX3Jlc3RyaWN0 IF9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uKSB0aHJv dyAoKTsKIyAxMzYgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCmV4dGVybiBpbnQgX193Y3Njb2xs X2wgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLCBfX2xvY2Fs ZV90IF9fbG9jKSB0aHJvdyAoKTsKCgoKCmV4dGVybiBzaXplX3QgX193Y3N4ZnJtX2wgKHdjaGFy X3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBf X2xvYykgdGhyb3cgKCk7CgoKCmV4dGVybiB3Y2hhcl90ICp3Y3NkdXAgKF9fY29uc3Qgd2NoYXJf dCAqX19zKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIHdjaGFyX3QgKndjc2NociAoX19jb25zdCB3Y2hh cl90ICpfX3djcywgd2NoYXJfdCBfX3djKSB0aHJvdyAoKTsKCmV4dGVybiB3Y2hhcl90ICp3Y3Ny Y2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpIHRocm93ICgpOwoKCgpl eHRlcm4gc2l6ZV90IHdjc2NzcG4gKF9fY29uc3Qgd2NoYXJfdCAqX193Y3MsIF9fY29uc3Qgd2No YXJfdCAqX19yZWplY3QpIHRocm93ICgpOwoKCgpleHRlcm4gc2l6ZV90IHdjc3NwbiAoX19jb25z dCB3Y2hhcl90ICpfX3djcywgX19jb25zdCB3Y2hhcl90ICpfX2FjY2VwdCkgdGhyb3cgKCk7Cgpl eHRlcm4gd2NoYXJfdCAqd2NzcGJyayAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgX19jb25zdCB3 Y2hhcl90ICpfX2FjY2VwdCkgdGhyb3cgKCk7CgoKZXh0ZXJuIHdjaGFyX3QgKndjc3N0ciAoX19j b25zdCB3Y2hhcl90ICpfX2hheXN0YWNrLCBfX2NvbnN0IHdjaGFyX3QgKl9fbmVlZGxlKSB0aHJv dyAoKTsKIyAxNzQgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCmV4dGVybiB3Y2hhcl90ICp3Y3N0 b2sgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3Qg X19kZWxpbSwgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19wdHIpIHRocm93ICgpOwoKCgoKZXh0ZXJu IHNpemVfdCBfX3djc2xlbiAoX19jb25zdCB3Y2hhcl90ICpfX3MpIHRocm93ICgpOwpleHRlcm4g c2l6ZV90IHdjc2xlbiAoX19jb25zdCB3Y2hhcl90ICpfX3MpIHRocm93ICgpOwoKCgpleHRlcm4g c2l6ZV90IHdjc25sZW4gKF9fY29uc3Qgd2NoYXJfdCAqX19zLCBzaXplX3QgX19tYXhsZW4pIHRo cm93ICgpOwoKCgoKZXh0ZXJuIHdjaGFyX3QgKndtZW1jaHIgKF9fY29uc3Qgd2NoYXJfdCAqX19z LCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCB3bWVtY21w IChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3Jl c3RyaWN0IF9fczIsIHNpemVfdCBfX24pIHRocm93ICgpOwoKCgpleHRlcm4gd2NoYXJfdCAqd21l bWNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJp Y3QgX19zMiwgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCgpleHRlcm4gd2NoYXJfdCAqd21lbW1v dmUgKHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwgc2l6ZV90IF9fbikgdGhy b3cgKCk7CgoKCmV4dGVybiB3Y2hhcl90ICp3bWVtc2V0ICh3Y2hhcl90ICpfX3MsIHdjaGFyX3Qg X19jLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgoKCmV4dGVybiB3aW50X3QgYnRvd2MgKGludCBf X2MpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHdjdG9iICh3aW50X3QgX19jKSB0aHJvdyAoKTsK CgoKZXh0ZXJuIGludCBtYnNpbml0IChfX2NvbnN0IG1ic3RhdGVfdCAqX19wcykgdGhyb3cgKCk7 CgoKCmV4dGVybiBzaXplX3QgbWJydG93YyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3B3YywgX19j b25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwgbWJzdGF0ZV90ICpfX3ApIHRo cm93ICgpOwoKCgoKZXh0ZXJuIHNpemVfdCB3Y3J0b21iIChjaGFyICpfX3Jlc3RyaWN0IF9fcywg d2NoYXJfdCBfX3djLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgdGhyb3cgKCk7CgoKCmV4 dGVybiBzaXplX3QgX19tYnJsZW4gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVf dCBfX24sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSB0aHJvdyAoKTsKCmV4dGVybiBzaXpl X3QgbWJybGVuIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLCBtYnN0 YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgdGhyb3cgKCk7CiMgMjQ3ICIvdXNyL2luY2x1ZGUvd2No YXIuaCIgMwpleHRlcm4gc2l6ZV90IG1ic3J0b3djcyAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rz dCwgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbGVuLCBtYnN0YXRl X3QgKl9fcmVzdHJpY3QgX19wcykgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIHNpemVfdCB3Y3NydG9t YnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3Qg X19zcmMsIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIHRocm93ICgp OwoKCgoKCgoKZXh0ZXJuIHNpemVfdCBtYnNucnRvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9f ZHN0LCBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19ubWMsIHNpemVf dCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIHRocm93ICgpOwoKCgoKCmV4dGVy biBzaXplX3Qgd2NzbnJ0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hh cl90ICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbndjLCBzaXplX3QgX19sZW4sIG1ic3Rh dGVfdCAqX19yZXN0cmljdCBfX3BzKSB0aHJvdyAoKTsKIyAyNzcgIi91c3IvaW5jbHVkZS93Y2hh ci5oIiAzCmV4dGVybiBpbnQgd2N3aWR0aCAod2ludF90IF9fYykgdGhyb3cgKCk7CgoKCmV4dGVy biBpbnQgd2Nzd2lkdGggKF9fY29uc3Qgd2NoYXJfdCAqX19zLCBzaXplX3QgX19uKSB0aHJvdyAo KTsKCgoKCgpleHRlcm4gZG91YmxlIHdjc3RvZCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0 IF9fbnB0ciwgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIpIHRocm93ICgpOwoKCgoKZXh0 ZXJuIGZsb2F0IHdjc3RvZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwgd2No YXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIpIHRocm93ICgpOwoKZXh0ZXJuIGxvbmcgZG91Ymxl IHdjc3RvbGQgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsIHdjaGFyX3QgKipf X3Jlc3RyaWN0IF9fZW5kcHRyKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGxvbmcgaW50IHdjc3Rv bCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwgd2NoYXJfdCAqKl9fcmVzdHJp Y3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIHRocm93ICgpOwoKCgoKZXh0ZXJuIHVuc2lnbmVkIGxv bmcgaW50IHdjc3RvdWwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsIHdjaGFy X3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKSB0aHJvdyAoKTsKCgoKCgoKX19l eHRlbnNpb25fXwpleHRlcm4gbG9uZyBsb25nIGludCB3Y3N0b3EgKF9fY29uc3Qgd2NoYXJfdCAq X19yZXN0cmljdCBfX25wdHIsIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19i YXNlKSB0aHJvdyAoKTsKCgoKCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9u ZyBpbnQgd2NzdG91cSAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwgd2NoYXJf dCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIHRocm93ICgpOwoKCgoKCgoKX19l eHRlbnNpb25fXwpleHRlcm4gbG9uZyBsb25nIGludCB3Y3N0b2xsIChfX2NvbnN0IHdjaGFyX3Qg Kl9fcmVzdHJpY3QgX19ucHRyLCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9f YmFzZSkgdGhyb3cgKCk7CgoKCgpfX2V4dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25nIGxv bmcgaW50IHdjc3RvdWxsIChfX2NvbnN0IHdjaGFyX3QgKiBfX3Jlc3RyaWN0IF9fbnB0ciwgd2No YXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIHRocm93ICgpOwojIDM1NSAi L3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUveGxvY2FsZS5oIiAxIDMK IyAzNTYgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAyIDMKCgoKZXh0ZXJuIGxvbmcgaW50IF9fd2Nz dG9sX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsIHdjaGFyX3QgKipfX3Jl c3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKTsK CgoKZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IF9fd2NzdG91bF9sIChfX2NvbnN0IHdjaGFyX3Qg Kl9fcmVzdHJpY3QgX19ucHRyLCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9f YmFzZSwgX19sb2NhbGVfdCBfX2xvYykgdGhyb3cgKCk7CgoKCl9fZXh0ZW5zaW9uX18KZXh0ZXJu IGxvbmcgbG9uZyBpbnQgX193Y3N0b2xsX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBf X25wdHIsIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBfX2xvY2Fs ZV90IF9fbG9jKSB0aHJvdyAoKTsKCgoKX19leHRlbnNpb25fXwpleHRlcm4gdW5zaWduZWQgbG9u ZyBsb25nIGludCBfX3djc3RvdWxsX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25w dHIsIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBfX2xvY2FsZV90 IF9fbG9jKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gZG91YmxlIF9fd2NzdG9kX2wgKF9fY29uc3Qg d2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRy LCBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGZsb2F0IF9fd2NzdG9mX2wg KF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsIHdjaGFyX3QgKipfX3Jlc3RyaWN0 IF9fZW5kcHRyLCBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGxvbmcgZG91 YmxlIF9fd2NzdG9sZF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLCB3Y2hh cl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgX19sb2NhbGVfdCBfX2xvYykgdGhyb3cgKCk7CgoK CgoKCgpleHRlcm4gZG91YmxlIF9fd2NzdG9kX2ludGVybmFsIChfX2NvbnN0IHdjaGFyX3QgKl9f cmVzdHJpY3QgX19ucHRyLCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fZ3Jv dXApIHRocm93ICgpOwoKCmV4dGVybiBmbG9hdCBfX3djc3RvZl9pbnRlcm5hbCAoX19jb25zdCB3 Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIs IGludCBfX2dyb3VwKSB0aHJvdyAoKTsKCgpleHRlcm4gbG9uZyBkb3VibGUgX193Y3N0b2xkX2lu dGVybmFsIChfX2NvbnN0IHdjaGFyX3QgKiBfX3Jlc3RyaWN0IF9fbnB0ciwgd2NoYXJfdCAqKl9f cmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2dyb3VwKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gbG9u ZyBpbnQgX193Y3N0b2xfaW50ZXJuYWwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25w dHIsIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBpbnQgX19ncm91 cCkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IF9fd2NzdG91bF9pbnRl cm5hbCAoX19jb25zdCB3Y2hhcl90ICogX19yZXN0cmljdCBfX25wdHIsIHdjaGFyX3QgKiogX19y ZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApIHRocm93ICgpOwoKCgoK CgoKX19leHRlbnNpb25fXwpleHRlcm4gbG9uZyBsb25nIGludCBfX3djc3RvbGxfaW50ZXJuYWwg KF9fY29uc3Qgd2NoYXJfdCAqIF9fcmVzdHJpY3QgX19ucHRyLCB3Y2hhcl90ICoqX19yZXN0cmlj dCBfX2VuZHB0ciwgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApIHRocm93ICgpOwoKCgoKCgpfX2V4 dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fd2NzdG91bGxfaW50ZXJu YWwgKF9fY29uc3Qgd2NoYXJfdCAqIF9fcmVzdHJpY3QgX19ucHRyLCB3Y2hhcl90ICoqIF9fcmVz dHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKSB0aHJvdyAoKTsKIyA0ODIg Ii91c3IvaW5jbHVkZS93Y2hhci5oIiAzCmV4dGVybiB3Y2hhcl90ICp3Y3BjcHkgKHdjaGFyX3Qg Kl9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3NyYykgdGhyb3cgKCk7CgoKCmV4dGVybiB3Y2hh cl90ICp3Y3BuY3B5ICh3Y2hhcl90ICpfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19zcmMsIHNp emVfdCBfX24pIHRocm93ICgpOwojIDUwMiAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKfQojIDQz ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3djaGFyLmgiIDIg MwojIDU3ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3djaGFy LmgiIDMKbmFtZXNwYWNlIHN0ZAp7CiAgdXNpbmcgOjptYnN0YXRlX3Q7Cn0KIyA0MSAiL3Vzci9s b2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvZnBvcy5oIiAyIDMKCm5hbWVzcGFjZSBz dGQKewoKCgogIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQ+CiAgICBjbGFzcyBmcG9zCiAgICB7 CiAgICBwdWJsaWM6CgogICAgICB0eXBlZGVmIF9TdGF0ZVQgX19zdGF0ZV90eXBlOwoKICAgIHBy aXZhdGU6CiAgICAgIHN0cmVhbW9mZiBfTV9vZmY7CiAgICAgIF9fc3RhdGVfdHlwZSBfTV9zdDsK CiAgICBwdWJsaWM6CiAgICAgIF9fc3RhdGVfdHlwZQogICAgICBzdGF0ZSgpIGNvbnN0IHsgcmV0 dXJuIF9NX3N0OyB9CgogICAgICB2b2lkCiAgICAgIHN0YXRlKF9fc3RhdGVfdHlwZSBfX3N0KSB7 IF9NX3N0ID0gX19zdDsgfQoKCgogICAgICBmcG9zKCk6IF9NX29mZihzdHJlYW1vZmYoKSksIF9N X3N0KF9fc3RhdGVfdHlwZSgpKSB7IH0KCiAgICAgIGZwb3Moc3RyZWFtb2ZmIF9fb2ZmLCBfX3N0 YXRlX3R5cGUgX19zdCA9IF9fc3RhdGVfdHlwZSgpKQogICAgICA6IF9NX29mZihfX29mZiksIF9N X3N0KF9fc3QpIHsgfQoKICAgICAgb3BlcmF0b3Igc3RyZWFtb2ZmKCkgY29uc3QgeyByZXR1cm4g X01fb2ZmOyB9CgogICAgICBmcG9zJgogICAgICBvcGVyYXRvcis9KHN0cmVhbW9mZiBfX29mZikg eyBfTV9vZmYgKz0gX19vZmY7IHJldHVybiAqdGhpczsgfQoKICAgICAgZnBvcyYKICAgICAgb3Bl cmF0b3ItPShzdHJlYW1vZmYgX19vZmYpIHsgX01fb2ZmIC09IF9fb2ZmOyByZXR1cm4gKnRoaXM7 IH0KCiAgICAgIGZwb3MKICAgICAgb3BlcmF0b3IrKHN0cmVhbW9mZiBfX29mZikKICAgICAgewog ICAgICAgIGZwb3MgX190KCp0aGlzKTsKICAgICAgICBfX3QgKz0gX19vZmY7CiAgICAgICAgcmV0 dXJuIF9fdDsKICAgICAgfQoKICAgICAgZnBvcwogICAgICBvcGVyYXRvci0oc3RyZWFtb2ZmIF9f b2ZmKQogICAgICB7CiAgICAgICAgZnBvcyBfX3QoKnRoaXMpOwogICAgICAgIF9fdCAtPSBfX29m ZjsKICAgICAgICByZXR1cm4gX190OwogICAgICB9CgogICAgICBib29sCiAgICAgIG9wZXJhdG9y PT0oY29uc3QgZnBvcyYgX19wb3MpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9NX29mZiA9PSBfX3Bv cy5fTV9vZmY7IH0KCiAgICAgIGJvb2wKICAgICAgb3BlcmF0b3IhPShjb25zdCBmcG9zJiBfX3Bv cykgY29uc3QKICAgICAgeyByZXR1cm4gX01fb2ZmICE9IF9fcG9zLl9NX29mZjsgfQoKICAgICAg c3RyZWFtb2ZmCiAgICAgIF9NX3Bvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gX01fb2ZmOyB9Cgog ICAgICB2b2lkCiAgICAgIF9NX3Bvc2l0aW9uKHN0cmVhbW9mZiBfX29mZikgeyBfTV9vZmYgPSBf X29mZjsgfQogICAgfTsKCgogIHR5cGVkZWYgZnBvczxtYnN0YXRlX3Q+IHN0cmVhbXBvczsKCgoK fQojIDQyICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9zZndk LmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Z1bmN0 ZXhjZXB0LmgiIDEgMwojIDM0ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0 cy9mdW5jdGV4Y2VwdC5oIiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYz L2V4Y2VwdGlvbl9kZWZpbmVzLmgiIDEgMwojIDM1ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVk ZS9nKystdjMvYml0cy9mdW5jdGV4Y2VwdC5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewoKICB2b2lk CiAgX190aHJvd19iYWRfZXhjZXB0aW9uKHZvaWQpOwoKCiAgdm9pZAogIF9fdGhyb3dfYmFkX2Fs bG9jKHZvaWQpOwoKCiAgdm9pZAogIF9fdGhyb3dfYmFkX2Nhc3Qodm9pZCk7CgogIHZvaWQKICBf X3Rocm93X2JhZF90eXBlaWQodm9pZCk7CgoKICB2b2lkCiAgX190aHJvd19sb2dpY19lcnJvcihj b25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19kb21haW5fZXJyb3IoY29uc3QgY2hh ciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKiBf X3MpOwoKICB2b2lkCiAgX190aHJvd19sZW5ndGhfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAg dm9pZAogIF9fdGhyb3dfb3V0X29mX3JhbmdlKGNvbnN0IGNoYXIqIF9fcyk7CgogIHZvaWQKICBf X3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3df cmFuZ2VfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfb3ZlcmZsb3df ZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfdW5kZXJmbG93X2Vycm9y KGNvbnN0IGNoYXIqIF9fcyk7CgoKICB2b2lkCiAgX190aHJvd19pb3NfZmFpbHVyZShjb25zdCBj aGFyKiBfX3MpOwp9CiMgNDMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRz L3N0ZF9pb3Nmd2QuaCIgMiAzCgpuYW1lc3BhY2Ugc3RkCnsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBf Q2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KICAgIGNsYXNz IGJhc2ljX2lvczsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRz ID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CiAgICBjbGFzcyBiYXNpY19zdHJlYW1idWY7CgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9D aGFyVD4gPgogICAgY2xhc3MgYmFzaWNfaXN0cmVhbTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0No YXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CiAgICBjbGFzcyBi YXNpY19vc3RyZWFtOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFp dHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KICAgIGNsYXNzIGJhc2ljX2lvc3RyZWFtOwoKICB0 ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxf Q2hhclQ+LAogICAgICAgICAgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+ CiAgICBjbGFzcyBiYXNpY19zdHJpbmdidWY7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwg dHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCiAgICAgICAgICAgdHlwZW5h bWUgX0FsbG9jID0gYWxsb2NhdG9yPF9DaGFyVD4gPgogICAgY2xhc3MgYmFzaWNfaXN0cmluZ3N0 cmVhbTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hh cl90cmFpdHM8X0NoYXJUPiwKICAgICAgICAgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8 X0NoYXJUPiA+CiAgICBjbGFzcyBiYXNpY19vc3RyaW5nc3RyZWFtOwoKICB0ZW1wbGF0ZTx0eXBl bmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LAogICAg ICAgICAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KICAgIGNsYXNzIGJh c2ljX3N0cmluZ3N0cmVhbTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBf VHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CiAgICBjbGFzcyBiYXNpY19maWxlYnVmOwoK ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0 czxfQ2hhclQ+ID4KICAgIGNsYXNzIGJhc2ljX2lmc3RyZWFtOwoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KICAgIGNs YXNzIGJhc2ljX29mc3RyZWFtOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1l IF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KICAgIGNsYXNzIGJhc2ljX2ZzdHJlYW07 CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJh aXRzPF9DaGFyVD4gPgogICAgY2xhc3MgaXN0cmVhbWJ1Zl9pdGVyYXRvcjsKCiAgdGVtcGxhdGU8 dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+ CiAgICBjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yOwoKCgogIGNsYXNzIGlvc19iYXNlOwoKCiAg dHlwZWRlZiBiYXNpY19pb3M8Y2hhcj4gaW9zOwogIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPGNo YXI+IHN0cmVhbWJ1ZjsKICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08Y2hhcj4gaXN0cmVhbTsKICB0 eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhcj4gb3N0cmVhbTsKICB0eXBlZGVmIGJhc2ljX2lvc3Ry ZWFtPGNoYXI+IGlvc3RyZWFtOwogIHR5cGVkZWYgYmFzaWNfc3RyaW5nYnVmPGNoYXI+IHN0cmlu Z2J1ZjsKICB0eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08Y2hhcj4gaXN0cmluZ3N0cmVhbTsK ICB0eXBlZGVmIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhcj4gb3N0cmluZ3N0cmVhbTsKICB0eXBl ZGVmIGJhc2ljX3N0cmluZ3N0cmVhbTxjaGFyPiBzdHJpbmdzdHJlYW07CiAgdHlwZWRlZiBiYXNp Y19maWxlYnVmPGNoYXI+IGZpbGVidWY7CiAgdHlwZWRlZiBiYXNpY19pZnN0cmVhbTxjaGFyPiBp ZnN0cmVhbTsKICB0eXBlZGVmIGJhc2ljX29mc3RyZWFtPGNoYXI+IG9mc3RyZWFtOwogIHR5cGVk ZWYgYmFzaWNfZnN0cmVhbTxjaGFyPiBmc3RyZWFtOwojIDEyOSAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2lvc2Z3ZC5oIiAzCn0KIyA0MCAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2lvcy5oIiAyIDMKIyAxICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvZXhjZXB0aW9uIiAxIDMKIyAzNCAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2V4Y2VwdGlvbiIgMwpleHRlcm4gIkMrKyIgewoKbmFtZXNw YWNlIHN0ZAp7CiAgY2xhc3MgZXhjZXB0aW9uCiAgewogIHB1YmxpYzoKICAgIGV4Y2VwdGlvbigp IHRocm93KCkgeyB9CiAgICB2aXJ0dWFsIH5leGNlcHRpb24oKSB0aHJvdygpOwogICAgdmlydHVh bCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKTsKICB9OwoKICBjbGFzcyBiYWRfZXhj ZXB0aW9uIDogcHVibGljIGV4Y2VwdGlvbgogIHsKICBwdWJsaWM6CiAgICBiYWRfZXhjZXB0aW9u KCkgdGhyb3coKSB7IH0KICAgIHZpcnR1YWwgfmJhZF9leGNlcHRpb24oKSB0aHJvdygpOwogIH07 CgogIHR5cGVkZWYgdm9pZCAoKnRlcm1pbmF0ZV9oYW5kbGVyKSAoKTsKICB0eXBlZGVmIHZvaWQg KCp1bmV4cGVjdGVkX2hhbmRsZXIpICgpOwoKICB0ZXJtaW5hdGVfaGFuZGxlciBzZXRfdGVybWlu YXRlKHRlcm1pbmF0ZV9oYW5kbGVyKSB0aHJvdygpOwogIHZvaWQgdGVybWluYXRlKCkgX19hdHRy aWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKICB1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3VuZXhw ZWN0ZWQodW5leHBlY3RlZF9oYW5kbGVyKSB0aHJvdygpOwogIHZvaWQgdW5leHBlY3RlZCgpIF9f YXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCiAgYm9vbCB1bmNhdWdodF9leGNlcHRpb24o KSB0aHJvdygpOwp9Cgp9CiMgNDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i aXRzL3N0ZF9pb3MuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYz L2JpdHMvY2hhcl90cmFpdHMuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL2NoYXJfdHJhaXRzLmgiIDMKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdHJpbmcuaCIgMSAzCiMgMzcgIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3RyaW5nLmgiIDMKIyAxICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3N0ZGRlZi5oIiAxIDMKIyAzOCAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdHJpbmcuaCIgMiAzCiMg NDAgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3RyaW5nLmgi IDMKIyAxICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDEgMwojIDQxICIvdXNyL2xvY2FsL2djYy0z LjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3N0cmluZy5oIiAyIDMKIyA2NiAiL3Vzci9sb2Nh bC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdHJpbmcuaCIgMwpuYW1lc3BhY2Ug c3RkCnsKICB1c2luZyA6Om1lbWNweTsKICB1c2luZyA6Om1lbW1vdmU7CiAgdXNpbmcgOjpzdHJj cHk7CiAgdXNpbmcgOjpzdHJuY3B5OwogIHVzaW5nIDo6c3RyY2F0OwogIHVzaW5nIDo6c3RybmNh dDsKICB1c2luZyA6Om1lbWNtcDsKICB1c2luZyA6OnN0cmNtcDsKICB1c2luZyA6OnN0cmNvbGw7 CiAgdXNpbmcgOjpzdHJuY21wOwogIHVzaW5nIDo6c3RyeGZybTsKICB1c2luZyA6OnN0cmNzcG47 CiAgdXNpbmcgOjpzdHJzcG47CiAgdXNpbmcgOjpzdHJ0b2s7CiAgdXNpbmcgOjptZW1zZXQ7CiAg dXNpbmcgOjpzdHJlcnJvcjsKICB1c2luZyA6OnN0cmxlbjsKCiAgdXNpbmcgOjptZW1jaHI7Cgog IGlubGluZSB2b2lkKgogIG1lbWNocih2b2lkKiBfX3AsIGludCBfX2MsIHNpemVfdCBfX24pCiAg eyByZXR1cm4gbWVtY2hyKGNvbnN0X2Nhc3Q8Y29uc3Qgdm9pZCo+KF9fcCksIF9fYywgX19uKTsg fQoKICB1c2luZyA6OnN0cmNocjsKCiAgaW5saW5lIGNoYXIqCiAgc3RyY2hyKGNoYXIqIF9fczEs IGludCBfX24pCiAgeyByZXR1cm4gX19idWlsdGluX3N0cmNocihjb25zdF9jYXN0PGNvbnN0IGNo YXIqPihfX3MxKSwgX19uKTsgfQoKICB1c2luZyA6OnN0cnBicms7CgogIGlubGluZSBjaGFyKgog IHN0cnBicmsoY2hhciogX19zMSwgY29uc3QgY2hhciogX19zMikKICB7IHJldHVybiBfX2J1aWx0 aW5fc3RycGJyayhjb25zdF9jYXN0PGNvbnN0IGNoYXIqPihfX3MxKSwgX19zMik7IH0KCiAgdXNp bmcgOjpzdHJyY2hyOwoKICBpbmxpbmUgY2hhcioKICBzdHJyY2hyKGNoYXIqIF9fczEsIGludCBf X24pCiAgeyByZXR1cm4gX19idWlsdGluX3N0cnJjaHIoY29uc3RfY2FzdDxjb25zdCBjaGFyKj4o X19zMSksIF9fbik7IH0KCiAgdXNpbmcgOjpzdHJzdHI7CgogIGlubGluZSBjaGFyKgogIHN0cnN0 cihjaGFyKiBfX3MxLCBjb25zdCBjaGFyKiBfX3MyKQogIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJz dHIoY29uc3RfY2FzdDxjb25zdCBjaGFyKj4oX19zMSksIF9fczIpOyB9Cn0KIyA0MCAiL3Vzci9s b2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvY2hhcl90cmFpdHMuaCIgMiAzCiMgMSAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvZnBvcy5oIiAxIDMKIyA0MSAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvY2hhcl90cmFpdHMuaCIgMiAz CgpuYW1lc3BhY2Ugc3RkCnsKCgoKICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CiAgICBzdHJ1Y3Qg Y2hhcl90cmFpdHMKICAgIHsKICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwoKICAgICAg dHlwZWRlZiB1bnNpZ25lZCBsb25nIGludF90eXBlOwogICAgICB0eXBlZGVmIHN0cmVhbXBvcyBw b3NfdHlwZTsKICAgICAgdHlwZWRlZiBzdHJlYW1vZmYgb2ZmX3R5cGU7CiAgICAgIHR5cGVkZWYg bWJzdGF0ZV90IHN0YXRlX3R5cGU7CgogICAgICBzdGF0aWMgdm9pZAogICAgICBhc3NpZ24oY2hh cl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCiAgICAgIHsgX19jMSA9IF9fYzI7 IH0KCiAgICAgIHN0YXRpYyBib29sCiAgICAgIGVxKGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29u c3QgY2hhcl90eXBlJiBfX2MyKQogICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KCiAgICAg IHN0YXRpYyBib29sCiAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90 eXBlJiBfX2MyKQogICAgICB7IHJldHVybiBfX2MxIDwgX19jMjsgfQoKICAgICAgc3RhdGljIGlu dAogICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBf X3MyLCBzaXplX3QgX19uKQogICAgICB7CiAgICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19p IDwgX19uOyArK19faSkKICAgICAgICAgIGlmICghZXEoX19zMVtfX2ldLCBfX3MyW19faV0pKQog ICAgICAgICAgICByZXR1cm4gbHQoX19zMVtfX2ldLCBfX3MyW19faV0pID8gLTEgOiAxOwogICAg ICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBzdGF0aWMgc2l6ZV90CiAgICAgIGxlbmd0aChj b25zdCBjaGFyX3R5cGUqIF9fcykKICAgICAgewogICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19w ID0gX19zOwogICAgICAgIHdoaWxlICgqX19wKSArK19fcDsKICAgICAgICByZXR1cm4gKF9fcCAt IF9fcyk7CiAgICAgIH0KCiAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCiAgICAgIGZpbmQo Y29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKQog ICAgICB7CiAgICAgICAgZm9yIChjb25zdCBjaGFyX3R5cGUqIF9fcCA9IF9fczsgc2l6ZV90KF9f cCAtIF9fcykgPCBfX247ICsrX19wKQogICAgICAgICAgaWYgKCpfX3AgPT0gX19hKSByZXR1cm4g X19wOwogICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBzdGF0aWMgY2hhcl90eXBlKgog ICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3Qg X19uKQogICAgICB7IHJldHVybiAoY2hhcl90eXBlKikgbWVtbW92ZShfX3MxLCBfX3MyLCBfX24g KiBzaXplb2YoY2hhcl90eXBlKSk7IH0KCiAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCiAgICAgIGNv cHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCiAg ICAgIHsgcmV0dXJuIChjaGFyX3R5cGUqKSBtZW1jcHkoX19zMSwgX19zMiwgX19uICogc2l6ZW9m KGNoYXJfdHlwZSkpOyB9CgogICAgICBzdGF0aWMgY2hhcl90eXBlKgogICAgICBhc3NpZ24oY2hh cl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCiAgICAgIHsKICAgICAgICBm b3IgKGNoYXJfdHlwZSogX19wID0gX19zOyBfX3AgPCBfX3MgKyBfX247ICsrX19wKQogICAgICAg ICAgYXNzaWduKCpfX3AsIF9fYSk7CiAgICAgICAgcmV0dXJuIF9fczsKICAgICAgfQoKICAgICAg c3RhdGljIGNoYXJfdHlwZQogICAgICB0b19jaGFyX3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYykK ICAgICAgeyByZXR1cm4gY2hhcl90eXBlKF9fYyk7IH0KCiAgICAgIHN0YXRpYyBpbnRfdHlwZQog ICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykgeyByZXR1cm4gaW50X3R5cGUo X19jKTsgfQoKICAgICAgc3RhdGljIGJvb2wKICAgICAgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5 cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKQogICAgICB7IHJldHVybiBfX2MxID09IF9f YzI7IH0KCiAgICAgIHN0YXRpYyBpbnRfdHlwZQogICAgICBlb2YoKSB7IHJldHVybiBzdGF0aWNf Y2FzdDxpbnRfdHlwZT4oLTEpOyB9CgogICAgICBzdGF0aWMgaW50X3R5cGUKICAgICAgbm90X2Vv Zihjb25zdCBpbnRfdHlwZSYgX19jKQogICAgICB7IHJldHVybiBlcV9pbnRfdHlwZShfX2MsIGVv ZigpKSA/IGludF90eXBlKDApIDogX19jOyB9CiAgICB9OwoKCgogIHRlbXBsYXRlPD4KICAgIHN0 cnVjdCBjaGFyX3RyYWl0czxjaGFyPgogICAgewogICAgICB0eXBlZGVmIGNoYXIgY2hhcl90eXBl OwogICAgICB0eXBlZGVmIGludCBpbnRfdHlwZTsKICAgICAgdHlwZWRlZiBzdHJlYW1wb3MgcG9z X3R5cGU7CiAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmIG9mZl90eXBlOwogICAgICB0eXBlZGVmIG1i c3RhdGVfdCBzdGF0ZV90eXBlOwoKICAgICAgc3RhdGljIHZvaWQKICAgICAgYXNzaWduKGNoYXJf dHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQogICAgICB7IF9fYzEgPSBfX2MyOyB9 CgogICAgICBzdGF0aWMgYm9vbAogICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0 IGNoYXJfdHlwZSYgX19jMikKICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CgogICAgICBz dGF0aWMgYm9vbAogICAgICBsdChjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlw ZSYgX19jMikKICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KCiAgICAgIHN0YXRpYyBpbnQK ICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19z Miwgc2l6ZV90IF9fbikKICAgICAgeyByZXR1cm4gbWVtY21wKF9fczEsIF9fczIsIF9fbik7IH0K CiAgICAgIHN0YXRpYyBzaXplX3QKICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKQog ICAgICB7IHJldHVybiBzdHJsZW4oX19zKTsgfQoKICAgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlw ZSoKICAgICAgZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hh cl90eXBlJiBfX2EpCiAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IGNoYXJfdHlwZSo+ KG1lbWNocihfX3MsIF9fYSwgX19uKSk7IH0KCiAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCiAgICAg IG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24p CiAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+KG1lbW1vdmUoX19zMSwgX19z MiwgX19uKSk7IH0KCiAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCiAgICAgIGNvcHkoY2hhcl90eXBl KiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCiAgICAgIHsgcmV0dXJu IHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+KG1lbWNweShfX3MxLCBfX3MyLCBfX24pKTsgfQoKICAg ICAgc3RhdGljIGNoYXJfdHlwZSoKICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3Qg X19uLCBjaGFyX3R5cGUgX19hKQogICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUq PihtZW1zZXQoX19zLCBfX2EsIF9fbikpOyB9CgogICAgICBzdGF0aWMgY2hhcl90eXBlCiAgICAg IHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jKQogICAgICB7IHJldHVybiBzdGF0aWNf Y2FzdDxjaGFyX3R5cGU+KF9fYyk7IH0KCgoKICAgICAgc3RhdGljIGludF90eXBlCiAgICAgIHRv X2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKQogICAgICB7IHJldHVybiBzdGF0aWNfY2Fz dDxpbnRfdHlwZT4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jKSk7IH0KCiAgICAgIHN0 YXRpYyBib29sCiAgICAgIGVxX2ludF90eXBlKGNvbnN0IGludF90eXBlJiBfX2MxLCBjb25zdCBp bnRfdHlwZSYgX19jMikKICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CgogICAgICBzdGF0 aWMgaW50X3R5cGUKICAgICAgZW9mKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KCgt MSkpOyB9CgogICAgICBzdGF0aWMgaW50X3R5cGUKICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlw ZSYgX19jKQogICAgICB7IHJldHVybiAoX19jID09IGVvZigpKSA/IDAgOiBfX2M7IH0KICB9Owoj IDI2NCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvY2hhcl90cmFpdHMu aCIgMwogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIHN0 cnVjdCBfQ2hhcl90cmFpdHNfbWF0Y2gKICAgIHsKICAgICAgX0NoYXJUIF9NX2M7CiAgICAgIF9D aGFyX3RyYWl0c19tYXRjaChfQ2hhclQgY29uc3QmIF9fYykgOiBfTV9jKF9fYykgeyB9CgogICAg ICBib29sCiAgICAgIG9wZXJhdG9yKCkoX0NoYXJUIGNvbnN0JiBfX2EpIHsgcmV0dXJuIF9UcmFp dHM6OmVxKF9NX2MsIF9fYSk7IH0KICAgIH07Cn0KIyA0MiAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvc3RkX2lvcy5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAv aW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3N0ZGlvLmgiIDEgMwojIDQzICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9zLmgiIDIgMwojIDEgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2xvY2FsZWZ3ZC5oIiAxIDMKIyAzOCAiL3Vzci9s b2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlZndkLmgiIDMKCiMgMSAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvYysr Y29uZmlnLmgiIDEgMwojIDQwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0 cy9sb2NhbGVmd2QuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYz L2k2ODYtcGMtbGludXgtZ251L2JpdHMvYysrbG9jYWxlLmgiIDEgMwojIDM2ICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytsb2NhbGUu aCIgMwpuYW1lc3BhY2Ugc3RkCnsKICB0eXBlZGVmIGludCogX19jX2xvY2FsZTsKfQojIDQxICIv dXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9sb2NhbGVmd2QuaCIgMiAzCiMg MSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NsaW1pdHMuaCIg MSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jbGlt aXRzLmgiIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51 eC1nbnUvMy4wL2luY2x1ZGUvbGltaXRzLmgiIDEgMwojIDExICIvdXNyL2xvY2FsL2djYy0zLjAv bGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1ZGUvbGltaXRzLmgiIDMKIyAx ICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2lu Y2x1ZGUvc3lzbGltaXRzLmgiIDEgMwoKCgoKCgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9saWIv Z2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9saW1pdHMuaCIgMSAzCiMgMTMw ICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2lu Y2x1ZGUvbGltaXRzLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvbGltaXRzLmgiIDEgMwojIDI2ICIv dXNyL2luY2x1ZGUvbGltaXRzLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAz CiMgMjcgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMiAzCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2Jp dHMvcG9zaXgxX2xpbS5oIiAxIDMKIyAxMjYgIi91c3IvaW5jbHVkZS9iaXRzL3Bvc2l4MV9saW0u aCIgMwojIDEgIi91c3IvaW5jbHVkZS9iaXRzL2xvY2FsX2xpbS5oIiAxIDMKIyAyNyAiL3Vzci9p bmNsdWRlL2JpdHMvbG9jYWxfbGltLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvbGludXgvbGltaXRz LmgiIDEgMwojIDI4ICIvdXNyL2luY2x1ZGUvYml0cy9sb2NhbF9saW0uaCIgMiAzCiMgMTI3ICIv dXNyL2luY2x1ZGUvYml0cy9wb3NpeDFfbGltLmgiIDIgMwojIDMxICIvdXNyL2luY2x1ZGUvbGlt aXRzLmgiIDIgMwoKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3Bvc2l4Ml9saW0uaCIgMSAzCiMg MzUgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMiAzCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMv eG9wZW5fbGltLmgiIDEgMwojIDM0ICIvdXNyL2luY2x1ZGUvYml0cy94b3Blbl9saW0uaCIgMwoj IDEgIi91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvX2xpbS5oIiAxIDMKIyAzNSAiL3Vzci9pbmNsdWRl L2JpdHMveG9wZW5fbGltLmgiIDIgMwojIDM5ICIvdXNyL2luY2x1ZGUvbGltaXRzLmgiIDIgMwoj IDEzMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzMu MC9pbmNsdWRlL2xpbWl0cy5oIiAyIDMKIyA4ICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1s aWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1ZGUvc3lzbGltaXRzLmgiIDIgMwojIDEyICIv dXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1 ZGUvbGltaXRzLmgiIDIgMwojIDM5ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv Yml0cy9zdGRfY2xpbWl0cy5oIiAyIDMKIyA0MiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvbG9jYWxlZndkLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9iaXRzL3N0ZF9zdHJpbmcuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMu MC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9zdHJpbmcuaCIgMwoKIyAxICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25maWcuaCIg MSAzCiMgNDAgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9zdHJp bmcuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3Ry aW5nZndkLmgiIDEgMwojIDQxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0 cy9zdGRfc3RyaW5nLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12 My9iaXRzL2NoYXJfdHJhaXRzLmgiIDEgMwojIDQyICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVk ZS9nKystdjMvYml0cy9zdGRfc3RyaW5nLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0ZF9pdGVyYXRvci5oIiAxIDMKIyAzMSAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2l0ZXJhdG9yLmgiIDMKIyAxICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25m aWcuaCIgMSAzCiMgMzIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0 ZF9pdGVyYXRvci5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv Yml0cy9zdGRfY3N0ZGRlZi5oIiAxIDMKIyAzMyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX2l0ZXJhdG9yLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0ZF9pb3Nmd2QuaCIgMSAzCiMgMzQgIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pdGVyYXRvci5oIiAyIDMKIyAxICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5o IiAxIDMKIyA0MCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2l0 ZXJhdG9yX2Jhc2VfdHlwZXMuaCIgMwoKbmFtZXNwYWNlIHN0ZAp7CgpzdHJ1Y3QgaW5wdXRfaXRl cmF0b3JfdGFnIHt9OwpzdHJ1Y3Qgb3V0cHV0X2l0ZXJhdG9yX3RhZyB7fTsKc3RydWN0IGZvcndh cmRfaXRlcmF0b3JfdGFnIDogcHVibGljIGlucHV0X2l0ZXJhdG9yX3RhZyB7fTsKc3RydWN0IGJp ZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIDogcHVibGljIGZvcndhcmRfaXRlcmF0b3JfdGFnIHt9 OwpzdHJ1Y3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgOiBwdWJsaWMgYmlkaXJlY3Rpb25h bF9pdGVyYXRvcl90YWcge307CgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0 YW5jZT4gc3RydWN0IGlucHV0X2l0ZXJhdG9yIHsKICB0eXBlZGVmIGlucHV0X2l0ZXJhdG9yX3Rh ZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOwogIHR5cGVkZWYg X0Rpc3RhbmNlIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIF9UcCogcG9pbnRlcjsKICB0eXBl ZGVmIF9UcCYgcmVmZXJlbmNlOwp9OwoKc3RydWN0IG91dHB1dF9pdGVyYXRvciB7CiAgdHlwZWRl ZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdm9pZCB2 YWx1ZV90eXBlOwogIHR5cGVkZWYgdm9pZCBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB2b2lk IHBvaW50ZXI7CiAgdHlwZWRlZiB2b2lkIHJlZmVyZW5jZTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBf VHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IGZvcndhcmRfaXRlcmF0b3IgewogIHR5cGVkZWYg Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgdmFs dWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0YW5jZSBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBf VHAqIHBvaW50ZXI7CiAgdHlwZWRlZiBfVHAmIHJlZmVyZW5jZTsKfTsKCgp0ZW1wbGF0ZSA8Y2xh c3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIHsK ICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5Owog IHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfRGlzdGFuY2UgZGlmZmVyZW5jZV90 eXBlOwogIHR5cGVkZWYgX1RwKiBwb2ludGVyOwogIHR5cGVkZWYgX1RwJiByZWZlcmVuY2U7Cn07 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCByYW5kb21fYWNj ZXNzX2l0ZXJhdG9yIHsKICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJh dG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfRGlzdGFu Y2UgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiBwb2ludGVyOwogIHR5cGVkZWYgX1Rw JiByZWZlcmVuY2U7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0NhdGVnb3J5LCBjbGFzcyBfVHAsIGNs YXNzIF9EaXN0YW5jZSA9IHB0cmRpZmZfdCwKICAgICAgICAgIGNsYXNzIF9Qb2ludGVyID0gX1Rw KiwgY2xhc3MgX1JlZmVyZW5jZSA9IF9UcCY+CnN0cnVjdCBpdGVyYXRvciB7CiAgdHlwZWRlZiBf Q2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKICB0 eXBlZGVmIF9EaXN0YW5jZSBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfUG9pbnRlciBwb2lu dGVyOwogIHR5cGVkZWYgX1JlZmVyZW5jZSByZWZlcmVuY2U7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0l0ZXJhdG9yPgpzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzIHsKICB0eXBlZGVmIHR5cGVuYW1lIF9J dGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB0 eXBlbmFtZSBfSXRlcmF0b3I6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHR5cGVu YW1lIF9JdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVm IHR5cGVuYW1lIF9JdGVyYXRvcjo6cG9pbnRlciBwb2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUg X0l0ZXJhdG9yOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4K c3RydWN0IGl0ZXJhdG9yX3RyYWl0czxfVHAqPiB7CiAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0 ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOwog IHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIF9UcCogcG9pbnRl cjsKICB0eXBlZGVmIF9UcCYgcmVmZXJlbmNlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3Ry dWN0IGl0ZXJhdG9yX3RyYWl0czxjb25zdCBfVHAqPiB7CiAgdHlwZWRlZiByYW5kb21fYWNjZXNz X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBl OwogIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIGNvbnN0IF9U cCogcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCYgcmVmZXJlbmNlOwp9OwojIDE0MCAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlw ZXMuaCIgMwp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90 cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeQpfX2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0 IF9JdGVyJikKewogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRl cmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OwogIHJldHVybiBfQ2F0ZWdvcnkoKTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6 ZGlmZmVyZW5jZV90eXBlKgpfX2Rpc3RhbmNlX3R5cGUoY29uc3QgX0l0ZXImKQp7CiAgcmV0dXJu IHN0YXRpY19jYXN0PHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2Vf dHlwZSo+KDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVy YXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlKgpfX3ZhbHVlX3R5cGUoY29uc3QgX0l0ZXIm KQp7CiAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46 OnZhbHVlX3R5cGUqPigwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5h bWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkKaXRlcmF0b3JfY2F0 ZWdvcnkoY29uc3QgX0l0ZXImIF9faSkgeyByZXR1cm4gX19pdGVyYXRvcl9jYXRlZ29yeShfX2kp OyB9CgoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJh aXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlKgpkaXN0YW5jZV90eXBlKGNvbnN0IF9JdGVyJiBf X2kpIHsgcmV0dXJuIF9fZGlzdGFuY2VfdHlwZShfX2kpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0 ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlKgp2 YWx1ZV90eXBlKGNvbnN0IF9JdGVyJiBfX2kpIHsgcmV0dXJuIF9fdmFsdWVfdHlwZShfX2kpOyB9 Cgp9CiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pdGVy YXRvci5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9z dGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oIiAxIDMKIyA0MCAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaCIgMwojIDEgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2NvbmNlcHRfY2hlY2suaCIgMSAzCiMg MzQgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2NvbmNlcHRfY2hlY2su aCIgMwoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51 eC1nbnUvYml0cy9jKytjb25maWcuaCIgMSAzCiMgMzYgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9iaXRzL2NvbmNlcHRfY2hlY2suaCIgMiAzCiMgNDEgIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmgiIDIgMwoK bmFtZXNwYWNlIHN0ZAp7CgoKCgoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFz cyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIF9fZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJz dCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5j ZSYgX19uLCBpbnB1dF9pdGVyYXRvcl90YWcpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogIHdoaWxlIChfX2Zp cnN0ICE9IF9fbGFzdCkgeyArK19fZmlyc3Q7ICsrX19uOyB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBf UmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZvaWQgX19kaXN0 YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAg ICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIF9E aXN0YW5jZSYgX19uLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKewoKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDsKICBfX24gKz0gX19sYXN0IC0gX19maXJzdDsKfQoKdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIGRpc3RhbmNl KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJh dG9yIF9fbGFzdCwgX0Rpc3RhbmNlJiBfX24pCnsKCiAgX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xh c3QsIF9fbiwgaXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0lucHV0SXRlcmF0b3I+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRl cmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKX19kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0 LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIGlucHV0X2l0ZXJhdG9yX3RhZykKewoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CiAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5j ZV90eXBlIF9fbiA9IDA7CiAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICArK19fZmly c3Q7ICsrX19uOwogIH0KICByZXR1cm4gX19uOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFj Y2Vzc0l0ZXJhdG9yPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nl c3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQpfX2Rpc3RhbmNlKF9SYW5kb21BY2Nlc3NJdGVy YXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgIHJh bmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwog IHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0 b3I+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZm ZXJlbmNlX3R5cGUKZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0 b3IgX19sYXN0KQp7CgogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0 ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkKICAgIF9DYXRlZ29yeTsKICByZXR1cm4gX19kaXN0 YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9DYXRlZ29yeSgpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9J bnB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZvaWQgX19hZHZhbmNlKF9JbnB1dEl0 ZXImIF9faSwgX0Rpc3RhbmNlIF9fbiwgaW5wdXRfaXRlcmF0b3JfdGFnKQp7CgogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwog IHdoaWxlIChfX24tLSkgKytfX2k7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0 ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIF9fYWR2YW5jZShfQmlkaXJlY3Rp b25hbEl0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCiAgICAgICAgICAgICAgICAgICAgICBi aWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsK ICBpZiAoX19uID4gMCkKICAgIHdoaWxlIChfX24tLSkgKytfX2k7CiAgZWxzZQogICAgd2hpbGUg KF9fbisrKSAtLV9faTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwg Y2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBfX2FkdmFuY2UoX1JhbmRvbUFjY2Vzc0l0ZXJh dG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCiAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNj ZXNzX2l0ZXJhdG9yX3RhZykKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICBfX2kgKz0g X19uOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4K aW5saW5lIHZvaWQgYWR2YW5jZShfSW5wdXRJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uKQp7 CgogIF9fYWR2YW5jZShfX2ksIF9fbiwgaXRlcmF0b3JfY2F0ZWdvcnkoX19pKSk7Cn0KCn0KIyAz NiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2l0ZXJhdG9yLmgi IDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9pdGVy YXRvci5oIiAxIDMKIyAzNCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv c3RsX2l0ZXJhdG9yLmgiIDMKbmFtZXNwYWNlIHN0ZAp7Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRh aW5lcj4KY2xhc3MgYmFja19pbnNlcnRfaXRlcmF0b3Igewpwcm90ZWN0ZWQ6CiAgX0NvbnRhaW5l ciogY29udGFpbmVyOwpwdWJsaWM6CiAgdHlwZWRlZiBfQ29udGFpbmVyIGNvbnRhaW5lcl90eXBl OwogIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBl ZGVmIHZvaWQgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHZvaWQgZGlmZmVyZW5jZV90eXBlOwogIHR5 cGVkZWYgdm9pZCBwb2ludGVyOwogIHR5cGVkZWYgdm9pZCByZWZlcmVuY2U7CgogIGV4cGxpY2l0 IGJhY2tfaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkg e30KICBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKICBvcGVyYXRvcj0oY29uc3Qg dHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkgewogICAgY29udGFpbmVy LT5wdXNoX2JhY2soX192YWx1ZSk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGJhY2tfaW5zZXJ0 X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQogIGJh Y2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRo aXM7IH0KICBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQp IHsgcmV0dXJuICp0aGlzOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KaW5saW5l IGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+IGJhY2tfaW5zZXJ0ZXIoX0NvbnRhaW5l ciYgX194KSB7CiAgcmV0dXJuIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgpjbGFzcyBmcm9udF9pbnNlcnRfaXRlcmF0 b3Igewpwcm90ZWN0ZWQ6CiAgX0NvbnRhaW5lciogY29udGFpbmVyOwpwdWJsaWM6CiAgdHlwZWRl ZiBfQ29udGFpbmVyIGNvbnRhaW5lcl90eXBlOwogIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3Rh ZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIHZvaWQgdmFsdWVfdHlwZTsKICB0eXBlZGVm IHZvaWQgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdm9pZCBwb2ludGVyOwogIHR5cGVkZWYg dm9pZCByZWZlcmVuY2U7CgogIGV4cGxpY2l0IGZyb250X2luc2VydF9pdGVyYXRvcihfQ29udGFp bmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHt9CiAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9D b250YWluZXI+JgogIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90 eXBlJiBfX3ZhbHVlKSB7CiAgICBjb250YWluZXItPnB1c2hfZnJvbnQoX192YWx1ZSk7CiAgICBy ZXR1cm4gKnRoaXM7CiAgfQogIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3Bl cmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KICBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0NvbnRh aW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQogIGZyb250X2luc2VydF9pdGVy YXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9Cn07Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KaW5saW5lIGZyb250X2luc2VydF9pdGVyYXRvcjxf Q29udGFpbmVyPiBmcm9udF9pbnNlcnRlcihfQ29udGFpbmVyJiBfX3gpIHsKICByZXR1cm4gZnJv bnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBf Q29udGFpbmVyPgpjbGFzcyBpbnNlcnRfaXRlcmF0b3Igewpwcm90ZWN0ZWQ6CiAgX0NvbnRhaW5l ciogY29udGFpbmVyOwogIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CnB1Ymxp YzoKICB0eXBlZGVmIF9Db250YWluZXIgY29udGFpbmVyX3R5cGU7CiAgdHlwZWRlZiBvdXRwdXRf aXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdm9pZCB2YWx1ZV90eXBl OwogIHR5cGVkZWYgdm9pZCBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB2b2lkIHBvaW50ZXI7 CiAgdHlwZWRlZiB2b2lkIHJlZmVyZW5jZTsKCiAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXIm IF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pKQogICAgOiBjb250YWluZXIo Jl9feCksIGl0ZXIoX19pKSB7fQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKICBvcGVy YXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkgewog ICAgaXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0KGl0ZXIsIF9fdmFsdWUpOwogICAgKytpdGVyOwog ICAgcmV0dXJuICp0aGlzOwogIH0KICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJh dG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CiAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBv cGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5l cj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQp9OwoKdGVtcGxhdGUgPGNsYXNz IF9Db250YWluZXIsIGNsYXNzIF9JdGVyYXRvcj4KaW5saW5lCmluc2VydF9pdGVyYXRvcjxfQ29u dGFpbmVyPiBpbnNlcnRlcihfQ29udGFpbmVyJiBfX3gsIF9JdGVyYXRvciBfX2kpCnsKICB0eXBl ZGVmIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIF9faXRlcjsKICByZXR1cm4gaW5zZXJ0 X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCwgX19pdGVyKF9faSkpOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfUmVmZXJlbmNlID0g X1RwJiwKICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZSA9IHB0cmRpZmZfdD4KY2xhc3MgcmV2ZXJz ZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIHsKICB0eXBlZGVmIHJldmVyc2VfYmlkaXJlY3Rpb25h bF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVHAsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX1JlZmVyZW5jZSwgX0Rpc3RhbmNlPiBfU2VsZjsKcHJv dGVjdGVkOgogIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgY3VycmVudDsKcHVibGljOgogIHR5cGVk ZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRl ZiBfVHAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0YW5jZSBkaWZmZXJlbmNlX3R5cGU7CiAg dHlwZWRlZiBfVHAqIHBvaW50ZXI7CiAgdHlwZWRlZiBfUmVmZXJlbmNlIHJlZmVyZW5jZTsKCiAg cmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yKCkge30KICBleHBsaWNpdCByZXZlcnNlX2Jp ZGlyZWN0aW9uYWxfaXRlcmF0b3IoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX3gpCiAgICA6IGN1 cnJlbnQoX194KSB7fQogIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgYmFzZSgpIGNvbnN0IHsgcmV0 dXJuIGN1cnJlbnQ7IH0KICBfUmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKICAgIF9CaWRp cmVjdGlvbmFsSXRlcmF0b3IgX190bXAgPSBjdXJyZW50OwogICAgcmV0dXJuICotLV9fdG1wOwog IH0KICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsg fQogIF9TZWxmJiBvcGVyYXRvcisrKCkgewogICAgLS1jdXJyZW50OwogICAgcmV0dXJuICp0aGlz OwogIH0KICBfU2VsZiBvcGVyYXRvcisrKGludCkgewogICAgX1NlbGYgX190bXAgPSAqdGhpczsK ICAgIC0tY3VycmVudDsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgX1NlbGYmIG9wZXJhdG9yLS0o KSB7CiAgICArK2N1cnJlbnQ7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIF9TZWxmIG9wZXJhdG9y LS0oaW50KSB7CiAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwogICAgKytjdXJyZW50OwogICAgcmV0 dXJuIF9fdG1wOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQmlJdGVyLCBjbGFzcyBfVHAsIGNs YXNzIF9SZWYsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIGJvb2wgb3BlcmF0b3I9PSgKICAgIGNv bnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlJdGVyLCBfVHAsIF9SZWYsIF9E aXN0YW5jZT4mIF9feCwKICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxf QmlJdGVyLCBfVHAsIF9SZWYsIF9EaXN0YW5jZT4mIF9feSkKewogIHJldHVybiBfX3guYmFzZSgp ID09IF9feS5iYXNlKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlJdGVyLCBjbGFzcyBfVHAsIGNs YXNzIF9SZWYsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIGJvb2wgb3BlcmF0b3IhPSgKICAgIGNv bnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlJdGVyLCBfVHAsIF9SZWYsIF9E aXN0YW5jZT4mIF9feCwKICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxf QmlJdGVyLCBfVHAsIF9SZWYsIF9EaXN0YW5jZT4mIF9feSkKewogIHJldHVybiAhKF9feCA9PSBf X3kpOwp9CiMgMTkzICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxf aXRlcmF0b3IuaCIgMwp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgpjbGFzcyByZXZlcnNlX2l0 ZXJhdG9yCnsKcHJvdGVjdGVkOgogIF9JdGVyYXRvciBjdXJyZW50OwpwdWJsaWM6CiAgdHlwZWRl ZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkK ICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3Jf dHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGUKICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlw ZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBl CiAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90 cmFpdHM8X0l0ZXJhdG9yPjo6cG9pbnRlcgogICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHR5 cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpyZWZlcmVuY2UKICAgICAgICAgIHJl ZmVyZW5jZTsKCiAgdHlwZWRlZiBfSXRlcmF0b3IgaXRlcmF0b3JfdHlwZTsKICB0eXBlZGVmIHJl dmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiBfU2VsZjsKCnB1YmxpYzoKICByZXZlcnNlX2l0ZXJh dG9yKCkge30KICBleHBsaWNpdCByZXZlcnNlX2l0ZXJhdG9yKGl0ZXJhdG9yX3R5cGUgX194KSA6 IGN1cnJlbnQoX194KSB7fQoKICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IF9TZWxmJiBfX3gpIDog Y3VycmVudChfX3guY3VycmVudCkge30KICB0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CiAgcmV2ZXJz ZV9pdGVyYXRvcihjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyPiYgX194KQogICAgOiBjdXJy ZW50KF9feC5iYXNlKCkpIHt9CgogIGl0ZXJhdG9yX3R5cGUgYmFzZSgpIGNvbnN0IHsgcmV0dXJu IGN1cnJlbnQ7IH0KICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewogICAgX0l0ZXJhdG9y IF9fdG1wID0gY3VycmVudDsKICAgIHJldHVybiAqLS1fX3RtcDsKICB9CiAgcG9pbnRlciBvcGVy YXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KCiAgX1NlbGYmIG9wZXJh dG9yKysoKSB7CiAgICAtLWN1cnJlbnQ7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIF9TZWxmIG9w ZXJhdG9yKysoaW50KSB7CiAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwogICAgLS1jdXJyZW50Owog ICAgcmV0dXJuIF9fdG1wOwogIH0KICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKICAgICsrY3VycmVu dDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKICAgIF9T ZWxmIF9fdG1wID0gKnRoaXM7CiAgICArK2N1cnJlbnQ7CiAgICByZXR1cm4gX190bXA7CiAgfQoK ICBfU2VsZiBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgewogICAgcmV0dXJu IF9TZWxmKGN1cnJlbnQgLSBfX24pOwogIH0KICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNl X3R5cGUgX19uKSB7CiAgICBjdXJyZW50IC09IF9fbjsKICAgIHJldHVybiAqdGhpczsKICB9CiAg X1NlbGYgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsKICAgIHJldHVybiBf U2VsZihjdXJyZW50ICsgX19uKTsKICB9CiAgX1NlbGYmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90 eXBlIF9fbikgewogICAgY3VycmVudCArPSBfX247CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIHJl ZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuICoo KnRoaXMgKyBfX24pOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgppbmxpbmUgYm9v bCBvcGVyYXRvcj09KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAogICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195 KSB7CiAgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9JdGVyYXRvcj4KaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8 X0l0ZXJhdG9yPiYgX194LAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVy YXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4gX195LmJhc2UoKSA8IF9feC5iYXNlKCk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+CmlubGluZSBib29sIG9wZXJhdG9yIT0oY29u c3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCiAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4gIShf X3ggPT0gX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KaW5saW5lIGJvb2wgb3Bl cmF0b3I+KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAogICAgICAgICAg ICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICBy ZXR1cm4gX195IDwgX194Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgppbmxpbmUgYm9v bCBvcGVyYXRvcjw9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAogICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195 KSB7CiAgcmV0dXJuICEoX195IDwgX194KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4K aW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4m IF9feCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJh dG9yPiYgX195KSB7CiAgcmV0dXJuICEoX194IDwgX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9J dGVyYXRvcj4KaW5saW5lIHR5cGVuYW1lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6ZGlm ZmVyZW5jZV90eXBlCm9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4m IF9feCwKICAgICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KSB7 CiAgcmV0dXJuIF9feS5iYXNlKCkgLSBfX3guYmFzZSgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0 ZXJhdG9yPgppbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+Cm9wZXJhdG9yKyh0eXBl bmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sCiAg ICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCkgewogIHJldHVy biByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4oX194LmJhc2UoKSAtIF9fbik7Cn0KCgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwLAogICAgICAgICAgY2xhc3MgX0NoYXJUID0gY2hhciwgY2xhc3MgX1Ry YWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCiAgICAgICAgICBjbGFzcyBfRGlzdCA9IHB0cmRp ZmZfdD4KY2xhc3MgaXN0cmVhbV9pdGVyYXRvciB7CnB1YmxpYzoKICB0eXBlZGVmIF9DaGFyVCBj aGFyX3R5cGU7CiAgdHlwZWRlZiBfVHJhaXRzIHRyYWl0c190eXBlOwogIHR5cGVkZWYgYmFzaWNf aXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IGlzdHJlYW1fdHlwZTsKCiAgdHlwZWRlZiBpbnB1dF9p dGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsK ICB0eXBlZGVmIF9EaXN0IGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIGNvbnN0IF9UcCogcG9p bnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCYgcmVmZXJlbmNlOwoKICBpc3RyZWFtX2l0ZXJhdG9y KCkgOiBfTV9zdHJlYW0oMCksIF9NX29rKGZhbHNlKSB7fQogIGlzdHJlYW1faXRlcmF0b3IoaXN0 cmVhbV90eXBlJiBfX3MpIDogX01fc3RyZWFtKCZfX3MpIHsgX01fcmVhZCgpOyB9CgogIHJlZmVy ZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBfTV92YWx1ZTsgfQogIHBvaW50ZXIgb3Bl cmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CgogIGlzdHJlYW1faXRl cmF0b3ImIG9wZXJhdG9yKysoKSB7CiAgICBfTV9yZWFkKCk7CiAgICByZXR1cm4gKnRoaXM7CiAg fQogIGlzdHJlYW1faXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKICAgIGlzdHJlYW1faXRlcmF0 b3IgX190bXAgPSAqdGhpczsKICAgIF9NX3JlYWQoKTsKICAgIHJldHVybiBfX3RtcDsKICB9Cgog IGJvb2wgX01fZXF1YWwoY29uc3QgaXN0cmVhbV9pdGVyYXRvciYgX194KSBjb25zdAogICAgeyBy ZXR1cm4gKF9NX29rID09IF9feC5fTV9vaykgJiYgKCFfTV9vayB8fCBfTV9zdHJlYW0gPT0gX194 Ll9NX3N0cmVhbSk7IH0KCnByaXZhdGU6CiAgaXN0cmVhbV90eXBlKiBfTV9zdHJlYW07CiAgX1Rw IF9NX3ZhbHVlOwogIGJvb2wgX01fb2s7CgogIHZvaWQgX01fcmVhZCgpIHsKICAgIF9NX29rID0g KF9NX3N0cmVhbSAmJiAqX01fc3RyZWFtKSA/IHRydWUgOiBmYWxzZTsKICAgIGlmIChfTV9vaykg ewogICAgICAqX01fc3RyZWFtID4+IF9NX3ZhbHVlOwogICAgICBfTV9vayA9ICpfTV9zdHJlYW0g PyB0cnVlIDogZmFsc2U7CiAgICB9CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRGlzdD4KaW5saW5lIGJvb2wKb3BlcmF0b3I9 PShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdD4mIF9f eCwKICAgICAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRz LCBfRGlzdD4mIF9feSkgewogIHJldHVybiBfX3guX01fZXF1YWwoX195KTsKfQoKdGVtcGxhdGUg PGNsYXNzIF9UcCwgY2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfRGlzdD4KaW5s aW5lIGJvb2wKb3BlcmF0b3IhPShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBf VHJhaXRzLCBfRGlzdD4mIF9feCwKICAgICAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9U cCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdD4mIF9feSkgewogIHJldHVybiAhX194Ll9NX2VxdWFs KF9feSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLAogICAgICAgICAgY2xhc3MgX0NoYXJUID0g Y2hhciwgY2xhc3MgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgpjbGFzcyBvc3RyZWFt X2l0ZXJhdG9yIHsKcHVibGljOgogIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKICB0eXBlZGVm IF9UcmFpdHMgdHJhaXRzX3R5cGU7CiAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1Ry YWl0cz4gb3N0cmVhbV90eXBlOwoKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0 b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lkIGRp ZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgcmVm ZXJlbmNlOwoKICBvc3RyZWFtX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19zKSA6IF9NX3N0cmVh bSgmX19zKSwgX01fc3RyaW5nKDApIHt9CiAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFtX3R5cGUm IF9fcywgY29uc3QgX0NoYXJUKiBfX2MpCiAgICA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5n KF9fYykge30KICBvc3RyZWFtX2l0ZXJhdG9yPF9UcD4mIG9wZXJhdG9yPShjb25zdCBfVHAmIF9f dmFsdWUpIHsKICAgICpfTV9zdHJlYW0gPDwgX192YWx1ZTsKICAgIGlmIChfTV9zdHJpbmcpICpf TV9zdHJlYW0gPDwgX01fc3RyaW5nOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBvc3RyZWFtX2l0 ZXJhdG9yPF9UcD4mIG9wZXJhdG9yKigpIHsgcmV0dXJuICp0aGlzOyB9CiAgb3N0cmVhbV9pdGVy YXRvcjxfVHA+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KICBvc3RyZWFtX2l0ZXJh dG9yPF9UcD4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQpwcml2YXRlOgogIG9z dHJlYW1fdHlwZSogX01fc3RyZWFtOwogIGNvbnN0IF9DaGFyVCogX01fc3RyaW5nOwp9OwojIDQx NyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2l0ZXJhdG9yLmgi IDMKdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgpjbGFz cyBfX25vcm1hbF9pdGVyYXRvcgogIDogcHVibGljIGl0ZXJhdG9yPGl0ZXJhdG9yX3RyYWl0czxf SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKICAgICAgICAgICAgICAgICAgICBpdGVyYXRv cl90cmFpdHM8X0l0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICBpdGVy YXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlLAogICAgICAgICAgICAgICAg ICAgIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojpwb2ludGVyLAogICAgICAgICAgICAgICAg ICAgIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpyZWZlcmVuY2U+CnsKCnByb3RlY3RlZDoK ICBfSXRlcmF0b3IgX01fY3VycmVudDsKCnB1YmxpYzoKICB0eXBlZGVmIF9fbm9ybWFsX2l0ZXJh dG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4gbm9ybWFsX2l0ZXJhdG9yX3R5cGU7CiAgdHlwZWRl ZiBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPiBfX3RyYWl0c190eXBlOwogIHR5cGVkZWYgdHlw ZW5hbWUgX190cmFpdHNfdHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7 CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7 CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVy ZW5jZV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6cG9pbnRlciBwb2lu dGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5j ZTsKCiAgX19ub3JtYWxfaXRlcmF0b3IoKSA6IF9NX2N1cnJlbnQoX0l0ZXJhdG9yKCkpIHsgfQoK ICBleHBsaWNpdCBfX25vcm1hbF9pdGVyYXRvcihjb25zdCBfSXRlcmF0b3ImIF9faSkgOiBfTV9j dXJyZW50KF9faSkgeyB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcj4KICBpbmxpbmUgX19u b3JtYWxfaXRlcmF0b3IoY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXIsIF9Db250YWluZXI+ JiBfX2kpCiAgICA6IF9NX2N1cnJlbnQoX19pLmJhc2UoKSkgeyB9CgoKICByZWZlcmVuY2UKICBv cGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqX01fY3VycmVudDsgfQoKICBwb2ludGVyCiAgb3Bl cmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KCiAgbm9ybWFsX2l0ZXJhdG9y X3R5cGUmCiAgb3BlcmF0b3IrKygpIHsgKytfTV9jdXJyZW50OyByZXR1cm4gKnRoaXM7IH0KCiAg bm9ybWFsX2l0ZXJhdG9yX3R5cGUKICBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gX19ub3JtYWxf aXRlcmF0b3IoX01fY3VycmVudCsrKTsgfQoKCiAgbm9ybWFsX2l0ZXJhdG9yX3R5cGUmCiAgb3Bl cmF0b3ItLSgpIHsgLS1fTV9jdXJyZW50OyByZXR1cm4gKnRoaXM7IH0KCiAgbm9ybWFsX2l0ZXJh dG9yX3R5cGUKICBvcGVyYXRvci0tKGludCkgeyByZXR1cm4gX19ub3JtYWxfaXRlcmF0b3IoX01f Y3VycmVudC0tKTsgfQoKCiAgcmVmZXJlbmNlCiAgb3BlcmF0b3JbXShjb25zdCBkaWZmZXJlbmNl X3R5cGUmIF9fbikgY29uc3QKICB7IHJldHVybiBfTV9jdXJyZW50W19fbl07IH0KCiAgbm9ybWFs X2l0ZXJhdG9yX3R5cGUmCiAgb3BlcmF0b3IrPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikK ICB7IF9NX2N1cnJlbnQgKz0gX19uOyByZXR1cm4gKnRoaXM7IH0KCiAgbm9ybWFsX2l0ZXJhdG9y X3R5cGUKICBvcGVyYXRvcisoY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CiAgeyBy ZXR1cm4gX19ub3JtYWxfaXRlcmF0b3IoX01fY3VycmVudCArIF9fbik7IH0KCiAgbm9ybWFsX2l0 ZXJhdG9yX3R5cGUmCiAgb3BlcmF0b3ItPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKICB7 IF9NX2N1cnJlbnQgLT0gX19uOyByZXR1cm4gKnRoaXM7IH0KCiAgbm9ybWFsX2l0ZXJhdG9yX3R5 cGUKICBvcGVyYXRvci0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0CiAgeyByZXR1 cm4gX19ub3JtYWxfaXRlcmF0b3IoX01fY3VycmVudCAtIF9fbik7IH0KCiAgZGlmZmVyZW5jZV90 eXBlCiAgb3BlcmF0b3ItKGNvbnN0IG5vcm1hbF9pdGVyYXRvcl90eXBlJiBfX2kpIGNvbnN0CiAg eyByZXR1cm4gX01fY3VycmVudCAtIF9faS5fTV9jdXJyZW50OyB9CgogIGNvbnN0IF9JdGVyYXRv ciYKICBiYXNlKCkgY29uc3QgeyByZXR1cm4gX01fY3VycmVudDsgfQp9OwoKCgp0ZW1wbGF0ZTx0 eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFp bmVyPgppbmxpbmUgYm9vbApvcGVyYXRvcj09KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVy YXRvckwsIF9Db250YWluZXI+JiBfX2xocywKICAgICAgICAgICBjb25zdCBfX25vcm1hbF9pdGVy YXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCnsgcmV0dXJuIF9fbGhzLmJhc2Uo KSA9PSBfX3Jocy5iYXNlKCk7IH0KCnRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVu YW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CmlubGluZSBib29sCm9wZXJhdG9y IT0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhz LAogICAgICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWlu ZXI+JiBfX3JocykKeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KCgoKdGVtcGxhdGU8dHlw ZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX0NvbnRhaW5l cj4KaW5saW5lIGJvb2wKb3BlcmF0b3I8KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRv ckwsIF9Db250YWluZXI+JiBfX2xocywKICAgICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9y PF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKeyByZXR1cm4gX19saHMuYmFzZSgpIDwg X19yaHMuYmFzZSgpOyB9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBf SXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgppbmxpbmUgYm9vbApvcGVyYXRvcj4oY29u c3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAogICAg ICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX0NvbnRhaW5lcj4mIF9f cmhzKQp7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0 b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgppbmxpbmUgYm9v bApvcGVyYXRvcjw9KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWlu ZXI+JiBfX2xocywKICAgICAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JS LCBfQ29udGFpbmVyPiYgX19yaHMpCnsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KCnRlbXBs YXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9D b250YWluZXI+CmlubGluZSBib29sCm9wZXJhdG9yPj0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8 X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAogICAgICAgICAgIGNvbnN0IF9fbm9ybWFs X2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKeyByZXR1cm4gIShfX2xo cyA8IF9fcmhzKTsgfQoKdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29u dGFpbmVyPgppbmxpbmUgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPgpv cGVyYXRvcisoX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPjo6ZGlmZmVy ZW5jZV90eXBlIF9fbiwKICAgICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRv ciwgX0NvbnRhaW5lcj4mIF9faSkKeyByZXR1cm4gX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9y LCBfQ29udGFpbmVyPihfX2kuYmFzZSgpICsgX19uKTsgfQoKfQojIDM3ICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaXRlcmF0b3IuaCIgMiAzCiMgNDMgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9zdHJpbmcuaCIgMiAzCiMgMSAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX21lbW9yeS5oIiAxIDMK IyAxOSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX21lbW9yeS5o IiAzCgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGdv YmFzZS5oIiAxIDMKIyAzNSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv c3RsX2FsZ29iYXNlLmgiIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv aTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25maWcuaCIgMSAzCiMgMzYgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGdvYmFzZS5oIiAyIDMKCiMgMSAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3BhaXIuaCIgMSAzCiMgMzQg Ii91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9wYWlyLmgiIDMKbmFt ZXNwYWNlIHN0ZAp7Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CnN0cnVjdCBwYWly IHsKICB0eXBlZGVmIF9UMSBmaXJzdF90eXBlOwogIHR5cGVkZWYgX1QyIHNlY29uZF90eXBlOwoK ICBfVDEgZmlyc3Q7CiAgX1QyIHNlY29uZDsKCgogIHBhaXIoKSA6IGZpcnN0KCksIHNlY29uZCgp IHt9CgoKCiAgcGFpcihjb25zdCBfVDEmIF9fYSwgY29uc3QgX1QyJiBfX2IpIDogZmlyc3QoX19h KSwgc2Vjb25kKF9fYikge30KCiAgdGVtcGxhdGUgPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgogIHBh aXIoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkgOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNvbmQo X19wLnNlY29uZCkge30KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5l IGJvb2wgb3BlcmF0b3I9PShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9U MSwgX1QyPiYgX195KQp7CiAgcmV0dXJuIF9feC5maXJzdCA9PSBfX3kuZmlyc3QgJiYgX194LnNl Y29uZCA9PSBfX3kuc2Vjb25kOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Cmlu bGluZSBib29sIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWly PF9UMSwgX1QyPiYgX195KQp7CiAgcmV0dXJuIF9feC5maXJzdCA8IF9feS5maXJzdCB8fAogICAg ICAgICAoIShfX3kuZmlyc3QgPCBfX3guZmlyc3QpICYmIF9feC5zZWNvbmQgPCBfX3kuc2Vjb25k KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgYm9vbCBvcGVyYXRv ciE9KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kp IHsKICByZXR1cm4gIShfX3ggPT0gX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3Mg X1QyPgppbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29u c3QgcGFpcjxfVDEsIF9UMj4mIF9feSkgewogIHJldHVybiBfX3kgPCBfX3g7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBwYWly PF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KSB7CiAgcmV0dXJuICEo X195IDwgX194KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgYm9v bCBvcGVyYXRvcj49KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBf VDI+JiBfX3kpIHsKICByZXR1cm4gIShfX3ggPCBfX3kpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Qx LCBjbGFzcyBfVDI+CgoKaW5saW5lIHBhaXI8X1QxLCBfVDI+IG1ha2VfcGFpcihfVDEgX194LCBf VDIgX195KQoKCgp7CiAgcmV0dXJuIHBhaXI8X1QxLCBfVDI+KF9feCwgX195KTsKfQoKfQojIDM4 ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxnb2Jhc2UuaCIg MiAzCgoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy90eXBlX3Ry YWl0cy5oIiAxIDMKIyAxOSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv dHlwZV90cmFpdHMuaCIgMwoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv aTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25maWcuaCIgMSAzCiMgMjEgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3R5cGVfdHJhaXRzLmgiIDIgMwojIDU3ICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy90eXBlX3RyYWl0cy5oIiAzCnRlbXBs YXRlIDxib29sIF9UcnV0aD4gc3RydWN0IF9Cb29sIHt9Owp0eXBlZGVmIF9Cb29sPHRydWU+IF9f dHJ1ZV90eXBlOwp0eXBlZGVmIF9Cb29sPGZhbHNlPiBfX2ZhbHNlX3R5cGU7Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwPgpzdHJ1Y3QgX190eXBlX3RyYWl0cyB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUg dGhpc19kdW1teV9tZW1iZXJfbXVzdF9iZV9maXJzdDsKIyA4MSAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvdHlwZV90cmFpdHMuaCIgMwogICB0eXBlZGVmIF9fZmFsc2Vf dHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fZmFsc2Vf dHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fZmFsc2VfdHlw ZSBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fZmFsc2VfdHlw ZSBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBpc19QT0Rf dHlwZTsKfTsKCgoKCnRlbXBsYXRlPD4gc3RydWN0IF9fdHlwZV90cmFpdHM8Ym9vbD4gewogICB0 eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5 cGUgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+IHN0cnVjdCBfX3R5cGVfdHJhaXRzPGNoYXI+ IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9y OwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgX190eXBlX3RyYWl0 czxzaWduZWQgY2hhcj4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2RlZmF1 bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfY29weV9j b25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9hc3NpZ25tZW50 X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Rlc3RydWN0b3I7 CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+IHN0cnVj dCBfX3R5cGVfdHJhaXRzPHVuc2lnbmVkIGNoYXI+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBo YXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhh c190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3Ry aXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJp dmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGlzX1BPRF90eXBlOwp9OwoK dGVtcGxhdGU8PiBzdHJ1Y3QgX190eXBlX3RyYWl0czx3Y2hhcl90PiB7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90 eXBlIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5 cGUgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBpc19QT0Rf dHlwZTsKfTsKCnRlbXBsYXRlPD4gc3RydWN0IF9fdHlwZV90cmFpdHM8c2hvcnQ+IHsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBf X3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBl IGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgX190eXBlX3RyYWl0czx1bnNpZ25l ZCBzaG9ydD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2RlZmF1bHRfY29u c3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1 Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJh dG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+IHN0cnVjdCBfX3R5 cGVfdHJhaXRzPGludD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2RlZmF1 bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfY29weV9j b25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9hc3NpZ25tZW50 X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Rlc3RydWN0b3I7 CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+IHN0cnVj dCBfX3R5cGVfdHJhaXRzPHVuc2lnbmVkIGludD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhh c190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFz X3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJp dmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2 aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaXNfUE9EX3R5cGU7Cn07Cgp0 ZW1wbGF0ZTw+IHN0cnVjdCBfX3R5cGVfdHJhaXRzPGxvbmc+IHsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90 eXBlIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUg aGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBo YXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGlzX1BPRF90eXBl Owp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgX190eXBlX3RyYWl0czx1bnNpZ25lZCBsb25nPiB7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSBpc19QT0RfdHlwZTsKfTsKCgoKdGVtcGxhdGU8PiBzdHJ1Y3QgX190eXBlX3RyYWl0czxs b25nIGxvbmc+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2Nv bnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2NvcHlfY29uc3Ry dWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVy YXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0 eXBlZGVmIF9fdHJ1ZV90eXBlIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgX190 eXBlX3RyYWl0czx1bnNpZ25lZCBsb25nIGxvbmc+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBo YXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhh c190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3Ry aXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJp dmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGlzX1BPRF90eXBlOwp9OwoK Cgp0ZW1wbGF0ZTw+IHN0cnVjdCBfX3R5cGVfdHJhaXRzPGZsb2F0PiB7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90 eXBlIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5 cGUgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBpc19QT0Rf dHlwZTsKfTsKCnRlbXBsYXRlPD4gc3RydWN0IF9fdHlwZV90cmFpdHM8ZG91YmxlPiB7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlw ZSBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gc3RydWN0IF9fdHlwZV90cmFpdHM8bG9uZyBk b3VibGU+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0 cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0 b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRv cjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3Ry dWN0IF9fdHlwZV90cmFpdHM8X1RwKj4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2 aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaGFzX3RyaXZp YWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBoYXNfdHJpdmlhbF9h c3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlIGhhc190cml2aWFsX2Rl c3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgaXNfUE9EX3R5cGU7Cn07CgoKCgoKdGVt cGxhdGUgPGNsYXNzIF9UcD4gc3RydWN0IF9Jc19pbnRlZ2VyIHsKICB0eXBlZGVmIF9fZmFsc2Vf dHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+IHN0cnVjdCBfSXNfaW50ZWdlcjxib29sPiB7 CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+IHN0cnVjdCBf SXNfaW50ZWdlcjxjaGFyPiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0 ZW1wbGF0ZTw+IHN0cnVjdCBfSXNfaW50ZWdlcjxzaWduZWQgY2hhcj4gewogIHR5cGVkZWYgX190 cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgX0lzX2ludGVnZXI8dW5z aWduZWQgY2hhcj4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxh dGU8PiBzdHJ1Y3QgX0lzX2ludGVnZXI8d2NoYXJfdD4gewogIHR5cGVkZWYgX190cnVlX3R5cGUg X0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgX0lzX2ludGVnZXI8c2hvcnQ+IHsKICB0 eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gc3RydWN0IF9Jc19p bnRlZ2VyPHVuc2lnbmVkIHNob3J0PiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7 Cn07Cgp0ZW1wbGF0ZTw+IHN0cnVjdCBfSXNfaW50ZWdlcjxpbnQ+IHsKICB0eXBlZGVmIF9fdHJ1 ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gc3RydWN0IF9Jc19pbnRlZ2VyPHVuc2ln bmVkIGludD4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8 PiBzdHJ1Y3QgX0lzX2ludGVnZXI8bG9uZz4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVn cmFsOwp9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgX0lzX2ludGVnZXI8dW5zaWduZWQgbG9uZz4gewog IHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKCgp0ZW1wbGF0ZTw+IHN0cnVjdCBf SXNfaW50ZWdlcjxsb25nIGxvbmc+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsK fTsKCnRlbXBsYXRlPD4gc3RydWN0IF9Jc19pbnRlZ2VyPHVuc2lnbmVkIGxvbmcgbG9uZz4gewog IHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBf VHA+IHN0cnVjdCBfSXNfbm9ybWFsX2l0ZXJhdG9yIHsKICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUg X05vcm1hbDsKfTsKCgpuYW1lc3BhY2Ugc3RkIHsKICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJh dG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPiBjbGFzcyBfX25vcm1hbF9pdGVyYXRvcjsKfTsKCnRl bXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4Kc3RydWN0IF9J c19ub3JtYWxfaXRlcmF0b3I8IHN0ZDo6X19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29u dGFpbmVyPiA+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfTm9ybWFsOwp9OwojIDQxICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgoj IDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3RyaW5nLmgi IDEgMwojIDQzICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxn b2Jhc2UuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv c3RkX2NsaW1pdHMuaCIgMSAzCiMgNDQgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12 My9iaXRzL3N0bF9hbGdvYmFzZS5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVk ZS9nKystdjMvYml0cy9zdGRfY3N0ZGxpYi5oIiAxIDMKIyAzNyAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdGRsaWIuaCIgMwojIDEgIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL2MrK2NvbmZpZy5oIiAx IDMKIyAzOCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NzdGRs aWIuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3Rk X2NzdGRkZWYuaCIgMSAzCiMgMzkgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i aXRzL3N0ZF9jc3RkbGliLmgiIDIgMwojIDQxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9zdGRfY3N0ZGxpYi5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAx IDMKIyAyNSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1 cmVzLmgiIDEgMwojIDI2ICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDIgMwoKCgoKCgoKIyAxICIv dXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4wL2luY2x1 ZGUvc3RkZGVmLmgiIDEgMwojIDM0ICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDIgMwoKZXh0ZXJu ICJDIiB7CgoKCgoKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICBpbnQgcXVvdDsKICAgIGludCByZW07 CiAgfSBkaXZfdDsKCgoKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICBsb25nIGludCBxdW90OwogICAg bG9uZyBpbnQgcmVtOwogIH0gbGRpdl90OwoKCgoKCl9fZXh0ZW5zaW9uX18gdHlwZWRlZiBzdHJ1 Y3QKICB7CiAgICBsb25nIGxvbmcgaW50IHF1b3Q7CiAgICBsb25nIGxvbmcgaW50IHJlbTsKICB9 IGxsZGl2X3Q7CiMgODAgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwpleHRlcm4gc2l6ZV90IF9f Y3R5cGVfZ2V0X21iX2N1cl9tYXggKHZvaWQpIHRocm93ICgpOwoKCgpleHRlcm4gZG91YmxlIGF0 b2YgKF9fY29uc3QgY2hhciAqX19ucHRyKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgYXRvaSAoX19j b25zdCBjaGFyICpfX25wdHIpIHRocm93ICgpOwoKZXh0ZXJuIGxvbmcgaW50IGF0b2wgKF9fY29u c3QgY2hhciAqX19ucHRyKSB0aHJvdyAoKTsKCgoKX19leHRlbnNpb25fXyBleHRlcm4gbG9uZyBs b25nIGludCBhdG9sbCAoX19jb25zdCBjaGFyICpfX25wdHIpIHRocm93ICgpOwoKCgpleHRlcm4g ZG91YmxlIHN0cnRvZCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9f cmVzdHJpY3QgX19lbmRwdHIpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGZsb2F0IHN0cnRvZiAoX19j b25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIp IHRocm93ICgpOwoKCmV4dGVybiBsb25nIGRvdWJsZSBzdHJ0b2xkIChfX2NvbnN0IGNoYXIgKl9f cmVzdHJpY3QgX19ucHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0cikgdGhyb3cgKCk7CgoK CgpleHRlcm4gbG9uZyBpbnQgc3RydG9sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRy LCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkgdGhyb3cgKCk7CgoKZXh0 ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHN0cnRvdWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X25wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKSB0aHJvdyAoKTsK CgoKCgpfX2V4dGVuc2lvbl9fCmV4dGVybiBsb25nIGxvbmcgaW50IHN0cnRvcSAoX19jb25zdCBj aGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBf X2Jhc2UpIHRocm93ICgpOwoKCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9u ZyBpbnQgc3RydG91cSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9f cmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIHRocm93ICgpOwojIDEzMiAiL3Vzci9pbmNs dWRlL3N0ZGxpYi5oIiAzCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIGxvbmcgbG9uZyBpbnQgc3RydG9s bCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgX19l bmRwdHIsIGludCBfX2Jhc2UpIHRocm93ICgpOwoKCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2ln bmVkIGxvbmcgbG9uZyBpbnQgc3RydG91bGwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25w dHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKSB0aHJvdyAoKTsKIyAx NTcgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwojIDEgIi91c3IvaW5jbHVkZS94bG9jYWxlLmgi IDEgMwojIDE1OCAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgoKZXh0ZXJuIGxvbmcgaW50 IF9fc3RydG9sX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNoYXIgKipfX3Jl c3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKTsK CgoKZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IF9fc3RydG91bF9sIChfX2NvbnN0IGNoYXIgKl9f cmVzdHJpY3QgX19ucHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSwg X19sb2NhbGVfdCBfX2xvYykgdGhyb3cgKCk7CgoKCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIGxvbmcg bG9uZyBpbnQgX19zdHJ0b2xsX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNo YXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKSB0 aHJvdyAoKTsKCgoKX19leHRlbnNpb25fXwpleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBf X3N0cnRvdWxsX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNoYXIgKipfX3Jl c3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBfX2xvY2FsZV90IF9fbG9jKSB0aHJvdyAoKTsK CgoKCgpleHRlcm4gZG91YmxlIF9fc3RydG9kX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X25wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBfX2xvY2FsZV90IF9fbG9jKSB0aHJv dyAoKTsKCgpleHRlcm4gZmxvYXQgX19zdHJ0b2ZfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIF9fbG9jYWxlX3QgX19sb2MpIHRo cm93ICgpOwoKCmV4dGVybiBsb25nIGRvdWJsZSBfX3N0cnRvbGRfbCAoX19jb25zdCBjaGFyICpf X3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIF9fbG9jYWxlX3Qg X19sb2MpIHRocm93ICgpOwojIDE5NiAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCmV4dGVybiBk b3VibGUgX19zdHJ0b2RfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIs IGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19ncm91cCkgdGhyb3cgKCk7CgoKZXh0 ZXJuIGZsb2F0IF9fc3RydG9mX2ludGVybmFsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19u cHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fZ3JvdXApIHRocm93ICgpOwoK ZXh0ZXJuIGxvbmcgZG91YmxlIF9fc3RydG9sZF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICogX19y ZXN0cmljdCBfX25wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19ncm91cCkg dGhyb3cgKCk7CgoKCgpleHRlcm4gbG9uZyBpbnQgX19zdHJ0b2xfaW50ZXJuYWwgKF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQg X19iYXNlLCBpbnQgX19ncm91cCkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIHVuc2lnbmVkIGxvbmcg aW50IF9fc3RydG91bF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICogX19yZXN0cmljdCBfX25wdHIs IGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkgdGhy b3cgKCk7CgoKCgoKCgpfX2V4dGVuc2lvbl9fCmV4dGVybiBsb25nIGxvbmcgaW50IF9fc3RydG9s bF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVz dHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKSB0aHJvdyAoKTsKCgoKCgpf X2V4dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fc3RydG91bGxfaW50 ZXJuYWwgKF9fY29uc3QgY2hhciAqIF9fcmVzdHJpY3QgX19ucHRyLCBjaGFyICoqIF9fcmVzdHJp Y3QgX19lbmRwdHIsIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKSB0aHJvdyAoKTsKIyAzMzMgIi91 c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwpleHRlcm4gY2hhciAqbDY0YSAobG9uZyBpbnQgX19uKSB0 aHJvdyAoKTsKCgpleHRlcm4gbG9uZyBpbnQgYTY0bCAoX19jb25zdCBjaGFyICpfX3MpIHRocm93 ICgpOwoKCiMgMSAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAxIDMKIyAyNiAiL3Vzci9pbmNs dWRlL3N5cy90eXBlcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMwojIDI3 ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKZXh0ZXJuICJDIiB7CgojIDEgIi91c3Iv aW5jbHVkZS9iaXRzL3R5cGVzLmgiIDEgMwojIDMxICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgi IDIgMwoKCnR5cGVkZWYgX191X2NoYXIgdV9jaGFyOwp0eXBlZGVmIF9fdV9zaG9ydCB1X3Nob3J0 Owp0eXBlZGVmIF9fdV9pbnQgdV9pbnQ7CnR5cGVkZWYgX191X2xvbmcgdV9sb25nOwp0eXBlZGVm IF9fcXVhZF90IHF1YWRfdDsKdHlwZWRlZiBfX3VfcXVhZF90IHVfcXVhZF90Owp0eXBlZGVmIF9f ZnNpZF90IGZzaWRfdDsKCgp0eXBlZGVmIF9fbG9mZl90IGxvZmZfdDsKCgoKdHlwZWRlZiBfX2lu b190IGlub190OwoKCgoKCgp0eXBlZGVmIF9faW5vNjRfdCBpbm82NF90OwoKCgoKdHlwZWRlZiBf X2Rldl90IGRldl90OwoKCgoKdHlwZWRlZiBfX2dpZF90IGdpZF90OwoKCgoKdHlwZWRlZiBfX21v ZGVfdCBtb2RlX3Q7CgoKCgp0eXBlZGVmIF9fbmxpbmtfdCBubGlua190OwoKCgoKdHlwZWRlZiBf X3VpZF90IHVpZF90OwojIDk2ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDMKdHlwZWRlZiBf X3BpZF90IHBpZF90OwoKCgoKdHlwZWRlZiBfX2lkX3QgaWRfdDsKCgoKdHlwZWRlZiBfX3NzaXpl X3Qgc3NpemVfdDsKCgoKCnR5cGVkZWYgX19kYWRkcl90IGRhZGRyX3Q7CnR5cGVkZWYgX19jYWRk cl90IGNhZGRyX3Q7CgoKCnR5cGVkZWYgX19rZXlfdCBrZXlfdDsKCgoKCgoKIyAxICIvdXNyL2lu Y2x1ZGUvdGltZS5oIiAxIDMKIyAxMjMgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMiAzCgoK IyAxICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4w L2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDEyNiAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAy IDMKCgoKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCB1bG9uZzsKdHlwZWRlZiB1bnNpZ25lZCBz aG9ydCBpbnQgdXNob3J0Owp0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50OwojIDE2OSAiL3Vzci9p bmNsdWRlL3N5cy90eXBlcy5oIiAzCnR5cGVkZWYgaW50IGludDhfdCBfX2F0dHJpYnV0ZV9fICgo X19tb2RlX18gKF9fUUlfXykpKTsKdHlwZWRlZiBpbnQgaW50MTZfdCBfX2F0dHJpYnV0ZV9fICgo X19tb2RlX18gKF9fSElfXykpKTsKdHlwZWRlZiBpbnQgaW50MzJfdCBfX2F0dHJpYnV0ZV9fICgo X19tb2RlX18gKF9fU0lfXykpKTsKdHlwZWRlZiBpbnQgaW50NjRfdCBfX2F0dHJpYnV0ZV9fICgo X19tb2RlX18gKF9fRElfXykpKTsKCgp0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDhfdCBfX2F0 dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fUUlfXykpKTsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9p bnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkpOwp0eXBlZGVmIHVuc2ln bmVkIGludCB1X2ludDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7CnR5 cGVkZWYgdW5zaWduZWQgaW50IHVfaW50NjRfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9f RElfXykpKTsKCnR5cGVkZWYgaW50IHJlZ2lzdGVyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9f IChfX3dvcmRfXykpKTsKIyAxOTEgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMwojIDEgIi91 c3IvaW5jbHVkZS9lbmRpYW4uaCIgMSAzCiMgMjIgIi91c3IvaW5jbHVkZS9lbmRpYW4uaCIgMwoj IDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAyMyAiL3Vzci9pbmNsdWRlL2VuZGlh bi5oIiAyIDMKIyAzNSAiL3Vzci9pbmNsdWRlL2VuZGlhbi5oIiAzCiMgMSAiL3Vzci9pbmNsdWRl L2JpdHMvZW5kaWFuLmgiIDEgMwojIDM2ICIvdXNyL2luY2x1ZGUvZW5kaWFuLmgiIDIgMwojIDE5 MiAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAyIDMKCgojIDEgIi91c3IvaW5jbHVkZS9zeXMv c2VsZWN0LmgiIDEgMwojIDE5NSAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAyIDMKCgojIDEg Ii91c3IvaW5jbHVkZS9zeXMvc3lzbWFjcm9zLmgiIDEgMwojIDE5OCAiL3Vzci9pbmNsdWRlL3N5 cy90eXBlcy5oIiAyIDMKCgoKCgp0eXBlZGVmIF9fYmxrY250X3QgYmxrY250X3Q7CnR5cGVkZWYg X19mc2Jsa2NudF90IGZzYmxrY250X3Q7CnR5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7 CgoKCgoKCgp0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnQ2NF90Owp0eXBlZGVmIF9fZnNibGtj bnQ2NF90IGZzYmxrY250NjRfdDsKdHlwZWRlZiBfX2ZzZmlsY250NjRfdCBmc2ZpbGNudDY0X3Q7 CgoKfQojIDM0MCAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgoKCgoKZXh0ZXJuIGludDMy X3QgcmFuZG9tICh2b2lkKSB0aHJvdyAoKTsKCgpleHRlcm4gdm9pZCBzcmFuZG9tICh1bnNpZ25l ZCBpbnQgX19zZWVkKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gdm9pZCAqIGluaXRzdGF0ZSAodW5z aWduZWQgaW50IF9fc2VlZCwgdm9pZCAqIF9fc3RhdGVidWYsIHNpemVfdCBfX3N0YXRlbGVuKSB0 aHJvdyAoKTsKCgoKCmV4dGVybiB2b2lkICogc2V0c3RhdGUgKHZvaWQgKiBfX3N0YXRlYnVmKSB0 aHJvdyAoKTsKCgoKCgoKCnN0cnVjdCByYW5kb21fZGF0YQogIHsKICAgIGludDMyX3QgKmZwdHI7 CiAgICBpbnQzMl90ICpycHRyOwogICAgaW50MzJfdCAqc3RhdGU7CiAgICBpbnQgcmFuZF90eXBl OwogICAgaW50IHJhbmRfZGVnOwogICAgaW50IHJhbmRfc2VwOwogICAgaW50MzJfdCAqZW5kX3B0 cjsKICB9OwoKZXh0ZXJuIGludCByYW5kb21fciAoc3RydWN0IHJhbmRvbV9kYXRhICpfX3Jlc3Ry aWN0IF9fYnVmLCBpbnQzMl90ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJvdyAoKTsKCgpleHRl cm4gaW50IHNyYW5kb21fciAodW5zaWduZWQgaW50IF9fc2VlZCwgc3RydWN0IHJhbmRvbV9kYXRh ICpfX2J1ZikgdGhyb3cgKCk7CgpleHRlcm4gaW50IGluaXRzdGF0ZV9yICh1bnNpZ25lZCBpbnQg X19zZWVkLCB2b2lkICogX19yZXN0cmljdCBfX3N0YXRlYnVmLCBzaXplX3QgX19zdGF0ZWxlbiwg c3RydWN0IHJhbmRvbV9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJvdyAoKTsKCgoKCmV4dGVy biBpbnQgc2V0c3RhdGVfciAodm9pZCAqIF9fcmVzdHJpY3QgX19zdGF0ZWJ1Ziwgc3RydWN0IHJh bmRvbV9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGludCBy YW5kICh2b2lkKSB0aHJvdyAoKTsKCmV4dGVybiB2b2lkIHNyYW5kICh1bnNpZ25lZCBpbnQgX19z ZWVkKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCByYW5kX3IgKHVuc2lnbmVkIGludCAqX19zZWVk KSB0aHJvdyAoKTsKCgoKCgoKCmV4dGVybiBkb3VibGUgZHJhbmQ0OCAodm9pZCkgdGhyb3cgKCk7 CmV4dGVybiBkb3VibGUgZXJhbmQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10pIHRo cm93ICgpOwoKCmV4dGVybiBsb25nIGludCBscmFuZDQ4ICh2b2lkKSB0aHJvdyAoKTsKZXh0ZXJu IGxvbmcgaW50IG5yYW5kNDggKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdKSB0aHJvdyAo KTsKCgpleHRlcm4gbG9uZyBpbnQgbXJhbmQ0OCAodm9pZCkgdGhyb3cgKCk7CmV4dGVybiBsb25n IGludCBqcmFuZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSkgdGhyb3cgKCk7CgoK ZXh0ZXJuIHZvaWQgc3JhbmQ0OCAobG9uZyBpbnQgX19zZWVkdmFsKSB0aHJvdyAoKTsKZXh0ZXJu IHVuc2lnbmVkIHNob3J0IGludCAqc2VlZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2 WzNdKSB0aHJvdyAoKTsKZXh0ZXJuIHZvaWQgbGNvbmc0OCAodW5zaWduZWQgc2hvcnQgaW50IF9f cGFyYW1bN10pIHRocm93ICgpOwoKCnN0cnVjdCBkcmFuZDQ4X2RhdGEKICB7CiAgICB1bnNpZ25l ZCBzaG9ydCBpbnQgeFszXTsKICAgIHVuc2lnbmVkIHNob3J0IGludCBhWzNdOwogICAgdW5zaWdu ZWQgc2hvcnQgaW50IGM7CiAgICB1bnNpZ25lZCBzaG9ydCBpbnQgb2xkX3hbM107CiAgICBpbnQg aW5pdDsKICB9OwoKCgpleHRlcm4gaW50IGRyYW5kNDhfciAoc3RydWN0IGRyYW5kNDhfZGF0YSAq X19yZXN0cmljdCBfX2J1ZmZlciwgZG91YmxlICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJvdyAo KTsKCmV4dGVybiBpbnQgZXJhbmQ0OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSwg c3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwgZG91YmxlICpfX3Jlc3Ry aWN0IF9fcmVzdWx0KSB0aHJvdyAoKTsKCgoKCmV4dGVybiBpbnQgbHJhbmQ0OF9yIChzdHJ1Y3Qg ZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBsb25nIGludCAqX19yZXN0cmljdCBf X3Jlc3VsdCkgdGhyb3cgKCk7CgpleHRlcm4gaW50IG5yYW5kNDhfciAodW5zaWduZWQgc2hvcnQg aW50IF9feHN1YmlbM10sIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIs IGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJvdyAoKTsKCgoKCmV4dGVybiBpbnQg bXJhbmQ0OF9yIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBsb25n IGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgdGhyb3cgKCk7CgpleHRlcm4gaW50IGpyYW5kNDhf ciAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9f cmVzdHJpY3QgX19idWZmZXIsIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJvdyAo KTsKCgoKCmV4dGVybiBpbnQgc3JhbmQ0OF9yIChsb25nIGludCBfX3NlZWR2YWwsIHN0cnVjdCBk cmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSB0aHJvdyAoKTsKCmV4dGVybiBpbnQgc2VlZDQ4X3IgKHVu c2lnbmVkIHNob3J0IGludCBfX3NlZWQxNnZbM10sIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVm ZmVyKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IGxjb25nNDhfciAodW5zaWduZWQgc2hvcnQgaW50 IF9fcGFyYW1bN10sIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSB0aHJvdyAoKTsKIyA0 NzQgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwpleHRlcm4gdm9pZCAqIG1hbGxvYyAoc2l6ZV90 IF9fc2l6ZSkgdGhyb3cgKCk7CgpleHRlcm4gdm9pZCAqIGNhbGxvYyAoc2l6ZV90IF9fbm1lbWIs IHNpemVfdCBfX3NpemUpIHRocm93ICgpOwoKCgoKCmV4dGVybiB2b2lkICogcmVhbGxvYyAodm9p ZCAqIF9fcHRyLCBzaXplX3QgX19zaXplKSB0aHJvdyAoKTsKCmV4dGVybiB2b2lkIGZyZWUgKHZv aWQgKiBfX3B0cikgdGhyb3cgKCk7CgoKCmV4dGVybiB2b2lkIGNmcmVlICh2b2lkICogX19wdHIp IHRocm93ICgpOwoKCgojIDEgIi91c3IvaW5jbHVkZS9hbGxvY2EuaCIgMSAzCiMgMjIgIi91c3Iv aW5jbHVkZS9hbGxvY2EuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAy MyAiL3Vzci9pbmNsdWRlL2FsbG9jYS5oIiAyIDMKCgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9s aWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMg MjYgIi91c3IvaW5jbHVkZS9hbGxvY2EuaCIgMiAzCgpleHRlcm4gIkMiIHsKCgoKCgpleHRlcm4g dm9pZCAqIGFsbG9jYSAoc2l6ZV90IF9fc2l6ZSkgdGhyb3cgKCk7CgoKCgoKfQojIDQ5MyAiL3Vz ci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgoKCmV4dGVybiB2b2lkICogdmFsbG9jIChzaXplX3Qg X19zaXplKSB0aHJvdyAoKTsKCgoKCmV4dGVybiB2b2lkIGFib3J0ICh2b2lkKSB0aHJvdyAoKSBf X2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CgoKCmV4dGVybiBpbnQgYXRleGl0ICh2b2lk ICgqX19mdW5jKSAodm9pZCkpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGludCBfX29uX2V4aXQgKHZv aWQgKCpfX2Z1bmMpIChpbnQgX19zdGF0dXMsIHZvaWQgKiBfX2FyZyksIHZvaWQgKiBfX2FyZykg dGhyb3cgKCk7CgpleHRlcm4gaW50IG9uX2V4aXQgKHZvaWQgKCpfX2Z1bmMpIChpbnQgX19zdGF0 dXMsIHZvaWQgKiBfX2FyZyksIHZvaWQgKiBfX2FyZykgdGhyb3cgKCk7CgoKCgoKCmV4dGVybiB2 b2lkIGV4aXQgKGludCBfX3N0YXR1cykgdGhyb3cgKCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1 cm5fXykpOwoKCgoKZXh0ZXJuIHZvaWQgX0V4aXQgKGludCBfX3N0YXR1cykgdGhyb3cgKCkgX19h dHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKCgoKZXh0ZXJuIGNoYXIgKmdldGVudiAoX19j b25zdCBjaGFyICpfX25hbWUpIHRocm93ICgpOwoKCgpleHRlcm4gY2hhciAqX19zZWN1cmVfZ2V0 ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgdGhyb3cgKCk7CgoKCgoKZXh0ZXJuIGludCBwdXRl bnYgKGNoYXIgKl9fc3RyaW5nKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4gaW50IHNldGVudiAoX19j b25zdCBjaGFyICpfX25hbWUsIF9fY29uc3QgY2hhciAqX192YWx1ZSwgaW50IF9fcmVwbGFjZSkg dGhyb3cgKCk7CgoKCmV4dGVybiB2b2lkIHVuc2V0ZW52IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkg dGhyb3cgKCk7CgoKCgoKCmV4dGVybiBpbnQgY2xlYXJlbnYgKHZvaWQpIHRocm93ICgpOwojIDU2 NiAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCmV4dGVybiBjaGFyICpta3RlbXAgKGNoYXIgKl9f dGVtcGxhdGUpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gaW50IG1rc3RlbXAgKGNoYXIgKl9fdGVt cGxhdGUpIHRocm93ICgpOwoKCgoKZXh0ZXJuIGludCBzeXN0ZW0gKF9fY29uc3QgY2hhciAqX19j b21tYW5kKSB0aHJvdyAoKTsKCgoKCgoKZXh0ZXJuIGNoYXIgKmNhbm9uaWNhbGl6ZV9maWxlX25h bWUgKF9fY29uc3QgY2hhciAqX19uYW1lKSB0aHJvdyAoKTsKIyA1OTUgIi91c3IvaW5jbHVkZS9z dGRsaWIuaCIgMwpleHRlcm4gY2hhciAqcmVhbHBhdGggKF9fY29uc3QgY2hhciAqX19yZXN0cmlj dCBfX25hbWUsIGNoYXIgKl9fcmVzdHJpY3QgX19yZXNvbHZlZCkgdGhyb3cgKCk7CgoKCgoKCgp0 eXBlZGVmIGludCAoKl9fY29tcGFyX2ZuX3QpIChfX2NvbnN0IHZvaWQgKiwgX19jb25zdCB2b2lk ICopOwoKCnR5cGVkZWYgX19jb21wYXJfZm5fdCBjb21wYXJpc29uX2ZuX3Q7CgoKCgoKZXh0ZXJu IHZvaWQgKiBic2VhcmNoIChfX2NvbnN0IHZvaWQgKiBfX2tleSwgX19jb25zdCB2b2lkICogX19i YXNlLCBzaXplX3QgX19ubWVtYiwgc2l6ZV90IF9fc2l6ZSwgX19jb21wYXJfZm5fdCBfX2NvbXBh cik7CgoKCgoKZXh0ZXJuIHZvaWQgcXNvcnQgKHZvaWQgKiBfX2Jhc2UsIHNpemVfdCBfX25tZW1i LCBzaXplX3QgX19zaXplLCBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKCgoKCmV4dGVybiBpbnQg YWJzIChpbnQgX194KSB0aHJvdyAoKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CmV4dGVy biBsb25nIGludCBsYWJzIChsb25nIGludCBfX3gpIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChf X2NvbnN0X18pKTsKCl9fZXh0ZW5zaW9uX18gZXh0ZXJuIGxvbmcgbG9uZyBpbnQgbGxhYnMgKGxv bmcgbG9uZyBpbnQgX194KSB0aHJvdyAoKQogICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18p KTsKCgoKCgoKZXh0ZXJuIGRpdl90IGRpdiAoaW50IF9fbnVtZXIsIGludCBfX2Rlbm9tKSB0aHJv dyAoKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CmV4dGVybiBsZGl2X3QgbGRpdiAobG9u ZyBpbnQgX19udW1lciwgbG9uZyBpbnQgX19kZW5vbSkgdGhyb3cgKCkKICAgICBfX2F0dHJpYnV0 ZV9fICgoX19jb25zdF9fKSk7CgpfX2V4dGVuc2lvbl9fIGV4dGVybiBsbGRpdl90IGxsZGl2IChs b25nIGxvbmcgaW50IF9fbnVtZXIsIGxvbmcgbG9uZyBpbnQgX19kZW5vbSkgdGhyb3cgKCkKCiAg ICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwojIDY1MSAiL3Vzci9pbmNsdWRlL3N0ZGxp Yi5oIiAzCmV4dGVybiBjaGFyICplY3Z0IChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBp bnQgKl9fcmVzdHJpY3QgX19kZWNwdCwgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbikgdGhyb3cgKCk7 CgoKCgoKZXh0ZXJuIGNoYXIgKmZjdnQgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGlu dCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSB0aHJvdyAoKTsK CgoKCgpleHRlcm4gY2hhciAqZ2N2dCAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgY2hh ciAqX19idWYpIHRocm93ICgpOwoKCmV4dGVybiBjaGFyICpxZWN2dCAobG9uZyBkb3VibGUgX192 YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwgaW50ICpfX3Jlc3Ry aWN0IF9fc2lnbikgdGhyb3cgKCk7CgpleHRlcm4gY2hhciAqcWZjdnQgKGxvbmcgZG91YmxlIF9f dmFsdWUsIGludCBfX25kaWdpdCwgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsIGludCAqX19yZXN0 cmljdCBfX3NpZ24pIHRocm93ICgpOwoKZXh0ZXJuIGNoYXIgKnFnY3Z0IChsb25nIGRvdWJsZSBf X3ZhbHVlLCBpbnQgX19uZGlnaXQsIGNoYXIgKl9fYnVmKSB0aHJvdyAoKTsKCgoKCgpleHRlcm4g aW50IGVjdnRfciAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgaW50ICpfX3Jlc3RyaWN0 IF9fZGVjcHQsIGludCAqX19yZXN0cmljdCBfX3NpZ24sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYs IHNpemVfdCBfX2xlbikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBmY3Z0X3IgKGRvdWJsZSBfX3Zh bHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJp Y3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pIHRocm93ICgp OwoKCgpleHRlcm4gaW50IHFlY3Z0X3IgKGxvbmcgZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdp dCwgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsIGludCAqX19yZXN0cmljdCBfX3NpZ24sIGNoYXIg Kl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBx ZmN2dF9yIChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmlj dCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVm LCBzaXplX3QgX19sZW4pIHRocm93ICgpOwojIDY5NSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAz CmV4dGVybiBpbnQgbWJsZW4gKF9fY29uc3QgY2hhciAqX19zLCBzaXplX3QgX19uKSB0aHJvdyAo KTsKCgpleHRlcm4gaW50IG1idG93YyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3B3YywgX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CgoKCmV4dGVybiBp bnQgd2N0b21iIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhcikgdGhyb3cgKCk7CgoKCmV4dGVy biBzaXplX3QgbWJzdG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19wd2NzLCBfX2NvbnN0IGNo YXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uKSB0aHJvdyAoKTsKCgpleHRlcm4gc2l6ZV90 IHdjc3RvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3Ry aWN0IF9fcHdjcywgc2l6ZV90IF9fbikgdGhyb3cgKCk7CiMgNzE4ICIvdXNyL2luY2x1ZGUvc3Rk bGliLmgiIDMKZXh0ZXJuIGludCBycG1hdGNoIChfX2NvbnN0IGNoYXIgKl9fcmVzcG9uc2UpIHRo cm93ICgpOwojIDcyOSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCmV4dGVybiBpbnQgZ2V0c3Vi b3B0IChjaGFyICoqX19yZXN0cmljdCBfX29wdGlvbnAsIF9fY29uc3QgY2hhciAqX19jb25zdCAq X19yZXN0cmljdCBfX3Rva2VucywgY2hhciAqKl9fcmVzdHJpY3QgX192YWx1ZXApIHRocm93ICgp OwojIDczOCAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCmV4dGVybiB2b2lkIHNldGtleSAoX19j b25zdCBjaGFyICpfX2tleSkgdGhyb3cgKCk7CgoKCgoKCgpleHRlcm4gaW50IGdyYW50cHQgKGlu dCBfX2ZkKSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCB1bmxvY2twdCAoaW50IF9fZmQpIHRocm93 ICgpOwoKCgoKZXh0ZXJuIGNoYXIgKnB0c25hbWUgKGludCBfX2ZkKSB0aHJvdyAoKTsKCgoKCgoK ZXh0ZXJuIGludCBwdHNuYW1lX3IgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVm bGVuKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IGdldHB0ICh2b2lkKSB0aHJvdyAoKTsKCgoKCgp9 CiMgNDIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3RkbGli LmgiIDIgMwojIDczICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRf Y3N0ZGxpYi5oIiAzCm5hbWVzcGFjZSBzdGQKewogIHVzaW5nIDo6ZGl2X3Q7CiAgdXNpbmcgOjps ZGl2X3Q7CgogIHVzaW5nIDo6YWJvcnQ7CiAgdXNpbmcgOjphYnM7CiAgdXNpbmcgOjphdGV4aXQ7 CiAgdXNpbmcgOjphdG9mOwogIHVzaW5nIDo6YXRvaTsKICB1c2luZyA6OmF0b2w7CiAgdXNpbmcg Ojpic2VhcmNoOwogIHVzaW5nIDo6Y2FsbG9jOwogIHVzaW5nIDo6ZGl2OwogIHVzaW5nIDo6ZXhp dDsKICB1c2luZyA6OmZyZWU7CiAgdXNpbmcgOjpnZXRlbnY7CiAgdXNpbmcgOjpsYWJzOwogIHVz aW5nIDo6bGRpdjsKICB1c2luZyA6Om1hbGxvYzsKICB1c2luZyA6Om1ibGVuOwogIHVzaW5nIDo6 bWJzdG93Y3M7CiAgdXNpbmcgOjptYnRvd2M7CiAgdXNpbmcgOjpxc29ydDsKICB1c2luZyA6OnJh bmQ7CiAgdXNpbmcgOjpyZWFsbG9jOwogIHVzaW5nIDo6c3JhbmQ7CiAgdXNpbmcgOjpzdHJ0b2Q7 CiAgdXNpbmcgOjpzdHJ0b2w7CiAgdXNpbmcgOjpzdHJ0b3VsOwogIHVzaW5nIDo6c3lzdGVtOwog IHVzaW5nIDo6d2NzdG9tYnM7CiAgdXNpbmcgOjp3Y3RvbWI7CgogIGlubGluZSBsb25nCiAgYWJz KGxvbmcgX19pKSB7IHJldHVybiBsYWJzKF9faSk7IH0KCiAgaW5saW5lIGxkaXZfdAogIGRpdihs b25nIF9faSwgbG9uZyBfX2opIHsgcmV0dXJuIGxkaXYoX19pLCBfX2opOyB9Cn0KIyAxMjUgIi91 c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3RkbGliLmgiIDMKbmFt ZXNwYWNlIF9fZ251X2N4eAp7CiAgdXNpbmcgOjpsbGRpdl90OwogIHVzaW5nIDo6X0V4aXQ7Cgog IGlubGluZSBsb25nIGxvbmcKICBhYnMobG9uZyBsb25nIF9feCkgeyByZXR1cm4gX194ID49IDAg PyBfX3ggOiAtX194OyB9CgogIGlubGluZSBsb25nIGxvbmcKICBsbGFicyhsb25nIGxvbmcgX194 KSB7IHJldHVybiBfX3ggPj0gMCA/IF9feCA6IC1fX3g7IH0KCiAgaW5saW5lIGxsZGl2X3QKICBk aXYobG9uZyBsb25nIF9fbiwgbG9uZyBsb25nIF9fZCkKICB7IGxsZGl2X3QgX19xOyBfX3EucXVv dCA9IF9fbiAvIF9fZDsgX19xLnJlbSA9IF9fbiAlIF9fZDsgcmV0dXJuIF9fcTsgfQoKICBpbmxp bmUgbGxkaXZfdAogIGxsZGl2KGxvbmcgbG9uZyBfX24sIGxvbmcgbG9uZyBfX2QpCiAgeyBsbGRp dl90IF9fcTsgX19xLnF1b3QgPSBfX24gLyBfX2Q7IF9fcS5yZW0gPSBfX24gJSBfX2Q7IHJldHVy biBfX3E7IH0KCiAgdXNpbmcgOjphdG9sbDsKICB1c2luZyA6OnN0cnRvZjsKICB1c2luZyA6OnN0 cnRvbGw7CiAgdXNpbmcgOjpzdHJ0b3VsbDsKICB1c2luZyA6OnN0cnRvbGQ7Cn0KCm5hbWVzcGFj ZSBzdGQKewogIHVzaW5nIF9fZ251X2N4eDo6bGxkaXZfdDsKICB1c2luZyBfX2dudV9jeHg6Ol9F eGl0OwogIHVzaW5nIF9fZ251X2N4eDo6YWJzOwogIHVzaW5nIF9fZ251X2N4eDo6bGxhYnM7CiAg dXNpbmcgX19nbnVfY3h4OjpkaXY7CiAgdXNpbmcgX19nbnVfY3h4OjpsbGRpdjsKICB1c2luZyBf X2dudV9jeHg6OmF0b2xsOwogIHVzaW5nIF9fZ251X2N4eDo6c3RydG9mOwogIHVzaW5nIF9fZ251 X2N4eDo6c3RydG9sbDsKICB1c2luZyBfX2dudV9jeHg6OnN0cnRvdWxsOwogIHVzaW5nIF9fZ251 X2N4eDo6c3RydG9sZDsKfQojIDQ1ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv Yml0cy9zdGxfYWxnb2Jhc2UuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX2NzdGRkZWYuaCIgMSAzCiMgNDYgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGdvYmFzZS5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvbmV3IiAxIDMKIyAzNCAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL25ldyIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12 My9jc3RkZGVmIiAxIDMKIyAzNSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL25l dyIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2V4Y2VwdGlvbiIg MSAzCiMgMzYgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9uZXciIDIgMwoKZXh0 ZXJuICJDKysiIHsKCm5hbWVzcGFjZSBzdGQKewogIGNsYXNzIGJhZF9hbGxvYyA6IHB1YmxpYyBl eGNlcHRpb24KICB7CiAgcHVibGljOgogICAgYmFkX2FsbG9jKCkgdGhyb3coKSB7IH0KICAgIHZp cnR1YWwgfmJhZF9hbGxvYygpIHRocm93KCk7CiAgfTsKCiAgc3RydWN0IG5vdGhyb3dfdCB7IH07 CiAgZXh0ZXJuIGNvbnN0IG5vdGhyb3dfdCBub3Rocm93OwogIHR5cGVkZWYgdm9pZCAoKm5ld19o YW5kbGVyKSgpOwogIG5ld19oYW5kbGVyIHNldF9uZXdfaGFuZGxlcihuZXdfaGFuZGxlcik7Cn0K Cgp2b2lkICpvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QpIHRocm93IChzdGQ6OmJhZF9hbGxvYyk7 CnZvaWQgKm9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRfYWxsb2Mp Owp2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHRocm93KCk7CnZvaWQgb3BlcmF0b3IgZGVs ZXRlW10odm9pZCAqKSB0aHJvdygpOwp2b2lkICpvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QsIGNv bnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKdm9pZCAqb3BlcmF0b3IgbmV3W10oc3RkOjpz aXplX3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKdm9pZCBvcGVyYXRvciBkZWxl dGUodm9pZCAqLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7CnZvaWQgb3BlcmF0b3Ig ZGVsZXRlW10odm9pZCAqLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7CgoKaW5saW5l IHZvaWQgKm9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCwgdm9pZCAqcGxhY2UpIHRocm93KCkgeyBy ZXR1cm4gcGxhY2U7IH0KaW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90LCB2 b2lkICpwbGFjZSkgdGhyb3coKSB7IHJldHVybiBwbGFjZTsgfQp9CiMgNDcgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGdvYmFzZS5oIiAyIDMKCiMgMSAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2lvc2Z3ZC5oIiAxIDMKIyA0 OSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2FsZ29iYXNlLmgi IDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9pdGVy YXRvcl9iYXNlX3R5cGVzLmgiIDEgMwojIDUwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9zdGxfYWxnb2Jhc2UuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaCIgMSAzCiMgNTEgIi91 c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGdvYmFzZS5oIiAyIDMK IyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfaXRlcmF0b3Iu aCIgMSAzCiMgNTIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9h bGdvYmFzZS5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0 cy9jb25jZXB0X2NoZWNrLmgiIDEgMwojIDUzICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgpuYW1lc3BhY2Ugc3RkCnsKCgoKdGVtcGxh dGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjIsIGNsYXNzIF9UcD4K aW5saW5lIHZvaWQgX19pdGVyX3N3YXAoX0ZvcndhcmRJdGVyMSBfX2EsIF9Gb3J3YXJkSXRlcjIg X19iLCBfVHAqKQp7CiAgX1RwIF9fdG1wID0gKl9fYTsKICAqX19hID0gKl9fYjsKICAqX19iID0g X190bXA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0 ZXIyPgppbmxpbmUgdm9pZCBpdGVyX3N3YXAoX0ZvcndhcmRJdGVyMSBfX2EsIF9Gb3J3YXJkSXRl cjIgX19iKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKCgoKICBfX2l0ZXJfc3dhcChfX2EsIF9fYiwgX192YWx1ZV90eXBlKF9fYSkp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgdm9pZCBzd2FwKF9UcCYgX19hLCBfVHAm IF9fYikKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwoKICBfVHAgX190bXAgPSBfX2E7CiAgX19hID0gX19iOwogIF9fYiA9IF9fdG1w Owp9CgoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgY29uc3QgX1RwJiBtaW4oY29u c3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgaWYgKF9fYiA8IF9fYSkg cmV0dXJuIF9fYjsgcmV0dXJuIF9fYTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcD4KaW5saW5lIGNv bnN0IF9UcCYgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikgewoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Cgog IGlmIChfX2EgPCBfX2IpIHJldHVybiBfX2I7IHJldHVybiBfX2E7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfVHAsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgY29uc3QgX1RwJiBtaW4oY29uc3QgX1RwJiBf X2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApIHsKCiAgaWYgKF9fY29tcChfX2Is IF9fYSkpIHJldHVybiBfX2I7IHJldHVybiBfX2E7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNs YXNzIF9Db21wYXJlPgppbmxpbmUgY29uc3QgX1RwJiBtYXgoY29uc3QgX1RwJiBfX2EsIGNvbnN0 IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApIHsKCiAgaWYgKF9fY29tcChfX2EsIF9fYikpIHJl dHVybiBfX2I7IHJldHVybiBfX2E7Cn0KIyAxMzcgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL3N0bF9hbGdvYmFzZS5oIiAzCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVy LCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgX091dHB1dEl0ZXIg X19jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnLCBfRGlzdGFuY2UqKQp7CiAgZm9yICggOyBfX2ZpcnN0 ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQogICAgKl9fcmVzdWx0ID0gKl9fZmly c3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0 ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSBfT3V0cHV0SXRl cgpfX2NvcHkoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19s YXN0LAogICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3Jf dGFnLCBfRGlzdGFuY2UqKQp7CiAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJz dDsgX19uID4gMDsgLS1fX24pIHsKICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogICAgKytfX2Zp cnN0OwogICAgKytfX3Jlc3VsdDsKICB9CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwPgppbmxpbmUgX1RwKgpfX2NvcHlfdHJpdmlhbChjb25zdCBfVHAqIF9fZmlyc3Qs IGNvbnN0IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KQp7CiAgbWVtbW92ZShfX3Jlc3VsdCwg X19maXJzdCwgc2l6ZW9mKF9UcCkgKiAoX19sYXN0IC0gX19maXJzdCkpOwogIHJldHVybiBfX3Jl c3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0KTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVy LCBjbGFzcyBfT3V0cHV0SXRlcj4KaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9hdXgyKF9JbnB1 dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX19mYWxzZV90eXBlKQp7CiAgcmV0dXJuIF9f Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgX19pdGVyYXRv cl9jYXRlZ29yeShfX2ZpcnN0KSwKICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZShfX2Zp cnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlcj4K aW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9hdXgyKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0 SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBf X3Jlc3VsdCwgX190cnVlX3R5cGUpCnsKICByZXR1cm4gX19jb3B5KF9fZmlyc3QsIF9fbGFzdCwg X19yZXN1bHQsCiAgICAgICAgICAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpLAog ICAgICAgICAgICAgICAgX19kaXN0YW5jZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9UcD4KaW5saW5lIF9UcCogX19jb3B5X2F1eDIoX1RwKiBfX2ZpcnN0LCBfVHAqIF9fbGFz dCwgX1RwKiBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgX190cnVlX3R5cGUpCnsK ICByZXR1cm4gX19jb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBfVHAqIF9fY29weV9hdXgyKGNvbnN0IF9UcCogX19m aXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQsCiAgICAgICAgICAgICAgICAg ICAgICAgIF9fdHJ1ZV90eXBlKQp7CiAgcmV0dXJuIF9fY29weV90cml2aWFsKF9fZmlyc3QsIF9f bGFzdCwgX19yZXN1bHQpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9P dXRwdXRJdGVyLCBjbGFzcyBfVHA+CmlubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfYXV4KF9JbnB1 dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfVHAqKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBf X3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IKICAgICAg ICAgIF9Ucml2aWFsOwogIHJldHVybiBfX2NvcHlfYXV4MihfX2ZpcnN0LCBfX2xhc3QsIF9fcmVz dWx0LCBfVHJpdmlhbCgpKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlciwgdHlwZW5h bWUgX091dHB1dEl0ZXI+CmlubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfbmkyKF9JbnB1dEl0ZXIg X19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX190cnVlX3R5cGUpCnsKICByZXR1cm4gX091dHB1dEl0 ZXIoX19jb3B5X2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LmJhc2UoKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoX19maXJzdCkpKTsKfQoKdGVtcGxh dGU8dHlwZW5hbWUgX0lucHV0SXRlciwgdHlwZW5hbWUgX091dHB1dEl0ZXI+CmlubGluZSBfT3V0 cHV0SXRlciBfX2NvcHlfbmkyKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfX2Zh bHNlX3R5cGUpCnsKICByZXR1cm4gX19jb3B5X2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0 LCBfX3ZhbHVlX3R5cGUoX19maXJzdCkpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVy LCB0eXBlbmFtZSBfT3V0cHV0SXRlcj4KaW5saW5lIF9PdXRwdXRJdGVyIF9fY29weV9uaTEoX0lu cHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfX3RydWVfdHlwZSkKewogIHR5cGVkZWYg dHlwZW5hbWUgX0lzX25vcm1hbF9pdGVyYXRvcjxfT3V0cHV0SXRlcj46Ol9Ob3JtYWwgX19Ob3Jt YWw7CiAgcmV0dXJuIF9fY29weV9uaTIoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCksIF9f cmVzdWx0LCBfX05vcm1hbCgpKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlciwgdHlw ZW5hbWUgX091dHB1dEl0ZXI+CmlubGluZSBfT3V0cHV0SXRlciBfX2NvcHlfbmkxKF9JbnB1dEl0 ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX19mYWxzZV90eXBlKQp7CiAgdHlwZWRlZiB0eXBl bmFtZSBfSXNfbm9ybWFsX2l0ZXJhdG9yPF9PdXRwdXRJdGVyPjo6X05vcm1hbCBfX05vcm1hbDsK ICByZXR1cm4gX19jb3B5X25pMihfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfX05vcm1hbCgp KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyPgppbmxp bmUgX091dHB1dEl0ZXIgY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkKewoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDsKCgogICB0eXBlZGVmIHR5cGVuYW1lIF9Jc19ub3JtYWxfaXRlcmF0b3I8X0lucHV0SXRl cj46Ol9Ob3JtYWwgX19Ob3JtYWw7CiAgIHJldHVybiBfX2NvcHlfbmkxKF9fZmlyc3QsIF9fbGFz dCwgX19yZXN1bHQsIF9fTm9ybWFsKCkpOwp9CgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0 aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMiwKICAgICAgICAgIGNsYXNzIF9E aXN0YW5jZT4KaW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19jb3B5X2JhY2t3YXJkKF9CaWRp cmVjdGlvbmFsSXRlcjEgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjEgX19sYXN0LAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX3Jlc3VsdCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWxfaXRl cmF0b3JfdGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rp c3RhbmNlKikKewogIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKICAgICotLV9fcmVzdWx0ID0g Ki0tX19sYXN0OwogIHJldHVybiBfX3Jlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KaW5s aW5lIF9CaWRpcmVjdGlvbmFsSXRlciBfX2NvcHlfYmFja3dhcmQoX1JhbmRvbUFjY2Vzc0l0ZXIg X19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRv bUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqKQp7CiAgZm9yIChfRGlz dGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pCiAgICAqLS1fX3Jl c3VsdCA9ICotLV9fbGFzdDsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCgoKCgoKCnRlbXBsYXRlIDxj bGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIxLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLAogICAg ICAgICAgY2xhc3MgX0Jvb2xUeXBlPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rpc3BhdGNoCnsK ICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXIxPjo6 aXRlcmF0b3JfY2F0ZWdvcnkKICAgICAgICAgIF9DYXQ7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVy YXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyMT46OmRpZmZlcmVuY2VfdHlwZQogICAgICAg ICAgX0Rpc3RhbmNlOwoKICBzdGF0aWMgX0JpZGlyZWN0aW9uYWxJdGVyMiBjb3B5KF9CaWRpcmVj dGlvbmFsSXRlcjEgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9C aWRpcmVjdGlvbmFsSXRlcjEgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX3Jlc3VsdCkgewogICAgcmV0dXJuIF9fY29weV9iYWNr d2FyZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfQ2F0KCksIChfRGlzdGFuY2UqKSAwKTsK ICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rpc3Bh dGNoPF9UcCosIF9UcCosIF9fdHJ1ZV90eXBlPgp7CiAgc3RhdGljIF9UcCogY29weShjb25zdCBf VHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KSB7CiAgICBjb25z dCBwdHJkaWZmX3QgX051bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CiAgICBtZW1tb3ZlKF9fcmVzdWx0 IC0gX051bSwgX19maXJzdCwgc2l6ZW9mKF9UcCkgKiBfTnVtKTsKICAgIHJldHVybiBfX3Jlc3Vs dCAtIF9OdW07CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9fY29weV9iYWNr d2FyZF9kaXNwYXRjaDxjb25zdCBfVHAqLCBfVHAqLCBfX3RydWVfdHlwZT4KewogIHN0YXRpYyBf VHAqIGNvcHkoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBfX3Jl c3VsdCkgewogICAgcmV0dXJuIF9fY29weV9iYWNrd2FyZF9kaXNwYXRjaDxfVHAqLCBfVHAqLCBf X3RydWVfdHlwZT4KICAgICAgOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwogIH0K fTsKCnRlbXBsYXRlIDxjbGFzcyBfQkkxLCBjbGFzcyBfQkkyPgppbmxpbmUgX0JJMiBfX2NvcHlf YmFja3dhcmRfYXV4KF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpIHsK ICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRz PF9CSTI+Ojp2YWx1ZV90eXBlPgogICAgICAgICAgICAgICAgICAgICAgICA6Omhhc190cml2aWFs X2Fzc2lnbm1lbnRfb3BlcmF0b3IKICAgICAgICAgIF9Ucml2aWFsOwogIHJldHVybiBfX2NvcHlf YmFja3dhcmRfZGlzcGF0Y2g8X0JJMSwgX0JJMiwgX1RyaXZpYWw+CiAgICAgICAgICAgICAgOjpj b3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgX0JJ MSwgdHlwZW5hbWUgX0JJMj4KaW5saW5lIF9CSTIgX19jb3B5X2JhY2t3YXJkX291dHB1dF9ub3Jt YWxfaXRlcmF0b3IoX0JJMSBfX2ZpcnN0LCBfQkkxIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JJMiBfX3Jlc3VsdCwgX190cnVlX3R5 cGUpIHsKICByZXR1cm4gX0JJMihfX2NvcHlfYmFja3dhcmRfYXV4KF9fZmlyc3QsIF9fbGFzdCwg X19yZXN1bHQuYmFzZSgpKSk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBf QkkyPgppbmxpbmUgX0JJMiBfX2NvcHlfYmFja3dhcmRfb3V0cHV0X25vcm1hbF9pdGVyYXRvcihf QkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfQkkyIF9fcmVzdWx0LCBfX2ZhbHNlX3R5cGUpewogIHJldHVy biBfX2NvcHlfYmFja3dhcmRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwp9Cgp0ZW1w bGF0ZSA8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KaW5saW5lIF9CSTIgX19jb3B5X2Jh Y2t3YXJkX2lucHV0X25vcm1hbF9pdGVyYXRvcihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CSTIgX19y ZXN1bHQsIF9fdHJ1ZV90eXBlKSB7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSXNfbm9ybWFsX2l0ZXJh dG9yPF9CSTI+OjpfTm9ybWFsIF9fTm9ybWFsOwogIHJldHVybiBfX2NvcHlfYmFja3dhcmRfb3V0 cHV0X25vcm1hbF9pdGVyYXRvcihfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZXN1bHQsIF9fTm9y bWFsKCkpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KaW5saW5l IF9CSTIgX19jb3B5X2JhY2t3YXJkX2lucHV0X25vcm1hbF9pdGVyYXRvcihfQkkxIF9fZmlyc3Qs IF9CSTEgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9CSTIgX19yZXN1bHQsIF9fZmFsc2VfdHlwZSkgewogIHR5cGVkZWYgdHlwZW5hbWUg X0lzX25vcm1hbF9pdGVyYXRvcjxfQkkyPjo6X05vcm1hbCBfX05vcm1hbDsKICByZXR1cm4gX19j b3B5X2JhY2t3YXJkX291dHB1dF9ub3JtYWxfaXRlcmF0b3IoX19maXJzdCwgX19sYXN0LCBfX3Jl c3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19O b3JtYWwoKSk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgppbmxp bmUgX0JJMiBjb3B5X2JhY2t3YXJkKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19y ZXN1bHQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKCiAgdHlwZWRlZiB0eXBlbmFt ZSBfSXNfbm9ybWFsX2l0ZXJhdG9yPF9CSTE+OjpfTm9ybWFsIF9fTm9ybWFsOwogIHJldHVybiBf X2NvcHlfYmFja3dhcmRfaW5wdXRfbm9ybWFsX2l0ZXJhdG9yKF9fZmlyc3QsIF9fbGFzdCwgX19y ZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19O b3JtYWwoKSk7Cn0KCgoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwg Y2xhc3MgX091dHB1dEl0ZXI+CnBhaXI8X0lucHV0SXRlciwgX091dHB1dEl0ZXI+IF9fY29weV9u KF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykgewogIGZvciAoIDsgX19j b3VudCA+IDA7IC0tX19jb3VudCkgewogICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CiAgICArK19f Zmlyc3Q7CiAgICArK19fcmVzdWx0OwogIH0KICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyLCBfT3V0 cHV0SXRlcj4oX19maXJzdCwgX19yZXN1bHQpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JBSXRlciwg Y2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyPgppbmxpbmUgcGFpcjxfUkFJdGVyLCBfT3V0 cHV0SXRlcj4KX19jb3B5X24oX1JBSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAogICAgICAg ICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90 YWcpIHsKICBfUkFJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBfX2NvdW50OwogIHJldHVybiBwYWly PF9SQUl0ZXIsIF9PdXRwdXRJdGVyPihfX2xhc3QsIGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jl c3VsdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNz IF9PdXRwdXRJdGVyPgppbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4KX19jb3B5 X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LCBfT3V0cHV0SXRlciBfX3Jlc3Vs dCkgewogIHJldHVybiBfX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwKICAgICAg ICAgICAgICAgICAgX19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX091dHB1dEl0ZXI+CmlubGluZSBw YWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPgpjb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBf U2l6ZSBfX2NvdW50LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkKewoKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIHJl dHVybiBfX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCk7Cn0KCgoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CnZvaWQgZmlsbChfRm9yd2FyZEl0ZXIg X19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQp7CgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOwoKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3Qp CiAgICAqX19maXJzdCA9IF9fdmFsdWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlciwg Y2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KX091dHB1dEl0ZXIgZmlsbF9uKF9PdXRwdXRJdGVyIF9f Zmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlKQp7CgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoK ICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCiAgICAqX19maXJzdCA9IF9fdmFs dWU7CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCgoKaW5saW5lIHZvaWQgZmlsbCh1bnNpZ25lZCBjaGFy KiBfX2ZpcnN0LCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QsCiAgICAgICAgICAgICAgICAgY29uc3Qg dW5zaWduZWQgY2hhciYgX19jKQp7CiAgdW5zaWduZWQgY2hhciBfX3RtcCA9IF9fYzsKICBtZW1z ZXQoX19maXJzdCwgX190bXAsIF9fbGFzdCAtIF9fZmlyc3QpOwp9CgppbmxpbmUgdm9pZCBmaWxs KHNpZ25lZCBjaGFyKiBfX2ZpcnN0LCBzaWduZWQgY2hhciogX19sYXN0LAogICAgICAgICAgICAg ICAgIGNvbnN0IHNpZ25lZCBjaGFyJiBfX2MpCnsKICBzaWduZWQgY2hhciBfX3RtcCA9IF9fYzsK ICBtZW1zZXQoX19maXJzdCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX190bXApLCBfX2xh c3QgLSBfX2ZpcnN0KTsKfQoKaW5saW5lIHZvaWQgZmlsbChjaGFyKiBfX2ZpcnN0LCBjaGFyKiBf X2xhc3QsIGNvbnN0IGNoYXImIF9fYykKewogIGNoYXIgX190bXAgPSBfX2M7CiAgbWVtc2V0KF9f Zmlyc3QsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fdG1wKSwgX19sYXN0IC0gX19maXJz dCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfU2l6ZT4KaW5saW5lIHVuc2lnbmVkIGNoYXIqIGZpbGxf bih1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0LCBfU2l6ZSBfX24sCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciYgX19jKQp7CiAgZmlsbChfX2ZpcnN0LCBfX2Zp cnN0ICsgX19uLCBfX2MpOwogIHJldHVybiBfX2ZpcnN0ICsgX19uOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1NpemU+CmlubGluZSBzaWduZWQgY2hhciogZmlsbF9uKGNoYXIqIF9fZmlyc3QsIF9TaXpl IF9fbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXImIF9fYykK ewogIGZpbGwoX19maXJzdCwgX19maXJzdCArIF9fbiwgX19jKTsKICByZXR1cm4gX19maXJzdCAr IF9fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9TaXplPgppbmxpbmUgY2hhciogZmlsbF9uKGNoYXIq IF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgY2hhciYgX19jKQp7CiAgZmlsbChfX2ZpcnN0LCBf X2ZpcnN0ICsgX19uLCBfX2MpOwogIHJldHVybiBfX2ZpcnN0ICsgX19uOwp9CgoKCgoKdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KcGFpcjxfSW5wdXRJdGVy MSwgX0lucHV0SXRlcjI+IG1pc21hdGNoKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyKQp7 CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICB3aGlsZSAoX19maXJzdDEgIT0gX19s YXN0MSAmJiAqX19maXJzdDEgPT0gKl9fZmlyc3QyKSB7CiAgICArK19fZmlyc3QxOwogICAgKytf X2ZpcnN0MjsKICB9CiAgcmV0dXJuIHBhaXI8X0lucHV0SXRlcjEsIF9JbnB1dEl0ZXIyPihfX2Zp cnN0MSwgX19maXJzdDIpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9J bnB1dEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgpwYWlyPF9JbnB1dEl0ZXIxLCBfSW5w dXRJdGVyMj4gbWlzbWF0Y2goX0lucHV0SXRlcjEgX19maXJzdDEsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5 X3ByZWQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFz dDEgJiYgX19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKICAgICsrX19maXJz dDE7CiAgICArK19fZmlyc3QyOwogIH0KICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyMSwgX0lucHV0 SXRlcjI+KF9fZmlyc3QxLCBfX2ZpcnN0Mik7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVy MSwgY2xhc3MgX0lucHV0SXRlcjI+CmlubGluZSBib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmly c3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBf X2ZpcnN0MikKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKICBmb3IgKCA7IF9fZmlyc3Qx ICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCiAgICBpZiAoISgqX19maXJzdDEg PT0gKl9fZmlyc3QyKSkKICAgICAgcmV0dXJuIGZhbHNlOwogIHJldHVybiB0cnVlOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQmluYXJ5 UHJlZGljYXRlPgppbmxpbmUgYm9vbCBlcXVhbChfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0 SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9C aW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKewoKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICBm b3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCiAgICBp ZiAoIV9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKQogICAgICByZXR1cm4gZmFs c2U7CiAgcmV0dXJuIHRydWU7Cn0KCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNs YXNzIF9JbnB1dEl0ZXIyPgpib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JbnB1dEl0ZXIx IF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyKQp7CgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7CgoKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYg X19maXJzdDIgIT0gX19sYXN0MgogICAgICAgIDsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0Mikgewog ICAgaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKICAgICAgcmV0dXJuIHRydWU7CiAgICBpZiAo Kl9fZmlyc3QyIDwgKl9fZmlyc3QxKQogICAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBf X2ZpcnN0MSA9PSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Db21wYXJlPgpib29s IGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVy MSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmly c3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9D b21wYXJlIF9fY29tcCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICBmb3IgKCA7IF9fZmlyc3Qx ICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MgogICAgICAgIDsgKytfX2ZpcnN0MSwg KytfX2ZpcnN0MikgewogICAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCiAgICAg IHJldHVybiB0cnVlOwogICAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCiAgICAg IHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIF9fZmlyc3QxID09IF9fbGFzdDEgJiYgX19maXJz dDIgIT0gX19sYXN0MjsKfQoKaW5saW5lIGJvb2wKbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoY29u c3QgdW5zaWduZWQgY2hhciogX19maXJzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVu c2lnbmVkIGNoYXIqIF9fZmlyc3QyLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNp Z25lZCBjaGFyKiBfX2xhc3QyKQp7CiAgY29uc3Qgc2l6ZV90IF9fbGVuMSA9IF9fbGFzdDEgLSBf X2ZpcnN0MTsKICBjb25zdCBzaXplX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOwogIGNv bnN0IGludCBfX3Jlc3VsdCA9IG1lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsIG1pbihfX2xlbjEs IF9fbGVuMikpOwogIHJldHVybiBfX3Jlc3VsdCAhPSAwID8gX19yZXN1bHQgPCAwIDogX19sZW4x IDwgX19sZW4yOwp9CgppbmxpbmUgYm9vbCBsZXhpY29ncmFwaGljYWxfY29tcGFyZShjb25zdCBj aGFyKiBfX2ZpcnN0MSwgY29uc3QgY2hhciogX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19maXJzdDIsIGNvbnN0IGNoYXIqIF9fbGFzdDIp CnsKCiAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKChjb25zdCBzaWduZWQgY2hhciop IF9fZmlyc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc2lnbmVk IGNoYXIqKSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qg c2lnbmVkIGNoYXIqKSBfX2ZpcnN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KGNvbnN0IHNpZ25lZCBjaGFyKikgX19sYXN0Mik7CgoKCgoKCn0KCnRlbXBsYXRlIDxjbGFzcyBf SW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CmludCBfX2xleGljb2dyYXBoaWNhbF9jb21w YXJlXzN3YXkoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1 dEl0ZXIyIF9fbGFzdDIpCnsKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0 MiAhPSBfX2xhc3QyKSB7CiAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQogICAgICByZXR1 cm4gLTE7CiAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQogICAgICByZXR1cm4gMTsKICAg ICsrX19maXJzdDE7CiAgICArK19fZmlyc3QyOwogIH0KICBpZiAoX19maXJzdDIgPT0gX19sYXN0 MikgewogICAgcmV0dXJuICEoX19maXJzdDEgPT0gX19sYXN0MSk7CiAgfQogIGVsc2UgewogICAg cmV0dXJuIC0xOwogIH0KfQoKaW5saW5lIGludApfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3 YXkoY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDEsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDIsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QyKQp7CiAgY29uc3Qg cHRyZGlmZl90IF9fbGVuMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKICBjb25zdCBwdHJkaWZmX3Qg X19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOwogIGNvbnN0IGludCBfX3Jlc3VsdCA9IG1lbWNt cChfX2ZpcnN0MSwgX19maXJzdDIsIG1pbihfX2xlbjEsIF9fbGVuMikpOwogIHJldHVybiBfX3Jl c3VsdCAhPSAwID8gX19yZXN1bHQKICAgICAgICAgICAgICAgICAgICAgICA6IChfX2xlbjEgPT0g X19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xlbjIgPyAtMSA6IDEpKTsKfQoKaW5saW5lIGludApf X2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgY2hhciogX19maXJzdDEsIGNvbnN0 IGNoYXIqIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFy KiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19sYXN0MikKewoKICByZXR1cm4gX19sZXhpY29ncmFw aGljYWxfY29tcGFyZV8zd2F5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25z dCBzaWduZWQgY2hhciopIF9fZmlyc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChjb25zdCBzaWduZWQgY2hhciopIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19maXJzdDIsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19sYXN0Mik7CgoKCgoKCn0KCnRlbXBs YXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CmludCBsZXhpY29ncmFw aGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xh c3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0 MiwgX0lucHV0SXRlcjIgX19sYXN0MikKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoK CiAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2ZpcnN0MSwgX19sYXN0 MSwgX19maXJzdDIsIF9fbGFzdDIpOwp9Cgp9CiMgMjEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9iaXRzL3N0ZF9tZW1vcnkuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2FsbG9jLmgiIDEgMwojIDI4ICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxsb2MuaCIgMwojIDEgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Z1bmN0ZXhjZXB0LmgiIDEgMwojIDM0ICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9mdW5jdGV4Y2VwdC5oIiAzCiMgMSAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2V4Y2VwdGlvbl9kZWZpbmVzLmgiIDEg MwojIDM1ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9mdW5jdGV4Y2Vw dC5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewoKICB2b2lkCiAgX190aHJvd19iYWRfZXhjZXB0aW9u KHZvaWQpOwoKCiAgdm9pZAogIF9fdGhyb3dfYmFkX2FsbG9jKHZvaWQpOwoKCiAgdm9pZAogIF9f dGhyb3dfYmFkX2Nhc3Qodm9pZCk7CgogIHZvaWQKICBfX3Rocm93X2JhZF90eXBlaWQodm9pZCk7 CgoKICB2b2lkCiAgX190aHJvd19sb2dpY19lcnJvcihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lk CiAgX190aHJvd19kb21haW5fZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhy b3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19s ZW5ndGhfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfb3V0X29mX3Jh bmdlKGNvbnN0IGNoYXIqIF9fcyk7CgogIHZvaWQKICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoY29u c3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfcmFuZ2VfZXJyb3IoY29uc3QgY2hhciog X19zKTsKCiAgdm9pZAogIF9fdGhyb3dfb3ZlcmZsb3dfZXJyb3IoY29uc3QgY2hhciogX19zKTsK CiAgdm9pZAogIF9fdGhyb3dfdW5kZXJmbG93X2Vycm9yKGNvbnN0IGNoYXIqIF9fcyk7CgoKICB2 b2lkCiAgX190aHJvd19pb3NfZmFpbHVyZShjb25zdCBjaGFyKiBfX3MpOwp9CiMgMjkgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGxvYy5oIiAyIDMKIyAxICIv dXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3N0ZGRlZi5oIiAxIDMK IyAzMCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2FsbG9jLmgi IDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3Rk bGliLmgiIDEgMwojIDMxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9z dGxfYWxsb2MuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RkX2NzdHJpbmcuaCIgMSAzCiMgMzIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2cr Ky12My9iaXRzL3N0bF9hbGxvYy5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVk ZS9nKystdjMvYml0cy9zdGRfY2Fzc2VydC5oIiAxIDMKIyAzNyAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2Nhc3NlcnQuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9h c3NlcnQuaCIgMSAzCiMgMzUgIi91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMwojIDEgIi91c3IvaW5j bHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAzNiAiL3Vzci9pbmNsdWRlL2Fzc2VydC5oIiAyIDMKIyA1 OCAiL3Vzci9pbmNsdWRlL2Fzc2VydC5oIiAzCmV4dGVybiAiQyIgewoKCmV4dGVybiB2b2lkIF9f YXNzZXJ0X2ZhaWwgKF9fY29uc3QgY2hhciAqX19hc3NlcnRpb24sIF9fY29uc3QgY2hhciAqX19m aWxlLCB1bnNpZ25lZCBpbnQgX19saW5lLCBfX2NvbnN0IGNoYXIgKl9fZnVuY3Rpb24pIHRocm93 ICgpCgoKCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKCmV4dGVybiB2b2lk IF9fYXNzZXJ0X3BlcnJvcl9mYWlsIChpbnQgX19lcnJudW0sIF9fY29uc3QgY2hhciAqX19maWxl LCB1bnNpZ25lZCBpbnQgX19saW5lLCBfX2NvbnN0IGNoYXIgKl9fZnVuY3Rpb24pIHRocm93ICgp CgoKCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKfQojIDM4ICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfY2Fzc2VydC5oIiAyIDMKIyAzMyAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2FsbG9jLmgiIDIgMwoK CgoKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3RocmVh ZHMuaCIgMSAzCiMgMzMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0 bF90aHJlYWRzLmgiIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4 Ni1wYy1saW51eC1nbnUvYml0cy9ndGhyLmgiIDEgMwojIDM0ICIvdXNyL2xvY2FsL2djYy0zLjAv aW5jbHVkZS9nKystdjMvYml0cy9zdGxfdGhyZWFkcy5oIiAyIDMKIyA1MSAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3RocmVhZHMuaCIgMwpuYW1lc3BhY2Ugc3Rk CnsKIyA2NiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3RocmVh ZHMuaCIgMwpzdHJ1Y3QgX1JlZmNvdW50X0Jhc2UKewoKCgoKICB0eXBlZGVmIHNpemVfdCBfUkNf dDsKCgoKICAgdm9sYXRpbGUgX1JDX3QgX01fcmVmX2NvdW50OwoKCgoKICBfX2d0aHJlYWRfbXV0 ZXhfdCBfTV9yZWZfY291bnRfbG9jazsKICBfUmVmY291bnRfQmFzZShfUkNfdCBfX24pIDogX01f cmVmX2NvdW50KF9fbikKICAgIHsKCiAgICAgIF9fZ3RocmVhZF9tdXRleF90IF9fdG1wID0gezAs IDAsIDAsIFBUSFJFQURfTVVURVhfRkFTVF9OUCwgezAsIDB9fTsKICAgICAgX01fcmVmX2NvdW50 X2xvY2sgPSBfX3RtcDsKCgoKCgogICAgfQojIDExMiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1 ZGUvZysrLXYzL2JpdHMvc3RsX3RocmVhZHMuaCIgMwogIHZvaWQgX01faW5jcigpIHsKICAgIF9f Z3RocmVhZF9tdXRleF9sb2NrKCZfTV9yZWZfY291bnRfbG9jayk7CiAgICArK19NX3JlZl9jb3Vu dDsKICAgIF9fZ3RocmVhZF9tdXRleF91bmxvY2soJl9NX3JlZl9jb3VudF9sb2NrKTsKICB9CiAg X1JDX3QgX01fZGVjcigpIHsKICAgIF9fZ3RocmVhZF9tdXRleF9sb2NrKCZfTV9yZWZfY291bnRf bG9jayk7CiAgICB2b2xhdGlsZSBfUkNfdCBfX3RtcCA9IC0tX01fcmVmX2NvdW50OwogICAgX19n dGhyZWFkX211dGV4X3VubG9jaygmX01fcmVmX2NvdW50X2xvY2spOwogICAgcmV0dXJuIF9fdG1w OwogIH0KIyAxNjMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF90 aHJlYWRzLmgiIDMKfTsKIyAyODQgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i aXRzL3N0bF90aHJlYWRzLmgiIDMKdGVtcGxhdGUgPGludCBfX2luc3Q+CnN0cnVjdCBfU1RMX211 dGV4X3NwaW4gewogIGVudW0geyBfX2xvd19tYXggPSAzMCwgX19oaWdoX21heCA9IDEwMDAgfTsK CgogIHN0YXRpYyB1bnNpZ25lZCBfX21heDsKICBzdGF0aWMgdW5zaWduZWQgX19sYXN0Owp9OwoK dGVtcGxhdGUgPGludCBfX2luc3Q+CnVuc2lnbmVkIF9TVExfbXV0ZXhfc3BpbjxfX2luc3Q+Ojpf X21heCA9IF9TVExfbXV0ZXhfc3BpbjxfX2luc3Q+OjpfX2xvd19tYXg7Cgp0ZW1wbGF0ZSA8aW50 IF9faW5zdD4KdW5zaWduZWQgX1NUTF9tdXRleF9zcGluPF9faW5zdD46Ol9fbGFzdCA9IDA7CiMg MzExICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfdGhyZWFkcy5o IiAzCnN0cnVjdCBfU1RMX211dGV4X2xvY2sKewoKCgoKCgoKICBfX2d0aHJlYWRfbXV0ZXhfdCBf TV9sb2NrOwogIHZvaWQgX01faW5pdGlhbGl6ZSgpIHsKIyAzNDIgIi91c3IvbG9jYWwvZ2NjLTMu MC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF90aHJlYWRzLmgiIDMKICB9CiAgdm9pZCBfTV9hY3F1 aXJlX2xvY2soKSB7CgoKCiAgICBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fbG9jayk7CiAgfQog IHZvaWQgX01fcmVsZWFzZV9sb2NrKCkgewoKCgogICAgX19ndGhyZWFkX211dGV4X3VubG9jaygm X01fbG9jayk7CiAgfQojIDQ1MyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RsX3RocmVhZHMuaCIgMwp9OwojIDQ5MiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RsX3RocmVhZHMuaCIgMwpzdHJ1Y3QgX1NUTF9hdXRvX2xvY2sKewogIF9T VExfbXV0ZXhfbG9jayYgX01fbG9jazsKCiAgX1NUTF9hdXRvX2xvY2soX1NUTF9tdXRleF9sb2Nr JiBfX2xvY2spIDogX01fbG9jayhfX2xvY2spCiAgICB7IF9NX2xvY2suX01fYWNxdWlyZV9sb2Nr KCk7IH0KICB+X1NUTF9hdXRvX2xvY2soKSB7IF9NX2xvY2suX01fcmVsZWFzZV9sb2NrKCk7IH0K CnByaXZhdGU6CiAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1NUTF9hdXRvX2xvY2smKTsKICBfU1RM X2F1dG9fbG9jayhjb25zdCBfU1RMX2F1dG9fbG9jayYpOwp9OwoKfQojIDM5ICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxsb2MuaCIgMiAzCiMgNjggIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGxvYy5oIiAzCm5hbWVzcGFj ZSBzdGQKewoKCgp0ZW1wbGF0ZSA8aW50IF9faW5zdD4KY2xhc3MgX19tYWxsb2NfYWxsb2NfdGVt cGxhdGUgewoKcHJpdmF0ZToKCiAgc3RhdGljIHZvaWQqIF9TX29vbV9tYWxsb2Moc2l6ZV90KTsK ICBzdGF0aWMgdm9pZCogX1Nfb29tX3JlYWxsb2Modm9pZCosIHNpemVfdCk7CiAgc3RhdGljIHZv aWQgKCogX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXIpKCk7CgpwdWJsaWM6CgogIHN0YXRpYyB2 b2lkKiBhbGxvY2F0ZShzaXplX3QgX19uKQogIHsKICAgIHZvaWQqIF9fcmVzdWx0ID0gbWFsbG9j KF9fbik7CiAgICBpZiAoMCA9PSBfX3Jlc3VsdCkgX19yZXN1bHQgPSBfU19vb21fbWFsbG9jKF9f bik7CiAgICByZXR1cm4gX19yZXN1bHQ7CiAgfQoKICBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlKHZv aWQqIF9fcCwgc2l6ZV90ICkKICB7CiAgICBmcmVlKF9fcCk7CiAgfQoKICBzdGF0aWMgdm9pZCog cmVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCAsIHNpemVfdCBfX25ld19zeikKICB7CiAgICB2 b2lkKiBfX3Jlc3VsdCA9IHJlYWxsb2MoX19wLCBfX25ld19zeik7CiAgICBpZiAoMCA9PSBfX3Jl c3VsdCkgX19yZXN1bHQgPSBfU19vb21fcmVhbGxvYyhfX3AsIF9fbmV3X3N6KTsKICAgIHJldHVy biBfX3Jlc3VsdDsKICB9CgogIHN0YXRpYyB2b2lkICgqIF9fc2V0X21hbGxvY19oYW5kbGVyKHZv aWQgKCpfX2YpKCkpKSgpCiAgewogICAgdm9pZCAoKiBfX29sZCkoKSA9IF9fbWFsbG9jX2FsbG9j X29vbV9oYW5kbGVyOwogICAgX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXIgPSBfX2Y7CiAgICBy ZXR1cm4oX19vbGQpOwogIH0KCn07CgoKCnRlbXBsYXRlIDxpbnQgX19pbnN0Pgp2b2lkICgqIF9f bWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD46Ol9fbWFsbG9jX2FsbG9jX29vbV9oYW5kbGVy KSgpID0gMDsKCnRlbXBsYXRlIDxpbnQgX19pbnN0Pgp2b2lkKgpfX21hbGxvY19hbGxvY190ZW1w bGF0ZTxfX2luc3Q+OjpfU19vb21fbWFsbG9jKHNpemVfdCBfX24pCnsKICAgIHZvaWQgKCogX19t eV9tYWxsb2NfaGFuZGxlcikoKTsKICAgIHZvaWQqIF9fcmVzdWx0OwoKICAgIGZvciAoOzspIHsK ICAgICAgICBfX215X21hbGxvY19oYW5kbGVyID0gX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXI7 CiAgICAgICAgaWYgKDAgPT0gX19teV9tYWxsb2NfaGFuZGxlcikgeyBzdGQ6Ol9fdGhyb3dfYmFk X2FsbG9jKCk7IH0KICAgICAgICAoKl9fbXlfbWFsbG9jX2hhbmRsZXIpKCk7CiAgICAgICAgX19y ZXN1bHQgPSBtYWxsb2MoX19uKTsKICAgICAgICBpZiAoX19yZXN1bHQpIHJldHVybihfX3Jlc3Vs dCk7CiAgICB9Cn0KCnRlbXBsYXRlIDxpbnQgX19pbnN0Pgp2b2lkKiBfX21hbGxvY19hbGxvY190 ZW1wbGF0ZTxfX2luc3Q+OjpfU19vb21fcmVhbGxvYyh2b2lkKiBfX3AsIHNpemVfdCBfX24pCnsK ICAgIHZvaWQgKCogX19teV9tYWxsb2NfaGFuZGxlcikoKTsKICAgIHZvaWQqIF9fcmVzdWx0OwoK ICAgIGZvciAoOzspIHsKICAgICAgICBfX215X21hbGxvY19oYW5kbGVyID0gX19tYWxsb2NfYWxs b2Nfb29tX2hhbmRsZXI7CiAgICAgICAgaWYgKDAgPT0gX19teV9tYWxsb2NfaGFuZGxlcikgeyBz dGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7IH0KICAgICAgICAoKl9fbXlfbWFsbG9jX2hhbmRsZXIp KCk7CiAgICAgICAgX19yZXN1bHQgPSByZWFsbG9jKF9fcCwgX19uKTsKICAgICAgICBpZiAoX19y ZXN1bHQpIHJldHVybihfX3Jlc3VsdCk7CiAgICB9Cn0KCnR5cGVkZWYgX19tYWxsb2NfYWxsb2Nf dGVtcGxhdGU8MD4gbWFsbG9jX2FsbG9jOwoKdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxs b2M+CmNsYXNzIHNpbXBsZV9hbGxvYyB7CgpwdWJsaWM6CiAgICBzdGF0aWMgX1RwKiBhbGxvY2F0 ZShzaXplX3QgX19uKQogICAgICB7IHJldHVybiAwID09IF9fbiA/IDAgOiAoX1RwKikgX0FsbG9j OjphbGxvY2F0ZShfX24gKiBzaXplb2YgKF9UcCkpOyB9CiAgICBzdGF0aWMgX1RwKiBhbGxvY2F0 ZSh2b2lkKQogICAgICB7IHJldHVybiAoX1RwKikgX0FsbG9jOjphbGxvY2F0ZShzaXplb2YgKF9U cCkpOyB9CiAgICBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlKF9UcCogX19wLCBzaXplX3QgX19uKQog ICAgICB7IGlmICgwICE9IF9fbikgX0FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9m IChfVHApKTsgfQogICAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZShfVHAqIF9fcCkKICAgICAgeyBf QWxsb2M6OmRlYWxsb2NhdGUoX19wLCBzaXplb2YgKF9UcCkpOyB9Cn07CgoKCgoKCnRlbXBsYXRl IDxjbGFzcyBfQWxsb2M+CmNsYXNzIGRlYnVnX2FsbG9jIHsKCnByaXZhdGU6CgogIGVudW0ge19T X2V4dHJhID0gOH07CgoKCnB1YmxpYzoKCiAgc3RhdGljIHZvaWQqIGFsbG9jYXRlKHNpemVfdCBf X24pCiAgewogICAgY2hhciogX19yZXN1bHQgPSAoY2hhciopX0FsbG9jOjphbGxvY2F0ZShfX24g KyAoaW50KSBfU19leHRyYSk7CiAgICAqKHNpemVfdCopX19yZXN1bHQgPSBfX247CiAgICByZXR1 cm4gX19yZXN1bHQgKyAoaW50KSBfU19leHRyYTsKICB9CgogIHN0YXRpYyB2b2lkIGRlYWxsb2Nh dGUodm9pZCogX19wLCBzaXplX3QgX19uKQogIHsKICAgIGNoYXIqIF9fcmVhbF9wID0gKGNoYXIq KV9fcCAtIChpbnQpIF9TX2V4dHJhOwogICAgKCh2b2lkKSAoKCooc2l6ZV90KilfX3JlYWxfcCA9 PSBfX24pID8gMCA6IChfX2Fzc2VydF9mYWlsICgiKihzaXplX3QqKV9fcmVhbF9wID09IF9fbiIs ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxsb2MuaCIsIDE5 MCwgX19QUkVUVFlfRlVOQ1RJT05fXyksIDApKSk7CiAgICBfQWxsb2M6OmRlYWxsb2NhdGUoX19y ZWFsX3AsIF9fbiArIChpbnQpIF9TX2V4dHJhKTsKICB9CgogIHN0YXRpYyB2b2lkKiByZWFsbG9j YXRlKHZvaWQqIF9fcCwgc2l6ZV90IF9fb2xkX3N6LCBzaXplX3QgX19uZXdfc3opCiAgewogICAg Y2hhciogX19yZWFsX3AgPSAoY2hhciopX19wIC0gKGludCkgX1NfZXh0cmE7CiAgICAoKHZvaWQp ICgoKihzaXplX3QqKV9fcmVhbF9wID09IF9fb2xkX3N6KSA/IDAgOiAoX19hc3NlcnRfZmFpbCAo Iiooc2l6ZV90KilfX3JlYWxfcCA9PSBfX29sZF9zeiIsICIvdXNyL2xvY2FsL2djYy0zLjAvaW5j bHVkZS9nKystdjMvYml0cy9zdGxfYWxsb2MuaCIsIDE5NywgX19QUkVUVFlfRlVOQ1RJT05fXyks IDApKSk7CiAgICBjaGFyKiBfX3Jlc3VsdCA9IChjaGFyKikKICAgICAgX0FsbG9jOjpyZWFsbG9j YXRlKF9fcmVhbF9wLCBfX29sZF9zeiArIChpbnQpIF9TX2V4dHJhLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9fbmV3X3N6ICsgKGludCkgX1NfZXh0cmEpOwogICAgKihzaXpl X3QqKV9fcmVzdWx0ID0gX19uZXdfc3o7CiAgICByZXR1cm4gX19yZXN1bHQgKyAoaW50KSBfU19l eHRyYTsKICB9Cgp9OwojIDI0MSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RsX2FsbG9jLmgiIDMKdGVtcGxhdGUgPGJvb2wgdGhyZWFkcywgaW50IGluc3Q+CmNsYXNz IF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZSB7Cgpwcml2YXRlOgoKCiAgZW51bSB7X0FMSUdOID0g OH07CiAgZW51bSB7X01BWF9CWVRFUyA9IDEyOH07CiAgZW51bSB7X05GUkVFTElTVFMgPSAxNn07 CiAgc3RhdGljIHNpemVfdAogIF9TX3JvdW5kX3VwKHNpemVfdCBfX2J5dGVzKQogICAgeyByZXR1 cm4gKCgoX19ieXRlcykgKyAoc2l6ZV90KSBfQUxJR04tMSkgJiB+KChzaXplX3QpIF9BTElHTiAt IDEpKTsgfQoKICB1bmlvbiBfT2JqIHsKICAgICAgICB1bmlvbiBfT2JqKiBfTV9mcmVlX2xpc3Rf bGluazsKICAgICAgICBjaGFyIF9NX2NsaWVudF9kYXRhWzFdOwogIH07CgogIHN0YXRpYyBfT2Jq KiB2b2xhdGlsZSBfU19mcmVlX2xpc3RbXTsKCiAgc3RhdGljIHNpemVfdCBfU19mcmVlbGlzdF9p bmRleChzaXplX3QgX19ieXRlcykgewogICAgICAgIHJldHVybiAoKChfX2J5dGVzKSArIChzaXpl X3QpX0FMSUdOLTEpLyhzaXplX3QpX0FMSUdOIC0gMSk7CiAgfQoKCiAgc3RhdGljIHZvaWQqIF9T X3JlZmlsbChzaXplX3QgX19uKTsKCgogIHN0YXRpYyBjaGFyKiBfU19jaHVua19hbGxvYyhzaXpl X3QgX19zaXplLCBpbnQmIF9fbm9ianMpOwoKCiAgc3RhdGljIGNoYXIqIF9TX3N0YXJ0X2ZyZWU7 CiAgc3RhdGljIGNoYXIqIF9TX2VuZF9mcmVlOwogIHN0YXRpYyBzaXplX3QgX1NfaGVhcF9zaXpl OwoKCiAgICBzdGF0aWMgX1NUTF9tdXRleF9sb2NrIF9TX25vZGVfYWxsb2NhdG9yX2xvY2s7CgoK CgoKICAgIGNsYXNzIF9Mb2NrOwogICAgZnJpZW5kIGNsYXNzIF9Mb2NrOwogICAgY2xhc3MgX0xv Y2sgewogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgX0xvY2soKSB7IHsgaWYgKHRocmVhZHMp IF9TX25vZGVfYWxsb2NhdG9yX2xvY2suX01fYWNxdWlyZV9sb2NrKCk7IH07IH0KICAgICAgICAg ICAgfl9Mb2NrKCkgeyB7IGlmICh0aHJlYWRzKSBfU19ub2RlX2FsbG9jYXRvcl9sb2NrLl9NX3Jl bGVhc2VfbG9jaygpOyB9OyB9CiAgICB9OwoKcHVibGljOgoKCiAgc3RhdGljIHZvaWQqIGFsbG9j YXRlKHNpemVfdCBfX24pCiAgewogICAgdm9pZCogX19yZXQgPSAwOwoKICAgIGlmIChfX24gPiAo c2l6ZV90KSBfTUFYX0JZVEVTKSB7CiAgICAgIF9fcmV0ID0gbWFsbG9jX2FsbG9jOjphbGxvY2F0 ZShfX24pOwogICAgfQogICAgZWxzZSB7CiAgICAgIF9PYmoqIHZvbGF0aWxlKiBfX215X2ZyZWVf bGlzdAogICAgICAgICAgPSBfU19mcmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChfX24pOwoK CgoKCiAgICAgIF9Mb2NrIF9fbG9ja19pbnN0YW5jZTsKCiAgICAgIF9PYmoqIF9fcmVzdWx0ID0g Kl9fbXlfZnJlZV9saXN0OwogICAgICBpZiAoX19yZXN1bHQgPT0gMCkKICAgICAgICBfX3JldCA9 IF9TX3JlZmlsbChfU19yb3VuZF91cChfX24pKTsKICAgICAgZWxzZSB7CiAgICAgICAgKl9fbXlf ZnJlZV9saXN0ID0gX19yZXN1bHQgLT4gX01fZnJlZV9saXN0X2xpbms7CiAgICAgICAgX19yZXQg PSBfX3Jlc3VsdDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBfX3JldDsKICB9OwoKCiAgc3Rh dGljIHZvaWQgZGVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX24pCiAgewogICAgaWYgKF9f biA+IChzaXplX3QpIF9NQVhfQllURVMpCiAgICAgIG1hbGxvY19hbGxvYzo6ZGVhbGxvY2F0ZShf X3AsIF9fbik7CiAgICBlbHNlIHsKICAgICAgX09iaiogdm9sYXRpbGUqIF9fbXlfZnJlZV9saXN0 CiAgICAgICAgICA9IF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fbik7CiAgICAg IF9PYmoqIF9fcSA9IChfT2JqKilfX3A7CgoKCgogICAgICBfTG9jayBfX2xvY2tfaW5zdGFuY2U7 CgogICAgICBfX3EgLT4gX01fZnJlZV9saXN0X2xpbmsgPSAqX19teV9mcmVlX2xpc3Q7CiAgICAg ICpfX215X2ZyZWVfbGlzdCA9IF9fcTsKCiAgICB9CiAgfQoKICBzdGF0aWMgdm9pZCogcmVhbGxv Y2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX29sZF9zeiwgc2l6ZV90IF9fbmV3X3N6KTsKCn0gOwoK dHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8dHJ1ZSwgMD4gYWxsb2M7CnR5cGVkZWYg X19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPGZhbHNlLCAwPiBzaW5nbGVfY2xpZW50X2FsbG9jOwoK dGVtcGxhdGUgPGJvb2wgX190aHJlYWRzLCBpbnQgX19pbnN0PgppbmxpbmUgYm9vbCBvcGVyYXRv cj09KGNvbnN0IF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4mLAog ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3Ro cmVhZHMsIF9faW5zdD4mKQp7CiAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDxib29sIF9fdGhy ZWFkcywgaW50IF9faW5zdD4KaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2RlZmF1bHRf YWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+JiwKICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+JikKewog IHJldHVybiBmYWxzZTsKfQoKCgoKCgoKdGVtcGxhdGUgPGJvb2wgX190aHJlYWRzLCBpbnQgX19p bnN0PgpjaGFyKgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+Ojpf U19jaHVua19hbGxvYyhzaXplX3QgX19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIF9fbm9ianMpCnsKICAgIGNoYXIq IF9fcmVzdWx0OwogICAgc2l6ZV90IF9fdG90YWxfYnl0ZXMgPSBfX3NpemUgKiBfX25vYmpzOwog ICAgc2l6ZV90IF9fYnl0ZXNfbGVmdCA9IF9TX2VuZF9mcmVlIC0gX1Nfc3RhcnRfZnJlZTsKCiAg ICBpZiAoX19ieXRlc19sZWZ0ID49IF9fdG90YWxfYnl0ZXMpIHsKICAgICAgICBfX3Jlc3VsdCA9 IF9TX3N0YXJ0X2ZyZWU7CiAgICAgICAgX1Nfc3RhcnRfZnJlZSArPSBfX3RvdGFsX2J5dGVzOwog ICAgICAgIHJldHVybihfX3Jlc3VsdCk7CiAgICB9IGVsc2UgaWYgKF9fYnl0ZXNfbGVmdCA+PSBf X3NpemUpIHsKICAgICAgICBfX25vYmpzID0gKGludCkoX19ieXRlc19sZWZ0L19fc2l6ZSk7CiAg ICAgICAgX190b3RhbF9ieXRlcyA9IF9fc2l6ZSAqIF9fbm9ianM7CiAgICAgICAgX19yZXN1bHQg PSBfU19zdGFydF9mcmVlOwogICAgICAgIF9TX3N0YXJ0X2ZyZWUgKz0gX190b3RhbF9ieXRlczsK ICAgICAgICByZXR1cm4oX19yZXN1bHQpOwogICAgfSBlbHNlIHsKICAgICAgICBzaXplX3QgX19i eXRlc190b19nZXQgPQogICAgICAgICAgMiAqIF9fdG90YWxfYnl0ZXMgKyBfU19yb3VuZF91cChf U19oZWFwX3NpemUgPj4gNCk7CgogICAgICAgIGlmIChfX2J5dGVzX2xlZnQgPiAwKSB7CiAgICAg ICAgICAgIF9PYmoqIHZvbGF0aWxlKiBfX215X2ZyZWVfbGlzdCA9CiAgICAgICAgICAgICAgICAg ICAgICAgIF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fYnl0ZXNfbGVmdCk7Cgog ICAgICAgICAgICAoKF9PYmoqKV9TX3N0YXJ0X2ZyZWUpIC0+IF9NX2ZyZWVfbGlzdF9saW5rID0g Kl9fbXlfZnJlZV9saXN0OwogICAgICAgICAgICAqX19teV9mcmVlX2xpc3QgPSAoX09iaiopX1Nf c3RhcnRfZnJlZTsKICAgICAgICB9CiAgICAgICAgX1Nfc3RhcnRfZnJlZSA9IChjaGFyKiltYWxs b2MoX19ieXRlc190b19nZXQpOwogICAgICAgIGlmICgwID09IF9TX3N0YXJ0X2ZyZWUpIHsKICAg ICAgICAgICAgc2l6ZV90IF9faTsKICAgICAgICAgICAgX09iaiogdm9sYXRpbGUqIF9fbXlfZnJl ZV9saXN0OwogICAgICAgICAgICBfT2JqKiBfX3A7CgoKCiAgICAgICAgICAgIGZvciAoX19pID0g X19zaXplOwogICAgICAgICAgICAgICAgIF9faSA8PSAoc2l6ZV90KSBfTUFYX0JZVEVTOwogICAg ICAgICAgICAgICAgIF9faSArPSAoc2l6ZV90KSBfQUxJR04pIHsKICAgICAgICAgICAgICAgIF9f bXlfZnJlZV9saXN0ID0gX1NfZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19pKTsKICAg ICAgICAgICAgICAgIF9fcCA9ICpfX215X2ZyZWVfbGlzdDsKICAgICAgICAgICAgICAgIGlmICgw ICE9IF9fcCkgewogICAgICAgICAgICAgICAgICAgICpfX215X2ZyZWVfbGlzdCA9IF9fcCAtPiBf TV9mcmVlX2xpc3RfbGluazsKICAgICAgICAgICAgICAgICAgICBfU19zdGFydF9mcmVlID0gKGNo YXIqKV9fcDsKICAgICAgICAgICAgICAgICAgICBfU19lbmRfZnJlZSA9IF9TX3N0YXJ0X2ZyZWUg KyBfX2k7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKF9TX2NodW5rX2FsbG9jKF9fc2l6ZSwg X19ub2JqcykpOwoKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAg X1NfZW5kX2ZyZWUgPSAwOwogICAgICAgICAgICBfU19zdGFydF9mcmVlID0gKGNoYXIqKW1hbGxv Y19hbGxvYzo6YWxsb2NhdGUoX19ieXRlc190b19nZXQpOwoKCgogICAgICAgIH0KICAgICAgICBf U19oZWFwX3NpemUgKz0gX19ieXRlc190b19nZXQ7CiAgICAgICAgX1NfZW5kX2ZyZWUgPSBfU19z dGFydF9mcmVlICsgX19ieXRlc190b19nZXQ7CiAgICAgICAgcmV0dXJuKF9TX2NodW5rX2FsbG9j KF9fc2l6ZSwgX19ub2JqcykpOwogICAgfQp9CgoKCgoKdGVtcGxhdGUgPGJvb2wgX190aHJlYWRz LCBpbnQgX19pbnN0Pgp2b2lkKgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBf X2luc3Q+OjpfU19yZWZpbGwoc2l6ZV90IF9fbikKewogICAgaW50IF9fbm9ianMgPSAyMDsKICAg IGNoYXIqIF9fY2h1bmsgPSBfU19jaHVua19hbGxvYyhfX24sIF9fbm9ianMpOwogICAgX09iaiog dm9sYXRpbGUqIF9fbXlfZnJlZV9saXN0OwogICAgX09iaiogX19yZXN1bHQ7CiAgICBfT2JqKiBf X2N1cnJlbnRfb2JqOwogICAgX09iaiogX19uZXh0X29iajsKICAgIGludCBfX2k7CgogICAgaWYg KDEgPT0gX19ub2JqcykgcmV0dXJuKF9fY2h1bmspOwogICAgX19teV9mcmVlX2xpc3QgPSBfU19m cmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChfX24pOwoKCiAgICAgIF9fcmVzdWx0ID0gKF9P YmoqKV9fY2h1bms7CiAgICAgICpfX215X2ZyZWVfbGlzdCA9IF9fbmV4dF9vYmogPSAoX09iaiop KF9fY2h1bmsgKyBfX24pOwogICAgICBmb3IgKF9faSA9IDE7IDsgX19pKyspIHsKICAgICAgICBf X2N1cnJlbnRfb2JqID0gX19uZXh0X29iajsKICAgICAgICBfX25leHRfb2JqID0gKF9PYmoqKSgo Y2hhciopX19uZXh0X29iaiArIF9fbik7CiAgICAgICAgaWYgKF9fbm9ianMgLSAxID09IF9faSkg ewogICAgICAgICAgICBfX2N1cnJlbnRfb2JqIC0+IF9NX2ZyZWVfbGlzdF9saW5rID0gMDsKICAg ICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX19jdXJyZW50X29i aiAtPiBfTV9mcmVlX2xpc3RfbGluayA9IF9fbmV4dF9vYmo7CiAgICAgICAgfQogICAgICB9CiAg ICByZXR1cm4oX19yZXN1bHQpOwp9Cgp0ZW1wbGF0ZSA8Ym9vbCB0aHJlYWRzLCBpbnQgaW5zdD4K dm9pZCoKX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPHRocmVhZHMsIGluc3Q+OjpyZWFsbG9jYXRl KHZvaWQqIF9fcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNpemVfdCBfX29sZF9zeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25ld19zeikKewogICAgdm9pZCogX19yZXN1bHQ7 CiAgICBzaXplX3QgX19jb3B5X3N6OwoKICAgIGlmIChfX29sZF9zeiA+IChzaXplX3QpIF9NQVhf QllURVMgJiYgX19uZXdfc3ogPiAoc2l6ZV90KSBfTUFYX0JZVEVTKSB7CiAgICAgICAgcmV0dXJu KHJlYWxsb2MoX19wLCBfX25ld19zeikpOwogICAgfQogICAgaWYgKF9TX3JvdW5kX3VwKF9fb2xk X3N6KSA9PSBfU19yb3VuZF91cChfX25ld19zeikpIHJldHVybihfX3ApOwogICAgX19yZXN1bHQg PSBhbGxvY2F0ZShfX25ld19zeik7CiAgICBfX2NvcHlfc3ogPSBfX25ld19zeiA+IF9fb2xkX3N6 PyBfX29sZF9zeiA6IF9fbmV3X3N6OwogICAgbWVtY3B5KF9fcmVzdWx0LCBfX3AsIF9fY29weV9z eik7CiAgICBkZWFsbG9jYXRlKF9fcCwgX19vbGRfc3opOwogICAgcmV0dXJuKF9fcmVzdWx0KTsK fQoKCiAgICB0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+CiAgICBfU1RMX211 dGV4X2xvY2sKICAgIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46 Ol9TX25vZGVfYWxsb2NhdG9yX2xvY2sKICAgICAgICA9IHsgezAsIDAsIDAsIFBUSFJFQURfTVVU RVhfRkFTVF9OUCwgezAsIDB9fSB9OwoKCgp0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBf X2luc3Q+CmNoYXIqIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46 Ol9TX3N0YXJ0X2ZyZWUgPSAwOwoKdGVtcGxhdGUgPGJvb2wgX190aHJlYWRzLCBpbnQgX19pbnN0 PgpjaGFyKiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+OjpfU19l bmRfZnJlZSA9IDA7Cgp0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+CnNpemVf dCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+OjpfU19oZWFwX3Np emUgPSAwOwoKdGVtcGxhdGUgPGJvb2wgX190aHJlYWRzLCBpbnQgX19pbnN0Pgp0eXBlbmFtZSBf X2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+OjpfT2JqKiB2b2xhdGls ZQpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+IDo6X1NfZnJlZV9s aXN0WwogICAgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0Pjo6X05G UkVFTElTVFMKXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw LCAwLCB9OwojIDUyNiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3Rs X2FsbG9jLmgiIDMKdGVtcGxhdGUgPGNsYXNzIF9UcD4KY2xhc3MgYWxsb2NhdG9yIHsKICB0eXBl ZGVmIGFsbG9jIF9BbGxvYzsKcHVibGljOgogIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKICB0 eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqIHBvaW50ZXI7 CiAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiBfVHAmIHJlZmVy ZW5jZTsKICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgX1Rw IHZhbHVlX3R5cGU7CgogIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKICAg IHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVyOwogIH07CgogIGFsbG9jYXRvcigpIHRocm93 KCkge30KICBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yJikgdGhyb3coKSB7fQogIHRlbXBsYXRl IDxjbGFzcyBfVHAxPiBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9UcDE+JikgdGhyb3coKSB7 fQogIH5hbGxvY2F0b3IoKSB0aHJvdygpIHt9CgogIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2Ug X194KSBjb25zdCB7IHJldHVybiAmX194OyB9CiAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0 X3JlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KCgoKICBfVHAqIGFsbG9jYXRl KHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkgewogICAgcmV0dXJuIF9fbiAhPSAwID8g c3RhdGljX2Nhc3Q8X1RwKj4oX0FsbG9jOjphbGxvY2F0ZShfX24gKiBzaXplb2YoX1RwKSkpCiAg ICAgICAgICAgICAgICAgICAgOiAwOwogIH0KCgogIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9f cCwgc2l6ZV90eXBlIF9fbikKICAgIHsgX0FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6 ZW9mKF9UcCkpOyB9CgogIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkKICAgIHsg cmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQoKICB2b2lkIGNvbnN0cnVjdChwb2lu dGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgeyBuZXcoX19wKSBfVHAoX192YWwpOyB9CiAgdm9p ZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9Cn07Cgp0ZW1wbGF0ZTw+CmNs YXNzIGFsbG9jYXRvcjx2b2lkPiB7CnB1YmxpYzoKICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7 CiAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdm9pZCogcG9p bnRlcjsKICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiB2b2lk IHZhbHVlX3R5cGU7CgogIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKICAg IHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVyOwogIH07Cn07CgoKdGVtcGxhdGUgPGNsYXNz IF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxf VDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKQp7CiAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhbGxv Y2F0b3I8X1QxPiYsIGNvbnN0IGFsbG9jYXRvcjxfVDI+JikKewogIHJldHVybiBmYWxzZTsKfQoj IDYwMiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2FsbG9jLmgi IDMKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3QgX19hbGxvY2F0b3Ig ewogIF9BbGxvYyBfX3VuZGVybHlpbmdfYWxsb2M7CgogIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlw ZTsKICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqIHBv aW50ZXI7CiAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiBfVHAm IHJlZmVyZW5jZTsKICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVk ZWYgX1RwIHZhbHVlX3R5cGU7CgogIHRlbXBsYXRlIDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5k IHsKICAgIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwMSwgX0FsbG9jPiBvdGhlcjsKICB9OwoKICBf X2FsbG9jYXRvcigpIHRocm93KCkge30KICBfX2FsbG9jYXRvcihjb25zdCBfX2FsbG9jYXRvciYg X19hKSB0aHJvdygpCiAgICA6IF9fdW5kZXJseWluZ19hbGxvYyhfX2EuX191bmRlcmx5aW5nX2Fs bG9jKSB7fQogIHRlbXBsYXRlIDxjbGFzcyBfVHAxPgogIF9fYWxsb2NhdG9yKGNvbnN0IF9fYWxs b2NhdG9yPF9UcDEsIF9BbGxvYz4mIF9fYSkgdGhyb3coKQogICAgOiBfX3VuZGVybHlpbmdfYWxs b2MoX19hLl9fdW5kZXJseWluZ19hbGxvYykge30KICB+X19hbGxvY2F0b3IoKSB0aHJvdygpIHt9 CgogIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAmX194OyB9 CiAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0 dXJuICZfX3g7IH0KCgogIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCog PSAwKSB7CiAgICByZXR1cm4gX19uICE9IDAKICAgICAgICA/IHN0YXRpY19jYXN0PF9UcCo+KF9f dW5kZXJseWluZ19hbGxvYy5hbGxvY2F0ZShfX24gKiBzaXplb2YoX1RwKSkpCiAgICAgICAgOiAw OwogIH0KCgogIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikKICAg IHsgX191bmRlcmx5aW5nX2FsbG9jLmRlYWxsb2NhdGUoX19wLCBfX24gKiBzaXplb2YoX1RwKSk7 IH0KCiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgdGhyb3coKQogICAgeyByZXR1cm4gc2l6 ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CgogIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBj b25zdCBfVHAmIF9fdmFsKSB7IG5ldyhfX3ApIF9UcChfX3ZhbCk7IH0KICB2b2lkIGRlc3Ryb3ko cG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+ CmNsYXNzIF9fYWxsb2NhdG9yPHZvaWQsIF9BbGxvYz4gewogIHR5cGVkZWYgc2l6ZV90IHNpemVf dHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB2b2lk KiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9pbnRlcjsKICB0eXBlZGVm IHZvaWQgdmFsdWVfdHlwZTsKCiAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQg ewogICAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAxLCBfQWxsb2M+IG90aGVyOwogIH07Cn07Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPT0o Y29uc3QgX19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+JiBfX2ExLAogICAgICAgICAgICAgICAgICAg ICAgIGNvbnN0IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMikKewogIHJldHVybiBfX2Ex Ll9fdW5kZXJseWluZ19hbGxvYyA9PSBfX2EyLl9fdW5kZXJseWluZ19hbGxvYzsKfQoKdGVtcGxh dGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0 IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMSwKICAgICAgICAgICAgICAgICAgICAgICBj b25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYTIpCnsKICByZXR1cm4gX19hMS5fX3Vu ZGVybHlpbmdfYWxsb2MgIT0gX19hMi5fX3VuZGVybHlpbmdfYWxsb2M7Cn0KCgoKCgp0ZW1wbGF0 ZSA8aW50IGluc3Q+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX19tYWxsb2NfYWxsb2Nf dGVtcGxhdGU8aW5zdD4mLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbWFsbG9jX2Fs bG9jX3RlbXBsYXRlPGluc3Q+JikKewogIHJldHVybiB0cnVlOwp9Cgp0ZW1wbGF0ZSA8aW50IF9f aW5zdD4KaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX21hbGxvY19hbGxvY190ZW1wbGF0 ZTxfX2luc3Q+JiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX21hbGxvY19hbGxvY190 ZW1wbGF0ZTxfX2luc3Q+JikKewogIHJldHVybiBmYWxzZTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9B bGxvYz4KaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkZWJ1Z19hbGxvYzxfQWxsb2M+JiwK ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWJ1Z19hbGxvYzxfQWxsb2M+JikgewogIHJl dHVybiB0cnVlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRv ciE9KGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mLAogICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mKSB7CiAgcmV0dXJuIGZhbHNlOwp9CiMgNzMyICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxsb2MuaCIgMwp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0cwp7CiAg c3RhdGljIGNvbnN0IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gZmFsc2U7CiAgdHlwZWRlZiB0eXBl bmFtZSBfQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgYWxsb2NhdG9yX3R5 cGU7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgpjb25zdCBib29s IF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2NhdG9yPjo6X1NfaW5zdGFuY2VsZXNzOwoKCgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHAxPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIGFs bG9jYXRvcjxfVHAxPiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0 cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9jPF9UcCwgYWxsb2M+IF9BbGxvY190eXBlOwogIHR5 cGVkZWYgYWxsb2NhdG9yPF9UcD4gYWxsb2NhdG9yX3R5cGU7Cn07CgoKCnRlbXBsYXRlIDxjbGFz cyBfVHAsIGludCBfX2luc3Q+CnN0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgX19tYWxsb2NfYWxs b2NfdGVtcGxhdGU8X19pbnN0PiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxl c3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9jPF9UcCwgX19tYWxsb2NfYWxsb2NfdGVt cGxhdGU8X19pbnN0PiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwLCBf X21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4gYWxsb2NhdG9yX3R5cGU7Cn07CgoKdGVt cGxhdGUgPGNsYXNzIF9UcCwgYm9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+CnN0cnVjdCBfQWxs b2NfdHJhaXRzPF9UcCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0 PiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVk ZWYgc2ltcGxlX2FsbG9jPF9UcCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywg X19pbnN0PiA+CiAgICAgICAgICBfQWxsb2NfdHlwZTsKICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9U cCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0PiA+CiAgICAgICAg ICBhbGxvY2F0b3JfdHlwZTsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ CnN0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwgZGVidWdfYWxsb2M8X0FsbG9jPiA+CnsKICBzdGF0 aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2Fs bG9jPF9UcCwgZGVidWdfYWxsb2M8X0FsbG9jPiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19h bGxvY2F0b3I8X1RwLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4gYWxsb2NhdG9yX3R5cGU7Cn07CgoK Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVHAxLCBpbnQgX19pbnN0PgpzdHJ1Y3QgX0Fs bG9jX3RyYWl0czxfVHAsCiAgICAgICAgICAgICAgICAgICAgIF9fYWxsb2NhdG9yPF9UcDEsIF9f bWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4gPiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBf U19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9jPF9UcCwgX19tYWxs b2NfYWxsb2NfdGVtcGxhdGU8X19pbnN0PiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxv Y2F0b3I8X1RwLCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4gYWxsb2NhdG9yX3R5 cGU7Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgYm9vbCBfX3RociwgaW50 IF9faW5zdD4Kc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLAogICAgICAgICAgICAgICAgICAgICAg X19hbGxvY2F0b3I8X1RwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGVm YXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RociwgX19pbnN0PiA+ID4KewogIHN0YXRpYyBjb25zdCBi b29sIF9TX2luc3RhbmNlbGVzcyA9IHRydWU7CiAgdHlwZWRlZiBzaW1wbGVfYWxsb2M8X1RwLCBf X2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHIsX19pbnN0PiA+CiAgICAgICAgICBfQWxsb2Nf dHlwZTsKICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRl PF9fdGhyLF9faW5zdD4gPgogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7Cn07CgoKdGVtcGxhdGUg PGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0 czxfVHAsIF9fYWxsb2NhdG9yPF9UcDEsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPiA+CnsKICBzdGF0 aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2Fs bG9jPF9UcCwgZGVidWdfYWxsb2M8X0FsbG9jPiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19h bGxvY2F0b3I8X1RwLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4gYWxsb2NhdG9yX3R5cGU7Cn07Cgp9 CiMgMjIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9tZW1vcnku aCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2Nv bnN0cnVjdC5oIiAxIDMKIyAzNCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RsX2NvbnN0cnVjdC5oIiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysr LXYzL25ldyIgMSAzCiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRz L3N0bF9jb25zdHJ1Y3QuaCIgMiAzCgpuYW1lc3BhY2Ugc3RkCnsKIyA0NyAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2NvbnN0cnVjdC5oIiAzCnRlbXBsYXRlIDxj bGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5lIHZvaWQgX0NvbnN0cnVjdChfVDEqIF9fcCwgY29u c3QgX1QyJiBfX3ZhbHVlKSB7Cm5ldyAoKHZvaWQqKSBfX3ApIF9UMShfX3ZhbHVlKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9UMT4KaW5saW5lIHZvaWQgX0NvbnN0cnVjdChfVDEqIF9fcCkgewogIG5l dyAoKHZvaWQqKSBfX3ApIF9UMSgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgdm9p ZCBfRGVzdHJveShfVHAqIF9fcG9pbnRlcikgewogIF9fcG9pbnRlci0+fl9UcCgpOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4Kdm9pZApfX2Rlc3Ryb3lfYXV4KF9Gb3J3YXJk SXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9fZmFsc2VfdHlwZSkK ewogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKICAgIGRlc3Ryb3koJipf X2ZpcnN0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CmlubGluZSB2b2lk IF9fZGVzdHJveV9hdXgoX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX190cnVl X3R5cGUpIHt9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgpp bmxpbmUgdm9pZApfX2Rlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0 ZXJhdG9yIF9fbGFzdCwgX1RwKikKewogIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxf VHA+OjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yCiAgICAgICAgICBfVHJpdmlhbF9kZXN0cnVjdG9y OwogIF9fZGVzdHJveV9hdXgoX19maXJzdCwgX19sYXN0LCBfVHJpdmlhbF9kZXN0cnVjdG9yKCkp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KaW5saW5lIHZvaWQgX0Rlc3Ry b3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgewog IF9fZGVzdHJveShfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWVfdHlwZShfX2ZpcnN0KSk7Cn0KCmlu bGluZSB2b2lkIF9EZXN0cm95KGNoYXIqLCBjaGFyKikge30KaW5saW5lIHZvaWQgX0Rlc3Ryb3ko aW50KiwgaW50Kikge30KaW5saW5lIHZvaWQgX0Rlc3Ryb3kobG9uZyosIGxvbmcqKSB7fQppbmxp bmUgdm9pZCBfRGVzdHJveShmbG9hdCosIGZsb2F0Kikge30KaW5saW5lIHZvaWQgX0Rlc3Ryb3ko ZG91YmxlKiwgZG91YmxlKikge30KaW5saW5lIHZvaWQgX0Rlc3Ryb3kod2NoYXJfdCosIHdjaGFy X3QqKSB7fQoKCgoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgdm9pZCBj b25zdHJ1Y3QoX1QxKiBfX3AsIGNvbnN0IF9UMiYgX192YWx1ZSkgewogIF9Db25zdHJ1Y3QoX19w LCBfX3ZhbHVlKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMT4KaW5saW5lIHZvaWQgY29uc3RydWN0 KF9UMSogX19wKSB7CiAgX0NvbnN0cnVjdChfX3ApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpp bmxpbmUgdm9pZCBkZXN0cm95KF9UcCogX19wb2ludGVyKSB7CiAgX0Rlc3Ryb3koX19wb2ludGVy KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CmlubGluZSB2b2lkIGRlc3Ry b3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkgewog IF9EZXN0cm95KF9fZmlyc3QsIF9fbGFzdCk7Cn0KCn0KIyAyMyAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX21lbW9yeS5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oIiAxIDMK IyAyNCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX21lbW9yeS5o IiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfdGVt cGJ1Zi5oIiAxIDMKIyAzNCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv c3RsX3RlbXBidWYuaCIgMwpuYW1lc3BhY2Ugc3RkCnsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnBh aXI8X1RwKiwgcHRyZGlmZl90PgpfX2dldF90ZW1wb3JhcnlfYnVmZmVyKHB0cmRpZmZfdCBfX2xl biwgX1RwKikKewogIGlmIChfX2xlbiA+IHB0cmRpZmZfdCgyMTQ3NDgzNjQ3IC8gc2l6ZW9mKF9U cCkpKQogICAgX19sZW4gPSAyMTQ3NDgzNjQ3IC8gc2l6ZW9mKF9UcCk7CgogIHdoaWxlIChfX2xl biA+IDApIHsKICAgIF9UcCogX190bXAgPSAoX1RwKikgbWFsbG9jKChzaXplX3QpX19sZW4gKiBz aXplb2YoX1RwKSk7CiAgICBpZiAoX190bXAgIT0gMCkKICAgICAgcmV0dXJuIHBhaXI8X1RwKiwg cHRyZGlmZl90PihfX3RtcCwgX19sZW4pOwogICAgX19sZW4gLz0gMjsKICB9CgogIHJldHVybiBw YWlyPF9UcCosIHB0cmRpZmZfdD4oKF9UcCopMCwgMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+ CmlubGluZSBwYWlyPF9UcCosIHB0cmRpZmZfdD4gZ2V0X3RlbXBvcmFyeV9idWZmZXIocHRyZGlm Zl90IF9fbGVuKSB7CiAgcmV0dXJuIF9fZ2V0X3RlbXBvcmFyeV9idWZmZXIoX19sZW4sIChfVHAq KSAwKTsKfQoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgcGFpcjxfVHAqLCBwdHJk aWZmX3Q+IGdldF90ZW1wb3JhcnlfYnVmZmVyKHB0cmRpZmZfdCBfX2xlbiwgX1RwKikgewogIHJl dHVybiBfX2dldF90ZW1wb3JhcnlfYnVmZmVyKF9fbGVuLCAoX1RwKikgMCk7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfVHA+CnZvaWQgcmV0dXJuX3RlbXBvcmFyeV9idWZmZXIoX1RwKiBfX3ApIHsKICBm cmVlKF9fcCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+ CmNsYXNzIF9UZW1wb3JhcnlfYnVmZmVyIHsKcHJpdmF0ZToKICBwdHJkaWZmX3QgX01fb3JpZ2lu YWxfbGVuOwogIHB0cmRpZmZfdCBfTV9sZW47CiAgX1RwKiBfTV9idWZmZXI7CgogIHZvaWQgX01f YWxsb2NhdGVfYnVmZmVyKCkgewogICAgX01fb3JpZ2luYWxfbGVuID0gX01fbGVuOwogICAgX01f YnVmZmVyID0gMDsKCiAgICBpZiAoX01fbGVuID4gKHB0cmRpZmZfdCkoMjE0NzQ4MzY0NyAvIHNp emVvZihfVHApKSkKICAgICAgX01fbGVuID0gMjE0NzQ4MzY0NyAvIHNpemVvZihfVHApOwoKICAg IHdoaWxlIChfTV9sZW4gPiAwKSB7CiAgICAgIF9NX2J1ZmZlciA9IChfVHAqKSBtYWxsb2MoX01f bGVuICogc2l6ZW9mKF9UcCkpOwogICAgICBpZiAoX01fYnVmZmVyKQogICAgICAgIGJyZWFrOwog ICAgICBfTV9sZW4gLz0gMjsKICAgIH0KICB9CgogIHZvaWQgX01faW5pdGlhbGl6ZV9idWZmZXIo Y29uc3QgX1RwJiwgX190cnVlX3R5cGUpIHt9CiAgdm9pZCBfTV9pbml0aWFsaXplX2J1ZmZlcihj b25zdCBfVHAmIHZhbCwgX19mYWxzZV90eXBlKSB7CiAgICB1bmluaXRpYWxpemVkX2ZpbGxfbihf TV9idWZmZXIsIF9NX2xlbiwgdmFsKTsKICB9CgpwdWJsaWM6CiAgcHRyZGlmZl90IHNpemUoKSBj b25zdCB7IHJldHVybiBfTV9sZW47IH0KICBwdHJkaWZmX3QgcmVxdWVzdGVkX3NpemUoKSBjb25z dCB7IHJldHVybiBfTV9vcmlnaW5hbF9sZW47IH0KICBfVHAqIGJlZ2luKCkgeyByZXR1cm4gX01f YnVmZmVyOyB9CiAgX1RwKiBlbmQoKSB7IHJldHVybiBfTV9idWZmZXIgKyBfTV9sZW47IH0KCiAg X1RlbXBvcmFyeV9idWZmZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJh dG9yIF9fbGFzdCkgewoKICAgIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxfVHA+Ojpo YXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yCiAgICAgICAgICAgIF9Ucml2aWFsOwoKICAg IHRyeSB7CiAgICAgIF9NX2xlbiA9IDA7CiAgICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwg X01fbGVuKTsKICAgICAgX01fYWxsb2NhdGVfYnVmZmVyKCk7CiAgICAgIGlmIChfTV9sZW4gPiAw KQogICAgICAgIF9NX2luaXRpYWxpemVfYnVmZmVyKCpfX2ZpcnN0LCBfVHJpdmlhbCgpKTsKICAg IH0KICAgIGNhdGNoKC4uLikgeyBmcmVlKF9NX2J1ZmZlcik7IF9NX2J1ZmZlciA9IDA7IF9NX2xl biA9IDA7IHRocm93OyB9OwogIH0KCiAgfl9UZW1wb3JhcnlfYnVmZmVyKCkgewogICAgZGVzdHJv eShfTV9idWZmZXIsIF9NX2J1ZmZlciArIF9NX2xlbik7CiAgICBmcmVlKF9NX2J1ZmZlcik7CiAg fQoKcHJpdmF0ZToKCiAgX1RlbXBvcmFyeV9idWZmZXIoY29uc3QgX1RlbXBvcmFyeV9idWZmZXIm KSB7fQogIHZvaWQgb3BlcmF0b3I9KGNvbnN0IF9UZW1wb3JhcnlfYnVmZmVyJikge30KfTsKCgoK dGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3IsCiAgICAgICAgICBjbGFzcyBfVHAKICAg ICAgICAgICAgICAgICAgICA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJh dG9yPjo6dmFsdWVfdHlwZQogICAgICAgICA+CnN0cnVjdCB0ZW1wb3JhcnlfYnVmZmVyIDogcHVi bGljIF9UZW1wb3JhcnlfYnVmZmVyPF9Gb3J3YXJkSXRlcmF0b3IsIF9UcD4KewogIHRlbXBvcmFy eV9idWZmZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFz dCkKICAgIDogX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPihfX2ZpcnN0 LCBfX2xhc3QpIHt9CiAgfnRlbXBvcmFyeV9idWZmZXIoKSB7fQp9OwoKfQojIDI1ICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfbWVtb3J5LmgiIDIgMwojIDEgIi91 c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF91bmluaXRpYWxpemVkLmgi IDEgMwojIDM0ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfdW5p bml0aWFsaXplZC5oIiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RkX2NzdHJpbmcuaCIgMSAzCiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2cr Ky12My9iaXRzL3N0bF91bmluaXRpYWxpemVkLmgiIDIgMwoKbmFtZXNwYWNlIHN0ZAp7CgoKCgoK dGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KaW5saW5lIF9G b3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRfY29weV9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBf SW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBf X3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJ1ZV90eXBlKQp7CiAgcmV0dXJu IGNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5w dXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXI+Cl9Gb3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRf Y29weV9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAg ICAgICAgIF9fZmFsc2VfdHlwZSkKewogIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fcmVzdWx0Owog IHRyeSB7CiAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19jdXIp CiAgICAgIF9Db25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOwogICAgcmV0dXJuIF9fY3VyOwog IH0KICBjYXRjaCguLi4pIHsgX0Rlc3Ryb3koX19yZXN1bHQsIF9fY3VyKTsgdGhyb3c7IH07Cn0K Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBf VHA+CmlubGluZSBfRm9yd2FyZEl0ZXIKX191bmluaXRpYWxpemVkX2NvcHkoX0lucHV0SXRlciBf X2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJ dGVyIF9fcmVzdWx0LCBfVHAqKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9U cD46OmlzX1BPRF90eXBlIF9Jc19QT0Q7CiAgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9jb3B5X2F1 eChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfSXNfUE9EKCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVyPgppbmxpbmUgX0ZvcndhcmRJdGVyCiAg dW5pbml0aWFsaXplZF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3Qs CiAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKewogIHJldHVybiBf X3VuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoX19yZXN1bHQpKTsKfQoKaW5saW5lIGNo YXIqIHVuaW5pdGlhbGl6ZWRfY29weShjb25zdCBjaGFyKiBfX2ZpcnN0LCBjb25zdCBjaGFyKiBf X2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogX19yZXN1bHQpIHsK ICBtZW1tb3ZlKF9fcmVzdWx0LCBfX2ZpcnN0LCBfX2xhc3QgLSBfX2ZpcnN0KTsKICByZXR1cm4g X19yZXN1bHQgKyAoX19sYXN0IC0gX19maXJzdCk7Cn0KCmlubGluZSB3Y2hhcl90Kgp1bmluaXRp YWxpemVkX2NvcHkoY29uc3Qgd2NoYXJfdCogX19maXJzdCwgY29uc3Qgd2NoYXJfdCogX19sYXN0 LAogICAgICAgICAgICAgICAgICAgd2NoYXJfdCogX19yZXN1bHQpCnsKICBtZW1tb3ZlKF9fcmVz dWx0LCBfX2ZpcnN0LCBzaXplb2Yod2NoYXJfdCkgKiAoX19sYXN0IC0gX19maXJzdCkpOwogIHJl dHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0KTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3Mg X0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KcGFpcjxfSW5wdXRJ dGVyLCBfRm9yd2FyZEl0ZXI+Cl9fdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2Zp cnN0LCBfU2l6ZSBfX2NvdW50LAogICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBf X3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpCnsKICBf Rm9yd2FyZEl0ZXIgX19jdXIgPSBfX3Jlc3VsdDsKICB0cnkgewogICAgZm9yICggOyBfX2NvdW50 ID4gMCA7IC0tX19jb3VudCwgKytfX2ZpcnN0LCArK19fY3VyKQogICAgICBfQ29uc3RydWN0KCYq X19jdXIsICpfX2ZpcnN0KTsKICAgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRl cj4oX19maXJzdCwgX19jdXIpOwogIH0KICBjYXRjaCguLi4pIHsgX0Rlc3Ryb3koX19yZXN1bHQs IF9fY3VyKTsgdGhyb3c7IH07Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwg Y2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KaW5saW5lIHBhaXI8X1JhbmRvbUFjY2Vz c0l0ZXIsIF9Gb3J3YXJkSXRlcj4KX191bmluaXRpYWxpemVkX2NvcHlfbihfUmFuZG9tQWNjZXNz SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAogICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3 YXJkSXRlciBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0 ZXJhdG9yX3RhZykgewogIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBfX2Nv dW50OwogIHJldHVybiBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+KAogICAg ICAgICAgICAgICAgIF9fbGFzdCwKICAgICAgICAgICAgICAgICB1bmluaXRpYWxpemVkX2NvcHko X19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl ciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KaW5saW5lIHBhaXI8X0lucHV0SXRl ciwgX0ZvcndhcmRJdGVyPgpfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9JbnB1dEl0ZXIgX19maXJz dCwgX1NpemUgX19jb3VudCwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fcmVz dWx0KSB7CiAgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9jb3B5X24oX19maXJzdCwgX19jb3VudCwg X19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVyYXRvcl9jYXRl Z29yeShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6 ZSwgY2xhc3MgX0ZvcndhcmRJdGVyPgppbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0 ZXI+CnVuaW5pdGlhbGl6ZWRfY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3Vu dCwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KSB7CiAgcmV0dXJu IF9fdW5pbml0aWFsaXplZF9jb3B5X24oX19maXJzdCwgX19jb3VudCwgX19yZXN1bHQsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7 Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgppbmxpbmUgdm9p ZApfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJk SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwgX190 cnVlX3R5cGUpCnsKICBmaWxsKF9fZmlyc3QsIF9fbGFzdCwgX194KTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgp2b2lkCl9fdW5pbml0aWFsaXplZF9maWxsX2F1 eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBfX2ZhbHNlX3R5cGUpCnsKICBfRm9yd2FyZEl0 ZXIgX19jdXIgPSBfX2ZpcnN0OwogIHRyeSB7CiAgICBmb3IgKCA7IF9fY3VyICE9IF9fbGFzdDsg KytfX2N1cikKICAgICAgX0NvbnN0cnVjdCgmKl9fY3VyLCBfX3gpOwogIH0KICBjYXRjaCguLi4p IHsgX0Rlc3Ryb3koX19maXJzdCwgX19jdXIpOyB0aHJvdzsgfTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfVHAxPgppbmxpbmUgdm9pZCBfX3VuaW5p dGlhbGl6ZWRfZmlsbChfRm9yd2FyZEl0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3gsIF9UcDEqKQp7 CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcDE+Ojppc19QT0RfdHlwZSBfSXNf UE9EOwogIF9fdW5pbml0aWFsaXplZF9maWxsX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9feCwgX0lz X1BPRCgpKTsKCn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KaW5s aW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194KQp7CiAgX191bmluaXRpYWxpemVkX2Zp bGwoX19maXJzdCwgX19sYXN0LCBfX3gsIF9fdmFsdWVfdHlwZShfX2ZpcnN0KSk7Cn0KCgoKdGVt cGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KaW5saW5l IF9Gb3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2F1eChfRm9yd2FyZEl0ZXIgX19m aXJzdCwgX1NpemUgX19uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9f eCwgX190cnVlX3R5cGUpCnsKICByZXR1cm4gZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KX0Zv cndhcmRJdGVyCl9fdW5pbml0aWFsaXplZF9maWxsX25fYXV4KF9Gb3J3YXJkSXRlciBfX2ZpcnN0 LCBfU2l6ZSBfX24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194LCBf X2ZhbHNlX3R5cGUpCnsKICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX2ZpcnN0OwogIHRyeSB7CiAg ICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fY3VyKQogICAgICBfQ29uc3RydWN0KCYqX19j dXIsIF9feCk7CiAgICByZXR1cm4gX19jdXI7CiAgfQogIGNhdGNoKC4uLikgeyBfRGVzdHJveShf X2ZpcnN0LCBfX2N1cik7IHRocm93OyB9Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVy LCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwLCBjbGFzcyBfVHAxPgppbmxpbmUgX0ZvcndhcmRJdGVy Cl9fdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9TaXplIF9fbiwg Y29uc3QgX1RwJiBfX3gsIF9UcDEqKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRz PF9UcDE+Ojppc19QT0RfdHlwZSBfSXNfUE9EOwogIHJldHVybiBfX3VuaW5pdGlhbGl6ZWRfZmls bF9uX2F1eChfX2ZpcnN0LCBfX24sIF9feCwgX0lzX1BPRCgpKTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KaW5saW5lIF9Gb3J3YXJkSXRl cgp1bmluaXRpYWxpemVkX2ZpbGxfbihfRm9yd2FyZEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBj b25zdCBfVHAmIF9feCkKewogIHJldHVybiBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uKF9fZmlyc3Qs IF9fbiwgX194LCBfX3ZhbHVlX3R5cGUoX19maXJzdCkpOwp9CiMgMjMxICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfdW5pbml0aWFsaXplZC5oIiAzCnRlbXBsYXRl IDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Gb3J3YXJkSXRl cj4KaW5saW5lIF9Gb3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRfY29weV9jb3B5KF9JbnB1dEl0 ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAg ICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAogICAgICAgICAg ICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkKewogIF9Gb3J3YXJkSXRlciBf X21pZCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOwog IHRyeSB7CiAgICByZXR1cm4gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBf X21pZCk7CiAgfQogIGNhdGNoKC4uLikgeyBfRGVzdHJveShfX3Jlc3VsdCwgX19taWQpOyB0aHJv dzsgfTsKfQoKCgoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFz cyBfSW5wdXRJdGVyPgppbmxpbmUgX0ZvcndhcmRJdGVyCl9fdW5pbml0aWFsaXplZF9maWxsX2Nv cHkoX0ZvcndhcmRJdGVyIF9fcmVzdWx0LCBfRm9yd2FyZEl0ZXIgX19taWQsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAg X0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKewogIHVuaW5pdGlhbGl6ZWRf ZmlsbChfX3Jlc3VsdCwgX19taWQsIF9feCk7CiAgdHJ5IHsKICAgIHJldHVybiB1bmluaXRpYWxp emVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX21pZCk7CiAgfQogIGNhdGNoKC4uLikgeyBfRGVz dHJveShfX3Jlc3VsdCwgX19taWQpOyB0aHJvdzsgfTsKfQoKCgoKdGVtcGxhdGUgPGNsYXNzIF9J bnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgppbmxpbmUgdm9pZApfX3Vu aW5pdGlhbGl6ZWRfY29weV9maWxsKF9JbnB1dEl0ZXIgX19maXJzdDEsIF9JbnB1dEl0ZXIgX19s YXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJzdDIsIF9G b3J3YXJkSXRlciBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYg X194KQp7CiAgX0ZvcndhcmRJdGVyIF9fbWlkMiA9IHVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0 MSwgX19sYXN0MSwgX19maXJzdDIpOwogIHRyeSB7CiAgICB1bmluaXRpYWxpemVkX2ZpbGwoX19t aWQyLCBfX2xhc3QyLCBfX3gpOwogIH0KICBjYXRjaCguLi4pIHsgX0Rlc3Ryb3koX19maXJzdDIs IF9fbWlkMik7IHRocm93OyB9Owp9Cgp9CiMgMjYgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL3N0ZF9tZW1vcnkuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaCIgMSAzCiMgMzQgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9yYXdfc3RvcmFnZV9pdGVyLmgi IDMKbmFtZXNwYWNlIHN0ZAp7Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xh c3MgX1RwPgpjbGFzcyByYXdfc3RvcmFnZV9pdGVyYXRvciB7CnByb3RlY3RlZDoKICBfRm9yd2Fy ZEl0ZXJhdG9yIF9NX2l0ZXI7CnB1YmxpYzoKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcg aXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2 b2lkIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgcG9pbnRlcjsKICB0eXBlZGVmIHZv aWQgcmVmZXJlbmNlOwoKICBleHBsaWNpdCByYXdfc3RvcmFnZV9pdGVyYXRvcihfRm9yd2FyZEl0 ZXJhdG9yIF9feCkgOiBfTV9pdGVyKF9feCkge30KICByYXdfc3RvcmFnZV9pdGVyYXRvciYgb3Bl cmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KICByYXdfc3RvcmFnZV9pdGVyYXRvciYgb3BlcmF0 b3I9KGNvbnN0IF9UcCYgX19lbGVtZW50KSB7CiAgICBjb25zdHJ1Y3QoJipfTV9pdGVyLCBfX2Vs ZW1lbnQpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfRm9y d2FyZEl0ZXJhdG9yLCBfVHA+JiBvcGVyYXRvcisrKCkgewogICAgKytfTV9pdGVyOwogICAgcmV0 dXJuICp0aGlzOwogIH0KICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfRm9yd2FyZEl0ZXJhdG9yLCBf VHA+IG9wZXJhdG9yKysoaW50KSB7CiAgICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfRm9yd2FyZEl0 ZXJhdG9yLCBfVHA+IF9fdG1wID0gKnRoaXM7CiAgICArK19NX2l0ZXI7CiAgICByZXR1cm4gX190 bXA7CiAgfQp9OwoKCn0KIyAyNyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RkX21lbW9yeS5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewoKIHRlbXBsYXRlPGNsYXNzIF9U cDE+IHN0cnVjdCBhdXRvX3B0cl9yZWYgewogICBfVHAxKiBfTV9wdHI7CiAgIGF1dG9fcHRyX3Jl ZihfVHAxKiBfX3ApIDogX01fcHRyKF9fcCkge30KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+IGNs YXNzIGF1dG9fcHRyIHsKcHJpdmF0ZToKICBfVHAqIF9NX3B0cjsKCnB1YmxpYzoKICB0eXBlZGVm IF9UcCBlbGVtZW50X3R5cGU7CgogIGV4cGxpY2l0IGF1dG9fcHRyKF9UcCogX19wID0gMCkgdGhy b3coKSA6IF9NX3B0cihfX3ApIHt9CiAgYXV0b19wdHIoYXV0b19wdHImIF9fYSkgdGhyb3coKSA6 IF9NX3B0cihfX2EucmVsZWFzZSgpKSB7fQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gYXV0b19w dHIoYXV0b19wdHI8X1RwMT4mIF9fYSkgdGhyb3coKQogICAgOiBfTV9wdHIoX19hLnJlbGVhc2Uo KSkge30KCiAgYXV0b19wdHImIG9wZXJhdG9yPShhdXRvX3B0ciYgX19hKSB0aHJvdygpIHsKICAg IHJlc2V0KF9fYS5yZWxlYXNlKCkpOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgdGVtcGxhdGUg PGNsYXNzIF9UcDE+CiAgYXV0b19wdHImIG9wZXJhdG9yPShhdXRvX3B0cjxfVHAxPiYgX19hKSB0 aHJvdygpIHsKICAgIHJlc2V0KF9fYS5yZWxlYXNlKCkpOwogICAgcmV0dXJuICp0aGlzOwogIH0K CgoKCgogIH5hdXRvX3B0cigpIHsgZGVsZXRlIF9NX3B0cjsgfQoKICBfVHAmIG9wZXJhdG9yKigp IGNvbnN0IHRocm93KCkgewogICAgcmV0dXJuICpfTV9wdHI7CiAgfQogIF9UcCogb3BlcmF0b3It PigpIGNvbnN0IHRocm93KCkgewogICAgcmV0dXJuIF9NX3B0cjsKICB9CiAgX1RwKiBnZXQoKSBj b25zdCB0aHJvdygpIHsKICAgIHJldHVybiBfTV9wdHI7CiAgfQogIF9UcCogcmVsZWFzZSgpIHRo cm93KCkgewogICAgX1RwKiBfX3RtcCA9IF9NX3B0cjsKICAgIF9NX3B0ciA9IDA7CiAgICByZXR1 cm4gX190bXA7CiAgfQogIHZvaWQgcmVzZXQoX1RwKiBfX3AgPSAwKSB0aHJvdygpIHsKICAgIGlm IChfX3AgIT0gX01fcHRyKSB7CiAgICAgIGRlbGV0ZSBfTV9wdHI7CiAgICAgIF9NX3B0ciA9IF9f cDsKICAgIH0KICB9CgoKCgoKcHVibGljOgogIGF1dG9fcHRyKGF1dG9fcHRyX3JlZjxfVHA+IF9f cmVmKSB0aHJvdygpCiAgICA6IF9NX3B0cihfX3JlZi5fTV9wdHIpIHt9CgogIGF1dG9fcHRyJiBv cGVyYXRvcj0oYXV0b19wdHJfcmVmPF9UcD4gX19yZWYpIHRocm93KCkgewogICAgaWYgKF9fcmVm Ll9NX3B0ciAhPSB0aGlzLT5nZXQoKSkgewogICAgICBkZWxldGUgX01fcHRyOwogICAgICBfTV9w dHIgPSBfX3JlZi5fTV9wdHI7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICB0ZW1wbGF0 ZSA8Y2xhc3MgX1RwMT4gb3BlcmF0b3IgYXV0b19wdHJfcmVmPF9UcDE+KCkgdGhyb3coKQogICAg eyByZXR1cm4gYXV0b19wdHJfcmVmPF9UcD4odGhpcy0+cmVsZWFzZSgpKTsgfQogIHRlbXBsYXRl IDxjbGFzcyBfVHAxPiBvcGVyYXRvciBhdXRvX3B0cjxfVHAxPigpIHRocm93KCkKICAgIHsgcmV0 dXJuIGF1dG9fcHRyPF9UcDE+KHRoaXMtPnJlbGVhc2UoKSk7IH0KfTsKCn0KIyA0NCAiL3Vzci9s b2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3N0cmluZy5oIiAyIDMKIyAxICIv dXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy90eXBlX3RyYWl0cy5oIiAxIDMK IyA0NSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3N0cmluZy5o IiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9z ZndkLmgiIDEgMwojIDQ2ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9z dGRfc3RyaW5nLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i aXRzL2Jhc2ljX3N0cmluZy5oIiAxIDMKIyAzOCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvYmFzaWNfc3RyaW5nLmgiIDMKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvYXRvbWljaXR5LmgiIDEgMwojIDMz ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0 cy9hdG9taWNpdHkuaCIgMwp0eXBlZGVmIGludCBfQXRvbWljX3dvcmQ7CgpzdGF0aWMgaW5saW5l IF9BdG9taWNfd29yZApfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCl9fZXhjaGFuZ2VfYW5k X2FkZCAodm9sYXRpbGUgX0F0b21pY193b3JkICpfX21lbSwgaW50IF9fdmFsKQp7CiAgcmVnaXN0 ZXIgX0F0b21pY193b3JkIF9fcmVzdWx0OwogIF9fYXNtX18gX192b2xhdGlsZV9fICgibG9jazsg eGFkZGwgJTAsJTIiCiAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAoX19yZXN1bHQpCiAg ICAgICAgICAgICAgICAgICAgICAgIDogIjAiIChfX3ZhbCksICJtIiAoKl9fbWVtKQogICAgICAg ICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCnN0YXRp YyBpbmxpbmUgdm9pZApfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCl9fYXRvbWljX2FkZCAo dm9sYXRpbGUgX0F0b21pY193b3JkKiBfX21lbSwgaW50IF9fdmFsKQp7CiAgX19hc21fXyBfX3Zv bGF0aWxlX18gKCJsb2NrOyBhZGRsICUwLCUxIgogICAgICAgICAgICAgICAgICAgICAgICA6IDog ImlyIiAoX192YWwpLCAibSIgKCpfX21lbSkgOiAibWVtb3J5Iik7Cn0KCnN0YXRpYyBpbmxpbmUg Y2hhcgpfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCl9fY29tcGFyZV9hbmRfc3dhcCAodm9s YXRpbGUgbG9uZyogX19wLCBsb25nIF9fb2xkdmFsLCBsb25nIF9fbmV3dmFsKQp7CiAgY2hhciBf X3JldDsKICBsb25nIF9fcmVhZHZhbDsKCiAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsb2NrOyBj bXB4Y2hnbCAlMywgJTE7IHNldGUgJTAiCiAgICAgICAgICAgICAgICAgICAgICAgIDogIj1xIiAo X19yZXQpLCAiPW0iICgqX19wKSwgIj1hIiAoX19yZWFkdmFsKQogICAgICAgICAgICAgICAgICAg ICAgICA6ICJyIiAoX19uZXd2YWwpLCAibSIgKCpfX3ApLCAiYSIgKF9fb2xkdmFsKSk7CiAgcmV0 dXJuIF9fcmV0Owp9CiMgNDAgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRz L2Jhc2ljX3N0cmluZy5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewojIDgzICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9iYXNpY19zdHJpbmcuaCIgMwogIHRlbXBsYXRlPHR5 cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgY2xh c3MgYmFzaWNfc3RyaW5nCiAgICB7CgogICAgcHVibGljOgogICAgICB0eXBlZGVmIF9UcmFpdHMg dHJhaXRzX3R5cGU7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlIHZh bHVlX3R5cGU7CiAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOwogICAgICB0eXBl ZGVmIHR5cGVuYW1lIF9BbGxvYzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKICAgICAgdHlwZWRlZiB0 eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CiAgICAgIHR5 cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwogICAgICB0eXBlZGVm IHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKICAgICAg dHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnBvaW50ZXIgcG9pbnRlcjsKICAgICAgdHlwZWRlZiB0 eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKICAgICAgdHlwZWRl ZiBfX25vcm1hbF9pdGVyYXRvcjxwb2ludGVyLCBiYXNpY19zdHJpbmc+IGl0ZXJhdG9yOwogICAg ICB0eXBlZGVmIF9fbm9ybWFsX2l0ZXJhdG9yPGNvbnN0X3BvaW50ZXIsIGJhc2ljX3N0cmluZz4g Y29uc3RfaXRlcmF0b3I7CiAgICAgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVy YXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKICAgICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJh dG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOwoKICAgIHByaXZhdGU6CiMgMTE4ICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9iYXNpY19zdHJpbmcuaCIgMwogICAg ICBzdHJ1Y3QgX1JlcAogICAgICB7CgogICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpy ZWJpbmQ8Y2hhcj46Om90aGVyIF9SYXdfYnl0ZXNfYWxsb2M7CiMgMTM2ICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9iYXNpY19zdHJpbmcuaCIgMwogICAgICAgIHN0YXRp YyBjb25zdCBzaXplX3R5cGUgX1NfbWF4X3NpemU7CiAgICAgICAgc3RhdGljIGNvbnN0IF9DaGFy VCBfU190ZXJtaW5hbDsKCiAgICAgICAgc2l6ZV90eXBlIF9NX2xlbmd0aDsKICAgICAgICBzaXpl X3R5cGUgX01fY2FwYWNpdHk7CiAgICAgICAgX0F0b21pY193b3JkIF9NX3JlZmVyZW5jZXM7Cgog ICAgICAgIGJvb2wKICAgICAgICBfTV9pc19sZWFrZWQoKSBjb25zdAogICAgICAgIHsgcmV0dXJu IF9NX3JlZmVyZW5jZXMgPCAwOyB9CgogICAgICAgIGJvb2wKICAgICAgICBfTV9pc19zaGFyZWQo KSBjb25zdAogICAgICAgIHsgcmV0dXJuIF9NX3JlZmVyZW5jZXMgPiAwOyB9CgogICAgICAgIHZv aWQKICAgICAgICBfTV9zZXRfbGVha2VkKCkKICAgICAgICB7IF9NX3JlZmVyZW5jZXMgPSAtMTsg fQoKICAgICAgICB2b2lkCiAgICAgICAgX01fc2V0X3NoYXJhYmxlKCkKICAgICAgICB7IF9NX3Jl ZmVyZW5jZXMgPSAwOyB9CgogICAgICAgIF9DaGFyVCoKICAgICAgICBfTV9yZWZkYXRhKCkgdGhy b3coKQogICAgICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X0NoYXJUKj4gKHRoaXMgKyAx KTsgfQoKICAgICAgICBfQ2hhclQmCiAgICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19zKSB0aHJv dygpCiAgICAgICAgeyByZXR1cm4gX01fcmVmZGF0YSgpIFtfX3NdOyB9CgogICAgICAgIF9DaGFy VCoKICAgICAgICBfTV9ncmFiKGNvbnN0IF9BbGxvYyYgX19hbGxvYzEsIGNvbnN0IF9BbGxvYyYg X19hbGxvYzIpCiAgICAgICAgeyByZXR1cm4gKCFfTV9pc19sZWFrZWQoKSAmJiBfX2FsbG9jMSA9 PSBfX2FsbG9jMikgPwogICAgICAgICAgICBfTV9yZWZjb3B5KCkgOiBfTV9jbG9uZShfX2FsbG9j MSk7IH0KCgogICAgICAgIHN0YXRpYyBfUmVwKgogICAgICAgIF9TX2NyZWF0ZShzaXplX3QsIGNv bnN0IF9BbGxvYyYpOwoKICAgICAgICB2b2lkCiAgICAgICAgX01fZGlzcG9zZShjb25zdCBfQWxs b2MmIF9fYSkKICAgICAgICB7CiAgICAgICAgICBpZiAoX19leGNoYW5nZV9hbmRfYWRkKCZfTV9y ZWZlcmVuY2VzLCAtMSkgPD0gMCkKICAgICAgICAgICAgX01fZGVzdHJveShfX2EpOwogICAgICAg IH0KCiAgICAgICAgdm9pZAogICAgICAgIF9NX2Rlc3Ryb3koY29uc3QgX0FsbG9jJikgdGhyb3co KTsKCiAgICAgICAgX0NoYXJUKgogICAgICAgIF9NX3JlZmNvcHkoKSB0aHJvdygpCiAgICAgICAg ewogICAgICAgICAgX19hdG9taWNfYWRkKCZfTV9yZWZlcmVuY2VzLCAxKTsKICAgICAgICAgIHJl dHVybiBfTV9yZWZkYXRhKCk7CiAgICAgICAgfQoKICAgICAgICBfQ2hhclQqCiAgICAgICAgX01f Y2xvbmUoY29uc3QgX0FsbG9jJiwgc2l6ZV90eXBlIF9fcmVzID0gMCk7CiMgMjA4ICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9iYXNpY19zdHJpbmcuaCIgMwogICAgICAg IGlubGluZSBzdGF0aWMgYm9vbAogICAgICAgIF9TX2V4Y2Vzc19zbG9wKHNpemVfdCwgc2l6ZV90 KTsKCiAgICAgIH07CgoKICAgICAgc3RydWN0IF9BbGxvY19oaWRlciA6IF9BbGxvYwogICAgICB7 CiAgICAgICAgX0FsbG9jX2hpZGVyKF9DaGFyVCogX19kYXQsIGNvbnN0IF9BbGxvYyYgX19hKQog ICAgICAgIDogX0FsbG9jKF9fYSksIF9NX3AoX19kYXQpIHsgfQoKICAgICAgICBfQ2hhclQqIF9N X3A7CiAgICAgIH07CgogICAgcHVibGljOgoKCgogICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBl IG5wb3MgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKCiAgICBwcml2YXRlOgoKICAgICAg bXV0YWJsZSBfQWxsb2NfaGlkZXIgX01fZGF0YXBsdXM7CgoKCiAgICAgIHN0YXRpYyBzaXplX3R5 cGUgX1NfZW1wdHlfcmVwX3N0b3JhZ2VbKHNpemVvZihfUmVwKSArIHNpemVvZihfQ2hhclQpICsg c2l6ZW9mKHNpemVfdHlwZSkgLSAxKS9zaXplb2Yoc2l6ZV90eXBlKV07CgogICAgICBfQ2hhclQq CiAgICAgIF9NX2RhdGEoKSBjb25zdAogICAgICB7IHJldHVybiBfTV9kYXRhcGx1cy5fTV9wOyB9 CgogICAgICBfQ2hhclQqCiAgICAgIF9NX2RhdGEoX0NoYXJUKiBfX3ApCiAgICAgIHsgcmV0dXJu IChfTV9kYXRhcGx1cy5fTV9wID0gX19wKTsgfQoKICAgICAgX1JlcCoKICAgICAgX01fcmVwKCkg Y29uc3QKICAgICAgeyByZXR1cm4gJigocmVpbnRlcnByZXRfY2FzdDxfUmVwKj4gKF9NX2RhdGEo KSkpWy0xXSk7IH0KCgoKICAgICAgaXRlcmF0b3IKICAgICAgX01faWJlZ2luKCkgY29uc3QgeyBy ZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpKTsgfQoKICAgICAgaXRlcmF0b3IKICAgICAgX01faWVu ZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0K CiAgICAgIHZvaWQKICAgICAgX01fbGVhaygpCiAgICAgIHsKICAgICAgICBpZiAoIV9NX3JlcCgp LT5fTV9pc19sZWFrZWQoKSkKICAgICAgICAgIF9NX2xlYWtfaGFyZCgpOwogICAgICB9CgogICAg ICBpdGVyYXRvcgogICAgICBfTV9jaGVjayhzaXplX3R5cGUgX19wb3MpIGNvbnN0CiAgICAgIHsK ICAgICAgICBpZiAoX19wb3MgPiB0aGlzLT5zaXplKCkpCiAgICAgICAgICBfX3Rocm93X291dF9v Zl9yYW5nZSgiYmFzaWNfc3RyaW5nOjpfTV9jaGVjayIpOwogICAgICAgIHJldHVybiBfTV9pYmVn aW4oKSArIF9fcG9zOwogICAgICB9CgoKICAgICAgaXRlcmF0b3IKICAgICAgX01fZm9sZChzaXpl X3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX29mZikgY29uc3QKICAgICAgewogICAgICAgIGJvb2wg X190ZXN0b2ZmID0gX19vZmYgPCB0aGlzLT5zaXplKCkgLSBfX3BvczsKICAgICAgICBzaXplX3R5 cGUgX19uZXdvZmYgPSBfX3Rlc3RvZmYgPyBfX29mZiA6IHRoaXMtPnNpemUoKSAtIF9fcG9zOwog ICAgICAgIHJldHVybiAoX01faWJlZ2luKCkgKyBfX3BvcyArIF9fbmV3b2ZmKTsKICAgICAgfQoK CgogICAgICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CiAgICAgICAgc3RhdGljIHZvaWQKICAg ICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfSXRlcmF0b3IgX19rMSwgX0l0ZXJhdG9y IF9fazIpCiAgICAgICAgewogICAgICAgICAgZm9yICg7IF9fazEgIT0gX19rMjsgKytfX2sxLCAr K19fcCkKICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19wLCAqX19rMSk7CiAgICAg ICAgfQoKICAgICAgc3RhdGljIHZvaWQKICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwg aXRlcmF0b3IgX19rMSwgaXRlcmF0b3IgX19rMikKICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwg X19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQoKICAgICAgc3RhdGljIHZvaWQKICAgICAgX1Nf Y29weV9jaGFycyhfQ2hhclQqIF9fcCwgY29uc3RfaXRlcmF0b3IgX19rMSwgY29uc3RfaXRlcmF0 b3IgX19rMikKICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFz ZSgpKTsgfQoKICAgICAgc3RhdGljIHZvaWQKICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9f cCwgX0NoYXJUKiBfX2sxLCBfQ2hhclQqIF9fazIpCiAgICAgIHsgdHJhaXRzX3R5cGU6OmNvcHko X19wLCBfX2sxLCBfX2syIC0gX19rMSk7IH0KCiAgICAgIHN0YXRpYyB2b2lkCiAgICAgIF9TX2Nv cHlfY2hhcnMoX0NoYXJUKiBfX3AsIGNvbnN0IF9DaGFyVCogX19rMSwgY29uc3QgX0NoYXJUKiBf X2syKQogICAgICB7IHRyYWl0c190eXBlOjpjb3B5KF9fcCwgX19rMSwgX19rMiAtIF9fazEpOyB9 CgogICAgICB2b2lkCiAgICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBf X2xlbjEsIHNpemVfdHlwZSBfX2xlbjIpOwoKICAgICAgdm9pZAogICAgICBfTV9sZWFrX2hhcmQo KTsKCiAgICAgIHN0YXRpYyBfUmVwJgogICAgICBfU19lbXB0eV9yZXAoKQogICAgICB7IHJldHVy biAqcmVpbnRlcnByZXRfY2FzdDxfUmVwKj4oJl9TX2VtcHR5X3JlcF9zdG9yYWdlKTsgfQoKICAg IHB1YmxpYzoKCgoKCiAgICAgIGlubGluZQogICAgICBiYXNpY19zdHJpbmcoKTsKCiAgICAgIGV4 cGxpY2l0CiAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQWxsb2MmIF9fYSk7CgoKICAgICAgYmFz aWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpOwogICAgICBiYXNpY19zdHJpbmco Y29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAogICAgICAgICAgICAg ICAgICAgc2l6ZV90eXBlIF9fbiA9IG5wb3MpOwogICAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFz aWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAogICAgICAgICAgICAgICAgICAgc2l6 ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2EpOwoKICAgICAgYmFzaWNfc3RyaW5nKGNvbnN0 IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLAogICAgICAgICAgICAgICAgICAgY29uc3QgX0Fs bG9jJiBfX2EgPSBfQWxsb2MoKSk7CiAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9f cywgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSk7CiAgICAgIGJhc2ljX3N0cmluZyhzaXpl X3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKTsKCiAg ICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogICAgICAgIGJhc2ljX3N0cmluZyhf SW5wdXRJdGVyYXRvciBfX2JlZ2luLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKICAgICAgICAgICAg ICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSk7CgogICAgICB+YmFzaWNfc3Ry aW5nKCkKICAgICAgeyBfTV9yZXAoKS0+X01fZGlzcG9zZSh0aGlzLT5nZXRfYWxsb2NhdG9yKCkp OyB9CgogICAgICBiYXNpY19zdHJpbmcmCiAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJp bmcmIF9fc3RyKSB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zdHIpOyB9CgogICAgICBiYXNpY19z dHJpbmcmCiAgICAgIG9wZXJhdG9yPShjb25zdCBfQ2hhclQqIF9fcykgeyByZXR1cm4gdGhpcy0+ YXNzaWduKF9fcyk7IH0KCiAgICAgIGJhc2ljX3N0cmluZyYKICAgICAgb3BlcmF0b3I9KF9DaGFy VCBfX2MpIHsgcmV0dXJuIHRoaXMtPmFzc2lnbigxLCBfX2MpOyB9CgoKICAgICAgaXRlcmF0b3IK ICAgICAgYmVnaW4oKQogICAgICB7CiAgICAgICAgX01fbGVhaygpOwogICAgICAgIHJldHVybiBp dGVyYXRvcihfTV9kYXRhKCkpOwogICAgICB9CgogICAgICBjb25zdF9pdGVyYXRvcgogICAgICBi ZWdpbigpIGNvbnN0CiAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2RhdGEoKSk7IH0K CiAgICAgIGl0ZXJhdG9yCiAgICAgIGVuZCgpCiAgICAgIHsKICAgICAgICAgX01fbGVhaygpOwog ICAgICAgICByZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpKTsKICAgICAg fQoKICAgICAgY29uc3RfaXRlcmF0b3IKICAgICAgZW5kKCkgY29uc3QKICAgICAgeyByZXR1cm4g Y29uc3RfaXRlcmF0b3IoX01fZGF0YSgpICsgdGhpcy0+c2l6ZSgpKTsgfQoKICAgICAgcmV2ZXJz ZV9pdGVyYXRvcgogICAgICByYmVnaW4oKQogICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9y KHRoaXMtPmVuZCgpKTsgfQoKICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgogICAgICByYmVn aW4oKSBjb25zdAogICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVu ZCgpKTsgfQoKICAgICAgcmV2ZXJzZV9pdGVyYXRvcgogICAgICByZW5kKCkKICAgICAgeyByZXR1 cm4gcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQoKICAgICAgY29uc3RfcmV2ZXJz ZV9pdGVyYXRvcgogICAgICByZW5kKCkgY29uc3QKICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJz ZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQoKICAgIHB1YmxpYzoKCiAgICAgIHNpemVfdHlw ZQogICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fcmVwKCktPl9NX2xlbmd0aDsgfQoKICAg ICAgc2l6ZV90eXBlCiAgICAgIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9s ZW5ndGg7IH0KCiAgICAgIHNpemVfdHlwZQogICAgICBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJu IF9SZXA6Ol9TX21heF9zaXplOyB9CgogICAgICB2b2lkCiAgICAgIHJlc2l6ZShzaXplX3R5cGUg X19uLCBfQ2hhclQgX19jKTsKCiAgICAgIHZvaWQKICAgICAgcmVzaXplKHNpemVfdHlwZSBfX24p IHsgdGhpcy0+cmVzaXplKF9fbiwgX0NoYXJUKCkpOyB9CgogICAgICBzaXplX3R5cGUKICAgICAg Y2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBfTV9yZXAoKS0+X01fY2FwYWNpdHk7IH0KCiAgICAg IHZvaWQKICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19yZXNfYXJnID0gMCk7CgogICAgICB2b2lk CiAgICAgIGNsZWFyKCkgeyBfTV9tdXRhdGUoMCwgdGhpcy0+c2l6ZSgpLCAwKTsgfQoKICAgICAg Ym9vbAogICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPnNpemUoKSA9PSAwOyB9CgoK ICAgICAgY29uc3RfcmVmZXJlbmNlCiAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3Bvcykg Y29uc3QKICAgICAgeyByZXR1cm4gX01fZGF0YSgpW19fcG9zXTsgfQoKICAgICAgcmVmZXJlbmNl CiAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKQogICAgICB7CiAgICAgICAgX01fbGVh aygpOwogICAgICAgIHJldHVybiBfTV9kYXRhKClbX19wb3NdOwogICAgICB9CgogICAgICBjb25z dF9yZWZlcmVuY2UKICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKICAgICAgewogICAgICAg IGlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQogICAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2Uo ImJhc2ljX3N0cmluZzo6YXQiKTsKICAgICAgICByZXR1cm4gX01fZGF0YSgpW19fbl07CiAgICAg IH0KCiAgICAgIHJlZmVyZW5jZQogICAgICBhdChzaXplX3R5cGUgX19uKQogICAgICB7CiAgICAg ICAgaWYgKF9fbiA+PSBzaXplKCkpCiAgICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiYmFz aWNfc3RyaW5nOjphdCIpOwogICAgICAgIF9NX2xlYWsoKTsKICAgICAgICByZXR1cm4gX01fZGF0 YSgpW19fbl07CiAgICAgIH0KCgogICAgICBiYXNpY19zdHJpbmcmCiAgICAgIG9wZXJhdG9yKz0o Y29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgeyByZXR1cm4gdGhpcy0+YXBwZW5kKF9fc3RyKTsg fQoKICAgICAgYmFzaWNfc3RyaW5nJgogICAgICBvcGVyYXRvcis9KGNvbnN0IF9DaGFyVCogX19z KSB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19zKTsgfQoKICAgICAgYmFzaWNfc3RyaW5nJgogICAg ICBvcGVyYXRvcis9KF9DaGFyVCBfX2MpIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChzaXplX3R5cGUo MSksIF9fYyk7IH0KCiAgICAgIGJhc2ljX3N0cmluZyYKICAgICAgYXBwZW5kKGNvbnN0IGJhc2lj X3N0cmluZyYgX19zdHIpOwoKICAgICAgYmFzaWNfc3RyaW5nJgogICAgICBhcHBlbmQoY29uc3Qg YmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKTsKCiAg ICAgIGJhc2ljX3N0cmluZyYKICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5 cGUgX19uKTsKCiAgICAgIGJhc2ljX3N0cmluZyYKICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCog X19zKQogICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3Ro KF9fcykpOyB9CgogICAgICBiYXNpY19zdHJpbmcmCiAgICAgIGFwcGVuZChzaXplX3R5cGUgX19u LCBfQ2hhclQgX19jKTsKCiAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogICAg ICAgIGJhc2ljX3N0cmluZyYKICAgICAgICBhcHBlbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwg X0lucHV0SXRlcmF0b3IgX19sYXN0KQogICAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01f aWVuZCgpLCBfTV9pZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KCiAgICAgIHZvaWQKICAgICAg cHVzaF9iYWNrKF9DaGFyVCBfX2MpCiAgICAgIHsgdGhpcy0+cmVwbGFjZShfTV9pZW5kKCksIF9N X2llbmQoKSwgMSwgX19jKTsgfQoKICAgICAgYmFzaWNfc3RyaW5nJgogICAgICBhc3NpZ24oY29u c3QgYmFzaWNfc3RyaW5nJiBfX3N0cik7CgogICAgICBiYXNpY19zdHJpbmcmCiAgICAgIGFzc2ln bihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBf X24pCiAgICAgIHsKICAgICAgICByZXR1cm4gdGhpcy0+YXNzaWduKF9fc3RyLl9NX2NoZWNrKF9f cG9zKSwgX19zdHIuX01fZm9sZChfX3BvcywgX19uKSk7CiAgICAgIH0KCiAgICAgIGJhc2ljX3N0 cmluZyYKICAgICAgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQogICAg ICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zLCBfX3MgKyBfX24pOyB9CgogICAgICBiYXNpY19z dHJpbmcmCiAgICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcykKICAgICAgeyByZXR1cm4gdGhp cy0+YXNzaWduKF9fcywgX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsgfQoKICAgICAg YmFzaWNfc3RyaW5nJgogICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKICAg ICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9pYmVnaW4oKSwgX01faWVuZCgpLCBfX24sIF9f Yyk7IH0KCiAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogICAgICAgIGJhc2lj X3N0cmluZyYKICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRl cmF0b3IgX19sYXN0KQogICAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01faWJlZ2luKCks IF9NX2llbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQoKICAgICAgdm9pZAogICAgICBpbnNlcnQo aXRlcmF0b3IgX19wLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQogICAgICB7IHRoaXMtPnJl cGxhY2UoX19wLCBfX3AsIF9fbiwgX19jKTsgfQoKICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0 SXRlcmF0b3I+CiAgICAgICAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyYXRv ciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQpCiAgICAgICAgeyB0aGlzLT5yZXBsYWNlKF9f cCwgX19wLCBfX2JlZywgX19lbmQpOyB9CgogICAgICBiYXNpY19zdHJpbmcmCiAgICAgIGluc2Vy dChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQogICAgICB7CiAg ICAgICAgaXRlcmF0b3IgX19wID0gX01fY2hlY2soX19wb3MxKTsKICAgICAgICB0aGlzLT5yZXBs YWNlKF9fcCwgX19wLCBfX3N0ci5fTV9pYmVnaW4oKSwgX19zdHIuX01faWVuZCgpKTsKICAgICAg ICByZXR1cm4gKnRoaXM7CiAgICAgIH0KCiAgICAgIGJhc2ljX3N0cmluZyYKICAgICAgaW5zZXJ0 KHNpemVfdHlwZSBfX3BvczEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCiAgICAgICAgICAg ICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uKQogICAgICB7CiAgICAgICAgaXRlcmF0 b3IgX19wID0gX01fY2hlY2soX19wb3MxKTsKICAgICAgICB0aGlzLT5yZXBsYWNlKF9fcCwgX19w LCBfX3N0ci5fTV9jaGVjayhfX3BvczIpLAogICAgICAgICAgICAgICAgICAgICAgX19zdHIuX01f Zm9sZChfX3BvczIsIF9fbikpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgICAgfQoKICAgICAg YmFzaWNfc3RyaW5nJgogICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQq IF9fcywgc2l6ZV90eXBlIF9fbikKICAgICAgewogICAgICAgIGl0ZXJhdG9yIF9fcCA9IF9NX2No ZWNrKF9fcG9zKTsKICAgICAgICB0aGlzLT5yZXBsYWNlKF9fcCwgX19wLCBfX3MsIF9fcyArIF9f bik7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICB9CgogICAgICBiYXNpY19zdHJpbmcmCiAg ICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zKQogICAgICB7IHJl dHVybiB0aGlzLT5pbnNlcnQoX19wb3MsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsg fQoKICAgICAgYmFzaWNfc3RyaW5nJgogICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXpl X3R5cGUgX19uLCBfQ2hhclQgX19jKQogICAgICB7CiAgICAgICAgdGhpcy0+aW5zZXJ0KF9NX2No ZWNrKF9fcG9zKSwgX19uLCBfX2MpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgICAgfQoKICAg ICAgaXRlcmF0b3IKICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0NoYXJUIF9fYyA9IF9DaGFy VCgpKQogICAgICB7CiAgICAgICAgc2l6ZV90eXBlIF9fcG9zID0gX19wIC0gX01faWJlZ2luKCk7 CiAgICAgICAgdGhpcy0+aW5zZXJ0KF9NX2NoZWNrKF9fcG9zKSwgc2l6ZV90eXBlKDEpLCBfX2Mp OwogICAgICAgIF9NX3JlcCgpLT5fTV9zZXRfbGVha2VkKCk7CiAgICAgICAgcmV0dXJuIHRoaXMt Pl9NX2liZWdpbigpICsgX19wb3M7CiAgICAgIH0KCiAgICAgIGJhc2ljX3N0cmluZyYKICAgICAg ZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpCiAgICAgIHsK ICAgICAgICByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9jaGVjayhfX3BvcyksIF9NX2ZvbGQoX19w b3MsIF9fbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZGF0YSgpLCBfTV9kYXRh KCkpOwogICAgICB9CgogICAgICBpdGVyYXRvcgogICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0 aW9uKQogICAgICB7CiAgICAgICAgc2l6ZV90eXBlIF9faSA9IF9fcG9zaXRpb24gLSBfTV9pYmVn aW4oKTsKICAgICAgICB0aGlzLT5yZXBsYWNlKF9fcG9zaXRpb24sIF9fcG9zaXRpb24gKyAxLCBf TV9kYXRhKCksIF9NX2RhdGEoKSk7CiAgICAgICAgX01fcmVwKCktPl9NX3NldF9sZWFrZWQoKTsK ICAgICAgICByZXR1cm4gX01faWJlZ2luKCkgKyBfX2k7CiAgICAgIH0KCiAgICAgIGl0ZXJhdG9y CiAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKICAgICAgewog ICAgICAgIHNpemVfdHlwZSBfX2kgPSBfX2ZpcnN0IC0gX01faWJlZ2luKCk7CiAgICAgICAgdGhp cy0+cmVwbGFjZShfX2ZpcnN0LCBfX2xhc3QsIF9NX2RhdGEoKSwgX01fZGF0YSgpKTsKICAgICAg ICBfTV9yZXAoKS0+X01fc2V0X2xlYWtlZCgpOwogICAgICAgcmV0dXJuIF9NX2liZWdpbigpICsg X19pOwogICAgICB9CgogICAgICBiYXNpY19zdHJpbmcmCiAgICAgIHJlcGxhY2Uoc2l6ZV90eXBl IF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQogICAgICB7 CiAgICAgICAgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01fY2hlY2soX19wb3MpLCBfTV9mb2xkKF9f cG9zLCBfX24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ci5iZWdpbigpLCBf X3N0ci5lbmQoKSk7CiAgICAgIH0KCiAgICAgIGJhc2ljX3N0cmluZyYKICAgICAgcmVwbGFjZShz aXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0 ciwKICAgICAgICAgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMik7CgogICAg ICBiYXNpY19zdHJpbmcmCiAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUg X19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCiAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbjIpCiAg ICAgIHsKICAgICAgICByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9jaGVjayhfX3BvcyksIF9NX2Zv bGQoX19wb3MsIF9fbjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcywgX19zICsg X19uMik7CiAgICAgIH0KCiAgICAgIGJhc2ljX3N0cmluZyYKICAgICAgcmVwbGFjZShzaXplX3R5 cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykKICAgICAgewogICAg ICAgIHJldHVybiB0aGlzLT5yZXBsYWNlKF9NX2NoZWNrKF9fcG9zKSwgX01fZm9sZChfX3Bvcywg X19uMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLCBfX3MgKyB0cmFpdHNfdHlw ZTo6bGVuZ3RoKF9fcykpOwogICAgICB9CgogICAgICBiYXNpY19zdHJpbmcmCiAgICAgIHJlcGxh Y2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsIF9DaGFy VCBfX2MpCiAgICAgIHsKICAgICAgICByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9jaGVjayhfX3Bv cyksIF9NX2ZvbGQoX19wb3MsIF9fbjEpLCBfX24yLCBfX2MpOwogICAgICB9CgogICAgICBiYXNp Y19zdHJpbmcmCiAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29u c3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kx LCBfX2kyLCBfX3N0ci5iZWdpbigpLCBfX3N0ci5lbmQoKSk7IH0KCiAgICAgIGJhc2ljX3N0cmlu ZyYKICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAogICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKICAgICAg eyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxLCBfX2kyLCBfX3MsIF9fcyArIF9fbik7IH0KCiAg ICAgIGJhc2ljX3N0cmluZyYKICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBf X2kyLCBjb25zdCBfQ2hhclQqIF9fcykKICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kx LCBfX2kyLCBfX3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zICsgdHJhaXRzX3R5 cGU6Omxlbmd0aChfX3MpKTsgfQoKICAgICAgYmFzaWNfc3RyaW5nJgogICAgICByZXBsYWNlKGl0 ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpOwoK ICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgICAgICAgYmFzaWNfc3RyaW5n JgogICAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKICAgICAgICAg ICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fazEsIF9JbnB1dEl0ZXJhdG9yIF9fazIpCiAgICAgICAg eyByZXR1cm4gX01fcmVwbGFjZShfX2kxLCBfX2kyLCBfX2sxLCBfX2syLAogICAgICAgICAgICAg dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdv cnkoKSk7IH0KCiAgICBwcml2YXRlOgogICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRv cj4KICAgICAgICBiYXNpY19zdHJpbmcmCiAgICAgICAgX01fcmVwbGFjZShpdGVyYXRvciBfX2kx LCBpdGVyYXRvciBfX2kyLCBfSW5wdXRJdGVyYXRvciBfX2sxLAogICAgICAgICAgICAgICAgICAg X0lucHV0SXRlcmF0b3IgX19rMiwgaW5wdXRfaXRlcmF0b3JfdGFnKTsKCiAgICAgIHRlbXBsYXRl PGNsYXNzIF9Gd2RJdGVyYXRvcj4KICAgICAgICBiYXNpY19zdHJpbmcmCiAgICAgICAgX01fcmVw bGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfRndkSXRlcmF0b3IgX19rMSwKICAg ICAgICAgICAgICAgICAgIF9Gd2RJdGVyYXRvciBfX2syLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7 CgoKCiAgICAgIHRlbXBsYXRlPGNsYXNzIF9Jbkl0ZXI+CiAgICAgICAgc3RhdGljIF9DaGFyVCoK ICAgICAgICBfU19jb25zdHJ1Y3RfYXV4KF9Jbkl0ZXIgX19iZWcsIF9Jbkl0ZXIgX19lbmQsIGNv bnN0IF9BbGxvYyYgX19hLAogICAgICAgICAgICAgICAgICAgICAgICAgX19mYWxzZV90eXBlKQog ICAgICAgIHsKICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Jbkl0 ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSBfVGFnOwogICAgICAgICAgcmV0dXJuIF9TX2NvbnN0cnVj dChfX2JlZywgX19lbmQsIF9fYSwgX1RhZygpKTsKICAgICAgICB9CgogICAgICB0ZW1wbGF0ZTxj bGFzcyBfSW5JdGVyPgogICAgICAgIHN0YXRpYyBfQ2hhclQqCiAgICAgICAgX1NfY29uc3RydWN0 X2F1eChfSW5JdGVyIF9fYmVnLCBfSW5JdGVyIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSwKICAg ICAgICAgICAgICAgICAgICAgICAgIF9fdHJ1ZV90eXBlKQogICAgICAgIHsKICAgICAgICAgIHJl dHVybiBfU19jb25zdHJ1Y3Qoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2JlZyksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZhbHVlX3R5cGU+KF9fZW5kKSwgX19h KTsKICAgICAgICB9CgogICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5JdGVyPgogICAgICAgIHN0YXRp YyBfQ2hhclQqCiAgICAgICAgX1NfY29uc3RydWN0KF9Jbkl0ZXIgX19iZWcsIF9Jbkl0ZXIgX19l bmQsIGNvbnN0IF9BbGxvYyYgX19hKQogICAgICAgIHsKICAgICAgICAgIHR5cGVkZWYgdHlwZW5h bWUgX0lzX2ludGVnZXI8X0luSXRlcj46Ol9JbnRlZ3JhbCBfSW50ZWdyYWw7CiAgICAgICAgICBy ZXR1cm4gX1NfY29uc3RydWN0X2F1eChfX2JlZywgX19lbmQsIF9fYSwgX0ludGVncmFsKCkpOwog ICAgICAgIH0KCgogICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5JdGVyPgogICAgICAgIHN0YXRpYyBf Q2hhclQqCiAgICAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyIF9fYmVnLCBfSW5JdGVyIF9fZW5k LCBjb25zdCBfQWxsb2MmIF9fYSwKICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9y X3RhZyk7CgoKCiAgICAgIHRlbXBsYXRlPGNsYXNzIF9Gd2RJdGVyPgogICAgICAgIHN0YXRpYyBf Q2hhclQqCiAgICAgICAgX1NfY29uc3RydWN0KF9Gd2RJdGVyIF9fZW5kLCBfRndkSXRlciBfX2Jl ZywgY29uc3QgX0FsbG9jJiBfX2EsCiAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0 b3JfdGFnKTsKCiAgICAgIHN0YXRpYyBfQ2hhclQqCiAgICAgIF9TX2NvbnN0cnVjdChzaXplX3R5 cGUgX19yZXEsIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKTsKCiAgICBwdWJsaWM6Cgog ICAgICBzaXplX3R5cGUKICAgICAgY29weShfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgc2l6 ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CgogICAgICB2b2lkCiAgICAgIHN3YXAoYmFzaWNfc3Ry aW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zKTsKCgogICAgICBjb25zdCBfQ2hhclQq CiAgICAgIGNfc3RyKCkgY29uc3QKICAgICAgewoKICAgICAgICBzaXplX3R5cGUgX19uID0gdGhp cy0+c2l6ZSgpOwogICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oX01fZGF0YSgpW19fbl0sIF9S ZXA6Ol9TX3Rlcm1pbmFsKTsKICAgICAgICByZXR1cm4gX01fZGF0YSgpOwogICAgICB9CgogICAg ICBjb25zdCBfQ2hhclQqCiAgICAgIGRhdGEoKSBjb25zdCB7IHJldHVybiBfTV9kYXRhKCk7IH0K CiAgICAgIGFsbG9jYXRvcl90eXBlCiAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVy biBfTV9kYXRhcGx1czsgfQoKICAgICAgc2l6ZV90eXBlCiAgICAgIGZpbmQoY29uc3QgX0NoYXJU KiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CgogICAgICBzaXpl X3R5cGUKICAgICAgZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19w b3MgPSAwKSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5maW5kKF9fc3RyLmRhdGEoKSwgX19w b3MsIF9fc3RyLnNpemUoKSk7IH0KCiAgICAgIHNpemVfdHlwZQogICAgICBmaW5kKGNvbnN0IF9D aGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAogICAgICB7IHJldHVybiB0aGlz LT5maW5kKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7IH0KCiAgICAgIHNp emVfdHlwZQogICAgICBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0 OwoKICAgICAgc2l6ZV90eXBlCiAgICAgIHJmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIs IHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CiAgICAgIHsgcmV0dXJuIHRoaXMtPnJmaW5k KF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KCiAgICAgIHNpemVfdHlwZQog ICAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUg X19uKSBjb25zdDsKCiAgICAgIHNpemVfdHlwZQogICAgICByZmluZChjb25zdCBfQ2hhclQqIF9f cywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+cmZp bmQoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsgfQoKICAgICAgc2l6ZV90 eXBlCiAgICAgIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0 OwoKICAgICAgc2l6ZV90eXBlCiAgICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5n JiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ ZmluZF9maXJzdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CgogICAg ICBzaXplX3R5cGUKICAgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90 eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKCiAgICAgIHNpemVfdHlwZQogICAgICBm aW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25z dAogICAgICB7IHJldHVybiB0aGlzLT5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIHRyYWl0c190 eXBlOjpsZW5ndGgoX19zKSk7IH0KCiAgICAgIHNpemVfdHlwZQogICAgICBmaW5kX2ZpcnN0X29m KF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CiAgICAgIHsgcmV0dXJuIHRo aXMtPmZpbmQoX19jLCBfX3Bvcyk7IH0KCiAgICAgIHNpemVfdHlwZQogICAgICBmaW5kX2xhc3Rf b2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29u c3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X29mKF9fc3RyLmRhdGEoKSwgX19wb3Ms IF9fc3RyLnNpemUoKSk7IH0KCiAgICAgIHNpemVfdHlwZQogICAgICBmaW5kX2xhc3Rfb2YoY29u c3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7Cgog ICAgICBzaXplX3R5cGUKICAgICAgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXpl X3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5maW5kX2xhc3Rf b2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsgfQoKICAgICAgc2l6ZV90 eXBlCiAgICAgIGZpbmRfbGFzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9z KSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5yZmluZChfX2MsIF9fcG9zKTsgfQoKICAgICAg c2l6ZV90eXBlCiAgICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19z dHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CiAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRf Zmlyc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KCiAgICAg IHNpemVfdHlwZQogICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6 ZV90eXBlIF9fcG9zLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKSBjb25z dDsKCiAgICAgIHNpemVfdHlwZQogICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQq IF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+Zmlu ZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsgfQoK ICAgICAgc2l6ZV90eXBlCiAgICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVf dHlwZSBfX3BvcyA9IDApIGNvbnN0OwoKICAgICAgc2l6ZV90eXBlCiAgICAgIGZpbmRfbGFzdF9u b3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykg Y29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X25vdF9vZihfX3N0ci5kYXRhKCks IF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CgogICAgICBzaXplX3R5cGUKICAgICAgZmluZF9sYXN0 X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAogICAgICAgICAgICAg ICAgICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0OwogICAgICBzaXplX3R5cGUKICAgICAgZmlu ZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykg Y29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X25vdF9vZihfX3MsIF9fcG9zLCB0 cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOyB9CgogICAgICBzaXplX3R5cGUKICAgICAgZmluZF9s YXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdDsKCiAg ICAgIGJhc2ljX3N0cmluZwogICAgICBzdWJzdHIoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90 eXBlIF9fbiA9IG5wb3MpIGNvbnN0CiAgICAgIHsKICAgICAgICBpZiAoX19wb3MgPiB0aGlzLT5z aXplKCkpCiAgICAgICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgiYmFzaWNfc3RyaW5nOjpzdWJz dHIiKTsKICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nKCp0aGlzLCBfX3BvcywgX19uKTsKICAg ICAgfQoKICAgICAgaW50CiAgICAgIGNvbXBhcmUoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikg Y29uc3QKICAgICAgewogICAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CiAg ICAgICAgc2l6ZV90eXBlIF9fb3NpemUgPSBfX3N0ci5zaXplKCk7CiAgICAgICAgc2l6ZV90eXBl IF9fbGVuID0gbWluKF9fc2l6ZSwgX19vc2l6ZSk7CgogICAgICAgIGludCBfX3IgPSB0cmFpdHNf dHlwZTo6Y29tcGFyZShfTV9kYXRhKCksIF9fc3RyLmRhdGEoKSwgX19sZW4pOwogICAgICAgIGlm ICghX19yKQogICAgICAgICAgX19yID0gX19zaXplIC0gX19vc2l6ZTsKICAgICAgICByZXR1cm4g X19yOwogICAgICB9CgogICAgICBpbnQKICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNp emVfdHlwZSBfX24sIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0OwoKICAgICAgaW50 CiAgICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJh c2ljX3N0cmluZyYgX19zdHIsCiAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90 eXBlIF9fbjIpIGNvbnN0OwoKICAgICAgaW50CiAgICAgIGNvbXBhcmUoY29uc3QgX0NoYXJUKiBf X3MpIGNvbnN0OwoKCgogICAgICBpbnQKICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNp emVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3Q7CgogICAgICBpbnQKICAgICAg Y29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9f cywKICAgICAgICAgICAgICBzaXplX3R5cGUgX19uMikgY29uc3Q7CgogIH07CgoKICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAg IGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKICAgIGJhc2lj X3N0cmluZygpCiAgICA6IF9NX2RhdGFwbHVzKF9TX2VtcHR5X3JlcCgpLl9NX3JlZmNvcHkoKSwg X0FsbG9jKCkpIHsgfQoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJh aXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBf QWxsb2M+CiAgICBvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywg X0FsbG9jPiYgX19saHMsCiAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwg X1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCiAgICB7CiAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQs IF9UcmFpdHMsIF9BbGxvYz4gX19zdHIoX19saHMpOwogICAgICBfX3N0ci5hcHBlbmQoX19yaHMp OwogICAgICByZXR1cm4gX19zdHI7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwg dHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNfc3RyaW5nPF9DaGFy VCxfVHJhaXRzLF9BbGxvYz4KICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAogICAg ICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3Jo cyk7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5h bWUgX0FsbG9jPgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4KICAgIG9w ZXJhdG9yKyhfQ2hhclQgX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxf QWxsb2M+JiBfX3Jocyk7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1Ry YWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9U cmFpdHMsIF9BbGxvYz4KICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBf VHJhaXRzLCBfQWxsb2M+JiBfX2xocywKICAgICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMp CiAgICB7CiAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19zdHIo X19saHMpOwogICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOwogICAgICByZXR1cm4gX19zdHI7CiAg ICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5h bWUgX0FsbG9jPgogICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxv Yz4KICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxs b2M+JiBfX2xocywgX0NoYXJUIF9fcmhzKQogICAgewogICAgICB0eXBlZGVmIGJhc2ljX3N0cmlu ZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19zdHJpbmdfdHlwZTsKICAgICAgdHlwZWRlZiB0 eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUgX19zaXplX3R5cGU7CiAgICAgIF9fc3Ry aW5nX3R5cGUgX19zdHIoX19saHMpOwogICAgICBfX3N0ci5hcHBlbmQoX19zaXplX3R5cGUoMSks IF9fcmhzKTsKICAgICAgcmV0dXJuIF9fc3RyOwogICAgfQoKCiAgdGVtcGxhdGU8dHlwZW5hbWUg X0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbmxpbmUgYm9v bAogICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxs b2M+JiBfX2xocywKICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1Ry YWl0cywgX0FsbG9jPiYgX19yaHMpCiAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9 PSAwOyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlw ZW5hbWUgX0FsbG9jPgogICAgaW5saW5lIGJvb2wKICAgIG9wZXJhdG9yPT0oY29uc3QgX0NoYXJU KiBfX2xocywKICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0 cywgX0FsbG9jPiYgX19yaHMpCiAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA9PSAw OyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5h bWUgX0FsbG9jPgogICAgaW5saW5lIGJvb2wKICAgIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3Ry aW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCiAgICAgICAgICAgICAgIGNvbnN0 IF9DaGFyVCogX19yaHMpCiAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9 CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1l IF9BbGxvYz4KICAgIGlubGluZSBib29sCiAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmlu ZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAogICAgICAgICAgICAgICBjb25zdCBi YXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKICAgIHsgcmV0dXJu IF9fcmhzLmNvbXBhcmUoX19saHMpICE9IDA7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJU LCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbmxpbmUgYm9vbAogICAg b3BlcmF0b3IhPShjb25zdCBfQ2hhclQqIF9fbGhzLAogICAgICAgICAgICAgICBjb25zdCBiYXNp Y19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKICAgIHsgcmV0dXJuIF9f cmhzLmNvbXBhcmUoX19saHMpICE9IDA7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0 eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbmxpbmUgYm9vbAogICAgb3Bl cmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xo cywKICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKICAgIHsgcmV0dXJuIF9fbGhz LmNvbXBhcmUoX19yaHMpICE9IDA7IH0KCgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlw ZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgaW5saW5lIGJvb2wKICAgIG9wZXJh dG9yPChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywK ICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ JiBfX3JocykKICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDwgMDsgfQoKICB0ZW1w bGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4K ICAgIGlubGluZSBib29sCiAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwg X1RyYWl0cywgX0FsbG9jPiYgX19saHMsCiAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3Jo cykKICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDwgMDsgfQoKICB0ZW1wbGF0ZTx0 eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGlu bGluZSBib29sCiAgICBvcGVyYXRvcjwoY29uc3QgX0NoYXJUKiBfX2xocywKICAgICAgICAgICAg ICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKICAg IHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID4gMDsgfQoKCiAgdGVtcGxhdGU8dHlwZW5h bWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbmxpbmUg Ym9vbAogICAgb3BlcmF0b3I+KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9B bGxvYz4mIF9fbGhzLAogICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9U cmFpdHMsIF9BbGxvYz4mIF9fcmhzKQogICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3Jocykg PiAwOyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlw ZW5hbWUgX0FsbG9jPgogICAgaW5saW5lIGJvb2wKICAgIG9wZXJhdG9yPihjb25zdCBiYXNpY19z dHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKICAgICAgICAgICAgICBjb25z dCBfQ2hhclQqIF9fcmhzKQogICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9 CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUg X0FsbG9jPgogICAgaW5saW5lIGJvb2wKICAgIG9wZXJhdG9yPihjb25zdCBfQ2hhclQqIF9fbGhz LAogICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxv Yz4mIF9fcmhzKQogICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPCAwOyB9CgoKICB0 ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxv Yz4KICAgIGlubGluZSBib29sCiAgICBvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hh clQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAogICAgICAgICAgICAgICBjb25zdCBiYXNpY19z dHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKICAgIHsgcmV0dXJuIF9fbGhz LmNvbXBhcmUoX19yaHMpIDw9IDA7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBl bmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbmxpbmUgYm9vbAogICAgb3BlcmF0 b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywK ICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKICAgIHsgcmV0dXJuIF9fbGhzLmNv bXBhcmUoX19yaHMpIDw9IDA7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFt ZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbmxpbmUgYm9vbAogICAgb3BlcmF0b3I8 PShjb25zdCBfQ2hhclQqIF9fbGhzLAogICAgICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8 X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKICB7IHJldHVybiBfX3Jocy5jb21wYXJl KF9fbGhzKSA+PSAwOyB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9U cmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGlubGluZSBib29sCiAgICBvcGVyYXRvcj49KGNv bnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAogICAgICAg ICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3Jo cykKICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KCiAgdGVtcGxhdGU8 dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBp bmxpbmUgYm9vbAogICAgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJh aXRzLCBfQWxsb2M+JiBfX2xocywKICAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykK ICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KCiAgdGVtcGxhdGU8dHlw ZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbmxp bmUgYm9vbAogICAgb3BlcmF0b3I+PShjb25zdCBfQ2hhclQqIF9fbGhzLAogICAgICAgICAgICAg Y29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCiAgICB7 IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA8PSAwOyB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGlubGluZSB2 b2lkCiAgICBzd2FwKGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhz LAogICAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykK ICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0 eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNpY19pc3RyZWFtPF9DaGFy VCwgX1RyYWl0cz4mCiAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRz PiYgX19pcywKICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0Fs bG9jPiYgX19zdHIpOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFp dHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYK ICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAogICAg ICAgICAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBf X3N0cik7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlw ZW5hbWUgX0FsbG9jPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4mCiAgICBnZXRs aW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKICAgICAgICAgICAgYmFz aWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIsIF9DaGFyVCBfX2RlbGlt KTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFt ZSBfQWxsb2M+CiAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4mCiAgICBn ZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKICAgICAgICAgICAg YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIpOwp9CiMgNDcgIi91 c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9zdHJpbmcuaCIgMiAzCgoK IyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfYWxnb3JpdGht LmgiIDEgMwojIDMxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRf YWxnb3JpdGhtLmgiIDMKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RsX2FsZ29iYXNlLmgiIDEgMwojIDMzICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9zdGRfYWxnb3JpdGhtLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0bF9jb25zdHJ1Y3QuaCIgMSAzCiMgMzQgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9hbGdvcml0aG0uaCIgMiAzCiMgMSAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaCIg MSAzCiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9hbGdv cml0aG0uaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv c3RsX3RlbXBidWYuaCIgMSAzCiMgMzYgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12 My9iaXRzL3N0ZF9hbGdvcml0aG0uaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1 ZGUvZysrLXYzL2JpdHMvc3RsX2FsZ28uaCIgMSAzCiMgMzQgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0bF9hbGdvLmgiIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAv aW5jbHVkZS9nKystdjMvYml0cy9zdGxfaGVhcC5oIiAxIDMKIyAzMyAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2hlYXAuaCIgMwpuYW1lc3BhY2Ugc3RkCnsKCgoK dGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLCBj bGFzcyBfVHA+CnZvaWQKX19wdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3Qs CiAgICAgICAgICAgIF9EaXN0YW5jZSBfX2hvbGVJbmRleCwgX0Rpc3RhbmNlIF9fdG9wSW5kZXgs IF9UcCBfX3ZhbHVlKQp7CiAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gKF9faG9sZUluZGV4IC0gMSkg LyAyOwogIHdoaWxlIChfX2hvbGVJbmRleCA+IF9fdG9wSW5kZXggJiYgKihfX2ZpcnN0ICsgX19w YXJlbnQpIDwgX192YWx1ZSkgewogICAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gKihfX2Zp cnN0ICsgX19wYXJlbnQpOwogICAgX19ob2xlSW5kZXggPSBfX3BhcmVudDsKICAgIF9fcGFyZW50 ID0gKF9faG9sZUluZGV4IC0gMSkgLyAyOwogIH0KICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkg PSBfX3ZhbHVlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFz cyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KaW5saW5lIHZvaWQKX19wdXNoX2hlYXBfYXV4KF9SYW5k b21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAogICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0 ZXJhdG9yIF9fbGFzdCwgX0Rpc3RhbmNlKiwgX1RwKikKewogIF9fcHVzaF9oZWFwKF9fZmlyc3Qs IF9EaXN0YW5jZSgoX19sYXN0IC0gX19maXJzdCkgLSAxKSwgX0Rpc3RhbmNlKDApLAogICAgICAg ICAgICAgIF9UcCgqKF9fbGFzdCAtIDEpKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNj ZXNzSXRlcmF0b3I+CmlubGluZSB2b2lkCnB1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3Ig X19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKewoKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIF9fcHVzaF9oZWFwX2F1eChfX2Zp cnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZShfX2ZpcnN0KSwg X192YWx1ZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJ dGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHAsCiAgICAgICAgICBjbGFzcyBfQ29t cGFyZT4Kdm9pZApfX3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rp c3RhbmNlIF9faG9sZUluZGV4LAogICAgICAgICAgICBfRGlzdGFuY2UgX190b3BJbmRleCwgX1Rw IF9fdmFsdWUsIF9Db21wYXJlIF9fY29tcCkKewogIF9EaXN0YW5jZSBfX3BhcmVudCA9IChfX2hv bGVJbmRleCAtIDEpIC8gMjsKICB3aGlsZSAoX19ob2xlSW5kZXggPiBfX3RvcEluZGV4ICYmIF9f Y29tcCgqKF9fZmlyc3QgKyBfX3BhcmVudCksIF9fdmFsdWUpKSB7CiAgICAqKF9fZmlyc3QgKyBf X2hvbGVJbmRleCkgPSAqKF9fZmlyc3QgKyBfX3BhcmVudCk7CiAgICBfX2hvbGVJbmRleCA9IF9f cGFyZW50OwogICAgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CiAgfQogICooX19m aXJzdCArIF9faG9sZUluZGV4KSA9IF9fdmFsdWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9t QWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlLAogICAgICAgICAgY2xhc3MgX0Rpc3RhbmNl LCBjbGFzcyBfVHA+CmlubGluZSB2b2lkCl9fcHVzaF9oZWFwX2F1eChfUmFuZG9tQWNjZXNzSXRl cmF0b3IgX19maXJzdCwKICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xh c3QsIF9Db21wYXJlIF9fY29tcCwKICAgICAgICAgICAgICAgIF9EaXN0YW5jZSosIF9UcCopCnsK ICBfX3B1c2hfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2UoKF9fbGFzdCAtIF9fZmlyc3QpIC0gMSks IF9EaXN0YW5jZSgwKSwKICAgICAgICAgICAgICBfVHAoKihfX2xhc3QgLSAxKSksIF9fY29tcCk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJl PgppbmxpbmUgdm9pZApwdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9S YW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCnsK CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICBfX3B1c2hfaGVhcF9hdXgoX19m aXJzdCwgX19sYXN0LCBfX2NvbXAsCiAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZShf X2ZpcnN0KSwgX192YWx1ZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5k b21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfVHA+CnZvaWQKX19hZGp1 c3RfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9faG9sZUlu ZGV4LAogICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbiwgX1RwIF9fdmFsdWUpCnsKICBfRGlz dGFuY2UgX190b3BJbmRleCA9IF9faG9sZUluZGV4OwogIF9EaXN0YW5jZSBfX3NlY29uZENoaWxk ID0gMiAqIF9faG9sZUluZGV4ICsgMjsKICB3aGlsZSAoX19zZWNvbmRDaGlsZCA8IF9fbGVuKSB7 CiAgICBpZiAoKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCkgPCAqKF9fZmlyc3QgKyAoX19zZWNv bmRDaGlsZCAtIDEpKSkKICAgICAgX19zZWNvbmRDaGlsZC0tOwogICAgKihfX2ZpcnN0ICsgX19o b2xlSW5kZXgpID0gKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCk7CiAgICBfX2hvbGVJbmRleCA9 IF9fc2Vjb25kQ2hpbGQ7CiAgICBfX3NlY29uZENoaWxkID0gMiAqIChfX3NlY29uZENoaWxkICsg MSk7CiAgfQogIGlmIChfX3NlY29uZENoaWxkID09IF9fbGVuKSB7CiAgICAqKF9fZmlyc3QgKyBf X2hvbGVJbmRleCkgPSAqKF9fZmlyc3QgKyAoX19zZWNvbmRDaGlsZCAtIDEpKTsKICAgIF9faG9s ZUluZGV4ID0gX19zZWNvbmRDaGlsZCAtIDE7CiAgfQogIF9fcHVzaF9oZWFwKF9fZmlyc3QsIF9f aG9sZUluZGV4LCBfX3RvcEluZGV4LCBfX3ZhbHVlKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5k b21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lk Cl9fcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJ dGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0 LCBfVHAgX192YWx1ZSwgX0Rpc3RhbmNlKikKewogICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogIF9f YWRqdXN0X2hlYXAoX19maXJzdCwgX0Rpc3RhbmNlKDApLCBfRGlzdGFuY2UoX19sYXN0IC0gX19m aXJzdCksIF9fdmFsdWUpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9y LCBjbGFzcyBfVHA+CmlubGluZSB2b2lkCl9fcG9wX2hlYXBfYXV4KF9SYW5kb21BY2Nlc3NJdGVy YXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAg ICBfVHAqKQp7CiAgX19wb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QgLSAxLCBfX2xhc3QgLSAxLAog ICAgICAgICAgICAgX1RwKCooX19sYXN0IC0gMSkpLCBfX2Rpc3RhbmNlX3R5cGUoX19maXJzdCkp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgppbmxpbmUgdm9pZCBw b3BfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKICAgICAgICAgICAgICAgICAg ICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKewoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIF9fcG9wX2hlYXBfYXV4KF9fZmlyc3QsIF9f bGFzdCwgX192YWx1ZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlLAogICAgICAgICAgY2xhc3MgX1RwLCBjbGFz cyBfQ29tcGFyZT4Kdm9pZApfX2FkanVzdF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2Zp cnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCiAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbGVu LCBfVHAgX192YWx1ZSwgX0NvbXBhcmUgX19jb21wKQp7CiAgX0Rpc3RhbmNlIF9fdG9wSW5kZXgg PSBfX2hvbGVJbmRleDsKICBfRGlzdGFuY2UgX19zZWNvbmRDaGlsZCA9IDIgKiBfX2hvbGVJbmRl eCArIDI7CiAgd2hpbGUgKF9fc2Vjb25kQ2hpbGQgPCBfX2xlbikgewogICAgaWYgKF9fY29tcCgq KF9fZmlyc3QgKyBfX3NlY29uZENoaWxkKSwgKihfX2ZpcnN0ICsgKF9fc2Vjb25kQ2hpbGQgLSAx KSkpKQogICAgICBfX3NlY29uZENoaWxkLS07CiAgICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkg PSAqKF9fZmlyc3QgKyBfX3NlY29uZENoaWxkKTsKICAgIF9faG9sZUluZGV4ID0gX19zZWNvbmRD aGlsZDsKICAgIF9fc2Vjb25kQ2hpbGQgPSAyICogKF9fc2Vjb25kQ2hpbGQgKyAxKTsKICB9CiAg aWYgKF9fc2Vjb25kQ2hpbGQgPT0gX19sZW4pIHsKICAgICooX19maXJzdCArIF9faG9sZUluZGV4 KSA9ICooX19maXJzdCArIChfX3NlY29uZENoaWxkIC0gMSkpOwogICAgX19ob2xlSW5kZXggPSBf X3NlY29uZENoaWxkIC0gMTsKICB9CiAgX19wdXNoX2hlYXAoX19maXJzdCwgX19ob2xlSW5kZXgs IF9fdG9wSW5kZXgsIF9fdmFsdWUsIF9fY29tcCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9t QWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsCiAgICAgICAgICBjbGFz cyBfRGlzdGFuY2U+CmlubGluZSB2b2lkCl9fcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9y IF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgX1JhbmRv bUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0LCBfVHAgX192YWx1ZSwgX0NvbXBhcmUgX19jb21wLAog ICAgICAgICAgIF9EaXN0YW5jZSopCnsKICAqX19yZXN1bHQgPSAqX19maXJzdDsKICBfX2FkanVz dF9oZWFwKF9fZmlyc3QsIF9EaXN0YW5jZSgwKSwgX0Rpc3RhbmNlKF9fbGFzdCAtIF9fZmlyc3Qp LAogICAgICAgICAgICAgICAgX192YWx1ZSwgX19jb21wKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9S YW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4KaW5saW5lIHZv aWQKX19wb3BfaGVhcF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAg ICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9UcCosIF9Db21wYXJlIF9fY29t cCkKewogIF9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0IC0gMSwgX19sYXN0IC0gMSwgX1RwKCoo X19sYXN0IC0gMSkpLCBfX2NvbXAsCiAgICAgICAgICAgICBfX2Rpc3RhbmNlX3R5cGUoX19maXJz dCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfQ29t cGFyZT4KaW5saW5lIHZvaWQKcG9wX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3Qs CiAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkK ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIF9fcG9wX2hlYXBfYXV4KF9f Zmlyc3QsIF9fbGFzdCwgX192YWx1ZV90eXBlKF9fZmlyc3QpLCBfX2NvbXApOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5j ZT4Kdm9pZApfX21ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKICAgICAg ICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKikKewog IGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMikgcmV0dXJuOwogIF9EaXN0YW5jZSBfX2xlbiA9IF9f bGFzdCAtIF9fZmlyc3Q7CiAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gKF9fbGVuIC0gMikvMjsKCiAg d2hpbGUgKHRydWUpIHsKICAgIF9fYWRqdXN0X2hlYXAoX19maXJzdCwgX19wYXJlbnQsIF9fbGVu LCBfVHAoKihfX2ZpcnN0ICsgX19wYXJlbnQpKSk7CiAgICBpZiAoX19wYXJlbnQgPT0gMCkgcmV0 dXJuOwogICAgX19wYXJlbnQtLTsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNz SXRlcmF0b3I+CmlubGluZSB2b2lkCm1ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19m aXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKewoKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIF9fbWFrZV9oZWFwKF9fZmlyc3QsIF9f bGFzdCwKICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoX19maXJzdCksIF9fZGlzdGFuY2VfdHlw ZShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNs YXNzIF9Db21wYXJlLAogICAgICAgICAgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CnZvaWQK X19tYWtlX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJ dGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCwgX1RwKiwgX0Rpc3Rh bmNlKikKewogIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMikgcmV0dXJuOwogIF9EaXN0YW5jZSBf X2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CiAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gKF9fbGVuIC0g MikvMjsKCiAgd2hpbGUgKHRydWUpIHsKICAgIF9fYWRqdXN0X2hlYXAoX19maXJzdCwgX19wYXJl bnQsIF9fbGVuLCBfVHAoKihfX2ZpcnN0ICsgX19wYXJlbnQpKSwKICAgICAgICAgICAgICAgICAg X19jb21wKTsKICAgIGlmIChfX3BhcmVudCA9PSAwKSByZXR1cm47CiAgICBfX3BhcmVudC0tOwog IH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgX0NvbXBh cmU+CmlubGluZSB2b2lkCm1ha2VfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwK ICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkK ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIF9fbWFrZV9oZWFwKF9fZmly c3QsIF9fbGFzdCwgX19jb21wLAogICAgICAgICAgICAgIF9fdmFsdWVfdHlwZShfX2ZpcnN0KSwg X19kaXN0YW5jZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nl c3NJdGVyYXRvcj4Kdm9pZCBzb3J0X2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3Qs IF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCnsKCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA7CgoKICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IDEp CiAgICBwb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QtLSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFu ZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9Db21wYXJlPgp2b2lkCnNvcnRfaGVhcChfUmFuZG9t QWNjZXNzSXRlcmF0b3IgX19maXJzdCwKICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBf X2xhc3QsIF9Db21wYXJlIF9fY29tcCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKCgogIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMSkKICAgIHBvcF9oZWFwKF9fZmlyc3Qs IF9fbGFzdC0tLCBfX2NvbXApOwp9Cgp9CiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL3N0bF9hbGdvLmgiIDIgMwoKCgpuYW1lc3BhY2Ugc3RkCnsKCgoKdGVtcGxh dGUgPGNsYXNzIF9UcD4KaW5saW5lIGNvbnN0IF9UcCYgX19tZWRpYW4oY29uc3QgX1RwJiBfX2Es IGNvbnN0IF9UcCYgX19iLCBjb25zdCBfVHAmIF9fYykKewoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgaWYgKF9fYSA8IF9f YikKICAgIGlmIChfX2IgPCBfX2MpCiAgICAgIHJldHVybiBfX2I7CiAgICBlbHNlIGlmIChfX2Eg PCBfX2MpCiAgICAgIHJldHVybiBfX2M7CiAgICBlbHNlCiAgICAgIHJldHVybiBfX2E7CiAgZWxz ZSBpZiAoX19hIDwgX19jKQogICAgcmV0dXJuIF9fYTsKICBlbHNlIGlmIChfX2IgPCBfX2MpCiAg ICByZXR1cm4gX19jOwogIGVsc2UKICAgIHJldHVybiBfX2I7Cn0KCnRlbXBsYXRlIDxjbGFzcyBf VHAsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgY29uc3QgX1RwJgpfX21lZGlhbihjb25zdCBfVHAm IF9fYSwgY29uc3QgX1RwJiBfX2IsIGNvbnN0IF9UcCYgX19jLCBfQ29tcGFyZSBfX2NvbXApCnsK CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA7CiAgaWYgKF9fY29tcChfX2EsIF9fYikpCiAgICBpZiAo X19jb21wKF9fYiwgX19jKSkKICAgICAgcmV0dXJuIF9fYjsKICAgIGVsc2UgaWYgKF9fY29tcChf X2EsIF9fYykpCiAgICAgIHJldHVybiBfX2M7CiAgICBlbHNlCiAgICAgIHJldHVybiBfX2E7CiAg ZWxzZSBpZiAoX19jb21wKF9fYSwgX19jKSkKICAgIHJldHVybiBfX2E7CiAgZWxzZSBpZiAoX19j b21wKF9fYiwgX19jKSkKICAgIHJldHVybiBfX2M7CiAgZWxzZQogICAgcmV0dXJuIF9fYjsKfQoK CnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRnVuY3Rpb24+Cl9GdW5jdGlvbiBm b3JfZWFjaChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfRnVuY3Rpb24g X19mKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOwogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkK ICAgIF9fZigqX19maXJzdCk7CiAgcmV0dXJuIF9fZjsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlciwgY2xhc3MgX1RwPgppbmxpbmUgX0lucHV0SXRlciBmaW5kKF9JbnB1dEl0ZXIgX19m aXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1Rw JiBfX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpCnsKICB3 aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgISgqX19maXJzdCA9PSBfX3ZhbCkpCiAgICArK19f Zmlyc3Q7CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBj bGFzcyBfUHJlZGljYXRlPgppbmxpbmUgX0lucHV0SXRlciBmaW5kX2lmKF9JbnB1dEl0ZXIgX19m aXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRp Y2F0ZSBfX3ByZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFn KQp7CiAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFfX3ByZWQoKl9fZmlyc3QpKQogICAg KytfX2ZpcnN0OwogIHJldHVybiBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFj Y2Vzc0l0ZXIsIGNsYXNzIF9UcD4KX1JhbmRvbUFjY2Vzc0l0ZXIgZmluZChfUmFuZG9tQWNjZXNz SXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgX1RwJiBfX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNj ZXNzX2l0ZXJhdG9yX3RhZykKewogIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNj ZXNzSXRlcj46OmRpZmZlcmVuY2VfdHlwZSBfX3RyaXBfY291bnQKICAgID0gKF9fbGFzdCAtIF9f Zmlyc3QpID4+IDI7CgogIGZvciAoIDsgX190cmlwX2NvdW50ID4gMCA7IC0tX190cmlwX2NvdW50 KSB7CiAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OwogICAgKytfX2Zp cnN0OwoKICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CiAgICArK19f Zmlyc3Q7CgogICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19maXJzdDsKICAgICsr X19maXJzdDsKCiAgICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OwogICAg KytfX2ZpcnN0OwogIH0KCiAgc3dpdGNoKF9fbGFzdCAtIF9fZmlyc3QpIHsKICBjYXNlIDM6CiAg ICBpZiAoKl9fZmlyc3QgPT0gX192YWwpIHJldHVybiBfX2ZpcnN0OwogICAgKytfX2ZpcnN0Owog IGNhc2UgMjoKICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkgcmV0dXJuIF9fZmlyc3Q7CiAgICAr K19fZmlyc3Q7CiAgY2FzZSAxOgogICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKSByZXR1cm4gX19m aXJzdDsKICAgICsrX19maXJzdDsKICBjYXNlIDA6CiAgZGVmYXVsdDoKICAgIHJldHVybiBfX2xh c3Q7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9QcmVk aWNhdGU+Cl9SYW5kb21BY2Nlc3NJdGVyIGZpbmRfaWYoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJz dCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9Q cmVkaWNhdGUgX19wcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3Nf aXRlcmF0b3JfdGFnKQp7CiAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJ dGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9fdHJpcF9jb3VudAogICAgPSAoX19sYXN0IC0gX19maXJz dCkgPj4gMjsKCiAgZm9yICggOyBfX3RyaXBfY291bnQgPiAwIDsgLS1fX3RyaXBfY291bnQpIHsK ICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKICAgICsrX19maXJzdDsK CiAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CiAgICArK19fZmlyc3Q7 CgogICAgaWYgKF9fcHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwogICAgKytfX2ZpcnN0 OwoKICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKICAgICsrX19maXJz dDsKICB9CgogIHN3aXRjaChfX2xhc3QgLSBfX2ZpcnN0KSB7CiAgY2FzZSAzOgogICAgaWYgKF9f cHJlZCgqX19maXJzdCkpIHJldHVybiBfX2ZpcnN0OwogICAgKytfX2ZpcnN0OwogIGNhc2UgMjoK ICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKSByZXR1cm4gX19maXJzdDsKICAgICsrX19maXJzdDsK ICBjYXNlIDE6CiAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgcmV0dXJuIF9fZmlyc3Q7CiAgICAr K19fZmlyc3Q7CiAgY2FzZSAwOgogIGRlZmF1bHQ6CiAgICByZXR1cm4gX19sYXN0OwogIH0KfQoK dGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9UcD4KaW5saW5lIF9JbnB1dEl0ZXIg ZmluZChfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgogIHJl dHVybiBmaW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19m aXJzdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4K aW5saW5lIF9JbnB1dEl0ZXIgZmluZF9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIg X19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkKQp7Cgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgogIHJldHVybiBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLCBf X2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0Zvcndh cmRJdGVyPgpfRm9yd2FyZEl0ZXIgYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXIgX19maXJzdCwg X0ZvcndhcmRJdGVyIF9fbGFzdCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgaWYgKF9fZmlyc3Qg PT0gX19sYXN0KQogICAgcmV0dXJuIF9fbGFzdDsKICBfRm9yd2FyZEl0ZXIgX19uZXh0ID0gX19m aXJzdDsKICB3aGlsZSgrK19fbmV4dCAhPSBfX2xhc3QpIHsKICAgIGlmICgqX19maXJzdCA9PSAq X19uZXh0KQogICAgICByZXR1cm4gX19maXJzdDsKICAgIF9fZmlyc3QgPSBfX25leHQ7CiAgfQog IHJldHVybiBfX2xhc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9C aW5hcnlQcmVkaWNhdGU+Cl9Gb3J3YXJkSXRlciBhZGphY2VudF9maW5kKF9Gb3J3YXJkSXRlciBf X2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBf QmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICBp ZiAoX19maXJzdCA9PSBfX2xhc3QpCiAgICByZXR1cm4gX19sYXN0OwogIF9Gb3J3YXJkSXRlciBf X25leHQgPSBfX2ZpcnN0OwogIHdoaWxlKCsrX19uZXh0ICE9IF9fbGFzdCkgewogICAgaWYgKF9f YmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQogICAgICByZXR1cm4gX19maXJzdDsKICAg IF9fZmlyc3QgPSBfX25leHQ7CiAgfQogIHJldHVybiBfX2xhc3Q7Cn0KCgoKCgoKCnRlbXBsYXRl IDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9TaXplPgp2b2lkIGNvdW50KF9J bnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSwK ICAgICAgICAgICBfU2l6ZSYgX19uKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogIGZvciAoIDsg X19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKICAgIGlmICgqX19maXJzdCA9PSBfX3ZhbHVl KQogICAgICArK19fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9QcmVk aWNhdGUsIGNsYXNzIF9TaXplPgp2b2lkIGNvdW50X2lmKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lu cHV0SXRlciBfX2xhc3QsIF9QcmVkaWNhdGUgX19wcmVkLAogICAgICAgICAgICAgIF9TaXplJiBf X24pCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CgogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJz dCkKICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQogICAgICArK19fbjsKfQoKdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9UcD4KdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1 dEl0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKY291bnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJ dGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQp7CgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwog IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyPjo6ZGlmZmVyZW5jZV90eXBlIF9f biA9IDA7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaWYgKCpf X2ZpcnN0ID09IF9fdmFsdWUpCiAgICAgICsrX19uOwogIHJldHVybiBfX247Cn0KCnRlbXBsYXRl IDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgp0eXBlbmFtZSBpdGVyYXRvcl90 cmFpdHM8X0lucHV0SXRlcj46OmRpZmZlcmVuY2VfdHlwZQpjb3VudF9pZihfSW5wdXRJdGVyIF9f Zmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKewoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKCiAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+OjpkaWZmZXJlbmNlX3R5 cGUgX19uID0gMDsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCiAgICBp ZiAoX19wcmVkKCpfX2ZpcnN0KSkKICAgICAgKytfX247CiAgcmV0dXJuIF9fbjsKfQoKCgoKdGVt cGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+Cl9Gb3J3YXJk SXRlcjEgc2VhcmNoKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0 MSwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJ dGVyMiBfX2xhc3QyKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKCiAg aWYgKF9fZmlyc3QxID09IF9fbGFzdDEgfHwgX19maXJzdDIgPT0gX19sYXN0MikKICAgIHJldHVy biBfX2ZpcnN0MTsKCgogIF9Gb3J3YXJkSXRlcjIgX190bXAoX19maXJzdDIpOwogICsrX190bXA7 CiAgaWYgKF9fdG1wID09IF9fbGFzdDIpCiAgICByZXR1cm4gZmluZChfX2ZpcnN0MSwgX19sYXN0 MSwgKl9fZmlyc3QyKTsKCgoKICBfRm9yd2FyZEl0ZXIyIF9fcDEsIF9fcDsKCiAgX19wMSA9IF9f Zmlyc3QyOyArK19fcDE7CgogIF9Gb3J3YXJkSXRlcjEgX19jdXJyZW50ID0gX19maXJzdDE7Cgog IHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxKSB7CiAgICBfX2ZpcnN0MSA9IGZpbmQoX19maXJz dDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CiAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKICAg ICAgcmV0dXJuIF9fbGFzdDE7CgogICAgX19wID0gX19wMTsKICAgIF9fY3VycmVudCA9IF9fZmly c3QxOwogICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCiAgICAgIHJldHVybiBfX2xhc3Qx OwoKICAgIHdoaWxlICgqX19jdXJyZW50ID09ICpfX3ApIHsKICAgICAgaWYgKCsrX19wID09IF9f bGFzdDIpCiAgICAgICAgcmV0dXJuIF9fZmlyc3QxOwogICAgICBpZiAoKytfX2N1cnJlbnQgPT0g X19sYXN0MSkKICAgICAgICByZXR1cm4gX19sYXN0MTsKICAgIH0KCiAgICArK19fZmlyc3QxOwog IH0KICByZXR1cm4gX19maXJzdDE7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBj bGFzcyBfRm9yd2FyZEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZD4KX0ZvcndhcmRJdGVyMSBzZWFy Y2goX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAogICAgICAg ICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9fbGFz dDIsCiAgICAgICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkIF9fcHJlZGljYXRlKQp7CgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKCiAgaWYgKF9fZmlyc3QxID09IF9fbGFz dDEgfHwgX19maXJzdDIgPT0gX19sYXN0MikKICAgIHJldHVybiBfX2ZpcnN0MTsKCgogIF9Gb3J3 YXJkSXRlcjIgX190bXAoX19maXJzdDIpOwogICsrX190bXA7CiAgaWYgKF9fdG1wID09IF9fbGFz dDIpIHsKICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICFfX3ByZWRpY2F0ZSgqX19m aXJzdDEsICpfX2ZpcnN0MikpCiAgICAgICsrX19maXJzdDE7CiAgICByZXR1cm4gX19maXJzdDE7 CiAgfQoKCgogIF9Gb3J3YXJkSXRlcjIgX19wMSwgX19wOwoKICBfX3AxID0gX19maXJzdDI7ICsr X19wMTsKCiAgX0ZvcndhcmRJdGVyMSBfX2N1cnJlbnQgPSBfX2ZpcnN0MTsKCiAgd2hpbGUgKF9f Zmlyc3QxICE9IF9fbGFzdDEpIHsKICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxKSB7CiAg ICAgIGlmIChfX3ByZWRpY2F0ZSgqX19maXJzdDEsICpfX2ZpcnN0MikpCiAgICAgICAgYnJlYWs7 CiAgICAgICsrX19maXJzdDE7CiAgICB9CiAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAm JiAhX19wcmVkaWNhdGUoKl9fZmlyc3QxLCAqX19maXJzdDIpKQogICAgICArK19fZmlyc3QxOwog ICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCiAgICAgIHJldHVybiBfX2xhc3QxOwoKICAgIF9f cCA9IF9fcDE7CiAgICBfX2N1cnJlbnQgPSBfX2ZpcnN0MTsKICAgIGlmICgrK19fY3VycmVudCA9 PSBfX2xhc3QxKSByZXR1cm4gX19sYXN0MTsKCiAgICB3aGlsZSAoX19wcmVkaWNhdGUoKl9fY3Vy cmVudCwgKl9fcCkpIHsKICAgICAgaWYgKCsrX19wID09IF9fbGFzdDIpCiAgICAgICAgcmV0dXJu IF9fZmlyc3QxOwogICAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKICAgICAgICByZXR1 cm4gX19sYXN0MTsKICAgIH0KCiAgICArK19fZmlyc3QxOwogIH0KICByZXR1cm4gX19maXJzdDE7 Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0ludGVnZXIsIGNsYXNz IF9UcD4KX0ZvcndhcmRJdGVyIHNlYXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2Fy ZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29u c3QgX1RwJiBfX3ZhbCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICBpZiAoX19jb3Vu dCA8PSAwKQogICAgcmV0dXJuIF9fZmlyc3Q7CiAgZWxzZSB7CiAgICBfX2ZpcnN0ID0gZmluZChf X2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewog ICAgICBfSW50ZWdlciBfX24gPSBfX2NvdW50IC0gMTsKICAgICAgX0ZvcndhcmRJdGVyIF9faSA9 IF9fZmlyc3Q7CiAgICAgICsrX19pOwogICAgICB3aGlsZSAoX19pICE9IF9fbGFzdCAmJiBfX24g IT0gMCAmJiAqX19pID09IF9fdmFsKSB7CiAgICAgICAgKytfX2k7CiAgICAgICAgLS1fX247CiAg ICAgIH0KICAgICAgaWYgKF9fbiA9PSAwKQogICAgICAgIHJldHVybiBfX2ZpcnN0OwogICAgICBl bHNlCiAgICAgICAgX19maXJzdCA9IGZpbmQoX19pLCBfX2xhc3QsIF9fdmFsKTsKICAgIH0KICAg IHJldHVybiBfX2xhc3Q7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFz cyBfSW50ZWdlciwgY2xhc3MgX1RwLCBjbGFzcyBfQmluYXJ5UHJlZD4KX0ZvcndhcmRJdGVyIHNl YXJjaF9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAg ICAgICAgICAgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwKICAgICAg ICAgICAgICAgICAgICAgIF9CaW5hcnlQcmVkIF9fYmluYXJ5X3ByZWQpCnsKCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKCgogIGlmIChfX2NvdW50IDw9IDApCiAgICByZXR1cm4gX19maXJzdDsKICBl bHNlIHsKICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewogICAgICBpZiAoX19iaW5hcnlf cHJlZCgqX19maXJzdCwgX192YWwpKQogICAgICAgIGJyZWFrOwogICAgICArK19fZmlyc3Q7CiAg ICB9CiAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKICAgICAgX0ludGVnZXIgX19uID0g X19jb3VudCAtIDE7CiAgICAgIF9Gb3J3YXJkSXRlciBfX2kgPSBfX2ZpcnN0OwogICAgICArK19f aTsKICAgICAgd2hpbGUgKF9faSAhPSBfX2xhc3QgJiYgX19uICE9IDAgJiYgX19iaW5hcnlfcHJl ZCgqX19pLCBfX3ZhbCkpIHsKICAgICAgICArK19faTsKICAgICAgICAtLV9fbjsKICAgICAgfQog ICAgICBpZiAoX19uID09IDApCiAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CiAgICAgIGVsc2Ugewog ICAgICAgIHdoaWxlIChfX2kgIT0gX19sYXN0KSB7CiAgICAgICAgICBpZiAoX19iaW5hcnlfcHJl ZCgqX19pLCBfX3ZhbCkpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgKytfX2k7CiAgICAg ICAgfQogICAgICAgIF9fZmlyc3QgPSBfX2k7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfX2xh c3Q7CiAgfQp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2Fy ZEl0ZXIyPgpfRm9yd2FyZEl0ZXIyIHN3YXBfcmFuZ2VzKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEs IF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2Fy ZEl0ZXIyIF9fZmlyc3QyKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDsKCgoKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsr X19maXJzdDEsICsrX19maXJzdDIpCiAgICBpdGVyX3N3YXAoX19maXJzdDEsIF9fZmlyc3QyKTsK ICByZXR1cm4gX19maXJzdDI7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNz IF9PdXRwdXRJdGVyLCBjbGFzcyBfVW5hcnlPcGVyYXRpb24+Cl9PdXRwdXRJdGVyIHRyYW5zZm9y bShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAg ICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9VbmFyeU9wZXJhdGlvbiBfX3VuYXJ5X29wKQp7 CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwoKCgoKCgogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCwg KytfX3Jlc3VsdCkKICAgICpfX3Jlc3VsdCA9IF9fdW5hcnlfb3AoKl9fZmlyc3QpOwogIHJldHVy biBfX3Jlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJ dGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCiAgICAgICAgICBjbGFzcyBfQmluYXJ5T3BlcmF0aW9u PgpfT3V0cHV0SXRlciB0cmFuc2Zvcm0oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIx IF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX091 dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5T3BlcmF0aW9u IF9fYmluYXJ5X29wKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKCgoKCiAgZm9yICggOyBfX2Zp cnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyLCArK19fcmVzdWx0KQogICAg Kl9fcmVzdWx0ID0gX19iaW5hcnlfb3AoKl9fZmlyc3QxLCAqX19maXJzdDIpOwogIHJldHVybiBf X3Jlc3VsdDsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CnZv aWQgcmVwbGFjZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAg ICAgICAgICAgIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUp CnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgZm9yICggOyBfX2Zp cnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaWYgKCpfX2ZpcnN0ID09IF9fb2xkX3ZhbHVl KQogICAgICAqX19maXJzdCA9IF9fbmV3X3ZhbHVlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0Zvcndh cmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfVHA+CnZvaWQgcmVwbGFjZV9pZihfRm9y d2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgIF9Q cmVkaWNhdGUgX19wcmVkLCBjb25zdCBfVHAmIF9fbmV3X3ZhbHVlKQp7CgogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CgoKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmly c3QpCiAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKICAgICAgKl9fZmlyc3QgPSBfX25ld192YWx1 ZTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFz cyBfVHA+Cl9PdXRwdXRJdGVyIHJlcGxhY2VfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1 dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1 bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fb2xkX3ZhbHVlLCBjb25z dCBfVHAmIF9fbmV3X3ZhbHVlKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgZm9yICggOyBf X2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQogICAgKl9fcmVzdWx0ID0g Kl9fZmlyc3QgPT0gX19vbGRfdmFsdWUgPyBfX25ld192YWx1ZSA6ICpfX2ZpcnN0OwogIHJldHVy biBfX3Jlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJ dGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfVHA+Cl9PdXRwdXRJdGVyIHJlcGxhY2VfY29w eV9pZihfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKewoKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgoKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsr X19yZXN1bHQpCiAgICAqX19yZXN1bHQgPSBfX3ByZWQoKl9fZmlyc3QpID8gX19uZXdfdmFsdWUg OiAqX19maXJzdDsKICByZXR1cm4gX19yZXN1bHQ7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3 YXJkSXRlciwgY2xhc3MgX0dlbmVyYXRvcj4Kdm9pZCBnZW5lcmF0ZShfRm9yd2FyZEl0ZXIgX19m aXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgX0dlbmVyYXRvciBfX2dlbikKewoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsKCgogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKICAgICpf X2ZpcnN0ID0gX19nZW4oKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBf U2l6ZSwgY2xhc3MgX0dlbmVyYXRvcj4KX091dHB1dEl0ZXIgZ2VuZXJhdGVfbihfT3V0cHV0SXRl ciBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4pCnsKCgoKCgoKICBmb3IgKCA7 IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCiAgICAqX19maXJzdCA9IF9fZ2VuKCk7CiAgcmV0 dXJuIF9fZmlyc3Q7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRw dXRJdGVyLCBjbGFzcyBfVHA+Cl9PdXRwdXRJdGVyIHJlbW92ZV9jb3B5KF9JbnB1dEl0ZXIgX19m aXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJ dGVyIF9fcmVzdWx0LCBjb25zdCBfVHAmIF9fdmFsdWUpCnsKCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7 CgoKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCiAgICBpZiAoISgqX19m aXJzdCA9PSBfX3ZhbHVlKSkgewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKICAgICAgKytf X3Jlc3VsdDsKICAgIH0KICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5w dXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KX091dHB1dEl0ZXIg cmVtb3ZlX2NvcHlfaWYoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9QcmVkaWNhdGUg X19wcmVkKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7 ICsrX19maXJzdCkKICAgIGlmICghX19wcmVkKCpfX2ZpcnN0KSkgewogICAgICAqX19yZXN1bHQg PSAqX19maXJzdDsKICAgICAgKytfX3Jlc3VsdDsKICAgIH0KICByZXR1cm4gX19yZXN1bHQ7Cn0K CnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KX0ZvcndhcmRJdGVyIHJl bW92ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsdWUpCnsKCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgOwoKCiAgX19maXJzdCA9IGZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbHVl KTsKICBfRm9yd2FyZEl0ZXIgX19pID0gX19maXJzdDsKICByZXR1cm4gX19maXJzdCA9PSBfX2xh c3QgPyBfX2ZpcnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVtb3ZlX2NvcHkoKytf X2ksIF9fbGFzdCwgX19maXJzdCwgX192YWx1ZSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2Fy ZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGU+Cl9Gb3J3YXJkSXRlciByZW1vdmVfaWYoX0ZvcndhcmRJ dGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAg X1ByZWRpY2F0ZSBfX3ByZWQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIF9fZmly c3QgPSBmaW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkKTsKICBfRm9yd2FyZEl0ZXIgX19p ID0gX19maXJzdDsKICByZXR1cm4gX19maXJzdCA9PSBfX2xhc3QgPyBfX2ZpcnN0CiAgICAgICAg ICAgICAgICAgICAgICAgICAgIDogcmVtb3ZlX2NvcHlfaWYoKytfX2ksIF9fbGFzdCwgX19maXJz dCwgX19wcmVkKTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1 dEl0ZXIsIGNsYXNzIF9UcD4KX091dHB1dEl0ZXIgX191bmlxdWVfY29weShfSW5wdXRJdGVyIF9f Zmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRw dXRJdGVyIF9fcmVzdWx0LCBfVHAqKQp7CgogIF9UcCBfX3ZhbHVlID0gKl9fZmlyc3Q7CiAgKl9f cmVzdWx0ID0gX192YWx1ZTsKICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKICAgIGlmICgh KF9fdmFsdWUgPT0gKl9fZmlyc3QpKSB7CiAgICAgIF9fdmFsdWUgPSAqX19maXJzdDsKICAgICAg KisrX19yZXN1bHQgPSBfX3ZhbHVlOwogICAgfQogIHJldHVybiArK19fcmVzdWx0Owp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+CmlubGluZSBfT3V0cHV0 SXRlciBfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaXRlcmF0b3JfdGFnKQp7Cgog IHJldHVybiBfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fdmFsdWVf dHlwZShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9y d2FyZEl0ZXI+Cl9Gb3J3YXJkSXRlciBfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwg X0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRl ciBfX3Jlc3VsdCwgZm9yd2FyZF9pdGVyYXRvcl90YWcpCnsKCiAgKl9fcmVzdWx0ID0gKl9fZmly c3Q7CiAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCiAgICBpZiAoISgqX19yZXN1bHQgPT0g Kl9fZmlyc3QpKQogICAgICAqKytfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogIHJldHVybiArK19fcmVz dWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXI+Cmlu bGluZSBfT3V0cHV0SXRlciB1bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0 ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19y ZXN1bHQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1 cm4gX19yZXN1bHQ7CiAgcmV0dXJuIF9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jl c3VsdCwKICAgICAgICAgICAgICAgICAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fcmVzdWx0 KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xh c3MgX0JpbmFyeVByZWRpY2F0ZSwKICAgICAgICAgIGNsYXNzIF9UcD4KX091dHB1dEl0ZXIgX191 bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAg ICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAogICAgICAgICAgICAgICAg ICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCwgX1RwKikKewoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDsKCiAgX1RwIF9fdmFsdWUgPSAqX19maXJzdDsKICAqX19yZXN1 bHQgPSBfX3ZhbHVlOwogIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQogICAgaWYgKCFfX2Jp bmFyeV9wcmVkKF9fdmFsdWUsICpfX2ZpcnN0KSkgewogICAgICBfX3ZhbHVlID0gKl9fZmlyc3Q7 CiAgICAgICorK19fcmVzdWx0ID0gX192YWx1ZTsKICAgIH0KICByZXR1cm4gKytfX3Jlc3VsdDsK fQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBf QmluYXJ5UHJlZGljYXRlPgppbmxpbmUgX091dHB1dEl0ZXIgX191bmlxdWVfY29weShfSW5wdXRJ dGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBvdXRwdXRfaXRlcmF0b3JfdGFnKQp7CgogIHJldHVybiBfX3VuaXF1ZV9j b3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYmluYXJ5X3ByZWQsCiAgICAgICAgICAg ICAgICAgICAgICAgX192YWx1ZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9J bnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KX0Zv cndhcmRJdGVyIF9fdW5pcXVlX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9f bGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQs CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKQp7CgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoK CgogICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQog ICAgaWYgKCFfX2JpbmFyeV9wcmVkKCpfX3Jlc3VsdCwgKl9fZmlyc3QpKSAqKytfX3Jlc3VsdCA9 ICpfX2ZpcnN0OwogIHJldHVybiArK19fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0 SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CmlubGluZSBf T3V0cHV0SXRlciB1bmlxdWVfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19s YXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5 X3ByZWQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7CgoKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybiBf X3Jlc3VsdDsKICByZXR1cm4gX191bmlxdWVfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0 LCBfX2JpbmFyeV9wcmVkLAogICAgICAgICAgICAgICAgICAgICAgIF9faXRlcmF0b3JfY2F0ZWdv cnkoX19yZXN1bHQpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KX0ZvcndhcmRJ dGVyIHVuaXF1ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCkKewoK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgX19maXJzdCA9IGFkamFjZW50X2ZpbmQoX19m aXJzdCwgX19sYXN0KTsKICByZXR1cm4gdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX2Zp cnN0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX0JpbmFyeVByZWRp Y2F0ZT4KX0ZvcndhcmRJdGVyIHVuaXF1ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJ dGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5 X3ByZWQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKICBfX2ZpcnN0ID0gYWRqYWNl bnRfZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fYmluYXJ5X3ByZWQpOwogIHJldHVybiB1bmlxdWVf Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fZmlyc3QsIF9fYmluYXJ5X3ByZWQpOwp9CgoKCnRlbXBs YXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+CnZvaWQgX19yZXZlcnNlKF9CaWRpcmVjdGlv bmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykgewogIHdoaWxlICh0cnVlKQogICAgaWYgKF9f Zmlyc3QgPT0gX19sYXN0IHx8IF9fZmlyc3QgPT0gLS1fX2xhc3QpCiAgICAgIHJldHVybjsKICAg IGVsc2UKICAgICAgaXRlcl9zd2FwKF9fZmlyc3QrKywgX19sYXN0KTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9SYW5kb21BY2Nlc3NJdGVyPgp2b2lkIF9fcmV2ZXJzZShfUmFuZG9tQWNjZXNzSXRlciBf X2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgIHJhbmRvbV9h Y2Nlc3NfaXRlcmF0b3JfdGFnKSB7CiAgd2hpbGUgKF9fZmlyc3QgPCBfX2xhc3QpCiAgICBpdGVy X3N3YXAoX19maXJzdCsrLCAtLV9fbGFzdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rp b25hbEl0ZXI+CmlubGluZSB2b2lkIHJldmVyc2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3Qs IF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CgogIF9fcmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QsIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19m aXJzdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfT3V0 cHV0SXRlcj4KX091dHB1dEl0ZXIgcmV2ZXJzZV9jb3B5KF9CaWRpcmVjdGlvbmFsSXRlciBfX2Zp cnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwK ICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0KQp7CgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0 KSB7CiAgICAtLV9fbGFzdDsKICAgICpfX3Jlc3VsdCA9ICpfX2xhc3Q7CiAgICArK19fcmVzdWx0 OwogIH0KICByZXR1cm4gX19yZXN1bHQ7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9FdWNsaWRlYW5S aW5nRWxlbWVudD4KX0V1Y2xpZGVhblJpbmdFbGVtZW50IF9fZ2NkKF9FdWNsaWRlYW5SaW5nRWxl bWVudCBfX20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRXVjbGlkZWFuUmluZ0VsZW1l bnQgX19uKQp7CiAgd2hpbGUgKF9fbiAhPSAwKSB7CiAgICBfRXVjbGlkZWFuUmluZ0VsZW1lbnQg X190ID0gX19tICUgX19uOwogICAgX19tID0gX19uOwogICAgX19uID0gX190OwogIH0KICByZXR1 cm4gX19tOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+ Cl9Gb3J3YXJkSXRlciBfX3JvdGF0ZShfRm9yd2FyZEl0ZXIgX19maXJzdCwKICAgICAgICAgICAg ICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwKICAgICAgICAgICAgICAgICAgICAgIF9G b3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLAogICAg ICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCnsKICBpZiAoX19maXJzdCA9 PSBfX21pZGRsZSkKICAgIHJldHVybiBfX2xhc3Q7CiAgaWYgKF9fbGFzdCA9PSBfX21pZGRsZSkK ICAgIHJldHVybiBfX2ZpcnN0OwoKICBfRm9yd2FyZEl0ZXIgX19maXJzdDIgPSBfX21pZGRsZTsK ICBkbyB7CiAgICBzd2FwKCpfX2ZpcnN0KyssICpfX2ZpcnN0MisrKTsKICAgIGlmIChfX2ZpcnN0 ID09IF9fbWlkZGxlKQogICAgICBfX21pZGRsZSA9IF9fZmlyc3QyOwogIH0gd2hpbGUgKF9fZmly c3QyICE9IF9fbGFzdCk7CgogIF9Gb3J3YXJkSXRlciBfX25ld19taWRkbGUgPSBfX2ZpcnN0OwoK ICBfX2ZpcnN0MiA9IF9fbWlkZGxlOwoKICB3aGlsZSAoX19maXJzdDIgIT0gX19sYXN0KSB7CiAg ICBzd2FwICgqX19maXJzdCsrLCAqX19maXJzdDIrKyk7CiAgICBpZiAoX19maXJzdCA9PSBfX21p ZGRsZSkKICAgICAgX19taWRkbGUgPSBfX2ZpcnN0MjsKICAgIGVsc2UgaWYgKF9fZmlyc3QyID09 IF9fbGFzdCkKICAgICAgX19maXJzdDIgPSBfX21pZGRsZTsKICB9CgogIHJldHVybiBfX25ld19t aWRkbGU7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfRGlz dGFuY2U+Cl9CaWRpcmVjdGlvbmFsSXRlciBfX3JvdGF0ZShfQmlkaXJlY3Rpb25hbEl0ZXIgX19m aXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21p ZGRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UqLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCnsKCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CgoKICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKICAgIHJldHVy biBfX2xhc3Q7CiAgaWYgKF9fbGFzdCA9PSBfX21pZGRsZSkKICAgIHJldHVybiBfX2ZpcnN0OwoK ICBfX3JldmVyc2UoX19maXJzdCwgX19taWRkbGUsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFn KCkpOwogIF9fcmV2ZXJzZShfX21pZGRsZSwgX19sYXN0LCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9y X3RhZygpKTsKCiAgd2hpbGUgKF9fZmlyc3QgIT0gX19taWRkbGUgJiYgX19taWRkbGUgIT0gX19s YXN0KQogICAgc3dhcCAoKl9fZmlyc3QrKywgKi0tX19sYXN0KTsKCiAgaWYgKF9fZmlyc3QgPT0g X19taWRkbGUpIHsKICAgIF9fcmV2ZXJzZShfX21pZGRsZSwgX19sYXN0LCBiaWRpcmVjdGlvbmFs X2l0ZXJhdG9yX3RhZygpKTsKICAgIHJldHVybiBfX2xhc3Q7CiAgfQogIGVsc2UgewogICAgX19y ZXZlcnNlKF9fZmlyc3QsIF9fbWlkZGxlLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsK ICAgIHJldHVybiBfX2ZpcnN0OwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJ dGVyLCBjbGFzcyBfRGlzdGFuY2UsIGNsYXNzIF9UcD4KX1JhbmRvbUFjY2Vzc0l0ZXIgX19yb3Rh dGUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg X1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9S YW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3Rh bmNlICosIF9UcCAqKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICBfRGlzdGFu Y2UgX19uID0gX19sYXN0IC0gX19maXJzdDsKICBfRGlzdGFuY2UgX19rID0gX19taWRkbGUgLSBf X2ZpcnN0OwogIF9EaXN0YW5jZSBfX2wgPSBfX24gLSBfX2s7CiAgX1JhbmRvbUFjY2Vzc0l0ZXIg X19yZXN1bHQgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fbWlkZGxlKTsKCiAgaWYgKF9fayA9PSAw KQogICAgcmV0dXJuIF9fbGFzdDsKCiAgZWxzZSBpZiAoX19rID09IF9fbCkgewogICAgc3dhcF9y YW5nZXMoX19maXJzdCwgX19taWRkbGUsIF9fbWlkZGxlKTsKICAgIHJldHVybiBfX3Jlc3VsdDsK ICB9CgogIF9EaXN0YW5jZSBfX2QgPSBfX2djZChfX24sIF9fayk7CgogIGZvciAoX0Rpc3RhbmNl IF9faSA9IDA7IF9faSA8IF9fZDsgX19pKyspIHsKICAgIF9UcCBfX3RtcCA9ICpfX2ZpcnN0Owog ICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19wID0gX19maXJzdDsKCiAgICBpZiAoX19rIDwgX19sKSB7 CiAgICAgIGZvciAoX0Rpc3RhbmNlIF9faiA9IDA7IF9faiA8IF9fbC9fX2Q7IF9faisrKSB7CiAg ICAgICAgaWYgKF9fcCA+IF9fZmlyc3QgKyBfX2wpIHsKICAgICAgICAgICpfX3AgPSAqKF9fcCAt IF9fbCk7CiAgICAgICAgICBfX3AgLT0gX19sOwogICAgICAgIH0KCiAgICAgICAgKl9fcCA9ICoo X19wICsgX19rKTsKICAgICAgICBfX3AgKz0gX19rOwogICAgICB9CiAgICB9CgogICAgZWxzZSB7 CiAgICAgIGZvciAoX0Rpc3RhbmNlIF9faiA9IDA7IF9faiA8IF9fay9fX2QgLSAxOyBfX2ogKysp IHsKICAgICAgICBpZiAoX19wIDwgX19sYXN0IC0gX19rKSB7CiAgICAgICAgICAqX19wID0gKihf X3AgKyBfX2spOwogICAgICAgICAgX19wICs9IF9fazsKICAgICAgICB9CgogICAgICAgICpfX3Ag PSAqIChfX3AgLSBfX2wpOwogICAgICAgIF9fcCAtPSBfX2w7CiAgICAgIH0KICAgIH0KCiAgICAq X19wID0gX190bXA7CiAgICArK19fZmlyc3Q7CiAgfQoKICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CmlubGluZSBfRm9yd2FyZEl0ZXIgcm90YXRlKF9G b3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX2xhc3QpCnsKCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7 CgogIHJldHVybiBfX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAogICAgICAgICAg ICAgICAgICBfX2Rpc3RhbmNlX3R5cGUoX19maXJzdCksCiAgICAgICAgICAgICAgICAgIF9faXRl cmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVy LCBjbGFzcyBfT3V0cHV0SXRlcj4KX091dHB1dEl0ZXIgcm90YXRlX2NvcHkoX0ZvcndhcmRJdGVy IF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX21pZGRsZSwKICAgICAgICAgICAgICAgICAgICAgICAg X0ZvcndhcmRJdGVyIF9fbGFzdCwgX091dHB1dEl0ZXIgX19yZXN1bHQpCnsKCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA7CgoKICByZXR1cm4gY29weShfX2ZpcnN0LCBfX21pZGRsZSwgY29weShfX21pZGRsZSwg X19sYXN0LCBfX3Jlc3VsdCkpOwp9CgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0Rpc3RhbmNlPgppbmxp bmUgX0Rpc3RhbmNlIF9fcmFuZG9tX251bWJlcihfRGlzdGFuY2UgX19uKSB7CgogIHJldHVybiBs cmFuZDQ4KCkgJSBfX247CgoKCn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVy PgppbmxpbmUgdm9pZCByYW5kb21fc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpCnsKCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0 dXJuOwogIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBf X2xhc3Q7ICsrX19pKQogICAgaXRlcl9zd2FwKF9faSwgX19maXJzdCArIF9fcmFuZG9tX251bWJl cigoX19pIC0gX19maXJzdCkgKyAxKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNz SXRlciwgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4Kdm9pZCByYW5kb21fc2h1ZmZsZShf UmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAg ICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQp7CgogICAgICAg ICAgICAgICAgICAgICAgICAgICA7CgoKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsK ICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0 OyArK19faSkKICAgIGl0ZXJfc3dhcChfX2ksIF9fZmlyc3QgKyBfX3JhbmQoKF9faSAtIF9fZmly c3QpICsgMSkpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9PdXRw dXRJdGVyLCBjbGFzcyBfRGlzdGFuY2U+Cl9PdXRwdXRJdGVyIHJhbmRvbV9zYW1wbGVfbihfRm9y d2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9PdXRwdXRJdGVyIF9fb3V0LCBjb25zdCBfRGlzdGFuY2UgX19uKQp7CgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgOwoKCiAgX0Rpc3RhbmNlIF9fcmVtYWluaW5nID0gMDsKICBkaXN0YW5jZShf X2ZpcnN0LCBfX2xhc3QsIF9fcmVtYWluaW5nKTsKICBfRGlzdGFuY2UgX19tID0gbWluKF9fbiwg X19yZW1haW5pbmcpOwoKICB3aGlsZSAoX19tID4gMCkgewogICAgaWYgKF9fcmFuZG9tX251bWJl cihfX3JlbWFpbmluZykgPCBfX20pIHsKICAgICAgKl9fb3V0ID0gKl9fZmlyc3Q7CiAgICAgICsr X19vdXQ7CiAgICAgIC0tX19tOwogICAgfQoKICAgIC0tX19yZW1haW5pbmc7CiAgICArK19fZmly c3Q7CiAgfQogIHJldHVybiBfX291dDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwg Y2xhc3MgX091dHB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwKICAgICAgICAgIGNsYXNzIF9SYW5k b21OdW1iZXJHZW5lcmF0b3I+Cl9PdXRwdXRJdGVyIHJhbmRvbV9zYW1wbGVfbihfRm9yd2FyZEl0 ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9PdXRwdXRJdGVyIF9fb3V0LCBjb25zdCBfRGlzdGFuY2UgX19uLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQp7CgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwoKCiAgX0Rpc3RhbmNlIF9fcmVtYWluaW5nID0gMDsKICBkaXN0YW5jZShfX2Zp cnN0LCBfX2xhc3QsIF9fcmVtYWluaW5nKTsKICBfRGlzdGFuY2UgX19tID0gbWluKF9fbiwgX19y ZW1haW5pbmcpOwoKICB3aGlsZSAoX19tID4gMCkgewogICAgaWYgKF9fcmFuZChfX3JlbWFpbmlu ZykgPCBfX20pIHsKICAgICAgKl9fb3V0ID0gKl9fZmlyc3Q7CiAgICAgICsrX19vdXQ7CiAgICAg IC0tX19tOwogICAgfQoKICAgIC0tX19yZW1haW5pbmc7CiAgICArK19fZmlyc3Q7CiAgfQogIHJl dHVybiBfX291dDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyLCBjbGFzcyBfRGlzdGFuY2U+Cl9SYW5kb21BY2Nlc3NJdGVyIF9fcmFuZG9tX3Nh bXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXQsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfRGlzdGFuY2UgX19uKQp7CiAgX0Rpc3RhbmNl IF9fbSA9IDA7CiAgX0Rpc3RhbmNlIF9fdCA9IF9fbjsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19s YXN0ICYmIF9fbSA8IF9fbjsgKytfX20sICsrX19maXJzdCkKICAgIF9fb3V0W19fbV0gPSAqX19m aXJzdDsKCiAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICArK19fdDsKICAgIF9EaXN0 YW5jZSBfX00gPSBfX3JhbmRvbV9udW1iZXIoX190KTsKICAgIGlmIChfX00gPCBfX24pCiAgICAg IF9fb3V0W19fTV0gPSAqX19maXJzdDsKICAgICsrX19maXJzdDsKICB9CgogIHJldHVybiBfX291 dCArIF9fbTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nl c3NJdGVyLAogICAgICAgICAgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvciwgY2xhc3MgX0Rp c3RhbmNlPgpfUmFuZG9tQWNjZXNzSXRlciBfX3JhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2Zp cnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbikKewoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgX0Rpc3RhbmNlIF9fbSA9IDA7 CiAgX0Rpc3RhbmNlIF9fdCA9IF9fbjsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9f bSA8IF9fbjsgKytfX20sICsrX19maXJzdCkKICAgIF9fb3V0W19fbV0gPSAqX19maXJzdDsKCiAg d2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICArK19fdDsKICAgIF9EaXN0YW5jZSBfX00g PSBfX3JhbmQoX190KTsKICAgIGlmIChfX00gPCBfX24pCiAgICAgIF9fb3V0W19fTV0gPSAqX19m aXJzdDsKICAgICsrX19maXJzdDsKICB9CgogIHJldHVybiBfX291dCArIF9fbTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgppbmxpbmUgX1Jh bmRvbUFjY2Vzc0l0ZXIKcmFuZG9tX3NhbXBsZShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0 ZXIgX19sYXN0LAogICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fb3V0X2ZpcnN0LCBf UmFuZG9tQWNjZXNzSXRlciBfX291dF9sYXN0KQp7CgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgoKICByZXR1cm4gX19yYW5kb21fc2FtcGxlKF9fZmlyc3QsIF9fbGFzdCwK ICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3V0X2ZpcnN0LCBfX291dF9sYXN0IC0gX19vdXRf Zmlyc3QpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nl c3NJdGVyLAogICAgICAgICAgY2xhc3MgX1JhbmRvbU51bWJlckdlbmVyYXRvcj4KaW5saW5lIF9S YW5kb21BY2Nlc3NJdGVyCnJhbmRvbV9zYW1wbGUoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJ dGVyIF9fbGFzdCwKICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX291dF9maXJzdCwg X1JhbmRvbUFjY2Vzc0l0ZXIgX19vdXRfbGFzdCwKICAgICAgICAgICAgICBfUmFuZG9tTnVtYmVy R2VuZXJhdG9yJiBfX3JhbmQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKCgogIHJldHVybiBfX3JhbmRvbV9zYW1wbGUoX19maXJzdCwgX19sYXN0LAogICAgICAgICAg ICAgICAgICAgICAgICAgX19vdXRfZmlyc3QsIF9fcmFuZCwKICAgICAgICAgICAgICAgICAgICAg ICAgIF9fb3V0X2xhc3QgLSBfX291dF9maXJzdCk7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3 YXJkSXRlciwgY2xhc3MgX1ByZWRpY2F0ZT4KX0ZvcndhcmRJdGVyIF9fcGFydGl0aW9uKF9Gb3J3 YXJkSXRlciBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9f bGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLAogICAgICAg ICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCnsKICBpZiAoX19maXJzdCA9 PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OwoKICB3aGlsZSAoX19wcmVkKCpfX2ZpcnN0KSkKICAg IGlmICgrK19fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKCiAgX0ZvcndhcmRJdGVy IF9fbmV4dCA9IF9fZmlyc3Q7CgogIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCiAgICBpZiAo X19wcmVkKCpfX25leHQpKSB7CiAgICAgIHN3YXAoKl9fZmlyc3QsICpfX25leHQpOwogICAgICAr K19fZmlyc3Q7CiAgICB9CgogIHJldHVybiBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0Jp ZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfUHJlZGljYXRlPgpfQmlkaXJlY3Rpb25hbEl0ZXIgX19w YXJ0aXRpb24oX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykKewogIHdoaWxlICh0cnVlKSB7CiAgICB3 aGlsZSAodHJ1ZSkKICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgICAgIHJldHVybiBf X2ZpcnN0OwogICAgICBlbHNlIGlmIChfX3ByZWQoKl9fZmlyc3QpKQogICAgICAgICsrX19maXJz dDsKICAgICAgZWxzZQogICAgICAgIGJyZWFrOwogICAgLS1fX2xhc3Q7CiAgICB3aGlsZSAodHJ1 ZSkKICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgICAgIHJldHVybiBfX2ZpcnN0Owog ICAgICBlbHNlIGlmICghX19wcmVkKCpfX2xhc3QpKQogICAgICAgIC0tX19sYXN0OwogICAgICBl bHNlCiAgICAgICAgYnJlYWs7CiAgICBpdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKICAgICsr X19maXJzdDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVk aWNhdGU+CmlubGluZSBfRm9yd2FyZEl0ZXIgcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCkKewoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOwoKCiAgcmV0dXJuIF9fcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwg X19wcmVkLCBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKfQoKCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9QcmVkaWNhdGUsIGNsYXNzIF9EaXN0YW5jZT4KX0Zvcndh cmRJdGVyIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFz dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19w cmVkLCBfRGlzdGFuY2UgX19sZW4pCnsKICBpZiAoX19sZW4gPT0gMSkKICAgIHJldHVybiBfX3By ZWQoKl9fZmlyc3QpID8gX19sYXN0IDogX19maXJzdDsKICBfRm9yd2FyZEl0ZXIgX19taWRkbGUg PSBfX2ZpcnN0OwogIGFkdmFuY2UoX19taWRkbGUsIF9fbGVuIC8gMik7CiAgcmV0dXJuIHJvdGF0 ZShfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX2ZpcnN0LCBfX21pZGRsZSwgX19wcmVkLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4gLyAyKSwKICAg ICAgICAgICAgICAgIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgX19pbnBsYWNlX3N0YWJsZV9w YXJ0aXRpb24oX19taWRkbGUsIF9fbGFzdCwgX19wcmVkLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX19sZW4gLSBfX2xlbiAvIDIpKTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1BvaW50ZXIsIGNsYXNzIF9QcmVkaWNhdGUsCiAgICAg ICAgICBjbGFzcyBfRGlzdGFuY2U+Cl9Gb3J3YXJkSXRlciBfX3N0YWJsZV9wYXJ0aXRpb25fYWRh cHRpdmUoX0ZvcndhcmRJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgX0Rpc3RhbmNlIF9fbGVuLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2J1ZmZl cl9zaXplKQp7CiAgaWYgKF9fbGVuIDw9IF9fYnVmZmVyX3NpemUpIHsKICAgIF9Gb3J3YXJkSXRl ciBfX3Jlc3VsdDEgPSBfX2ZpcnN0OwogICAgX1BvaW50ZXIgX19yZXN1bHQyID0gX19idWZmZXI7 CiAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0IDsgKytfX2ZpcnN0KQogICAgICBpZiAoX19w cmVkKCpfX2ZpcnN0KSkgewogICAgICAgICpfX3Jlc3VsdDEgPSAqX19maXJzdDsKICAgICAgICAr K19fcmVzdWx0MTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAqX19yZXN1bHQyID0gKl9f Zmlyc3Q7CiAgICAgICAgKytfX3Jlc3VsdDI7CiAgICAgIH0KICAgIGNvcHkoX19idWZmZXIsIF9f cmVzdWx0MiwgX19yZXN1bHQxKTsKICAgIHJldHVybiBfX3Jlc3VsdDE7CiAgfQogIGVsc2Ugewog ICAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlID0gX19maXJzdDsKICAgIGFkdmFuY2UoX19taWRkbGUs IF9fbGVuIC8gMik7CiAgICByZXR1cm4gcm90YXRlKF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2 ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0LCBfX21pZGRsZSwgX19wcmVkLAog ICAgICAgICAgICAgICAgICAgICAgICAgIF9fbGVuIC8gMiwgX19idWZmZXIsIF9fYnVmZmVyX3Np emUpLAogICAgICAgICAgICAgICAgICAgIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgIF9f c3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICBfX21p ZGRsZSwgX19sYXN0LCBfX3ByZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX19sZW4gLSBf X2xlbiAvIDIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKSk7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfUHJlZGljYXRlLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0 YW5jZT4KaW5saW5lIF9Gb3J3YXJkSXRlcgpfX3N0YWJsZV9wYXJ0aXRpb25fYXV4KF9Gb3J3YXJk SXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAg IF9QcmVkaWNhdGUgX19wcmVkLCBfVHAqLCBfRGlzdGFuY2UqKQp7CiAgX1RlbXBvcmFyeV9idWZm ZXI8X0ZvcndhcmRJdGVyLCBfVHA+IF9fYnVmKF9fZmlyc3QsIF9fbGFzdCk7CiAgaWYgKF9fYnVm LnNpemUoKSA+IDApCiAgICByZXR1cm4gX19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9fZmly c3QsIF9fbGFzdCwgX19wcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfRGlzdGFuY2UoX19idWYucmVxdWVzdGVkX3NpemUoKSksCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9fYnVmLmJlZ2luKCksIF9fYnVmLnNpemUoKSk7CiAgZWxzZQog ICAgcmV0dXJuIF9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwgX19w cmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX2J1 Zi5yZXF1ZXN0ZWRfc2l6ZSgpKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNs YXNzIF9QcmVkaWNhdGU+CmlubGluZSBfRm9yd2FyZEl0ZXIgc3RhYmxlX3BhcnRpdGlvbihfRm9y d2FyZEl0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9G b3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf UHJlZGljYXRlIF9fcHJlZCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgaWYgKF9f Zmlyc3QgPT0gX19sYXN0KQogICAgcmV0dXJuIF9fZmlyc3Q7CiAgZWxzZQogICAgcmV0dXJuIF9f c3RhYmxlX3BhcnRpdGlvbl9hdXgoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoX19maXJzdCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfX2Rpc3RhbmNlX3R5cGUoX19maXJzdCkpOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcD4KX1JhbmRvbUFjY2Vzc0l0 ZXIgX191bmd1YXJkZWRfcGFydGl0aW9uKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAgX19waXZvdCkK ewogIHdoaWxlICh0cnVlKSB7CiAgICB3aGlsZSAoKl9fZmlyc3QgPCBfX3Bpdm90KQogICAgICAr K19fZmlyc3Q7CiAgICAtLV9fbGFzdDsKICAgIHdoaWxlIChfX3Bpdm90IDwgKl9fbGFzdCkKICAg ICAgLS1fX2xhc3Q7CiAgICBpZiAoIShfX2ZpcnN0IDwgX19sYXN0KSkKICAgICAgcmV0dXJuIF9f Zmlyc3Q7CiAgICBpdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKICAgICsrX19maXJzdDsKICB9 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBf Q29tcGFyZT4KX1JhbmRvbUFjY2Vzc0l0ZXIgX191bmd1YXJkZWRfcGFydGl0aW9uKF9SYW5kb21B Y2Nlc3NJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfVHAgX19waXZvdCwgX0NvbXBhcmUgX19jb21wKQp7CiAgd2hpbGUgKHRydWUp IHsKICAgIHdoaWxlIChfX2NvbXAoKl9fZmlyc3QsIF9fcGl2b3QpKQogICAgICArK19fZmlyc3Q7 CiAgICAtLV9fbGFzdDsKICAgIHdoaWxlIChfX2NvbXAoX19waXZvdCwgKl9fbGFzdCkpCiAgICAg IC0tX19sYXN0OwogICAgaWYgKCEoX19maXJzdCA8IF9fbGFzdCkpCiAgICAgIHJldHVybiBfX2Zp cnN0OwogICAgaXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7CiAgICArK19fZmlyc3Q7CiAgfQp9 Cgpjb25zdCBpbnQgX19zdGxfdGhyZXNob2xkID0gMTY7CgoKCnRlbXBsYXRlIDxjbGFzcyBfUmFu ZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwPgp2b2lkIF9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQo X1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAgX192YWwpCnsKICBfUmFuZG9tQWNjZXNzSXRl ciBfX25leHQgPSBfX2xhc3Q7CiAgLS1fX25leHQ7CiAgd2hpbGUgKF9fdmFsIDwgKl9fbmV4dCkg ewogICAgKl9fbGFzdCA9ICpfX25leHQ7CiAgICBfX2xhc3QgPSBfX25leHQ7CiAgICAtLV9fbmV4 dDsKICB9CiAgKl9fbGFzdCA9IF9fdmFsOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vz c0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CnZvaWQgX191bmd1YXJkZWRfbGluZWFy X2luc2VydChfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9UcCBfX3ZhbCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkKewogIF9SYW5kb21BY2Nlc3NJdGVy IF9fbmV4dCA9IF9fbGFzdDsKICAtLV9fbmV4dDsKICB3aGlsZSAoX19jb21wKF9fdmFsLCAqX19u ZXh0KSkgewogICAgKl9fbGFzdCA9ICpfX25leHQ7CiAgICBfX2xhc3QgPSBfX25leHQ7CiAgICAt LV9fbmV4dDsKICB9CiAgKl9fbGFzdCA9IF9fdmFsOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRv bUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcD4KaW5saW5lIHZvaWQgX19saW5lYXJfaW5zZXJ0KF9SYW5k b21BY2Nlc3NJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9t QWNjZXNzSXRlciBfX2xhc3QsIF9UcCopCnsKICBfVHAgX192YWwgPSAqX19sYXN0OwogIGlmIChf X3ZhbCA8ICpfX2ZpcnN0KSB7CiAgICBjb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9fbGFzdCwgX19s YXN0ICsgMSk7CiAgICAqX19maXJzdCA9IF9fdmFsOwogIH0KICBlbHNlCiAgICBfX3VuZ3VhcmRl ZF9saW5lYXJfaW5zZXJ0KF9fbGFzdCwgX192YWwpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRv bUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSB2b2lkIF9fbGlu ZWFyX2luc2VydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAqLCBfQ29tcGFyZSBfX2NvbXAp CnsKICBfVHAgX192YWwgPSAqX19sYXN0OwogIGlmIChfX2NvbXAoX192YWwsICpfX2ZpcnN0KSkg ewogICAgY29weV9iYWNrd2FyZChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCArIDEpOwogICAgKl9f Zmlyc3QgPSBfX3ZhbDsKICB9CiAgZWxzZQogICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChf X2xhc3QsIF9fdmFsLCBfX2NvbXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0 ZXI+CnZvaWQgX19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFu ZG9tQWNjZXNzSXRlciBfX2xhc3QpCnsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsK ICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0 OyArK19faSkKICAgIF9fbGluZWFyX2luc2VydChfX2ZpcnN0LCBfX2ksIF9fdmFsdWVfdHlwZShf X2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Nv bXBhcmU+CnZvaWQgX19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAog ICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfQ29tcGFyZSBf X2NvbXApCnsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpIHJldHVybjsKICBmb3IgKF9SYW5kb21B Y2Nlc3NJdGVyIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKICAgIF9f bGluZWFyX2luc2VydChfX2ZpcnN0LCBfX2ksIF9fdmFsdWVfdHlwZShfX2ZpcnN0KSwgX19jb21w KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHA+CnZvaWQg X191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnRfYXV4KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9f bGFzdCwgX1RwKikKewogIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19pID0gX19maXJzdDsgX19p ICE9IF9fbGFzdDsgKytfX2kpCiAgICBfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9faSwgX1Rw KCpfX2kpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgppbmxpbmUgdm9p ZCBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkg ewogIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0X2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFs dWVfdHlwZShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwg Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4Kdm9pZCBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29y dF9hdXgoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfVHAqLCBfQ29tcGFyZSBfX2NvbXApCnsKICBmb3IgKF9SYW5kb21B Y2Nlc3NJdGVyIF9faSA9IF9fZmlyc3Q7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQogICAgX191bmd1 YXJkZWRfbGluZWFyX2luc2VydChfX2ksIF9UcCgqX19pKSwgX19jb21wKTsKfQoKdGVtcGxhdGUg PGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4KaW5saW5lIHZvaWQgX191 bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAp CnsKICBfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydF9hdXgoX19maXJzdCwgX19sYXN0LCBfX3Zh bHVlX3R5cGUoX19maXJzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29t cCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4Kdm9pZCBfX2ZpbmFsX2lu c2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpCnsKICBpZiAoX19sYXN0IC0gX19m aXJzdCA+IF9fc3RsX3RocmVzaG9sZCkgewogICAgX19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBf X2ZpcnN0ICsgX19zdGxfdGhyZXNob2xkKTsKICAgIF9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0 KF9fZmlyc3QgKyBfX3N0bF90aHJlc2hvbGQsIF9fbGFzdCk7CiAgfQogIGVsc2UKICAgIF9faW5z ZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZT4Kdm9pZCBfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9S YW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFu ZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKewogIGlmIChfX2xhc3QgLSBf X2ZpcnN0ID4gX19zdGxfdGhyZXNob2xkKSB7CiAgICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3Qs IF9fZmlyc3QgKyBfX3N0bF90aHJlc2hvbGQsIF9fY29tcCk7CiAgICBfX3VuZ3VhcmRlZF9pbnNl cnRpb25fc29ydChfX2ZpcnN0ICsgX19zdGxfdGhyZXNob2xkLCBfX2xhc3QsIF9fY29tcCk7CiAg fQogIGVsc2UKICAgIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1NpemU+CmlubGluZSBfU2l6ZSBfX2xnKF9TaXplIF9fbikKewog IF9TaXplIF9fazsKICBmb3IgKF9fayA9IDA7IF9fbiAhPSAxOyBfX24gPj49IDEpICsrX19rOwog IHJldHVybiBfX2s7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3Mg X1RwLCBjbGFzcyBfU2l6ZT4Kdm9pZCBfX2ludHJvc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVy IF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3Qs IF9UcCosCiAgICAgICAgICAgICAgICAgICAgICBfU2l6ZSBfX2RlcHRoX2xpbWl0KQp7CiAgd2hp bGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBfX3N0bF90aHJlc2hvbGQpIHsKICAgIGlmIChfX2RlcHRo X2xpbWl0ID09IDApIHsKICAgICAgcGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0 KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLS1fX2RlcHRoX2xpbWl0OwogICAgX1JhbmRvbUFj Y2Vzc0l0ZXIgX19jdXQgPQogICAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX19maXJzdCwgX19s YXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RwKF9fbWVkaWFuKCpfX2ZpcnN0LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooX19maXJzdCArIChfX2xh c3QgLSBfX2ZpcnN0KS8yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqKF9fbGFzdCAtIDEpKSkpOwogICAgX19pbnRyb3NvcnRfbG9vcChfX2N1dCwgX19sYXN0LCAo X1RwKikgMCwgX19kZXB0aF9saW1pdCk7CiAgICBfX2xhc3QgPSBfX2N1dDsKICB9Cn0KCnRlbXBs YXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfU2l6ZSwgY2xh c3MgX0NvbXBhcmU+CnZvaWQgX19pbnRyb3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlciBfX2Zp cnN0LAogICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfVHAq LAogICAgICAgICAgICAgICAgICAgICAgX1NpemUgX19kZXB0aF9saW1pdCwgX0NvbXBhcmUgX19j b21wKQp7CiAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBfX3N0bF90aHJlc2hvbGQpIHsKICAg IGlmIChfX2RlcHRoX2xpbWl0ID09IDApIHsKICAgICAgcGFydGlhbF9zb3J0KF9fZmlyc3QsIF9f bGFzdCwgX19sYXN0LCBfX2NvbXApOwogICAgICByZXR1cm47CiAgICB9CiAgICAtLV9fZGVwdGhf bGltaXQ7CiAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2N1dCA9CiAgICAgIF9fdW5ndWFyZGVkX3Bh cnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAo X19tZWRpYW4oKl9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKihfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpLzIpLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICooX19sYXN0IC0gMSksIF9fY29tcCkpLAogICAgICAgX19j b21wKTsKICAgIF9faW50cm9zb3J0X2xvb3AoX19jdXQsIF9fbGFzdCwgKF9UcCopIDAsIF9fZGVw dGhfbGltaXQsIF9fY29tcCk7CiAgICBfX2xhc3QgPSBfX2N1dDsKICB9Cn0KCnRlbXBsYXRlIDxj bGFzcyBfUmFuZG9tQWNjZXNzSXRlcj4KaW5saW5lIHZvaWQgc29ydChfUmFuZG9tQWNjZXNzSXRl ciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpCnsKCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgOwoKCiAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICBf X2ludHJvc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgX192 YWx1ZV90eXBlKF9fZmlyc3QpLAogICAgICAgICAgICAgICAgICAgICBfX2xnKF9fbGFzdCAtIF9f Zmlyc3QpICogMik7CiAgICBfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7 CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJl PgppbmxpbmUgdm9pZCBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nl c3NJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCnsKCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCgogIGlmIChfX2ZpcnN0ICE9IF9f bGFzdCkgewogICAgX19pbnRyb3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAg ICAgICAgICAgIF9fdmFsdWVfdHlwZShfX2ZpcnN0KSwKICAgICAgICAgICAgICAgICAgICAgX19s ZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIsCiAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAg ICBfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKICB9Cn0K CgoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgp2b2lkIF9faW5wbGFjZV9zdGFi bGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAg ICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpCnsKICBpZiAoX19sYXN0IC0gX19maXJzdCA8 IDE1KSB7CiAgICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CiAgICByZXR1cm47 CiAgfQogIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlID0gX19maXJzdCArIChfX2xhc3QgLSBf X2ZpcnN0KSAvIDI7CiAgX19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlKTsK ICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19taWRkbGUsIF9fbGFzdCk7CiAgX19tZXJnZV93aXRo b3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAogICAgICAgICAgICAgICAgICAg ICAgICAgX19taWRkbGUgLSBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX19sYXN0 IC0gX19taWRkbGUpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNz IF9Db21wYXJlPgp2b2lkIF9faW5wbGFjZV9zdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlciBf X2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xh c3QsIF9Db21wYXJlIF9fY29tcCkKewogIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMTUpIHsKICAg IF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwogICAgcmV0dXJuOwog IH0KICBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19m aXJzdCkgLyAyOwogIF9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX21pZGRsZSwgX19j b21wKTsKICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsK ICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCiAgICAg ICAgICAgICAgICAgICAgICAgICBfX21pZGRsZSAtIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICBfX2xhc3QgLSBfX21pZGRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29t cCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcjEsIGNsYXNzIF9SYW5kb21B Y2Nlc3NJdGVyMiwKICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4Kdm9pZCBfX21lcmdlX3NvcnRf bG9vcChfUmFuZG9tQWNjZXNzSXRlcjEgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICBf UmFuZG9tQWNjZXNzSXRlcjEgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21B Y2Nlc3NJdGVyMiBfX3Jlc3VsdCwgX0Rpc3RhbmNlIF9fc3RlcF9zaXplKQp7CiAgX0Rpc3RhbmNl IF9fdHdvX3N0ZXAgPSAyICogX19zdGVwX3NpemU7CgogIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0 ID49IF9fdHdvX3N0ZXApIHsKICAgIF9fcmVzdWx0ID0gbWVyZ2UoX19maXJzdCwgX19maXJzdCAr IF9fc3RlcF9zaXplLAogICAgICAgICAgICAgICAgICAgICBfX2ZpcnN0ICsgX19zdGVwX3NpemUs IF9fZmlyc3QgKyBfX3R3b19zdGVwLAogICAgICAgICAgICAgICAgICAgICBfX3Jlc3VsdCk7CiAg ICBfX2ZpcnN0ICs9IF9fdHdvX3N0ZXA7CiAgfQoKICBfX3N0ZXBfc2l6ZSA9IG1pbihfRGlzdGFu Y2UoX19sYXN0IC0gX19maXJzdCksIF9fc3RlcF9zaXplKTsKICBtZXJnZShfX2ZpcnN0LCBfX2Zp cnN0ICsgX19zdGVwX3NpemUsIF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwgX19sYXN0LAogICAgICAg IF9fcmVzdWx0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyMSwgY2xhc3Mg X1JhbmRvbUFjY2Vzc0l0ZXIyLAogICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfQ29t cGFyZT4Kdm9pZCBfX21lcmdlX3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcjEgX19maXJzdCwK ICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlcjEgX19sYXN0LAogICAgICAg ICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyMiBfX3Jlc3VsdCwgX0Rpc3RhbmNlIF9f c3RlcF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkKewogIF9E aXN0YW5jZSBfX3R3b19zdGVwID0gMiAqIF9fc3RlcF9zaXplOwoKICB3aGlsZSAoX19sYXN0IC0g X19maXJzdCA+PSBfX3R3b19zdGVwKSB7CiAgICBfX3Jlc3VsdCA9IG1lcmdlKF9fZmlyc3QsIF9f Zmlyc3QgKyBfX3N0ZXBfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgX19maXJzdCArIF9fc3Rl cF9zaXplLCBfX2ZpcnN0ICsgX190d29fc3RlcCwKICAgICAgICAgICAgICAgICAgICAgX19yZXN1 bHQsCiAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgICBfX2ZpcnN0ICs9IF9fdHdvX3N0 ZXA7CiAgfQogIF9fc3RlcF9zaXplID0gbWluKF9EaXN0YW5jZShfX2xhc3QgLSBfX2ZpcnN0KSwg X19zdGVwX3NpemUpOwoKICBtZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCiAg ICAgICAgX19maXJzdCArIF9fc3RlcF9zaXplLCBfX2xhc3QsCiAgICAgICAgX19yZXN1bHQsCiAg ICAgICAgX19jb21wKTsKfQoKY29uc3QgaW50IF9fc3RsX2NodW5rX3NpemUgPSA3OwoKdGVtcGxh dGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CnZvaWQgX19jaHVu a19pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfRGlzdGFuY2UgX19jaHVu a19zaXplKQp7CiAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPj0gX19jaHVua19zaXplKSB7CiAg ICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUpOwogICAg X19maXJzdCArPSBfX2NodW5rX3NpemU7CiAgfQogIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwg X19sYXN0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfRGlz dGFuY2UsIGNsYXNzIF9Db21wYXJlPgp2b2lkIF9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX1JhbmRv bUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21B Y2Nlc3NJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBf X2NodW5rX3NpemUsIF9Db21wYXJlIF9fY29tcCkKewogIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0 ID49IF9fY2h1bmtfc2l6ZSkgewogICAgX19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2ZpcnN0 ICsgX19jaHVua19zaXplLCBfX2NvbXApOwogICAgX19maXJzdCArPSBfX2NodW5rX3NpemU7CiAg fQogIF9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Qb2ludGVyLCBjbGFzcyBfRGlzdGFu Y2U+CnZvaWQgX19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmly c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFz dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9EaXN0 YW5jZSopCnsKICBfRGlzdGFuY2UgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OwogIF9Qb2ludGVy IF9fYnVmZmVyX2xhc3QgPSBfX2J1ZmZlciArIF9fbGVuOwoKICBfRGlzdGFuY2UgX19zdGVwX3Np emUgPSBfX3N0bF9jaHVua19zaXplOwogIF9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX19maXJzdCwg X19sYXN0LCBfX3N0ZXBfc2l6ZSk7CgogIHdoaWxlIChfX3N0ZXBfc2l6ZSA8IF9fbGVuKSB7CiAg ICBfX21lcmdlX3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmZmVyLCBfX3N0ZXBfc2l6 ZSk7CiAgICBfX3N0ZXBfc2l6ZSAqPSAyOwogICAgX19tZXJnZV9zb3J0X2xvb3AoX19idWZmZXIs IF9fYnVmZmVyX2xhc3QsIF9fZmlyc3QsIF9fc3RlcF9zaXplKTsKICAgIF9fc3RlcF9zaXplICo9 IDI7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Qb2lu dGVyLCBjbGFzcyBfRGlzdGFuY2UsCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4Kdm9pZCBfX21l cmdlX3NvcnRfd2l0aF9idWZmZXIoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBfUG9pbnRlciBf X2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKiwgX0NvbXBh cmUgX19jb21wKQp7CiAgX0Rpc3RhbmNlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKICBfUG9p bnRlciBfX2J1ZmZlcl9sYXN0ID0gX19idWZmZXIgKyBfX2xlbjsKCiAgX0Rpc3RhbmNlIF9fc3Rl cF9zaXplID0gX19zdGxfY2h1bmtfc2l6ZTsKICBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9fZmly c3QsIF9fbGFzdCwgX19zdGVwX3NpemUsIF9fY29tcCk7CgogIHdoaWxlIChfX3N0ZXBfc2l6ZSA8 IF9fbGVuKSB7CiAgICBfX21lcmdlX3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmZmVy LCBfX3N0ZXBfc2l6ZSwgX19jb21wKTsKICAgIF9fc3RlcF9zaXplICo9IDI7CiAgICBfX21lcmdl X3NvcnRfbG9vcChfX2J1ZmZlciwgX19idWZmZXJfbGFzdCwgX19maXJzdCwgX19zdGVwX3NpemUs IF9fY29tcCk7CiAgICBfX3N0ZXBfc2l6ZSAqPSAyOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9S YW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX0Rpc3RhbmNlPgp2b2lkIF9f c3RhYmxlX3NvcnRfYWRhcHRpdmUoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1BvaW50ZXIgX19i dWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19idWZmZXJfc2l6 ZSkKewogIF9EaXN0YW5jZSBfX2xlbiA9IChfX2xhc3QgLSBfX2ZpcnN0ICsgMSkgLyAyOwogIF9S YW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlID0gX19maXJzdCArIF9fbGVuOwogIGlmIChfX2xlbiA+ IF9fYnVmZmVyX3NpemUpIHsKICAgIF9fc3RhYmxlX3NvcnRfYWRhcHRpdmUoX19maXJzdCwgX19t aWRkbGUsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKICAgIF9fc3RhYmxlX3NvcnRfYWRhcHRp dmUoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOwogIH0KICBlbHNl IHsKICAgIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZm ZXIsIChfRGlzdGFuY2UqKTApOwogICAgX19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fbWlkZGxl LCBfX2xhc3QsIF9fYnVmZmVyLCAoX0Rpc3RhbmNlKikwKTsKICB9CiAgX19tZXJnZV9hZGFwdGl2 ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfRGlzdGFuY2UoX19taWRkbGUgLSBfX2ZpcnN0 KSwKICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZShfX2xhc3QgLSBfX21pZGRsZSksIF9fYnVm ZmVyLCBfX2J1ZmZlcl9zaXplKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVy LCBjbGFzcyBfUG9pbnRlciwgY2xhc3MgX0Rpc3RhbmNlLAogICAgICAgICAgY2xhc3MgX0NvbXBh cmU+CnZvaWQgX19zdGFibGVfc29ydF9hZGFwdGl2ZShfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LCBf UG9pbnRlciBfX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBf X2J1ZmZlcl9zaXplLCBfQ29tcGFyZSBfX2NvbXApCnsKICBfRGlzdGFuY2UgX19sZW4gPSAoX19s YXN0IC0gX19maXJzdCArIDEpIC8gMjsKICBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSA9IF9f Zmlyc3QgKyBfX2xlbjsKICBpZiAoX19sZW4gPiBfX2J1ZmZlcl9zaXplKSB7CiAgICBfX3N0YWJs ZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6 ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKICAgIF9fc3RhYmxlX3NvcnRf YWRhcHRpdmUoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgfQogIGVsc2UgewogICAgX19tZXJnZV9z b3J0X3dpdGhfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgKF9EaXN0YW5jZSop MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7CiAgICBfX21lcmdlX3Nv cnRfd2l0aF9idWZmZXIoX19taWRkbGUsIF9fbGFzdCwgX19idWZmZXIsIChfRGlzdGFuY2UqKTAs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwogIH0KICBfX21lcmdlX2Fk YXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9EaXN0YW5jZShfX21pZGRsZSAtIF9f Zmlyc3QpLAogICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKF9fbGFzdCAtIF9fbWlkZGxlKSwg X19idWZmZXIsIF9fYnVmZmVyX3NpemUsCiAgICAgICAgICAgICAgICAgICBfX2NvbXApOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3Rh bmNlPgppbmxpbmUgdm9pZCBfX3N0YWJsZV9zb3J0X2F1eChfUmFuZG9tQWNjZXNzSXRlciBfX2Zp cnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xh c3QsIF9UcCosIF9EaXN0YW5jZSopCnsKICBfVGVtcG9yYXJ5X2J1ZmZlcjxfUmFuZG9tQWNjZXNz SXRlciwgX1RwPiBidWYoX19maXJzdCwgX19sYXN0KTsKICBpZiAoYnVmLmJlZ2luKCkgPT0gMCkK ICAgIF9faW5wbGFjZV9zdGFibGVfc29ydChfX2ZpcnN0LCBfX2xhc3QpOwogIGVsc2UKICAgIF9f c3RhYmxlX3NvcnRfYWRhcHRpdmUoX19maXJzdCwgX19sYXN0LCBidWYuYmVnaW4oKSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKGJ1Zi5zaXplKCkpKTsKfQoKdGVtcGxhdGUg PGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZSwgY2xh c3MgX0NvbXBhcmU+CmlubGluZSB2b2lkIF9fc3RhYmxlX3NvcnRfYXV4KF9SYW5kb21BY2Nlc3NJ dGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJ dGVyIF9fbGFzdCwgX1RwKiwgX0Rpc3RhbmNlKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX0NvbXBhcmUgX19jb21wKQp7CiAgX1RlbXBvcmFyeV9idWZmZXI8X1JhbmRvbUFjY2Vzc0l0 ZXIsIF9UcD4gYnVmKF9fZmlyc3QsIF9fbGFzdCk7CiAgaWYgKGJ1Zi5iZWdpbigpID09IDApCiAg ICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOwogIGVsc2UK ICAgIF9fc3RhYmxlX3NvcnRfYWRhcHRpdmUoX19maXJzdCwgX19sYXN0LCBidWYuYmVnaW4oKSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKGJ1Zi5zaXplKCkpLAogICAgICAg ICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFj Y2Vzc0l0ZXI+CmlubGluZSB2b2lkIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmly c3QsCiAgICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCkKewoK ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICBfX3N0YWJsZV9zb3J0 X2F1eChfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlKF9f Zmlyc3QpLAogICAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZShfX2ZpcnN0KSk7Cn0K CnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+CmlubGlu ZSB2b2lkIHN0YWJsZV9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsCiAgICAgICAgICAg ICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQp7 CgogICAgICAgICAgICAgICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKICBfX3N0YWJsZV9z b3J0X2F1eChfX2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBl KF9fZmlyc3QpLAogICAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZShfX2ZpcnN0KSwK ICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9t QWNjZXNzSXRlciwgY2xhc3MgX1RwPgp2b2lkIF9fcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJ dGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAogICAgICAgICAgICAgICAg ICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1RwKikKewogIG1ha2VfaGVhcChfX2ZpcnN0 LCBfX21pZGRsZSk7CiAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2kgPSBfX21pZGRsZTsgX19p IDwgX19sYXN0OyArK19faSkKICAgIGlmICgqX19pIDwgKl9fZmlyc3QpCiAgICAgIF9fcG9wX2hl YXAoX19maXJzdCwgX19taWRkbGUsIF9faSwgX1RwKCpfX2kpLAogICAgICAgICAgICAgICAgIF9f ZGlzdGFuY2VfdHlwZShfX2ZpcnN0KSk7CiAgc29ydF9oZWFwKF9fZmlyc3QsIF9fbWlkZGxlKTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyPgppbmxpbmUgdm9pZCBwYXJ0aWFs X3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAg IF9SYW5kb21BY2Nlc3NJdGVyIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgX1Jh bmRvbUFjY2Vzc0l0ZXIgX19sYXN0KQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICA7Cgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsKCgogIF9fcGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9f dmFsdWVfdHlwZShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRl ciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZT4Kdm9pZCBfX3BhcnRpYWxfc29ydChfUmFuZG9t QWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX21pZGRsZSwKICAgICAgICAg ICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9UcCosIF9Db21wYXJlIF9fY29t cCkKewogIG1ha2VfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19jb21wKTsKICBmb3IgKF9SYW5k b21BY2Nlc3NJdGVyIF9faSA9IF9fbWlkZGxlOyBfX2kgPCBfX2xhc3Q7ICsrX19pKQogICAgaWYg KF9fY29tcCgqX19pLCAqX19maXJzdCkpCiAgICAgIF9fcG9wX2hlYXAoX19maXJzdCwgX19taWRk bGUsIF9faSwgX1RwKCpfX2kpLCBfX2NvbXAsCiAgICAgICAgICAgICAgICAgX19kaXN0YW5jZV90 eXBlKF9fZmlyc3QpKTsKICBzb3J0X2hlYXAoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7Cn0K CnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0NvbXBhcmU+CmlubGlu ZSB2b2lkIHBhcnRpYWxfc29ydChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LAogICAgICAgICAg ICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAg ICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKewoK ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKCiAgX19wYXJ0aWFsX3Nv cnQoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX192YWx1ZV90eXBlKF9fZmlyc3QpLCBfX2Nv bXApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0 ZXIsIGNsYXNzIF9EaXN0YW5jZSwKICAgICAgICAgIGNsYXNzIF9UcD4KX1JhbmRvbUFjY2Vzc0l0 ZXIgX19wYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19yZXN1bHRfZmlyc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIg X19yZXN1bHRfbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlz dGFuY2UqLCBfVHAqKQp7CiAgaWYgKF9fcmVzdWx0X2ZpcnN0ID09IF9fcmVzdWx0X2xhc3QpIHJl dHVybiBfX3Jlc3VsdF9sYXN0OwogIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X3JlYWxfbGFz dCA9IF9fcmVzdWx0X2ZpcnN0OwogIHdoaWxlKF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fcmVzdWx0 X3JlYWxfbGFzdCAhPSBfX3Jlc3VsdF9sYXN0KSB7CiAgICAqX19yZXN1bHRfcmVhbF9sYXN0ID0g Kl9fZmlyc3Q7CiAgICArK19fcmVzdWx0X3JlYWxfbGFzdDsKICAgICsrX19maXJzdDsKICB9CiAg bWFrZV9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QpOwogIHdoaWxlIChf X2ZpcnN0ICE9IF9fbGFzdCkgewogICAgaWYgKCpfX2ZpcnN0IDwgKl9fcmVzdWx0X2ZpcnN0KQog ICAgICBfX2FkanVzdF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfRGlzdGFuY2UoMCksCiAgICAgICAg ICAgICAgICAgICAgX0Rpc3RhbmNlKF9fcmVzdWx0X3JlYWxfbGFzdCAtIF9fcmVzdWx0X2ZpcnN0 KSwKICAgICAgICAgICAgICAgICAgICBfVHAoKl9fZmlyc3QpKTsKICAgICsrX19maXJzdDsKICB9 CiAgc29ydF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QpOwogIHJldHVy biBfX3Jlc3VsdF9yZWFsX2xhc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFz cyBfUmFuZG9tQWNjZXNzSXRlcj4KaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyCnBhcnRpYWxfc29y dF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAg ICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVzdWx0X2ZpcnN0LAogICAgICAgICAgICAgICAg ICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9sYXN0KQp7CgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsK CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA7CgoKICByZXR1cm4gX19wYXJ0aWFsX3NvcnRfY29weShfX2ZpcnN0LCBf X2xhc3QsIF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9sYXN0LAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZShfX3Jlc3VsdF9maXJzdCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgX192YWx1ZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9JbnB1dEl0ZXIsIGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFzcyBfQ29tcGFyZSwKICAg ICAgICAgIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX1RwPgpfUmFuZG9tQWNjZXNzSXRlciBfX3Bh cnRpYWxfc29ydF9jb3B5KF9JbnB1dEl0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX3Jlc3VsdF9maXJzdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRl ciBfX3Jlc3VsdF9sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF9Db21wYXJlIF9fY29tcCwgX0Rpc3RhbmNlKiwgX1RwKikKewogIGlmIChfX3Jlc3VsdF9maXJz dCA9PSBfX3Jlc3VsdF9sYXN0KSByZXR1cm4gX19yZXN1bHRfbGFzdDsKICBfUmFuZG9tQWNjZXNz SXRlciBfX3Jlc3VsdF9yZWFsX2xhc3QgPSBfX3Jlc3VsdF9maXJzdDsKICB3aGlsZShfX2ZpcnN0 ICE9IF9fbGFzdCAmJiBfX3Jlc3VsdF9yZWFsX2xhc3QgIT0gX19yZXN1bHRfbGFzdCkgewogICAg Kl9fcmVzdWx0X3JlYWxfbGFzdCA9ICpfX2ZpcnN0OwogICAgKytfX3Jlc3VsdF9yZWFsX2xhc3Q7 CiAgICArK19fZmlyc3Q7CiAgfQogIG1ha2VfaGVhcChfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRf cmVhbF9sYXN0LCBfX2NvbXApOwogIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewogICAgaWYg KF9fY29tcCgqX19maXJzdCwgKl9fcmVzdWx0X2ZpcnN0KSkKICAgICAgX19hZGp1c3RfaGVhcChf X3Jlc3VsdF9maXJzdCwgX0Rpc3RhbmNlKDApLAogICAgICAgICAgICAgICAgICAgIF9EaXN0YW5j ZShfX3Jlc3VsdF9yZWFsX2xhc3QgLSBfX3Jlc3VsdF9maXJzdCksCiAgICAgICAgICAgICAgICAg ICAgX1RwKCpfX2ZpcnN0KSwKICAgICAgICAgICAgICAgICAgICBfX2NvbXApOwogICAgKytfX2Zp cnN0OwogIH0KICBzb3J0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCwg X19jb21wKTsKICByZXR1cm4gX19yZXN1bHRfcmVhbF9sYXN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0lucHV0SXRlciwgY2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9Db21wYXJlPgppbmxp bmUgX1JhbmRvbUFjY2Vzc0l0ZXIKcGFydGlhbF9zb3J0X2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0 LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIg X19yZXN1bHRfZmlyc3QsCiAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fcmVz dWx0X2xhc3QsIF9Db21wYXJlIF9fY29tcCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKCiAgcmV0dXJuIF9fcGFydGlhbF9z b3J0X2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXAsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX19kaXN0YW5jZV90eXBlKF9fcmVzdWx0X2ZpcnN0KSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoX19maXJzdCkpOwp9CgoKCnRlbXBsYXRlIDxjbGFz cyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX1RwPgp2b2lkIF9fbnRoX2VsZW1lbnQoX1JhbmRv bUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCiAgICAgICAgICAg ICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIF9UcCopCnsKICB3aGlsZSAoX19sYXN0 IC0gX19maXJzdCA+IDMpIHsKICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fY3V0ID0KICAgICAgX191 bmd1YXJkZWRfcGFydGl0aW9uKF9fZmlyc3QsIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9UcChfX21lZGlhbigqX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAqKF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkvMiksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihfX2xhc3QgLSAxKSkpKTsKICAgIGlm IChfX2N1dCA8PSBfX250aCkKICAgICAgX19maXJzdCA9IF9fY3V0OwogICAgZWxzZQogICAgICBf X2xhc3QgPSBfX2N1dDsKICB9CiAgX19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QpOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+CmlubGluZSB2b2lkIG50aF9lbGVt ZW50KF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbnRoLAog ICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QpCnsKCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgX19udGhfZWxlbWVudChfX2Zp cnN0LCBfX250aCwgX19sYXN0LCBfX3ZhbHVlX3R5cGUoX19maXJzdCkpOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CnZvaWQg X19udGhfZWxlbWVudChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRl ciBfX250aCwKICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX1Rw KiwgX0NvbXBhcmUgX19jb21wKQp7CiAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiAzKSB7CiAg ICBfUmFuZG9tQWNjZXNzSXRlciBfX2N1dCA9CiAgICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihf X2ZpcnN0LCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoX19tZWRpYW4o Kl9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihfX2Zp cnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpLzIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICooX19sYXN0IC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX19jb21wKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbXAp OwogICAgaWYgKF9fY3V0IDw9IF9fbnRoKQogICAgICBfX2ZpcnN0ID0gX19jdXQ7CiAgICBlbHNl CiAgICAgIF9fbGFzdCA9IF9fY3V0OwogIH0KICBfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9f bGFzdCwgX19jb21wKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyLCBjbGFz cyBfQ29tcGFyZT4KaW5saW5lIHZvaWQgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXIgX19m aXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19udGgsCiAgICAgICAgICAgICAgICAgICAgICAgIF9S YW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQp7CgogICAgICAgICAgICAg ICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKICBfX250aF9lbGVtZW50KF9fZmlyc3QsIF9f bnRoLCBfX2xhc3QsIF9fdmFsdWVfdHlwZShfX2ZpcnN0KSwgX19jb21wKTsKfQoKCgoKdGVtcGxh dGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+Cl9Gb3J3 YXJkSXRlciBfX2xvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIg X19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfRGlz dGFuY2UqKQp7CiAgX0Rpc3RhbmNlIF9fbGVuID0gMDsKICBkaXN0YW5jZShfX2ZpcnN0LCBfX2xh c3QsIF9fbGVuKTsKICBfRGlzdGFuY2UgX19oYWxmOwogIF9Gb3J3YXJkSXRlciBfX21pZGRsZTsK CiAgd2hpbGUgKF9fbGVuID4gMCkgewogICAgX19oYWxmID0gX19sZW4gPj4gMTsKICAgIF9fbWlk ZGxlID0gX19maXJzdDsKICAgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CiAgICBpZiAoKl9f bWlkZGxlIDwgX192YWwpIHsKICAgICAgX19maXJzdCA9IF9fbWlkZGxlOwogICAgICArK19fZmly c3Q7CiAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOwogICAgfQogICAgZWxzZQogICAg ICBfX2xlbiA9IF9faGFsZjsKICB9CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KaW5saW5lIF9Gb3J3YXJkSXRlciBsb3dlcl9ib3Vu ZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsKQp7CgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA7CgogIHJldHVybiBfX2xvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWws CiAgICAgICAgICAgICAgICAgICAgICAgX19kaXN0YW5jZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xh c3MgX0Rpc3RhbmNlPgpfRm9yd2FyZEl0ZXIgX19sb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19m aXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wLCBfRGlzdGFuY2UqKQp7CiAgX0Rpc3Rh bmNlIF9fbGVuID0gMDsKICBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fbGVuKTsKICBfRGlz dGFuY2UgX19oYWxmOwogIF9Gb3J3YXJkSXRlciBfX21pZGRsZTsKCiAgd2hpbGUgKF9fbGVuID4g MCkgewogICAgX19oYWxmID0gX19sZW4gPj4gMTsKICAgIF9fbWlkZGxlID0gX19maXJzdDsKICAg IGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CiAgICBpZiAoX19jb21wKCpfX21pZGRsZSwgX192 YWwpKSB7CiAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKICAgICAgKytfX2ZpcnN0OwogICAgICBf X2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKICAgIH0KICAgIGVsc2UKICAgICAgX19sZW4gPSBf X2hhbGY7CiAgfQogIHJldHVybiBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJ dGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlPgppbmxpbmUgX0ZvcndhcmRJdGVyIGxvd2Vy X2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29t cCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICByZXR1cm4gX19s b3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXAsCiAgICAgICAgICAgICAg ICAgICAgICAgX19kaXN0YW5jZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9G b3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+Cl9Gb3J3YXJkSXRlciBfX3Vw cGVyX2JvdW5kKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfRGlzdGFuY2UqKQp7CiAg X0Rpc3RhbmNlIF9fbGVuID0gMDsKICBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fbGVuKTsK ICBfRGlzdGFuY2UgX19oYWxmOwogIF9Gb3J3YXJkSXRlciBfX21pZGRsZTsKCiAgd2hpbGUgKF9f bGVuID4gMCkgewogICAgX19oYWxmID0gX19sZW4gPj4gMTsKICAgIF9fbWlkZGxlID0gX19maXJz dDsKICAgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CiAgICBpZiAoX192YWwgPCAqX19taWRk bGUpCiAgICAgIF9fbGVuID0gX19oYWxmOwogICAgZWxzZSB7CiAgICAgIF9fZmlyc3QgPSBfX21p ZGRsZTsKICAgICAgKytfX2ZpcnN0OwogICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsK ICAgIH0KICB9CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0 ZXIsIGNsYXNzIF9UcD4KaW5saW5lIF9Gb3J3YXJkSXRlciB1cHBlcl9ib3VuZChfRm9yd2FyZEl0 ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBfVHAmIF9fdmFsKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Cgog IHJldHVybiBfX3VwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwsCiAgICAgICAgICAg ICAgICAgICAgICAgX19kaXN0YW5jZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0Rpc3RhbmNl PgpfRm9yd2FyZEl0ZXIgX191cHBlcl9ib3VuZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0Zvcndh cmRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3Zh bCwgX0NvbXBhcmUgX19jb21wLCBfRGlzdGFuY2UqKQp7CiAgX0Rpc3RhbmNlIF9fbGVuID0gMDsK ICBkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9fbGVuKTsKICBfRGlzdGFuY2UgX19oYWxmOwog IF9Gb3J3YXJkSXRlciBfX21pZGRsZTsKCiAgd2hpbGUgKF9fbGVuID4gMCkgewogICAgX19oYWxm ID0gX19sZW4gPj4gMTsKICAgIF9fbWlkZGxlID0gX19maXJzdDsKICAgIGFkdmFuY2UoX19taWRk bGUsIF9faGFsZik7CiAgICBpZiAoX19jb21wKF9fdmFsLCAqX19taWRkbGUpKQogICAgICBfX2xl biA9IF9faGFsZjsKICAgIGVsc2UgewogICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CiAgICAgICsr X19maXJzdDsKICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CiAgICB9CiAgfQogIHJl dHVybiBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAs IGNsYXNzIF9Db21wYXJlPgppbmxpbmUgX0ZvcndhcmRJdGVyIHVwcGVyX2JvdW5kKF9Gb3J3YXJk SXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbnN0IF9UcCYgX192YWwsIF9Db21wYXJlIF9fY29tcCkKewoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICByZXR1cm4gX191cHBlcl9ib3VuZChfX2Zp cnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXAsCiAgICAgICAgICAgICAgICAgICAgICAgX19kaXN0 YW5jZV90eXBlKF9fZmlyc3QpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xh c3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+CnBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+ Cl9fZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3Qs IGNvbnN0IF9UcCYgX192YWwsCiAgICAgICAgICAgICAgX0Rpc3RhbmNlKikKewogIF9EaXN0YW5j ZSBfX2xlbiA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX2xlbik7CiAgX0Rpc3Rh bmNlIF9faGFsZjsKICBfRm9yd2FyZEl0ZXIgX19taWRkbGUsIF9fbGVmdCwgX19yaWdodDsKCiAg d2hpbGUgKF9fbGVuID4gMCkgewogICAgX19oYWxmID0gX19sZW4gPj4gMTsKICAgIF9fbWlkZGxl ID0gX19maXJzdDsKICAgIGFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CiAgICBpZiAoKl9fbWlk ZGxlIDwgX192YWwpIHsKICAgICAgX19maXJzdCA9IF9fbWlkZGxlOwogICAgICArK19fZmlyc3Q7 CiAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOwogICAgfQogICAgZWxzZSBpZiAoX192 YWwgPCAqX19taWRkbGUpCiAgICAgIF9fbGVuID0gX19oYWxmOwogICAgZWxzZSB7CiAgICAgIF9f bGVmdCA9IGxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ZhbCk7CiAgICAgIGFkdmFu Y2UoX19maXJzdCwgX19sZW4pOwogICAgICBfX3JpZ2h0ID0gdXBwZXJfYm91bmQoKytfX21pZGRs ZSwgX19maXJzdCwgX192YWwpOwogICAgICByZXR1cm4gcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3 YXJkSXRlcj4oX19sZWZ0LCBfX3JpZ2h0KTsKICAgIH0KICB9CiAgcmV0dXJuIHBhaXI8X0Zvcndh cmRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fZmlyc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHA+CmlubGluZSBwYWlyPF9Gb3J3YXJkSXRlciwgX0Zv cndhcmRJdGVyPgplcXVhbF9yYW5nZShfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVy IF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoK ICByZXR1cm4gX19lcXVhbF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLAogICAgICAgICAg ICAgICAgICAgICAgIF9fZGlzdGFuY2VfdHlwZShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9EaXN0YW5j ZT4KcGFpcjxfRm9yd2FyZEl0ZXIsIF9Gb3J3YXJkSXRlcj4KX19lcXVhbF9yYW5nZShfRm9yd2Fy ZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbCwKICAg ICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXAsIF9EaXN0YW5jZSopCnsKICBfRGlzdGFuY2UgX19s ZW4gPSAwOwogIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX19sZW4pOwogIF9EaXN0YW5jZSBf X2hhbGY7CiAgX0ZvcndhcmRJdGVyIF9fbWlkZGxlLCBfX2xlZnQsIF9fcmlnaHQ7CgogIHdoaWxl IChfX2xlbiA+IDApIHsKICAgIF9faGFsZiA9IF9fbGVuID4+IDE7CiAgICBfX21pZGRsZSA9IF9f Zmlyc3Q7CiAgICBhZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOwogICAgaWYgKF9fY29tcCgqX19t aWRkbGUsIF9fdmFsKSkgewogICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CiAgICAgICsrX19maXJz dDsKICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CiAgICB9CiAgICBlbHNlIGlmIChf X2NvbXAoX192YWwsICpfX21pZGRsZSkpCiAgICAgIF9fbGVuID0gX19oYWxmOwogICAgZWxzZSB7 CiAgICAgIF9fbGVmdCA9IGxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ZhbCwgX19j b21wKTsKICAgICAgYWR2YW5jZShfX2ZpcnN0LCBfX2xlbik7CiAgICAgIF9fcmlnaHQgPSB1cHBl cl9ib3VuZCgrK19fbWlkZGxlLCBfX2ZpcnN0LCBfX3ZhbCwgX19jb21wKTsKICAgICAgcmV0dXJu IHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fbGVmdCwgX19yaWdodCk7CiAgICB9 CiAgfQogIHJldHVybiBwYWlyPF9Gb3J3YXJkSXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBf X2ZpcnN0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwLCBjbGFz cyBfQ29tcGFyZT4KaW5saW5lIHBhaXI8X0ZvcndhcmRJdGVyLCBfRm9yd2FyZEl0ZXI+CmVxdWFs X3JhbmdlKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBf VHAmIF9fdmFsLAogICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCnsKCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsKCiAgcmV0dXJuIF9fZXF1YWxfcmFuZ2UoX19maXJzdCwg X19sYXN0LCBfX3ZhbCwgX19jb21wLAogICAgICAgICAgICAgICAgICAgICAgIF9fZGlzdGFuY2Vf dHlwZShfX2ZpcnN0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9U cD4KYm9vbCBiaW5hcnlfc2VhcmNoKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIg X19sYXN0LAogICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3ZhbCkKewoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOwoKICBfRm9yd2FyZEl0ZXIgX19pID0gbG93ZXJfYm91bmQoX19maXJz dCwgX19sYXN0LCBfX3ZhbCk7CiAgcmV0dXJuIF9faSAhPSBfX2xhc3QgJiYgIShfX3ZhbCA8ICpf X2kpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9D b21wYXJlPgpib29sIGJpbmFyeV9zZWFyY2goX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJk SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLAogICAgICAg ICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgogIF9Gb3J3YXJkSXRlciBfX2kgPSBsb3dlcl9ib3VuZChfX2ZpcnN0LCBf X2xhc3QsIF9fdmFsLCBfX2NvbXApOwogIHJldHVybiBfX2kgIT0gX19sYXN0ICYmICFfX2NvbXAo X192YWwsICpfX2kpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lu cHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyPgpfT3V0cHV0SXRlciBtZXJnZShfSW5wdXRJdGVy MSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgX0lucHV0 SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgIF9P dXRwdXRJdGVyIF9fcmVzdWx0KQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7 CgoKICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7 CiAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2Zp cnN0MjsKICAgICAgKytfX2ZpcnN0MjsKICAgIH0KICAgIGVsc2UgewogICAgICAqX19yZXN1bHQg PSAqX19maXJzdDE7CiAgICAgICsrX19maXJzdDE7CiAgICB9CiAgICArK19fcmVzdWx0OwogIH0K ICByZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwg X19yZXN1bHQpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJ dGVyMiwgY2xhc3MgX091dHB1dEl0ZXIsCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KX091dHB1 dEl0ZXIgbWVyZ2UoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAg ICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3Qy LAogICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21w KQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKCiAgd2hpbGUgKF9fZmly c3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikgewogICAgaWYgKF9fY29tcCgq X19maXJzdDIsICpfX2ZpcnN0MSkpIHsKICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOwogICAg ICArK19fZmlyc3QyOwogICAgfQogICAgZWxzZSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0 MTsKICAgICAgKytfX2ZpcnN0MTsKICAgIH0KICAgICsrX19yZXN1bHQ7CiAgfQogIHJldHVybiBj b3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCkp Owp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5j ZT4Kdm9pZCBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxl LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBf X2xlbjIpCnsKICBpZiAoX19sZW4xID09IDAgfHwgX19sZW4yID09IDApCiAgICByZXR1cm47CiAg aWYgKF9fbGVuMSArIF9fbGVuMiA9PSAyKSB7CiAgICBpZiAoKl9fbWlkZGxlIDwgKl9fZmlyc3Qp CiAgICAgIGl0ZXJfc3dhcChfX2ZpcnN0LCBfX21pZGRsZSk7CiAgICByZXR1cm47CiAgfQogIF9C aWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0X2N1dCA9IF9fZmlyc3Q7CiAgX0JpZGlyZWN0aW9uYWxJ dGVyIF9fc2Vjb25kX2N1dCA9IF9fbWlkZGxlOwogIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKICBf RGlzdGFuY2UgX19sZW4yMiA9IDA7CiAgaWYgKF9fbGVuMSA+IF9fbGVuMikgewogICAgX19sZW4x MSA9IF9fbGVuMSAvIDI7CiAgICBhZHZhbmNlKF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKICAgIF9f c2Vjb25kX2N1dCA9IGxvd2VyX2JvdW5kKF9fbWlkZGxlLCBfX2xhc3QsICpfX2ZpcnN0X2N1dCk7 CiAgICBkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKICB9CiAgZWxz ZSB7CiAgICBfX2xlbjIyID0gX19sZW4yIC8gMjsKICAgIGFkdmFuY2UoX19zZWNvbmRfY3V0LCBf X2xlbjIyKTsKICAgIF9fZmlyc3RfY3V0ID0gdXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUs ICpfX3NlY29uZF9jdXQpOwogICAgZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbGVu MTEpOwogIH0KICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19uZXdfbWlkZGxlCiAgICA9IHJvdGF0ZShf X2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CiAgX19tZXJnZV93aXRob3V0X2J1 ZmZlcihfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLAogICAgICAgICAgICAgICAg ICAgICAgICAgX19sZW4xMSwgX19sZW4yMik7CiAgX19tZXJnZV93aXRob3V0X2J1ZmZlcihfX25l d19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sYXN0LCBfX2xlbjEgLSBfX2xlbjExLAogICAgICAg ICAgICAgICAgICAgICAgICAgX19sZW4yIC0gX19sZW4yMik7Cn0KCnRlbXBsYXRlIDxjbGFzcyBf QmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9EaXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+CnZvaWQg X19tZXJnZV93aXRob3V0X2J1ZmZlcihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX21pZGRsZSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKQp7CiAgaWYgKF9fbGVu MSA9PSAwIHx8IF9fbGVuMiA9PSAwKQogICAgcmV0dXJuOwogIGlmIChfX2xlbjEgKyBfX2xlbjIg PT0gMikgewogICAgaWYgKF9fY29tcCgqX19taWRkbGUsICpfX2ZpcnN0KSkKICAgICAgaXRlcl9z d2FwKF9fZmlyc3QsIF9fbWlkZGxlKTsKICAgIHJldHVybjsKICB9CiAgX0JpZGlyZWN0aW9uYWxJ dGVyIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19zZWNvbmRf Y3V0ID0gX19taWRkbGU7CiAgX0Rpc3RhbmNlIF9fbGVuMTEgPSAwOwogIF9EaXN0YW5jZSBfX2xl bjIyID0gMDsKICBpZiAoX19sZW4xID4gX19sZW4yKSB7CiAgICBfX2xlbjExID0gX19sZW4xIC8g MjsKICAgIGFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOwogICAgX19zZWNvbmRfY3V0ID0g bG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwgKl9fZmlyc3RfY3V0LCBfX2NvbXApOwogICAg ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sZW4yMik7CiAgfQogIGVsc2Ugewog ICAgX19sZW4yMiA9IF9fbGVuMiAvIDI7CiAgICBhZHZhbmNlKF9fc2Vjb25kX2N1dCwgX19sZW4y Mik7CiAgICBfX2ZpcnN0X2N1dCA9IHVwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCAqX19z ZWNvbmRfY3V0LCBfX2NvbXApOwogICAgZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQsIF9f bGVuMTEpOwogIH0KICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19uZXdfbWlkZGxlCiAgICA9IHJvdGF0 ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CiAgX19tZXJnZV93aXRob3V0 X2J1ZmZlcihfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLCBfX2xlbjExLCBfX2xl bjIyLAogICAgICAgICAgICAgICAgICAgICAgICAgX19jb21wKTsKICBfX21lcmdlX3dpdGhvdXRf YnVmZmVyKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsIF9fbGVuMSAtIF9fbGVu MTEsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2xlbjIgLSBfX2xlbjIyLCBfX2NvbXApOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMSwgY2xhc3MgX0JpZGlyZWN0aW9u YWxJdGVyMiwKICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4KX0JpZGlyZWN0aW9uYWxJdGVyMSBf X3JvdGF0ZV9hZGFwdGl2ZShfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fZmlyc3QsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMSBfX21pZGRsZSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIx IF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2Ug X19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19idWZmZXIsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fYnVmZmVyX3NpemUpCnsKICBfQmlkaXJlY3Rp b25hbEl0ZXIyIF9fYnVmZmVyX2VuZDsKICBpZiAoX19sZW4xID4gX19sZW4yICYmIF9fbGVuMiA8 PSBfX2J1ZmZlcl9zaXplKSB7CiAgICBfX2J1ZmZlcl9lbmQgPSBjb3B5KF9fbWlkZGxlLCBfX2xh c3QsIF9fYnVmZmVyKTsKICAgIGNvcHlfYmFja3dhcmQoX19maXJzdCwgX19taWRkbGUsIF9fbGFz dCk7CiAgICByZXR1cm4gY29weShfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2ZpcnN0KTsKICB9 CiAgZWxzZSBpZiAoX19sZW4xIDw9IF9fYnVmZmVyX3NpemUpIHsKICAgIF9fYnVmZmVyX2VuZCA9 IGNvcHkoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKICAgIGNvcHkoX19taWRkbGUsIF9f bGFzdCwgX19maXJzdCk7CiAgICByZXR1cm4gY29weV9iYWNrd2FyZChfX2J1ZmZlciwgX19idWZm ZXJfZW5kLCBfX2xhc3QpOwogIH0KICBlbHNlCiAgICByZXR1cm4gcm90YXRlKF9fZmlyc3QsIF9f bWlkZGxlLCBfX2xhc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMSwg Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyMiwKICAgICAgICAgIGNsYXNzIF9CaWRpcmVjdGlvbmFs SXRlcjM+Cl9CaWRpcmVjdGlvbmFsSXRlcjMgX19tZXJnZV9iYWNrd2FyZChfQmlkaXJlY3Rpb25h bEl0ZXIxIF9fZmlyc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jp ZGlyZWN0aW9uYWxJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19sYXN0MiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjMgX19yZXN1bHQpCnsK ICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKICAgIHJldHVybiBjb3B5X2JhY2t3YXJkKF9fZmly c3QyLCBfX2xhc3QyLCBfX3Jlc3VsdCk7CiAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCiAgICBy ZXR1cm4gY29weV9iYWNrd2FyZChfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOwogIC0tX19s YXN0MTsKICAtLV9fbGFzdDI7CiAgd2hpbGUgKHRydWUpIHsKICAgIGlmICgqX19sYXN0MiA8ICpf X2xhc3QxKSB7CiAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDE7CiAgICAgIGlmIChfX2ZpcnN0 MSA9PSBfX2xhc3QxKQogICAgICAgIHJldHVybiBjb3B5X2JhY2t3YXJkKF9fZmlyc3QyLCArK19f bGFzdDIsIF9fcmVzdWx0KTsKICAgICAgLS1fX2xhc3QxOwogICAgfQogICAgZWxzZSB7CiAgICAg ICotLV9fcmVzdWx0ID0gKl9fbGFzdDI7CiAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQog ICAgICAgIHJldHVybiBjb3B5X2JhY2t3YXJkKF9fZmlyc3QxLCArK19fbGFzdDEsIF9fcmVzdWx0 KTsKICAgICAgLS1fX2xhc3QyOwogICAgfQogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVj dGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCiAgICAgICAgICBjbGFzcyBf QmlkaXJlY3Rpb25hbEl0ZXIzLCBjbGFzcyBfQ29tcGFyZT4KX0JpZGlyZWN0aW9uYWxJdGVyMyBf X21lcmdlX2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFsSXRlcjEgX19maXJzdDEsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9f Zmlyc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9u YWxJdGVyMiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jp ZGlyZWN0aW9uYWxJdGVyMyBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9Db21wYXJlIF9fY29tcCkKewogIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQogICAg cmV0dXJuIGNvcHlfYmFja3dhcmQoX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0KTsKICBpZiAo X19maXJzdDIgPT0gX19sYXN0MikKICAgIHJldHVybiBjb3B5X2JhY2t3YXJkKF9fZmlyc3QxLCBf X2xhc3QxLCBfX3Jlc3VsdCk7CiAgLS1fX2xhc3QxOwogIC0tX19sYXN0MjsKICB3aGlsZSAodHJ1 ZSkgewogICAgaWYgKF9fY29tcCgqX19sYXN0MiwgKl9fbGFzdDEpKSB7CiAgICAgICotLV9fcmVz dWx0ID0gKl9fbGFzdDE7CiAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQogICAgICAgIHJl dHVybiBjb3B5X2JhY2t3YXJkKF9fZmlyc3QyLCArK19fbGFzdDIsIF9fcmVzdWx0KTsKICAgICAg LS1fX2xhc3QxOwogICAgfQogICAgZWxzZSB7CiAgICAgICotLV9fcmVzdWx0ID0gKl9fbGFzdDI7 CiAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQogICAgICAgIHJldHVybiBjb3B5X2JhY2t3 YXJkKF9fZmlyc3QxLCArK19fbGFzdDEsIF9fcmVzdWx0KTsKICAgICAgLS1fX2xhc3QyOwogICAg fQogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3Rh bmNlLCBjbGFzcyBfUG9pbnRlcj4Kdm9pZCBfX21lcmdlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFs SXRlciBfX2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9f bWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwK ICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIs CiAgICAgICAgICAgICAgICAgICAgICBfUG9pbnRlciBfX2J1ZmZlciwgX0Rpc3RhbmNlIF9fYnVm ZmVyX3NpemUpCnsKICBpZiAoX19sZW4xIDw9IF9fbGVuMiAmJiBfX2xlbjEgPD0gX19idWZmZXJf c2l6ZSkgewogICAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gY29weShfX2ZpcnN0LCBfX21pZGRs ZSwgX19idWZmZXIpOwogICAgbWVyZ2UoX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19taWRkbGUs IF9fbGFzdCwgX19maXJzdCk7CiAgfQogIGVsc2UgaWYgKF9fbGVuMiA8PSBfX2J1ZmZlcl9zaXpl KSB7CiAgICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBjb3B5KF9fbWlkZGxlLCBfX2xhc3QsIF9f YnVmZmVyKTsKICAgIF9fbWVyZ2VfYmFja3dhcmQoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVy LCBfX2J1ZmZlcl9lbmQsIF9fbGFzdCk7CiAgfQogIGVsc2UgewogICAgX0JpZGlyZWN0aW9uYWxJ dGVyIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX3NlY29u ZF9jdXQgPSBfX21pZGRsZTsKICAgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKICAgIF9EaXN0YW5j ZSBfX2xlbjIyID0gMDsKICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpIHsKICAgICAgX19sZW4xMSA9 IF9fbGVuMSAvIDI7CiAgICAgIGFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOwogICAgICBf X3NlY29uZF9jdXQgPSBsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQp OwogICAgICBkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKICAgIH0K ICAgIGVsc2UgewogICAgICBfX2xlbjIyID0gX19sZW4yIC8gMjsKICAgICAgYWR2YW5jZShfX3Nl Y29uZF9jdXQsIF9fbGVuMjIpOwogICAgICBfX2ZpcnN0X2N1dCA9IHVwcGVyX2JvdW5kKF9fZmly c3QsIF9fbWlkZGxlLCAqX19zZWNvbmRfY3V0KTsKICAgICAgZGlzdGFuY2UoX19maXJzdCwgX19m aXJzdF9jdXQsIF9fbGVuMTEpOwogICAgfQogICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbmV3X21p ZGRsZSA9CiAgICAgIF9fcm90YXRlX2FkYXB0aXZlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19z ZWNvbmRfY3V0LCBfX2xlbjEgLSBfX2xlbjExLAogICAgICAgICAgICAgICAgICAgICAgICBfX2xl bjIyLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSk7CiAgICBfX21lcmdlX2FkYXB0aXZlKF9fZmly c3QsIF9fZmlyc3RfY3V0LCBfX25ld19taWRkbGUsIF9fbGVuMTEsCiAgICAgICAgICAgICAgICAg ICAgIF9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKICAgIF9fbWVyZ2VfYWRhcHRp dmUoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwgX19sZW4xIC0gX19sZW4xMSwK ICAgICAgICAgICAgICAgICAgICAgX19sZW4yIC0gX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVy X3NpemUpOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3Mg X0Rpc3RhbmNlLCBjbGFzcyBfUG9pbnRlciwKICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgp2b2lk IF9fbWVyZ2VfYWRhcHRpdmUoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCiAgICAgICAgICAg ICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAgICAg ICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgX0Rp c3RhbmNlIF9fbGVuMSwgX0Rpc3RhbmNlIF9fbGVuMiwKICAgICAgICAgICAgICAgICAgICAgIF9Q b2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwKICAgICAgICAgICAgICAg ICAgICAgIF9Db21wYXJlIF9fY29tcCkKewogIGlmIChfX2xlbjEgPD0gX19sZW4yICYmIF9fbGVu MSA8PSBfX2J1ZmZlcl9zaXplKSB7CiAgICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBjb3B5KF9f Zmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlcik7CiAgICBtZXJnZShfX2J1ZmZlciwgX19idWZmZXJf ZW5kLCBfX21pZGRsZSwgX19sYXN0LCBfX2ZpcnN0LCBfX2NvbXApOwogIH0KICBlbHNlIGlmIChf X2xlbjIgPD0gX19idWZmZXJfc2l6ZSkgewogICAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gY29w eShfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CiAgICBfX21lcmdlX2JhY2t3YXJkKF9fZmly c3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2xhc3QsCiAgICAgICAgICAg ICAgICAgICAgIF9fY29tcCk7CiAgfQogIGVsc2UgewogICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9f Zmlyc3RfY3V0ID0gX19maXJzdDsKICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX3NlY29uZF9jdXQg PSBfX21pZGRsZTsKICAgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKICAgIF9EaXN0YW5jZSBfX2xl bjIyID0gMDsKICAgIGlmIChfX2xlbjEgPiBfX2xlbjIpIHsKICAgICAgX19sZW4xMSA9IF9fbGVu MSAvIDI7CiAgICAgIGFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOwogICAgICBfX3NlY29u ZF9jdXQgPSBsb3dlcl9ib3VuZChfX21pZGRsZSwgX19sYXN0LCAqX19maXJzdF9jdXQsIF9fY29t cCk7CiAgICAgIGRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGVuMjIpOwogICAg fQogICAgZWxzZSB7CiAgICAgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOwogICAgICBhZHZhbmNlKF9f c2Vjb25kX2N1dCwgX19sZW4yMik7CiAgICAgIF9fZmlyc3RfY3V0ID0gdXBwZXJfYm91bmQoX19m aXJzdCwgX19taWRkbGUsICpfX3NlY29uZF9jdXQsIF9fY29tcCk7CiAgICAgIGRpc3RhbmNlKF9f Zmlyc3QsIF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKICAgIH0KICAgIF9CaWRpcmVjdGlvbmFsSXRl ciBfX25ld19taWRkbGUgPQogICAgICBfX3JvdGF0ZV9hZGFwdGl2ZShfX2ZpcnN0X2N1dCwgX19t aWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sZW4xIC0gX19sZW4xMSwKICAgICAgICAgICAgICAgICAg ICAgICAgX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOwogICAgX19tZXJnZV9hZGFw dGl2ZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLCBfX2xlbjExLAogICAgICAg ICAgICAgICAgICAgICBfX2xlbjIyLCBfX2J1ZmZlciwgX19idWZmZXJfc2l6ZSwgX19jb21wKTsK ICAgIF9fbWVyZ2VfYWRhcHRpdmUoX19uZXdfbWlkZGxlLCBfX3NlY29uZF9jdXQsIF9fbGFzdCwg X19sZW4xIC0gX19sZW4xMSwKICAgICAgICAgICAgICAgICAgICAgX19sZW4yIC0gX19sZW4yMiwg X19idWZmZXIsIF9fYnVmZmVyX3NpemUsIF9fY29tcCk7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0JpZGlyZWN0aW9uYWxJdGVyLCBjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZv aWQgX19pbnBsYWNlX21lcmdlX2F1eChfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19taWRkbGUsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwg X1RwKiwgX0Rpc3RhbmNlKikKewogIF9EaXN0YW5jZSBfX2xlbjEgPSAwOwogIGRpc3RhbmNlKF9f Zmlyc3QsIF9fbWlkZGxlLCBfX2xlbjEpOwogIF9EaXN0YW5jZSBfX2xlbjIgPSAwOwogIGRpc3Rh bmNlKF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMik7CgogIF9UZW1wb3JhcnlfYnVmZmVyPF9CaWRp cmVjdGlvbmFsSXRlciwgX1RwPiBfX2J1ZihfX2ZpcnN0LCBfX2xhc3QpOwogIGlmIChfX2J1Zi5i ZWdpbigpID09IDApCiAgICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxl LCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yKTsKICBlbHNlCiAgICBfX21lcmdlX2FkYXB0aXZlKF9f Zmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yLAogICAgICAgICAgICAgICAg ICAgICBfX2J1Zi5iZWdpbigpLCBfRGlzdGFuY2UoX19idWYuc2l6ZSgpKSk7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9UcCwKICAgICAgICAgIGNsYXNzIF9E aXN0YW5jZSwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSB2b2lkIF9faW5wbGFjZV9tZXJnZV9hdXgo X0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsIF9UcCosIF9EaXN0YW5jZSosCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKQp7CiAgX0Rpc3RhbmNl IF9fbGVuMSA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19taWRkbGUsIF9fbGVuMSk7CiAgX0Rp c3RhbmNlIF9fbGVuMiA9IDA7CiAgZGlzdGFuY2UoX19taWRkbGUsIF9fbGFzdCwgX19sZW4yKTsK CiAgX1RlbXBvcmFyeV9idWZmZXI8X0JpZGlyZWN0aW9uYWxJdGVyLCBfVHA+IF9fYnVmKF9fZmly c3QsIF9fbGFzdCk7CiAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKICAgIF9fbWVyZ2Vfd2l0aG91 dF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19sZW4xLCBfX2xlbjIsIF9fY29t cCk7CiAgZWxzZQogICAgX19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0 LCBfX2xlbjEsIF9fbGVuMiwKICAgICAgICAgICAgICAgICAgICAgX19idWYuYmVnaW4oKSwgX0Rp c3RhbmNlKF9fYnVmLnNpemUoKSksCiAgICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+CmlubGluZSB2b2lkIGlucGxhY2VfbWVy Z2UoX0JpZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg X0JpZGlyZWN0aW9uYWxJdGVyIF9fbWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIF9C aWRpcmVjdGlvbmFsSXRlciBfX2xhc3QpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7 CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgoKICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX21pZGRsZSA9PSBf X2xhc3QpCiAgICByZXR1cm47CiAgX19pbnBsYWNlX21lcmdlX2F1eChfX2ZpcnN0LCBfX21pZGRs ZSwgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgX192YWx1ZV90eXBlKF9fZmlyc3QpLCBf X2Rpc3RhbmNlX3R5cGUoX19maXJzdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9u YWxJdGVyLCBjbGFzcyBfQ29tcGFyZT4KaW5saW5lIHZvaWQgaW5wbGFjZV9tZXJnZShfQmlkaXJl Y3Rpb25hbEl0ZXIgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rp b25hbEl0ZXIgX19taWRkbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9u YWxJdGVyIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQp7CgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOwoKCgogIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlIHx8IF9fbWlk ZGxlID09IF9fbGFzdCkKICAgIHJldHVybjsKICBfX2lucGxhY2VfbWVyZ2VfYXV4KF9fZmlyc3Qs IF9fbWlkZGxlLCBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlX3R5cGUoX19m aXJzdCksIF9fZGlzdGFuY2VfdHlwZShfX2ZpcnN0KSwKICAgICAgICAgICAgICAgICAgICAgIF9f Y29tcCk7Cn0KCgoKCgoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJ dGVyMj4KYm9vbCBpbmNsdWRlcyhfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19s YXN0MSwKICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19s YXN0MikKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIHdoaWxlIChfX2ZpcnN0 MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCiAgICBpZiAoKl9fZmlyc3QyIDwg Kl9fZmlyc3QxKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBlbHNlIGlmKCpfX2ZpcnN0MSA8ICpf X2ZpcnN0MikKICAgICAgKytfX2ZpcnN0MTsKICAgIGVsc2UKICAgICAgKytfX2ZpcnN0MSwgKytf X2ZpcnN0MjsKCiAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Db21wYXJlPgpib29sIGlu Y2x1ZGVzKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAg ICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLCBfQ29tcGFy ZSBfX2NvbXApCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKCiAgd2hpbGUgKF9f Zmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKICAgIGlmIChfX2NvbXAo Kl9fZmlyc3QyLCAqX19maXJzdDEpKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBlbHNlIGlmKF9f Y29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCiAgICAgICsrX19maXJzdDE7CiAgICBlbHNlCiAg ICAgICsrX19maXJzdDEsICsrX19maXJzdDI7CgogIHJldHVybiBfX2ZpcnN0MiA9PSBfX2xhc3Qy Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFz cyBfT3V0cHV0SXRlcj4KX091dHB1dEl0ZXIgc2V0X3VuaW9uKF9JbnB1dEl0ZXIxIF9fZmlyc3Qx LCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIg X19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICBfT3V0 cHV0SXRlciBfX3Jlc3VsdCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoK CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0Mikgewog ICAgaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikgewogICAgICAqX19yZXN1bHQgPSAqX19maXJz dDE7CiAgICAgICsrX19maXJzdDE7CiAgICB9CiAgICBlbHNlIGlmICgqX19maXJzdDIgPCAqX19m aXJzdDEpIHsKICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOwogICAgICArK19fZmlyc3QyOwog ICAgfQogICAgZWxzZSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKICAgICAgKytfX2Zp cnN0MTsKICAgICAgKytfX2ZpcnN0MjsKICAgIH0KICAgICsrX19yZXN1bHQ7CiAgfQogIHJldHVy biBjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3Vs dCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBj bGFzcyBfT3V0cHV0SXRlciwKICAgICAgICAgIGNsYXNzIF9Db21wYXJlPgpfT3V0cHV0SXRlciBz ZXRfdW5pb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAg ICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0 MiwKICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LCBfQ29tcGFyZSBf X2NvbXApCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKICB3aGlsZSAo X19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKSB7CiAgICBpZiAoX19j b21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkgewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7 CiAgICAgICsrX19maXJzdDE7CiAgICB9CiAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAq X19maXJzdDEpKSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKICAgICAgKytfX2ZpcnN0 MjsKICAgIH0KICAgIGVsc2UgewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CiAgICAgICsr X19maXJzdDE7CiAgICAgICsrX19maXJzdDI7CiAgICB9CiAgICArK19fcmVzdWx0OwogIH0KICBy ZXR1cm4gY29weShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19y ZXN1bHQpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVy MiwgY2xhc3MgX091dHB1dEl0ZXI+Cl9PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0 SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpCnsKCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3Qx ICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCiAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQog ICAgICArK19fZmlyc3QxOwogICAgZWxzZSBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQogICAg ICArK19fZmlyc3QyOwogICAgZWxzZSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKICAg ICAgKytfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MjsKICAgICAgKytfX3Jlc3VsdDsKICAgIH0K ICByZXR1cm4gX19yZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3Mg X0lucHV0SXRlcjIsIGNsYXNzIF9PdXRwdXRJdGVyLAogICAgICAgICAgY2xhc3MgX0NvbXBhcmU+ Cl9PdXRwdXRJdGVyIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1 dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIg X19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX091dHB1dEl0ZXIgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKewoKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgOwoKCgogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYm IF9fZmlyc3QyICE9IF9fbGFzdDIpCiAgICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3Qy KSkKICAgICAgKytfX2ZpcnN0MTsKICAgIGVsc2UgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2Zp cnN0MSkpCiAgICAgICsrX19maXJzdDI7CiAgICBlbHNlIHsKICAgICAgKl9fcmVzdWx0ID0gKl9f Zmlyc3QxOwogICAgICArK19fZmlyc3QxOwogICAgICArK19fZmlyc3QyOwogICAgICArK19fcmVz dWx0OwogICAgfQogIHJldHVybiBfX3Jlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0 ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0ZXI+Cl9PdXRwdXRJdGVyIHNl dF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAog ICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRl cjIgX19sYXN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1 bHQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgogIHdoaWxlIChfX2Zp cnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCiAgICBpZiAoKl9fZmlyc3Qx IDwgKl9fZmlyc3QyKSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKICAgICAgKytfX2Zp cnN0MTsKICAgICAgKytfX3Jlc3VsdDsKICAgIH0KICAgIGVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpf X2ZpcnN0MSkKICAgICAgKytfX2ZpcnN0MjsKICAgIGVsc2UgewogICAgICArK19fZmlyc3QxOwog ICAgICArK19fZmlyc3QyOwogICAgfQogIHJldHVybiBjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBf X3Jlc3VsdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRl cjIsIGNsYXNzIF9PdXRwdXRJdGVyLAogICAgICAgICAgY2xhc3MgX0NvbXBhcmU+Cl9PdXRwdXRJ dGVyIHNldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xh c3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lu cHV0SXRlcjIgX19sYXN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIg X19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOwoKCgogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9f bGFzdDIpCiAgICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkgewogICAgICAqX19y ZXN1bHQgPSAqX19maXJzdDE7CiAgICAgICsrX19maXJzdDE7CiAgICAgICsrX19yZXN1bHQ7CiAg ICB9CiAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQogICAgICArK19f Zmlyc3QyOwogICAgZWxzZSB7CiAgICAgICsrX19maXJzdDE7CiAgICAgICsrX19maXJzdDI7CiAg ICB9CiAgcmV0dXJuIGNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX091dHB1dEl0 ZXI+Cl9PdXRwdXRJdGVyCnNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShfSW5wdXRJdGVyMSBfX2Zp cnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1 dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVyMiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAg ICAgICAgX091dHB1dEl0ZXIgX19yZXN1bHQpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Cgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDsKCgogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9f bGFzdDIpCiAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKSB7CiAgICAgICpfX3Jlc3VsdCA9 ICpfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MTsKICAgICAgKytfX3Jlc3VsdDsKICAgIH0KICAg IGVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkgewogICAgICAqX19yZXN1bHQgPSAqX19m aXJzdDI7CiAgICAgICsrX19maXJzdDI7CiAgICAgICsrX19yZXN1bHQ7CiAgICB9CiAgICBlbHNl IHsKICAgICAgKytfX2ZpcnN0MTsKICAgICAgKytfX2ZpcnN0MjsKICAgIH0KICByZXR1cm4gY29w eShfX2ZpcnN0MiwgX19sYXN0MiwgY29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3Mg X091dHB1dEl0ZXIsCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZT4KX091dHB1dEl0ZXIKc2V0X3N5 bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xh c3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1 dEl0ZXIyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jl c3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkKewoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCgogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xh c3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCiAgICBpZiAoX19jb21wKCpfX2ZpcnN0MSwgKl9f Zmlyc3QyKSkgewogICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CiAgICAgICsrX19maXJzdDE7 CiAgICAgICsrX19yZXN1bHQ7CiAgICB9CiAgICBlbHNlIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAq X19maXJzdDEpKSB7CiAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKICAgICAgKytfX2ZpcnN0 MjsKICAgICAgKytfX3Jlc3VsdDsKICAgIH0KICAgIGVsc2UgewogICAgICArK19fZmlyc3QxOwog ICAgICArK19fZmlyc3QyOwogICAgfQogIHJldHVybiBjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBj b3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCkpOwp9CgoKCgp0ZW1wbGF0ZSA8Y2xhc3Mg X0ZvcndhcmRJdGVyPgpfRm9yd2FyZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmly c3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKICBpZiAoX19m aXJzdCA9PSBfX2xhc3QpIHJldHVybiBfX2ZpcnN0OwogIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCA9 IF9fZmlyc3Q7CiAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCiAgICBpZiAoKl9fcmVzdWx0 IDwgKl9fZmlyc3QpCiAgICAgIF9fcmVzdWx0ID0gX19maXJzdDsKICByZXR1cm4gX19yZXN1bHQ7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9Db21wYXJlPgpfRm9yd2Fy ZEl0ZXIgbWF4X2VsZW1lbnQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCnsKCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA7CgoKCiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KSByZXR1cm4gX19maXJzdDsKICBf Rm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OwogIHdoaWxlICgrK19fZmlyc3QgIT0gX19s YXN0KQogICAgaWYgKF9fY29tcCgqX19yZXN1bHQsICpfX2ZpcnN0KSkgX19yZXN1bHQgPSBfX2Zp cnN0OwogIHJldHVybiBfX3Jlc3VsdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4K X0ZvcndhcmRJdGVyIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0 ZXIgX19sYXN0KQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0 KSByZXR1cm4gX19maXJzdDsKICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQgPSBfX2ZpcnN0OwogIHdo aWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQogICAgaWYgKCpfX2ZpcnN0IDwgKl9fcmVzdWx0KQog ICAgICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfQ29tcGFyZT4KX0ZvcndhcmRJdGVyIG1pbl9lbGVt ZW50KF9Gb3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LAogICAgICAgICAg ICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKQp7CgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCgog IGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fZmlyc3Q7CiAgX0ZvcndhcmRJdGVyIF9f cmVzdWx0ID0gX19maXJzdDsKICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKICAgIGlmIChf X2NvbXAoKl9fZmlyc3QsICpfX3Jlc3VsdCkpCiAgICAgIF9fcmVzdWx0ID0gX19maXJzdDsKICBy ZXR1cm4gX19yZXN1bHQ7Cn0KCgoKCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXI+ CmJvb2wgbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIgX19maXJzdCwgX0JpZGly ZWN0aW9uYWxJdGVyIF9fbGFzdCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDsKCgogIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKICAgIHJldHVybiBmYWxzZTsKICBfQmlkaXJl Y3Rpb25hbEl0ZXIgX19pID0gX19maXJzdDsKICArK19faTsKICBpZiAoX19pID09IF9fbGFzdCkK ICAgIHJldHVybiBmYWxzZTsKICBfX2kgPSBfX2xhc3Q7CiAgLS1fX2k7CgogIGZvcig7Oykgewog ICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faWkgPSBfX2k7CiAgICAtLV9faTsKICAgIGlmICgqX19p IDwgKl9faWkpIHsKICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyIF9faiA9IF9fbGFzdDsKICAgICAg d2hpbGUgKCEoKl9faSA8ICotLV9faikpCiAgICAgICAge30KICAgICAgaXRlcl9zd2FwKF9faSwg X19qKTsKICAgICAgcmV2ZXJzZShfX2lpLCBfX2xhc3QpOwogICAgICByZXR1cm4gdHJ1ZTsKICAg IH0KICAgIGlmIChfX2kgPT0gX19maXJzdCkgewogICAgICByZXZlcnNlKF9fZmlyc3QsIF9fbGFz dCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQmlk aXJlY3Rpb25hbEl0ZXIsIGNsYXNzIF9Db21wYXJlPgpib29sIG5leHRfcGVybXV0YXRpb24oX0Jp ZGlyZWN0aW9uYWxJdGVyIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlciBfX2xhc3QsCiAgICAg ICAgICAgICAgICAgICAgICBfQ29tcGFyZSBfX2NvbXApCnsKCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA7CgoKCiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgcmV0dXJuIGZh bHNlOwogIF9CaWRpcmVjdGlvbmFsSXRlciBfX2kgPSBfX2ZpcnN0OwogICsrX19pOwogIGlmIChf X2kgPT0gX19sYXN0KQogICAgcmV0dXJuIGZhbHNlOwogIF9faSA9IF9fbGFzdDsKICAtLV9faTsK CiAgZm9yKDs7KSB7CiAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19paSA9IF9faTsKICAgIC0tX19p OwogICAgaWYgKF9fY29tcCgqX19pLCAqX19paSkpIHsKICAgICAgX0JpZGlyZWN0aW9uYWxJdGVy IF9faiA9IF9fbGFzdDsKICAgICAgd2hpbGUgKCFfX2NvbXAoKl9faSwgKi0tX19qKSkKICAgICAg ICB7fQogICAgICBpdGVyX3N3YXAoX19pLCBfX2opOwogICAgICByZXZlcnNlKF9faWksIF9fbGFz dCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKF9faSA9PSBfX2ZpcnN0KSB7CiAg ICAgIHJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQog IH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcj4KYm9vbCBwcmV2X3Blcm11 dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlciBfX2ZpcnN0LCBfQmlkaXJlY3Rpb25hbEl0ZXIgX19s YXN0KQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgaWYgKF9fZmly c3QgPT0gX19sYXN0KQogICAgcmV0dXJuIGZhbHNlOwogIF9CaWRpcmVjdGlvbmFsSXRlciBfX2kg PSBfX2ZpcnN0OwogICsrX19pOwogIGlmIChfX2kgPT0gX19sYXN0KQogICAgcmV0dXJuIGZhbHNl OwogIF9faSA9IF9fbGFzdDsKICAtLV9faTsKCiAgZm9yKDs7KSB7CiAgICBfQmlkaXJlY3Rpb25h bEl0ZXIgX19paSA9IF9faTsKICAgIC0tX19pOwogICAgaWYgKCpfX2lpIDwgKl9faSkgewogICAg ICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19qID0gX19sYXN0OwogICAgICB3aGlsZSAoISgqLS1fX2og PCAqX19pKSkKICAgICAgICB7fQogICAgICBpdGVyX3N3YXAoX19pLCBfX2opOwogICAgICByZXZl cnNlKF9faWksIF9fbGFzdCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKF9faSA9 PSBfX2ZpcnN0KSB7CiAgICAgIHJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKICAgICAgcmV0dXJu IGZhbHNlOwogICAgfQogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwg Y2xhc3MgX0NvbXBhcmU+CmJvb2wgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXIg X19maXJzdCwgX0JpZGlyZWN0aW9uYWxJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAg IF9Db21wYXJlIF9fY29tcCkKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsK CgoKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAgICByZXR1cm4gZmFsc2U7CiAgX0JpZGlyZWN0 aW9uYWxJdGVyIF9faSA9IF9fZmlyc3Q7CiAgKytfX2k7CiAgaWYgKF9faSA9PSBfX2xhc3QpCiAg ICByZXR1cm4gZmFsc2U7CiAgX19pID0gX19sYXN0OwogIC0tX19pOwoKICBmb3IoOzspIHsKICAg IF9CaWRpcmVjdGlvbmFsSXRlciBfX2lpID0gX19pOwogICAgLS1fX2k7CiAgICBpZiAoX19jb21w KCpfX2lpLCAqX19pKSkgewogICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIgX19qID0gX19sYXN0Owog ICAgICB3aGlsZSAoIV9fY29tcCgqLS1fX2osICpfX2kpKQogICAgICAgIHt9CiAgICAgIGl0ZXJf c3dhcChfX2ksIF9faik7CiAgICAgIHJldmVyc2UoX19paSwgX19sYXN0KTsKICAgICAgcmV0dXJu IHRydWU7CiAgICB9CiAgICBpZiAoX19pID09IF9fZmlyc3QpIHsKICAgICAgcmV2ZXJzZShfX2Zp cnN0LCBfX2xhc3QpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CgoKCnRlbXBsYXRl IDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXI+Cl9JbnB1dEl0ZXIgZmluZF9m aXJzdF9vZihfSW5wdXRJdGVyIF9fZmlyc3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCiAgICAgICAg ICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xh c3QyKQp7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCgogIGZvciAoIDsgX19maXJzdDEg IT0gX19sYXN0MTsgKytfX2ZpcnN0MSkKICAgIGZvciAoX0ZvcndhcmRJdGVyIF9faXRlciA9IF9f Zmlyc3QyOyBfX2l0ZXIgIT0gX19sYXN0MjsgKytfX2l0ZXIpCiAgICAgIGlmICgqX19maXJzdDEg PT0gKl9faXRlcikKICAgICAgICByZXR1cm4gX19maXJzdDE7CiAgcmV0dXJuIF9fbGFzdDE7Cn0K CnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9C aW5hcnlQcmVkaWNhdGU+Cl9JbnB1dEl0ZXIgZmluZF9maXJzdF9vZihfSW5wdXRJdGVyIF9fZmly c3QxLCBfSW5wdXRJdGVyIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2Fy ZEl0ZXIgX19maXJzdDIsIF9Gb3J3YXJkSXRlciBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAg ICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApCnsKCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwoKCgogIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSkK ICAgIGZvciAoX0ZvcndhcmRJdGVyIF9faXRlciA9IF9fZmlyc3QyOyBfX2l0ZXIgIT0gX19sYXN0 MjsgKytfX2l0ZXIpCiAgICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19pdGVyKSkKICAgICAg ICByZXR1cm4gX19maXJzdDE7CiAgcmV0dXJuIF9fbGFzdDE7Cn0KIyAzMzkwICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxnby5oIiAzCnRlbXBsYXRlIDxjbGFz cyBfRm9yd2FyZEl0ZXIxLCBjbGFzcyBfRm9yd2FyZEl0ZXIyPgpfRm9yd2FyZEl0ZXIxIF9fZmlu ZF9lbmQoX0ZvcndhcmRJdGVyMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyMSBfX2xhc3QxLAogICAg ICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVy MiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcs IGZvcndhcmRfaXRlcmF0b3JfdGFnKQp7CiAgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCiAgICBy ZXR1cm4gX19sYXN0MTsKICBlbHNlIHsKICAgIF9Gb3J3YXJkSXRlcjEgX19yZXN1bHQgPSBfX2xh c3QxOwogICAgd2hpbGUgKDEpIHsKICAgICAgX0ZvcndhcmRJdGVyMSBfX25ld19yZXN1bHQKICAg ICAgICA9IHNlYXJjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOwogICAg ICBpZiAoX19uZXdfcmVzdWx0ID09IF9fbGFzdDEpCiAgICAgICAgcmV0dXJuIF9fcmVzdWx0Owog ICAgICBlbHNlIHsKICAgICAgICBfX3Jlc3VsdCA9IF9fbmV3X3Jlc3VsdDsKICAgICAgICBfX2Zp cnN0MSA9IF9fbmV3X3Jlc3VsdDsKICAgICAgICArK19fZmlyc3QxOwogICAgICB9CiAgICB9CiAg fQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJdGVyMiwK ICAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+Cl9Gb3J3YXJkSXRlcjEgX19maW5kX2Vu ZChfRm9yd2FyZEl0ZXIxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXIxIF9fbGFzdDEsCiAgICAgICAg ICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXIyIF9f bGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgZm9y d2FyZF9pdGVyYXRvcl90YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBfQmluYXJ5UHJlZGlj YXRlIF9fY29tcCkKewogIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQogICAgcmV0dXJuIF9fbGFz dDE7CiAgZWxzZSB7CiAgICBfRm9yd2FyZEl0ZXIxIF9fcmVzdWx0ID0gX19sYXN0MTsKICAgIHdo aWxlICgxKSB7CiAgICAgIF9Gb3J3YXJkSXRlcjEgX19uZXdfcmVzdWx0CiAgICAgICAgPSBzZWFy Y2goX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLCBfX2NvbXApOwogICAgICBp ZiAoX19uZXdfcmVzdWx0ID09IF9fbGFzdDEpCiAgICAgICAgcmV0dXJuIF9fcmVzdWx0OwogICAg ICBlbHNlIHsKICAgICAgICBfX3Jlc3VsdCA9IF9fbmV3X3Jlc3VsdDsKICAgICAgICBfX2ZpcnN0 MSA9IF9fbmV3X3Jlc3VsdDsKICAgICAgICArK19fZmlyc3QxOwogICAgICB9CiAgICB9CiAgfQp9 CgoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlv bmFsSXRlcjI+Cl9CaWRpcmVjdGlvbmFsSXRlcjEKX19maW5kX2VuZChfQmlkaXJlY3Rpb25hbEl0 ZXIxIF9fZmlyc3QxLCBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgX0Jp ZGlyZWN0aW9uYWxJdGVyMiBfX2ZpcnN0MiwgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX2xhc3QyLAog ICAgICAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBiaWRpcmVjdGlvbmFsX2l0ZXJh dG9yX3RhZykKewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA7CgogIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXIxPiBf UmV2SXRlcjE7CiAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcjI+ IF9SZXZJdGVyMjsKCiAgX1Jldkl0ZXIxIF9fcmxhc3QxKF9fZmlyc3QxKTsKICBfUmV2SXRlcjIg X19ybGFzdDIoX19maXJzdDIpOwogIF9SZXZJdGVyMSBfX3JyZXN1bHQgPSBzZWFyY2goX1Jldkl0 ZXIxKF9fbGFzdDEpLCBfX3JsYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9S ZXZJdGVyMihfX2xhc3QyKSwgX19ybGFzdDIpOwoKICBpZiAoX19ycmVzdWx0ID09IF9fcmxhc3Qx KQogICAgcmV0dXJuIF9fbGFzdDE7CiAgZWxzZSB7CiAgICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9f cmVzdWx0ID0gX19ycmVzdWx0LmJhc2UoKTsKICAgIGFkdmFuY2UoX19yZXN1bHQsIC1kaXN0YW5j ZShfX2ZpcnN0MiwgX19sYXN0MikpOwogICAgcmV0dXJuIF9fcmVzdWx0OwogIH0KfQoKdGVtcGxh dGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIs CiAgICAgICAgICBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgpfQmlkaXJlY3Rpb25hbEl0ZXIxCl9f ZmluZF9lbmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0MSwgX0JpZGlyZWN0aW9uYWxJdGVy MSBfX2xhc3QxLAogICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19maXJzdDIsIF9CaWRp cmVjdGlvbmFsSXRlcjIgX19sYXN0MiwKICAgICAgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9y X3RhZywgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCiAgICAgICAgICAgX0JpbmFyeVByZWRp Y2F0ZSBfX2NvbXApCnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOwoKICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8X0JpZGlyZWN0aW9uYWxJdGVy MT4gX1Jldkl0ZXIxOwogIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0 ZXIyPiBfUmV2SXRlcjI7CgogIF9SZXZJdGVyMSBfX3JsYXN0MShfX2ZpcnN0MSk7CiAgX1Jldkl0 ZXIyIF9fcmxhc3QyKF9fZmlyc3QyKTsKICBfUmV2SXRlcjEgX19ycmVzdWx0ID0gc2VhcmNoKF9S ZXZJdGVyMShfX2xhc3QxKSwgX19ybGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfUmV2SXRlcjIoX19sYXN0MiksIF9fcmxhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX19jb21wKTsKCiAgaWYgKF9fcnJlc3VsdCA9PSBfX3JsYXN0MSkKICAgIHJldHVybiBf X2xhc3QxOwogIGVsc2UgewogICAgX0JpZGlyZWN0aW9uYWxJdGVyMSBfX3Jlc3VsdCA9IF9fcnJl c3VsdC5iYXNlKCk7CiAgICBhZHZhbmNlKF9fcmVzdWx0LCAtZGlzdGFuY2UoX19maXJzdDIsIF9f bGFzdDIpKTsKICAgIHJldHVybiBfX3Jlc3VsdDsKICB9Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9G b3J3YXJkSXRlcjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+CmlubGluZSBfRm9yd2FyZEl0ZXIxCmZp bmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcjEgX19sYXN0MSwKICAg ICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyMiBfX2xhc3QyKQp7Cgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCgoKICByZXR1cm4gX19maW5kX2VuZChf X2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAg X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0MSksCiAgICAgICAgICAgICAgICAgICAgX19pdGVy YXRvcl9jYXRlZ29yeShfX2ZpcnN0MikpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVy MSwgY2xhc3MgX0ZvcndhcmRJdGVyMiwKICAgICAgICAgIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+ CmlubGluZSBfRm9yd2FyZEl0ZXIxCmZpbmRfZW5kKF9Gb3J3YXJkSXRlcjEgX19maXJzdDEsIF9G b3J3YXJkSXRlcjEgX19sYXN0MSwKICAgICAgICAgX0ZvcndhcmRJdGVyMiBfX2ZpcnN0MiwgX0Zv cndhcmRJdGVyMiBfX2xhc3QyLAogICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkKewoK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CgoKCiAgcmV0dXJuIF9fZmluZF9lbmQo X19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAg IF9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdDEpLAogICAgICAgICAgICAgICAgICAgIF9faXRl cmF0b3JfY2F0ZWdvcnkoX19maXJzdDIpLAogICAgICAgICAgICAgICAgICAgIF9fY29tcCk7Cn0K CgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9EaXN0YW5jZT4K Ym9vbCBfX2lzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX0Rpc3RhbmNlIF9fbikK ewogIF9EaXN0YW5jZSBfX3BhcmVudCA9IDA7CiAgZm9yIChfRGlzdGFuY2UgX19jaGlsZCA9IDE7 IF9fY2hpbGQgPCBfX247ICsrX19jaGlsZCkgewogICAgaWYgKF9fZmlyc3RbX19wYXJlbnRdIDwg X19maXJzdFtfX2NoaWxkXSkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgaWYgKChfX2NoaWxkICYg MSkgPT0gMCkKICAgICAgKytfX3BhcmVudDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0Rpc3RhbmNlLCBjbGFzcyBfU3RyaWN0 V2Vha09yZGVyaW5nPgpib29sIF9faXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBf U3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCwKICAgICAgICAgICAgICAgX0Rpc3RhbmNlIF9fbikK ewogIF9EaXN0YW5jZSBfX3BhcmVudCA9IDA7CiAgZm9yIChfRGlzdGFuY2UgX19jaGlsZCA9IDE7 IF9fY2hpbGQgPCBfX247ICsrX19jaGlsZCkgewogICAgaWYgKF9fY29tcChfX2ZpcnN0W19fcGFy ZW50XSwgX19maXJzdFtfX2NoaWxkXSkpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmICgoX19j aGlsZCAmIDEpID09IDApCiAgICAgICsrX19wYXJlbnQ7CiAgfQogIHJldHVybiB0cnVlOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXI+CmlubGluZSBib29sIGlzX2hlYXAoX1Jh bmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0KQp7CgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOwoKCiAgcmV0dXJuIF9faXNfaGVhcChfX2ZpcnN0 LCBfX2xhc3QgLSBfX2ZpcnN0KTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRl ciwgY2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4KaW5saW5lIGJvb2wgaXNfaGVhcChfUmFuZG9t QWNjZXNzSXRlciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsCiAgICAgICAgICAg ICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCnsKCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA7CgoKCiAgcmV0dXJuIF9faXNfaGVhcChfX2ZpcnN0LCBfX2NvbXAsIF9f bGFzdCAtIF9fZmlyc3QpOwp9CgoKCgoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcj4KYm9v bCBpc19zb3J0ZWQoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QpCnsK CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA7CgoKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAgICByZXR1cm4g dHJ1ZTsKCiAgX0ZvcndhcmRJdGVyIF9fbmV4dCA9IF9fZmlyc3Q7CiAgZm9yICgrK19fbmV4dDsg X19uZXh0ICE9IF9fbGFzdDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQpIHsKICAgIGlmICgq X19uZXh0IDwgKl9fZmlyc3QpCiAgICAgIHJldHVybiBmYWxzZTsKICB9CgogIHJldHVybiB0cnVl Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyLCBjbGFzcyBfU3RyaWN0V2Vha09yZGVy aW5nPgpib29sIGlzX3NvcnRlZChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9f bGFzdCwKICAgICAgICAgICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCnsKCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA7CgoKCiAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQogICAgcmV0dXJuIHRydWU7 CgogIF9Gb3J3YXJkSXRlciBfX25leHQgPSBfX2ZpcnN0OwogIGZvciAoKytfX25leHQ7IF9fbmV4 dCAhPSBfX2xhc3Q7IF9fZmlyc3QgPSBfX25leHQsICsrX19uZXh0KSB7CiAgICBpZiAoX19jb21w KCpfX25leHQsICpfX2ZpcnN0KSkKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgcmV0dXJuIHRy dWU7Cn0KCn0KIyAzNyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3Rk X2FsZ29yaXRobS5oIiAyIDMKIyA1MCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYz L2JpdHMvc3RkX3N0cmluZy5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9iYXNpY19zdHJpbmcudGNjIiAxIDMKIyA0MyAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvYmFzaWNfc3RyaW5nLnRjYyIgMwpuYW1lc3BhY2Ugc3RkCnsK ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9B bGxvYz4KICAgIGNvbnN0IF9DaGFyVAogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywg X0FsbG9jPjo6CiAgICBfUmVwOjpfU190ZXJtaW5hbCA9IF9DaGFyVCgpOwoKICB0ZW1wbGF0ZTx0 eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGNv bnN0IHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVf dHlwZQogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CiAgICBfUmVw OjpfU19tYXhfc2l6ZSA9ICgoKG5wb3MgLSBzaXplb2YoX1JlcCkpL3NpemVvZihfQ2hhclQpKSAt IDEpIC8gNDsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0 eXBlbmFtZSBfQWxsb2M+CiAgICBjb25zdCB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBf VHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFp dHMsIF9BbGxvYz46Om5wb3M7CgoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFt ZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0No YXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQs IF9UcmFpdHMsIF9BbGxvYz46Ol9TX2VtcHR5X3JlcF9zdG9yYWdlWwogICAgKHNpemVvZihfUmVw KSArIHNpemVvZihfQ2hhclQpICsgc2l6ZW9mKHNpemVfdHlwZSkgLSAxKS9zaXplb2Yoc2l6ZV90 eXBlKV07CgoKCgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMs IHR5cGVuYW1lIF9BbGxvYz4KICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXI+CiAgICAgIF9D aGFyVCoKICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CiAgICAg IF9TX2NvbnN0cnVjdChfSW5JdGVyIF9fYmVnLCBfSW5JdGVyIF9fZW5kLCBjb25zdCBfQWxsb2Mm IF9fYSwKICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKICAgICAgewogICAg ICAgIGlmIChfX2JlZyA9PSBfX2VuZCAmJiBfX2EgPT0gX0FsbG9jKCkpCiAgICAgICAgICByZXR1 cm4gX1NfZW1wdHlfcmVwKCkuX01fcmVmY29weSgpOwoKICAgICAgICBfQ2hhclQgX19idWZbMTAw XTsKICAgICAgICBzaXplX3R5cGUgX19pID0gMDsKICAgICAgICB3aGlsZSAoX19iZWcgIT0gX19l bmQgJiYgX19pIDwgc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQogICAgICAgICAgewog ICAgICAgICAgICBfX2J1ZltfX2krK10gPSAqX19iZWc7CiAgICAgICAgICAgICsrX19iZWc7CiAg ICAgICAgICB9CiAgICAgICAgX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9faSwgX19hKTsK ICAgICAgICB0cmFpdHNfdHlwZTo6Y29weShfX3ItPl9NX3JlZmRhdGEoKSwgX19idWYsIF9faSk7 CiAgICAgICAgX19yLT5fTV9sZW5ndGggPSBfX2k7CiAgICAgICAgdHJ5CiAgICAgICAgICB7CgoK CiAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgX0No YXJUKiBfX3AgPSBfX3ItPl9NX3JlZmRhdGEoKSArIF9fci0+X01fbGVuZ3RoOwogICAgICAgICAg ICAgICAgX0NoYXJUKiBfX2xhc3QgPSBfX3ItPl9NX3JlZmRhdGEoKSArIF9fci0+X01fY2FwYWNp dHk7CiAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQogICAgICAgICAgICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgICAgICAgICBfX3ItPl9NX2xlbmd0aCA9IF9fcCAtIF9fci0+X01fcmVm ZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAqX19wID0gX1JlcDo6X1NfdGVybWluYWw7 CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKICAgICAg ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoX19wID09IF9fbGFzdCkK ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICpfX3ArKyA9 ICpfX2JlZzsKICAgICAgICAgICAgICAgICAgICArK19fYmVnOwogICAgICAgICAgICAgICAgICB9 CgogICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbGVuID0gX19wIC0gX19yLT5fTV9yZWZkYXRh KCk7CiAgICAgICAgICAgICAgICBfUmVwKiBfX2Fub3RoZXIgPSBfUmVwOjpfU19jcmVhdGUoX19s ZW4gKyAxLCBfX2EpOwogICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmNvcHkoX19hbm90aGVy LT5fTV9yZWZkYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ItPl9N X3JlZmRhdGEoKSwgX19sZW4pOwogICAgICAgICAgICAgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7 CiAgICAgICAgICAgICAgICBfX3IgPSBfX2Fub3RoZXI7CiAgICAgICAgICAgICAgICBfX3ItPl9N X2xlbmd0aCA9IF9fbGVuOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBjYXRj aCguLi4pCiAgICAgICAgICB7CiAgICAgICAgICAgIF9fci0+X01fZGVzdHJveShfX2EpOwogICAg ICAgICAgICB0aHJvdzsKICAgICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICB0 ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxv Yz4KICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyPgogICAgICBfQ2hhclQqCiAgICAgIGJhc2lj X3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjoKICAgICAgX1NfY29uc3RydWN0KF9Jbkl0 ZXIgX19iZWcsIF9Jbkl0ZXIgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAogICAgICAgICAgICAg ICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCiAgICAgIHsKICAgICAgICBzaXplX3R5cGUgX19k bmV3ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihkaXN0YW5jZShfX2JlZywgX19lbmQpKTsKCiAg ICAgICAgaWYgKF9fYmVnID09IF9fZW5kICYmIF9fYSA9PSBfQWxsb2MoKSkKICAgICAgICAgIHJl dHVybiBfU19lbXB0eV9yZXAoKS5fTV9yZWZjb3B5KCk7CgoKICAgICAgICBfUmVwKiBfX3IgPSBf UmVwOjpfU19jcmVhdGUoX19kbmV3LCBfX2EpOwogICAgICAgIHRyeQogICAgICAgICAgeyBfU19j b3B5X2NoYXJzKF9fci0+X01fcmVmZGF0YSgpLCBfX2JlZywgX19lbmQpOyB9CiAgICAgICAgY2F0 Y2goLi4uKQogICAgICAgICAgewogICAgICAgICAgICBfX3ItPl9NX2Rlc3Ryb3koX19hKTsKICAg ICAgICAgICAgdGhyb3c7CiAgICAgICAgICB9CiAgICAgICAgX19yLT5fTV9sZW5ndGggPSBfX2Ru ZXc7CgogICAgICAgIF9fci0+X01fcmVmZGF0YSgpW19fZG5ld10gPSBfUmVwOjpfU190ZXJtaW5h bDsKICAgICAgICByZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CiAgICAgIH0KCiAgdGVtcGxhdGU8 dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBf Q2hhclQqCiAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsIF9BbGxvYz46OgogICAgX1Nf Y29uc3RydWN0KHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQog ICAgewogICAgICBpZiAoX19uID09IDAgJiYgX19hID09IF9BbGxvYygpKQogICAgICAgIHJldHVy biBfU19lbXB0eV9yZXAoKS5fTV9yZWZjb3B5KCk7CgoKICAgICAgX1JlcCogX19yID0gX1JlcDo6 X1NfY3JlYXRlKF9fbiwgX19hKTsKICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgaWYgKF9f bikKICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmFzc2lnbihfX3ItPl9NX3JlZmRhdGEoKSwgX19u LCBfX2MpOwogICAgICAgIH0KICAgICAgY2F0Y2goLi4uKQogICAgICAgIHsKICAgICAgICAgIF9f ci0+X01fZGVzdHJveShfX2EpOwogICAgICAgICAgdGhyb3c7CiAgICAgICAgfQogICAgICBfX3It Pl9NX2xlbmd0aCA9IF9fbjsKICAgICAgX19yLT5fTV9yZWZkYXRhKClbX19uXSA9IF9SZXA6Ol9T X3Rlcm1pbmFsOwogICAgICByZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CiAgICB9CgogIHRlbXBs YXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgog ICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CiAgICBiYXNpY19zdHJp bmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKICAgIDogX01fZGF0YXBsdXMoX19zdHIuX01f cmVwKCktPl9NX2dyYWIoX0FsbG9jKCksIF9fc3RyLmdldF9hbGxvY2F0b3IoKSksCiAgICAgICAg ICAgICAgICAgX19zdHIuZ2V0X2FsbG9jYXRvcigpKQogICAgeyB9CgogIHRlbXBsYXRlPHR5cGVu YW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNf c3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CiAgICBiYXNpY19zdHJpbmcoY29uc3Qg X0FsbG9jJiBfX2EpCiAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChzaXplX3R5cGUoKSwg X0NoYXJUKCksIF9fYSksIF9fYSkKICAgIHsgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQs IHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxfQ2hh clQsIF9UcmFpdHMsIF9BbGxvYz46OgogICAgYmFzaWNfc3RyaW5nKGNvbnN0IGJhc2ljX3N0cmlu ZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKICAgIDogX01fZGF0YXBs dXMoX1NfY29uc3RydWN0KF9fc3RyLl9NX2NoZWNrKF9fcG9zKSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9fc3RyLl9NX2ZvbGQoX19wb3MsIF9fbiksIF9BbGxvYygpKSwgX0FsbG9j KCkpCiAgICB7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRz LCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxs b2M+OjoKICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5 cGUgX19wb3MsCiAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBf X2EpCiAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVjdChfX3N0ci5fTV9jaGVjayhfX3Bvcyks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N0ci5fTV9mb2xkKF9fcG9zLCBfX24p LCBfX2EpLCBfX2EpCiAgICB7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFt ZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJh aXRzLCBfQWxsb2M+OjoKICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90 eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2EpCiAgICA6IF9NX2RhdGFwbHVzKF9TX2NvbnN0cnVj dChfX3MsIF9fcyArIF9fbiwgX19hKSwgX19hKQogICAgeyB9CgogIHRlbXBsYXRlPHR5cGVuYW1l IF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNfc3Ry aW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CiAgICBiYXNpY19zdHJpbmcoY29uc3QgX0No YXJUKiBfX3MsIGNvbnN0IF9BbGxvYyYgX19hKQogICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1 Y3QoX19zLCBfX3MgKyB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcyksIF9fYSksIF9fYSkKICAgIHsg fQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1l IF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgogICAg YmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19h KQogICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19uLCBfX2MsIF9fYSksIF9fYSkKICAg IHsgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVu YW1lIF9BbGxvYz4KICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXI+CiAgICBiYXNpY19z dHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKICAgIGJhc2ljX3N0cmluZyhfSW5wdXRJ dGVyIF9fYmVnLCBfSW5wdXRJdGVyIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSkKICAgIDogX01f ZGF0YXBsdXMoX1NfY29uc3RydWN0KF9fYmVnLCBfX2VuZCwgX19hKSwgX19hKQogICAgeyB9Cgog IHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0Fs bG9jPgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKICAgIGJhc2lj X3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmFzc2lnbihjb25zdCBiYXNpY19zdHJp bmcmIF9fc3RyKQogICAgewogICAgICBpZiAoX01fcmVwKCkgIT0gX19zdHIuX01fcmVwKCkpCiAg ICAgICAgewoKICAgICAgICAgIGFsbG9jYXRvcl90eXBlIF9fYSA9IHRoaXMtPmdldF9hbGxvY2F0 b3IoKTsKICAgICAgICAgIF9DaGFyVCogX190bXAgPSBfX3N0ci5fTV9yZXAoKS0+X01fZ3JhYihf X2EsIF9fc3RyLmdldF9hbGxvY2F0b3IoKSk7CiAgICAgICAgICBfTV9yZXAoKS0+X01fZGlzcG9z ZShfX2EpOwogICAgICAgICAgX01fZGF0YShfX3RtcCk7CiAgICAgICAgfQogICAgICByZXR1cm4g KnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0 cywgdHlwZW5hbWUgX0FsbG9jPgogICAgdm9pZAogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1Ry YWl0cywgX0FsbG9jPjo6X1JlcDo6CiAgICBfTV9kZXN0cm95KGNvbnN0IF9BbGxvYyYgX19hKSB0 aHJvdyAoKQogICAgewogICAgICBzaXplX3R5cGUgX19zaXplID0gc2l6ZW9mKF9SZXApICsgKF9N X2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKTsKICAgICAgX1Jhd19ieXRlc19hbGxvYyhf X2EpLmRlYWxsb2NhdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odGhpcyksIF9fc2l6ZSk7CiAg ICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5h bWUgX0FsbG9jPgogICAgdm9pZAogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0Fs bG9jPjo6X01fbGVha19oYXJkKCkKICAgIHsKICAgICAgaWYgKF9NX3JlcCgpLT5fTV9pc19zaGFy ZWQoKSkKICAgICAgICBfTV9tdXRhdGUoMCwgMCwgMCk7CiAgICAgIF9NX3JlcCgpLT5fTV9zZXRf bGVha2VkKCk7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1Ry YWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgdm9pZAogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwg X1RyYWl0cywgX0FsbG9jPjo6CiAgICBfTV9tdXRhdGUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5 cGUgX19sZW4xLCBzaXplX3R5cGUgX19sZW4yKQogICAgewogICAgICBzaXplX3R5cGUgX19vbGRf c2l6ZSA9IHRoaXMtPnNpemUoKTsKICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmV3X3NpemUgPSBf X29sZF9zaXplICsgX19sZW4yIC0gX19sZW4xOwogICAgICBjb25zdCBfQ2hhclQqIF9fc3JjID0g X01fZGF0YSgpICsgX19wb3MgKyBfX2xlbjE7CiAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19t dWNoID0gX19vbGRfc2l6ZSAtIF9fcG9zIC0gX19sZW4xOwoKICAgICAgaWYgKF9NX3JlcCgpLT5f TV9pc19zaGFyZWQoKSB8fCBfX25ld19zaXplID4gY2FwYWNpdHkoKSkKICAgICAgICB7CgogICAg ICAgICAgYWxsb2NhdG9yX3R5cGUgX19hID0gZ2V0X2FsbG9jYXRvcigpOwogICAgICAgICAgX1Jl cCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fbmV3X3NpemUsIF9fYSk7CiAgICAgICAgICB0cnkK ICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChfX3BvcykKICAgICAgICAgICAgICAgIHRy YWl0c190eXBlOjpjb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfTV9kYXRhKCksIF9fcG9zKTsKICAg ICAgICAgICAgICBpZiAoX19ob3dfbXVjaCkKICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjpj b3B5KF9fci0+X01fcmVmZGF0YSgpICsgX19wb3MgKyBfX2xlbjIsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfX3NyYywgX19ob3dfbXVjaCk7CiAgICAgICAgICAgIH0KICAgICAg ICAgIGNhdGNoKC4uLikKICAgICAgICAgICAgewogICAgICAgICAgICAgIF9fci0+X01fZGlzcG9z ZShnZXRfYWxsb2NhdG9yKCkpOwogICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAg ICAgICAgICBfTV9yZXAoKS0+X01fZGlzcG9zZShfX2EpOwogICAgICAgICAgX01fZGF0YShfX3It Pl9NX3JlZmRhdGEoKSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoX19ob3dfbXVjaCAmJiBfX2xl bjEgIT0gX19sZW4yKQogICAgICAgIHsKCiAgICAgICAgICB0cmFpdHNfdHlwZTo6bW92ZShfTV9k YXRhKCkgKyBfX3BvcyArIF9fbGVuMiwgX19zcmMsIF9faG93X211Y2gpOwogICAgICAgIH0KICAg ICAgX01fcmVwKCktPl9NX3NldF9zaGFyYWJsZSgpOwogICAgICBfTV9yZXAoKS0+X01fbGVuZ3Ro ID0gX19uZXdfc2l6ZTsKICAgICAgX01fZGF0YSgpW19fbmV3X3NpemVdID0gX1JlcDo6X1NfdGVy bWluYWw7CgogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFp dHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIHZvaWQKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9U cmFpdHMsIF9BbGxvYz46OnJlc2VydmUoc2l6ZV90eXBlIF9fcmVzKQogICAgewogICAgICBpZiAo X19yZXMgPiB0aGlzLT5jYXBhY2l0eSgpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKICAg ICAgICB7CiAgICAgICAgICBpZiAoX19yZXMgPiB0aGlzLT5tYXhfc2l6ZSgpKQogICAgICAgICAg ICBfX3Rocm93X2xlbmd0aF9lcnJvcigiYmFzaWNfc3RyaW5nOjpyZXNlcnZlIik7CiAgICAgICAg ICBhbGxvY2F0b3JfdHlwZSBfX2EgPSBnZXRfYWxsb2NhdG9yKCk7CiAgICAgICAgICBfQ2hhclQq IF9fdG1wID0gX01fcmVwKCktPl9NX2Nsb25lKF9fYSwgX19yZXMgLSB0aGlzLT5zaXplKCkpOwog ICAgICAgICAgX01fcmVwKCktPl9NX2Rpc3Bvc2UoX19hKTsKICAgICAgICAgIF9NX2RhdGEoX190 bXApOwogICAgICAgIH0KICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFt ZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICB2b2lkIGJhc2ljX3N0cmluZzxfQ2hhclQs IF9UcmFpdHMsIF9BbGxvYz46OnN3YXAoYmFzaWNfc3RyaW5nJiBfX3MpCiAgICB7CiAgICAgIGlm IChfTV9yZXAoKS0+X01faXNfbGVha2VkKCkpCiAgICAgICAgX01fcmVwKCktPl9NX3NldF9zaGFy YWJsZSgpOwogICAgICBpZiAoX19zLl9NX3JlcCgpLT5fTV9pc19sZWFrZWQoKSkKICAgICAgICBf X3MuX01fcmVwKCktPl9NX3NldF9zaGFyYWJsZSgpOwogICAgICBpZiAodGhpcy0+Z2V0X2FsbG9j YXRvcigpID09IF9fcy5nZXRfYWxsb2NhdG9yKCkpCiAgICAgICAgewogICAgICAgICAgX0NoYXJU KiBfX3RtcCA9IF9NX2RhdGEoKTsKICAgICAgICAgIF9NX2RhdGEoX19zLl9NX2RhdGEoKSk7CiAg ICAgICAgICBfX3MuX01fZGF0YShfX3RtcCk7CiAgICAgICAgfQoKICAgICAgZWxzZQogICAgICAg IHsKICAgICAgICAgIGJhc2ljX3N0cmluZyBfX3RtcDEoX01faWJlZ2luKCksIF9NX2llbmQoKSwg X19zLmdldF9hbGxvY2F0b3IoKSk7CiAgICAgICAgICBiYXNpY19zdHJpbmcgX190bXAyKF9fcy5f TV9pYmVnaW4oKSwgX19zLl9NX2llbmQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dGhpcy0+Z2V0X2FsbG9jYXRvcigpKTsKICAgICAgICAgICp0aGlzID0gX190bXAyOwogICAgICAg ICAgX19zID0gX190bXAxOwogICAgICAgIH0KICAgIH0KIyAzNTYgIi91c3IvbG9jYWwvZ2NjLTMu MC9pbmNsdWRlL2crKy12My9iaXRzL2Jhc2ljX3N0cmluZy50Y2MiIDMKICB0ZW1wbGF0ZTx0eXBl bmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2lj X3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXAqCiAgICBiYXNpY19zdHJpbmc8 X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjoKICAgIF9TX2NyZWF0ZShzaXplX3QgX19j YXBhY2l0eSwgY29uc3QgX0FsbG9jJiBfX2FsbG9jKQogICAgewogICAgICB0eXBlZGVmIGJhc2lj X3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19zdHJpbmdfdHlwZTsKCgogICAgICBp ZiAoX19jYXBhY2l0eSA+IF9TX21heF9zaXplKQoKCgogICAgICAgIF9fdGhyb3dfbGVuZ3RoX2Vy cm9yKCJiYXNpY19zdHJpbmc6Ol9TX2NyZWF0ZSIpOwoKCgoKICAgICAgc2l6ZV90IF9fc2l6ZSA9 IChfX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKSArIHNpemVvZihfUmVwKTsKCgogICAg ICB2b2lkKiBfX3BsYWNlID0gX1Jhd19ieXRlc19hbGxvYyhfX2FsbG9jKS5hbGxvY2F0ZShfX3Np emUpOwogICAgICBfUmVwICpfX3AgPSBuZXcgKF9fcGxhY2UpIF9SZXA7CiAgICAgIF9fcC0+X01f Y2FwYWNpdHkgPSBfX2NhcGFjaXR5OwogICAgICBfX3AtPl9NX3NldF9zaGFyYWJsZSgpOwogICAg ICBfX3AtPl9NX2xlbmd0aCA9IDA7CiAgICAgIHJldHVybiBfX3A7CiAgICB9CgogIHRlbXBsYXRl PHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAg X0NoYXJUKgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6 CiAgICBfTV9jbG9uZShjb25zdCBfQWxsb2MmIF9fYWxsb2MsIHNpemVfdHlwZSBfX3JlcykKICAg IHsKICAgICAgX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9NX2xlbmd0aCArIF9fcmVzLCBf X2FsbG9jKTsKICAgICAgaWYgKF9NX2xlbmd0aCkKICAgICAgICB7CiAgICAgICAgICB0cnkKICAg ICAgICAgICAgeyB0cmFpdHNfdHlwZTo6Y29weShfX3ItPl9NX3JlZmRhdGEoKSwgX01fcmVmZGF0 YSgpLCBfTV9sZW5ndGgpOyB9CiAgICAgICAgICBjYXRjaCguLi4pCiAgICAgICAgICAgIHsKICAg ICAgICAgICAgICBfX3ItPl9NX2Rlc3Ryb3koX19hbGxvYyk7CiAgICAgICAgICAgICAgdGhyb3c7 CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF9fci0+X01fbGVuZ3RoID0gX01fbGVuZ3Ro OwogICAgICByZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVu YW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogIGlubGluZSBi b29sCgoKCgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6 CiAgICBfU19leGNlc3Nfc2xvcChzaXplX3QgX19zLCBzaXplX3QgX19yKQoKICAgIHsKICAgICAg cmV0dXJuIDIgKiAoX19zIDw9IDE2ID8gMTYgOiBfX3MpIDwgX19yOwogICAgfQoKICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAg IHZvaWQKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnJlc2l6ZShz aXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQogICAgewogICAgICBpZiAoX19uID4gbWF4X3NpemUo KSkKICAgICAgICBfX3Rocm93X2xlbmd0aF9lcnJvcigiYmFzaWNfc3RyaW5nOjpyZXNpemUiKTsK ICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKICAgICAgaWYgKF9fc2l6ZSA8 IF9fbikKICAgICAgICB0aGlzLT5hcHBlbmQoX19uIC0gX19zaXplLCBfX2MpOwogICAgICBlbHNl IGlmIChfX24gPCBfX3NpemUpCiAgICAgICAgdGhpcy0+ZXJhc2UoX19uKTsKCiAgICB9CgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9j PgogICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KICAgICAgYmFzaWNfc3RyaW5nPF9D aGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0 cywgX0FsbG9jPjo6CiAgICAgIF9NX3JlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19p MiwgX0lucHV0SXRlciBfX2sxLAogICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIgX19rMiwgaW5w dXRfaXRlcmF0b3JfdGFnKQogICAgICB7CiAgICAgICAgYmFzaWNfc3RyaW5nIF9fcyhfX2sxLCBf X2syKTsKICAgICAgICByZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxLCBfX2kyLCBfX3MuX01faWJl Z2luKCksIF9fcy5fTV9pZW5kKCkpOwogICAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFy VCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgdGVtcGxhdGU8dHlwZW5h bWUgX0ZvcndhcmRJdGVyPgogICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxs b2M+JgogICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKICAgICAg X01fcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfRm9yd2FyZEl0ZXIgX19r MSwKICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19rMiwgZm9yd2FyZF9pdGVyYXRvcl90 YWcpCiAgICAgIHsKICAgICAgICBzaXplX3R5cGUgX19kb2xkID0gX19pMiAtIF9faTE7CiAgICAg ICAgc2l6ZV90eXBlIF9fZG1heCA9IHRoaXMtPm1heF9zaXplKCk7CiAgICAgICAgc2l6ZV90eXBl IF9fZG5ldyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oZGlzdGFuY2UoX19rMSwgX19rMikpOwoK ICAgICAgICBpZiAoX19kbWF4IDw9IF9fZG5ldykKICAgICAgICAgIF9fdGhyb3dfbGVuZ3RoX2Vy cm9yKCJiYXNpY19zdHJpbmc6Ol9NX3JlcGxhY2UiKTsKICAgICAgICBzaXplX3R5cGUgX19vZmYg PSBfX2kxIC0gX01faWJlZ2luKCk7CiAgICAgICAgX01fbXV0YXRlKF9fb2ZmLCBfX2RvbGQsIF9f ZG5ldyk7CgogICAgICAgIGlmIChfX2RuZXcpCiAgICAgICAgICBfU19jb3B5X2NoYXJzKF9NX2Rh dGEoKSArIF9fb2ZmLCBfX2sxLCBfX2syKTsKCiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICB9 CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUg X0FsbG9jPgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKICAgIGJh c2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgogICAgcmVwbGFjZShzaXplX3R5 cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKICAg ICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpCiAgICB7CiAgICAgIHJl dHVybiB0aGlzLT5yZXBsYWNlKF9NX2NoZWNrKF9fcG9zMSksIF9NX2ZvbGQoX19wb3MxLCBfX24x KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHIuX01fY2hlY2soX19wb3MyKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgX19zdHIuX01fZm9sZChfX3BvczIsIF9fbjIpKTsKICAg IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFt ZSBfQWxsb2M+CiAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKICAgIGJh c2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjoKICAgIGFwcGVuZChjb25zdCBiYXNp Y19zdHJpbmcmIF9fc3RyKQogICAgewoKCgogICAgICBzaXplX3R5cGUgX19zaXplID0gX19zdHIu c2l6ZSgpOwogICAgICBzaXplX3R5cGUgX19sZW4gPSBfX3NpemUgKyB0aGlzLT5zaXplKCk7CiAg ICAgIGlmIChfX2xlbiA+IHRoaXMtPmNhcGFjaXR5KCkpCiAgICAgICAgdGhpcy0+cmVzZXJ2ZShf X2xlbik7CiAgICAgIHJldHVybiB0aGlzLT5yZXBsYWNlKF9NX2llbmQoKSwgX01faWVuZCgpLCBf X3N0ci5fTV9pYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHIuX01faWVu ZCgpKTsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRz LCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9j PiYKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+OjoKICAgIGFwcGVuZChj b25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24p CiAgICB7CgoKCiAgICAgIHNpemVfdHlwZSBfX2xlbiA9IG1pbihfX3N0ci5zaXplKCkgLSBfX3Bv cywgX19uKSArIHRoaXMtPnNpemUoKTsKICAgICAgaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHko KSkKICAgICAgICB0aGlzLT5yZXNlcnZlKF9fbGVuKTsKICAgICAgcmV0dXJuIHRoaXMtPnJlcGxh Y2UoX01faWVuZCgpLCBfTV9pZW5kKCksIF9fc3RyLl9NX2NoZWNrKF9fcG9zKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgX19zdHIuX01fZm9sZChfX3BvcywgX19uKSk7CiAgICB9CgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9j PgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mCiAgICBiYXNpY19zdHJp bmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6CiAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3Ms IHNpemVfdHlwZSBfX24pCiAgICB7CiAgICAgIHNpemVfdHlwZSBfX2xlbiA9IF9fbiArIHRoaXMt PnNpemUoKTsKICAgICAgaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHkoKSkKICAgICAgICB0aGlz LT5yZXNlcnZlKF9fbGVuKTsKICAgICAgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01faWVuZCgpLCBf TV9pZW5kKCksIF9fcywgX19zICsgX19uKTsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0No YXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNpY19zdHJpbmc8 X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxf QWxsb2M+OjoKICAgIGFwcGVuZChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQogICAgewogICAg ICBzaXplX3R5cGUgX19sZW4gPSBfX24gKyB0aGlzLT5zaXplKCk7CiAgICAgIGlmIChfX2xlbiA+ IHRoaXMtPmNhcGFjaXR5KCkpCiAgICAgICAgdGhpcy0+cmVzZXJ2ZShfX2xlbik7CiAgICAgICBy ZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9pZW5kKCksIF9NX2llbmQoKSwgX19uLCBfX2MpOwogICAg fQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1l IF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+CiAgICBvcGVy YXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmlu ZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3JocykKICAgIHsKICAgICAgdHlwZWRlZiBiYXNp Y19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiBfX3N0cmluZ190eXBlOwogICAgICB0eXBl ZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZSBfX3NpemVfdHlwZTsKICAgICAg X19zaXplX3R5cGUgX19sZW4gPSBfVHJhaXRzOjpsZW5ndGgoX19saHMpOwogICAgICBfX3N0cmlu Z190eXBlIF9fc3RyOwogICAgICBfX3N0ci5yZXNlcnZlKF9fbGVuICsgX19yaHMuc2l6ZSgpKTsK ICAgICAgX19zdHIuYXBwZW5kKF9fbGhzLCBfX2xocyArIF9fbGVuKTsKICAgICAgX19zdHIuYXBw ZW5kKF9fcmhzKTsKICAgICAgcmV0dXJuIF9fc3RyOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX3N0 cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+CiAgICBvcGVyYXRvcisoX0NoYXJUIF9fbGhzLCBj b25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19yaHMpCiAgICB7CiAg ICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4gX19zdHJpbmdf dHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUgX19z aXplX3R5cGU7CiAgICAgIF9fc3RyaW5nX3R5cGUgX19zdHI7CiAgICAgIF9fc2l6ZV90eXBlIF9f bGVuID0gX19yaHMuc2l6ZSgpOwogICAgICBfX3N0ci5yZXNlcnZlKF9fbGVuICsgMSk7CiAgICAg IF9fc3RyLmFwcGVuZChfX3NpemVfdHlwZSgxKSwgX19saHMpOwogICAgICBfX3N0ci5hcHBlbmQo X19yaHMpOwogICAgICByZXR1cm4gX19zdHI7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9D aGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNfc3RyaW5n PF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFp dHMsIF9BbGxvYz46OgogICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBz aXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykKICAgIHsKICAgICAgc2l6ZV90eXBlIF9fbjEgPSBf X2kyIC0gX19pMTsKICAgICAgc2l6ZV90eXBlIF9fb2ZmMSA9IF9faTEgLSBfTV9pYmVnaW4oKTsK ICAgICAgaWYgKG1heF9zaXplKCkgLSAodGhpcy0+c2l6ZSgpIC0gX19uMSkgPD0gX19uMikKICAg ICAgICBfX3Rocm93X2xlbmd0aF9lcnJvcigiYmFzaWNfc3RyaW5nOjpyZXBsYWNlIik7CiAgICAg IF9NX211dGF0ZSAoX19vZmYxLCBfX24xLCBfX24yKTsKCiAgICAgIGlmIChfX24yKQogICAgICAg IHRyYWl0c190eXBlOjphc3NpZ24oX01fZGF0YSgpICsgX19vZmYxLCBfX24yLCBfX2MpOwogICAg ICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5h bWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1Ry YWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCiAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRz LCBfQWxsb2M+OjoKICAgIGNvcHkoX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlw ZSBfX3BvcykgY29uc3QKICAgIHsKICAgICAgaWYgKF9fcG9zID4gdGhpcy0+c2l6ZSgpKQogICAg ICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKCJiYXNpY19zdHJpbmc6OmNvcHkiKTsKCiAgICAgIGlm IChfX24gPiB0aGlzLT5zaXplKCkgLSBfX3BvcykKICAgICAgICBfX24gPSB0aGlzLT5zaXplKCkg LSBfX3BvczsKCiAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcywgX01fZGF0YSgpICsgX19wb3Ms IF9fbik7CgogICAgICByZXR1cm4gX19uOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hh clQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxf Q2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQogICAgYmFzaWNfc3RyaW5nPF9DaGFy VCwgX1RyYWl0cywgX0FsbG9jPjo6CiAgICBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5 cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CiAgICB7CiAgICAgIHNpemVfdHlwZSBfX3Np emUgPSB0aGlzLT5zaXplKCk7CiAgICAgIHNpemVfdCBfX3hwb3MgPSBfX3BvczsKICAgICAgY29u c3QgX0NoYXJUKiBfX2RhdGEgPSBfTV9kYXRhKCk7CiAgICAgIGZvciAoOyBfX3hwb3MgKyBfX24g PD0gX19zaXplOyArK19feHBvcykKICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmNvbXBhcmUoX19k YXRhICsgX194cG9zLCBfX3MsIF9fbikgPT0gMCkKICAgICAgICAgIHJldHVybiBfX3hwb3M7CiAg ICAgIHJldHVybiBucG9zOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVu YW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9U cmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0 cywgX0FsbG9jPjo6CiAgICBmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QK ICAgIHsKICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKICAgICAgc2l6ZV90 eXBlIF9fcmV0ID0gbnBvczsKICAgICAgaWYgKF9fcG9zIDwgX19zaXplKQogICAgICAgIHsKICAg ICAgICAgIGNvbnN0IF9DaGFyVCogX19kYXRhID0gX01fZGF0YSgpOwogICAgICAgICAgc2l6ZV90 eXBlIF9fbiA9IF9fc2l6ZSAtIF9fcG9zOwogICAgICAgICAgY29uc3QgX0NoYXJUKiBfX3AgPSB0 cmFpdHNfdHlwZTo6ZmluZChfX2RhdGEgKyBfX3BvcywgX19uLCBfX2MpOwogICAgICAgICAgaWYg KF9fcCkKICAgICAgICAgICAgX19yZXQgPSBfX3AgLSBfX2RhdGE7CiAgICAgICAgfQogICAgICBy ZXR1cm4gX19yZXQ7CiAgICB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1l IF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFp dHMsIF9BbGxvYz46OnNpemVfdHlwZQogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywg X0FsbG9jPjo6CiAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBz aXplX3R5cGUgX19uKSBjb25zdAogICAgewogICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+ c2l6ZSgpOwogICAgICBpZiAoX19uIDw9IF9fc2l6ZSkKICAgICAgICB7CiAgICAgICAgICBfX3Bv cyA9IHN0ZDo6bWluKF9fc2l6ZSAtIF9fbiAsX19wb3MpOwogICAgICAgICAgY29uc3QgX0NoYXJU KiBfX2RhdGEgPSBfTV9kYXRhKCk7CiAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgaWYgKHRyYWl0c190eXBlOjpjb21wYXJlKF9fZGF0YSArIF9fcG9zLCBfX3MsIF9fbikg PT0gMCkKICAgICAgICAgICAgICAgIHJldHVybiBfX3BvczsKICAgICAgICAgICAgfQogICAgICAg ICAgd2hpbGUgKF9fcG9zLS0gPiAwKTsKICAgICAgICB9CiAgICAgIHJldHVybiBucG9zOwogICAg fQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1l IF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVf dHlwZQogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CiAgICByZmlu ZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CiAgICB7CiAgICAgIHNpemVfdHlw ZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CiAgICAgIGlmIChfX3NpemUpCiAgICAgICAgewogICAg ICAgICAgc2l6ZV90IF9feHBvcyA9IF9fc2l6ZSAtIDE7CiAgICAgICAgICBpZiAoX194cG9zID4g X19wb3MpCiAgICAgICAgICAgIF9feHBvcyA9IF9fcG9zOwoKICAgICAgICAgIGZvciAoKytfX3hw b3M7IF9feHBvcy0tID4gMDsgKQogICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxKF9NX2Rh dGEoKVtfX3hwb3NdLCBfX2MpKQogICAgICAgICAgICAgIHJldHVybiBfX3hwb3M7CiAgICAgICAg fQogICAgICByZXR1cm4gbnBvczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0 eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNpY19zdHJpbmc8X0NoYXJU LCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9U cmFpdHMsIF9BbGxvYz46OgogICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6 ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAogICAgewogICAgICBmb3IgKDsgX19u ICYmIF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQogICAgICAgIHsKICAgICAgICAgIGNv bnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIF9NX2RhdGEoKVtf X3Bvc10pOwogICAgICAgICAgaWYgKF9fcCkKICAgICAgICAgICAgcmV0dXJuIF9fcG9zOwogICAg ICAgIH0KICAgICAgcmV0dXJuIG5wb3M7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFy VCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNfc3RyaW5nPF9D aGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCiAgICBiYXNpY19zdHJpbmc8X0NoYXJU LCBfVHJhaXRzLCBfQWxsb2M+OjoKICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywg c2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAogICAgewogICAgICBzaXplX3R5 cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOwogICAgICBpZiAoX19zaXplICYmIF9fbikKICAgICAg ICB7CiAgICAgICAgICBpZiAoLS1fX3NpemUgPiBfX3BvcykKICAgICAgICAgICAgX19zaXplID0g X19wb3M7CiAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKHRyYWl0 c190eXBlOjpmaW5kKF9fcywgX19uLCBfTV9kYXRhKClbX19zaXplXSkpCiAgICAgICAgICAgICAg ICByZXR1cm4gX19zaXplOwogICAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoX19zaXplLS0g IT0gMCk7CiAgICAgICAgfQogICAgICByZXR1cm4gbnBvczsKICAgIH0KCiAgdGVtcGxhdGU8dHlw ZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBiYXNp Y19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKICAgIGJhc2ljX3N0 cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgogICAgZmluZF9maXJzdF9ub3Rfb2YoY29u c3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKICAg IHsKICAgICAgc2l6ZV90IF9feHBvcyA9IF9fcG9zOwogICAgICBmb3IgKDsgX19uICYmIF9feHBv cyA8IHRoaXMtPnNpemUoKTsgKytfX3hwb3MpCiAgICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6Zmlu ZChfX3MsIF9fbiwgX01fZGF0YSgpW19feHBvc10pKQogICAgICAgICAgcmV0dXJuIF9feHBvczsK ICAgICAgcmV0dXJuIG5wb3M7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlw ZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwg X1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCiAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJh aXRzLCBfQWxsb2M+OjoKICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlw ZSBfX3BvcykgY29uc3QKICAgIHsKICAgICAgc2l6ZV90IF9feHBvcyA9IF9fcG9zOwogICAgICBm b3IgKDsgX194cG9zIDwgdGhpcy0+c2l6ZSgpOyArK19feHBvcykKICAgICAgICBpZiAoIXRyYWl0 c190eXBlOjplcShfTV9kYXRhKClbX194cG9zXSwgX19jKSkKICAgICAgICAgIHJldHVybiBfX3hw b3M7CiAgICAgIHJldHVybiBucG9zOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQs IHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX3N0cmluZzxfQ2hh clQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQogICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwg X1RyYWl0cywgX0FsbG9jPjo6CiAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19z LCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CiAgICB7CiAgICAgIHNpemVf dHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CiAgICAgIGlmIChfX3NpemUgJiYgX19uKQogICAg ICAgIHsKICAgICAgICAgIGlmICgtLV9fc2l6ZSA+IF9fcG9zKQogICAgICAgICAgICBfX3NpemUg PSBfX3BvczsKICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoIXRy YWl0c190eXBlOjpmaW5kKF9fcywgX19uLCBfTV9kYXRhKClbX19zaXplXSkpCiAgICAgICAgICAg ICAgICByZXR1cm4gX19zaXplOwogICAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoX19zaXpl LS0pOwogICAgICAgIH0KICAgICAgcmV0dXJuIG5wb3M7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVu YW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgYmFzaWNf c3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCiAgICBiYXNpY19zdHJp bmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKICAgIGZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJU IF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdAogICAgewogICAgICBzaXplX3R5cGUgX19zaXpl ID0gdGhpcy0+c2l6ZSgpOwogICAgICBpZiAoX19zaXplKQogICAgICAgIHsKICAgICAgICAgIGlm ICgtLV9fc2l6ZSA+IF9fcG9zKQogICAgICAgICAgICBfX3NpemUgPSBfX3BvczsKICAgICAgICAg IGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoIXRyYWl0c190eXBlOjplcShfTV9k YXRhKClbX19zaXplXSwgX19jKSkKICAgICAgICAgICAgICAgIHJldHVybiBfX3NpemU7CiAgICAg ICAgICAgIH0KICAgICAgICAgIHdoaWxlIChfX3NpemUtLSk7CiAgICAgICAgfQogICAgICByZXR1 cm4gbnBvczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJh aXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbnQKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9U cmFpdHMsIF9BbGxvYz46OgogICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBf X24sIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0CiAgICB7CiAgICAgIHNpemVfdHlw ZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CiAgICAgIHNpemVfdHlwZSBfX29zaXplID0gX19zdHIu c2l6ZSgpOwogICAgICBpZiAoX19wb3MgPiBfX3NpemUpCiAgICAgICAgX190aHJvd19vdXRfb2Zf cmFuZ2UoImJhc2ljX3N0cmluZzo6Y29tcGFyZSIpOwoKICAgICAgc2l6ZV90eXBlIF9fcnNpemU9 IG1pbihfX3NpemUgLSBfX3BvcywgX19uKTsKICAgICAgc2l6ZV90eXBlIF9fbGVuID0gbWluKF9f cnNpemUsIF9fb3NpemUpOwogICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01f ZGF0YSgpICsgX19wb3MsIF9fc3RyLmRhdGEoKSwgX19sZW4pOwogICAgICBpZiAoIV9fcikKICAg ICAgICBfX3IgPSBfX3JzaXplIC0gX19vc2l6ZTsKICAgICAgcmV0dXJuIF9fcjsKICAgIH0KCiAg dGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxs b2M+CiAgICBpbnQKICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ogog ICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNf c3RyaW5nJiBfX3N0ciwKICAgICAgICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9f bjIpIGNvbnN0CiAgICB7CiAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CiAg ICAgIHNpemVfdHlwZSBfX29zaXplID0gX19zdHIuc2l6ZSgpOwogICAgICBpZiAoX19wb3MxID4g X19zaXplIHx8IF9fcG9zMiA+IF9fb3NpemUpCiAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2Uo ImJhc2ljX3N0cmluZzo6Y29tcGFyZSIpOwoKICAgICAgc2l6ZV90eXBlIF9fcnNpemUgPSBtaW4o X19zaXplIC0gX19wb3MxLCBfX24xKTsKICAgICAgc2l6ZV90eXBlIF9fcm9zaXplID0gbWluKF9f b3NpemUgLSBfX3BvczIsIF9fbjIpOwogICAgICBzaXplX3R5cGUgX19sZW4gPSBtaW4oX19yc2l6 ZSwgX19yb3NpemUpOwogICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0 YSgpICsgX19wb3MxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdHIu ZGF0YSgpICsgX19wb3MyLCBfX2xlbik7CiAgICAgIGlmICghX19yKQogICAgICAgIF9fciA9IF9f cnNpemUgLSBfX3Jvc2l6ZTsKICAgICAgcmV0dXJuIF9fcjsKICAgIH0KCgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgaW50 CiAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKICAgIGNvbXBhcmUo Y29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CiAgICB7CiAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0 aGlzLT5zaXplKCk7CiAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRh KCksIF9fcywgX19zaXplKTsKICAgICAgaWYgKCFfX3IpCiAgICAgICAgX19yID0gX19zaXplIC0g dHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpOwogICAgICByZXR1cm4gX19yOwogICAgfQoKCiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+ CiAgICBpbnQKICAgIGJhc2ljX3N0cmluZyA8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6CiAgICBj b21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19z KSBjb25zdAogICAgewogICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOwogICAg ICBpZiAoX19wb3MgPiBfX3NpemUpCiAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoImJhc2lj X3N0cmluZzo6Y29tcGFyZSIpOwoKICAgICAgc2l6ZV90eXBlIF9fb3NpemUgPSB0cmFpdHNfdHlw ZTo6bGVuZ3RoKF9fcyk7CiAgICAgIHNpemVfdHlwZSBfX3JzaXplID0gbWluKF9fc2l6ZSAtIF9f cG9zLCBfX24xKTsKICAgICAgc2l6ZV90eXBlIF9fbGVuID0gbWluKF9fcnNpemUsIF9fb3NpemUp OwogICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0YSgpICsgX19wb3Ms IF9fcywgX19sZW4pOwogICAgICBpZiAoIV9fcikKICAgICAgICBfX3IgPSBfX3JzaXplIC0gX19v c2l6ZTsKICAgICAgcmV0dXJuIF9fcjsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJU LCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CiAgICBpbnQKICAgIGJhc2ljX3N0 cmluZyA8X0NoYXJULF9UcmFpdHMsX0FsbG9jPjo6CiAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bv cywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAogICAgICAgICAgICBzaXplX3R5 cGUgX19uMikgY29uc3QKICAgIHsKICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUo KTsKICAgICAgaWYgKF9fcG9zID4gX19zaXplKQogICAgICAgIF9fdGhyb3dfb3V0X29mX3Jhbmdl KCJiYXNpY19zdHJpbmc6OmNvbXBhcmUiKTsKCiAgICAgIHNpemVfdHlwZSBfX29zaXplID0gbWlu KHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSwgX19uMik7CiAgICAgIHNpemVfdHlwZSBfX3JzaXpl ID0gbWluKF9fc2l6ZSAtIF9fcG9zLCBfX24xKTsKICAgICAgc2l6ZV90eXBlIF9fbGVuID0gbWlu KF9fcnNpemUsIF9fb3NpemUpOwogICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUo X01fZGF0YSgpICsgX19wb3MsIF9fcywgX19sZW4pOwogICAgICBpZiAoIV9fcikKICAgICAgICBf X3IgPSBfX3JzaXplIC0gX19vc2l6ZTsKICAgICAgcmV0dXJuIF9fcjsKICAgIH0KCiAgdGVtcGxh dGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgogICAgdm9pZAog ICAgX1Nfc3RyaW5nX2NvcHkoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0Fs bG9jPiYgX19zdHIsCiAgICAgICAgICAgICAgICAgICBfQ2hhclQqIF9fYnVmLCB0eXBlbmFtZSBf QWxsb2M6OnNpemVfdHlwZSBfX2J1ZnNpeikKICAgIHsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBf QWxsb2M6OnNpemVfdHlwZSBzaXplX3R5cGU7CiAgICAgIHNpemVfdHlwZSBfX3N0cnNpemUgPSBf X3N0ci5zaXplKCk7CiAgICAgIHNpemVfdHlwZSBfX2J5dGVzID0gbWluKF9fc3Ryc2l6ZSwgX19i dWZzaXogLSAxKTsKICAgICAgX1RyYWl0czo6Y29weShfX2J1ZiwgX19zdHIuZGF0YSgpLCBfX2J5 dGVzKTsKICAgICAgX19idWZbX19ieXRlc10gPSBfQ2hhclQoKTsKICAgIH0KfQojIDUxICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfc3RyaW5nLmgiIDIgMwojIDQz ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9sb2NhbGVmd2QuaCIgMiAz CiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2NjdHlwZS5o IiAxIDMKIyAzOCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2Nj dHlwZS5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2N0eXBlLmgiIDEgMwojIDI2ICIvdXNyL2luY2x1 ZGUvY3R5cGUuaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIyAyNyAiL3Vz ci9pbmNsdWRlL2N0eXBlLmgiIDIgMwojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDEg MwojIDI4ICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMiAzCgpleHRlcm4gIkMiIHsKIyA0MCAiL3Vz ci9pbmNsdWRlL2N0eXBlLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvZW5kaWFuLmgiIDEgMwojIDQx ICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMiAzCgoKCgoKCmVudW0KewogIF9JU3VwcGVyID0gKCgw KSA8IDggPyAoKDEgPDwgKDApKSA8PCA4KSA6ICgoMSA8PCAoMCkpID4+IDgpKSwKICBfSVNsb3dl ciA9ICgoMSkgPCA4ID8gKCgxIDw8ICgxKSkgPDwgOCkgOiAoKDEgPDwgKDEpKSA+PiA4KSksCiAg X0lTYWxwaGEgPSAoKDIpIDwgOCA/ICgoMSA8PCAoMikpIDw8IDgpIDogKCgxIDw8ICgyKSkgPj4g OCkpLAogIF9JU2RpZ2l0ID0gKCgzKSA8IDggPyAoKDEgPDwgKDMpKSA8PCA4KSA6ICgoMSA8PCAo MykpID4+IDgpKSwKICBfSVN4ZGlnaXQgPSAoKDQpIDwgOCA/ICgoMSA8PCAoNCkpIDw8IDgpIDog KCgxIDw8ICg0KSkgPj4gOCkpLAogIF9JU3NwYWNlID0gKCg1KSA8IDggPyAoKDEgPDwgKDUpKSA8 PCA4KSA6ICgoMSA8PCAoNSkpID4+IDgpKSwKICBfSVNwcmludCA9ICgoNikgPCA4ID8gKCgxIDw8 ICg2KSkgPDwgOCkgOiAoKDEgPDwgKDYpKSA+PiA4KSksCiAgX0lTZ3JhcGggPSAoKDcpIDwgOCA/ ICgoMSA8PCAoNykpIDw8IDgpIDogKCgxIDw8ICg3KSkgPj4gOCkpLAogIF9JU2JsYW5rID0gKCg4 KSA8IDggPyAoKDEgPDwgKDgpKSA8PCA4KSA6ICgoMSA8PCAoOCkpID4+IDgpKSwKICBfSVNjbnRy bCA9ICgoOSkgPCA4ID8gKCgxIDw8ICg5KSkgPDwgOCkgOiAoKDEgPDwgKDkpKSA+PiA4KSksCiAg X0lTcHVuY3QgPSAoKDEwKSA8IDggPyAoKDEgPDwgKDEwKSkgPDwgOCkgOiAoKDEgPDwgKDEwKSkg Pj4gOCkpLAogIF9JU2FsbnVtID0gKCgxMSkgPCA4ID8gKCgxIDw8ICgxMSkpIDw8IDgpIDogKCgx IDw8ICgxMSkpID4+IDgpKQp9OwojIDc1ICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMwpleHRlcm4g X19jb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgKl9fY3R5cGVfYjsKZXh0ZXJuIF9fY29uc3QgX19p bnQzMl90ICpfX2N0eXBlX3RvbG93ZXI7CmV4dGVybiBfX2NvbnN0IF9faW50MzJfdCAqX19jdHlw ZV90b3VwcGVyOwojIDkxICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMwpleHRlcm4gaW50IGlzYWxu dW0gKGludCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgaXNhbHBoYSAoaW50KSB0aHJvdyAoKTsKZXh0 ZXJuIGludCBpc2NudHJsIChpbnQpIHRocm93ICgpOwpleHRlcm4gaW50IGlzZGlnaXQgKGludCkg dGhyb3cgKCk7CmV4dGVybiBpbnQgaXNsb3dlciAoaW50KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBp c2dyYXBoIChpbnQpIHRocm93ICgpOwpleHRlcm4gaW50IGlzcHJpbnQgKGludCkgdGhyb3cgKCk7 CmV4dGVybiBpbnQgaXNwdW5jdCAoaW50KSB0aHJvdyAoKTsKZXh0ZXJuIGludCBpc3NwYWNlIChp bnQpIHRocm93ICgpOwpleHRlcm4gaW50IGlzdXBwZXIgKGludCkgdGhyb3cgKCk7CmV4dGVybiBp bnQgaXN4ZGlnaXQgKGludCkgdGhyb3cgKCk7CgoKZXh0ZXJuIGludCBpc2JsYW5rIChpbnQpIHRo cm93ICgpOwoKCgoKZXh0ZXJuIGludCB0b2xvd2VyIChpbnQgX19jKSB0aHJvdyAoKTsKCgpleHRl cm4gaW50IHRvdXBwZXIgKGludCBfX2MpIHRocm93ICgpOwoKCgoKCgpleHRlcm4gaW50IGlzYXNj aWkgKGludCBfX2MpIHRocm93ICgpOwoKCgpleHRlcm4gaW50IHRvYXNjaWkgKGludCBfX2MpIHRo cm93ICgpOwoKCgoKCgpleHRlcm4gaW50IF90b3VwcGVyIChpbnQpIHRocm93ICgpOwpleHRlcm4g aW50IF90b2xvd2VyIChpbnQpIHRocm93ICgpOwojIDIxMyAiL3Vzci9pbmNsdWRlL2N0eXBlLmgi IDMKIyAxICIvdXNyL2luY2x1ZGUveGxvY2FsZS5oIiAxIDMKIyAyMTQgIi91c3IvaW5jbHVkZS9j dHlwZS5oIiAyIDMKIyAyMjkgIi91c3IvaW5jbHVkZS9jdHlwZS5oIiAzCmV4dGVybiBpbnQgX19p c2FsbnVtX2wgKGludCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgX19pc2FscGhh X2wgKGludCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgX19pc2NudHJsX2wgKGlu dCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgX19pc2RpZ2l0X2wgKGludCwgX19s b2NhbGVfdCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgX19pc2xvd2VyX2wgKGludCwgX19sb2NhbGVf dCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgX19pc2dyYXBoX2wgKGludCwgX19sb2NhbGVfdCkgdGhy b3cgKCk7CmV4dGVybiBpbnQgX19pc3ByaW50X2wgKGludCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7 CmV4dGVybiBpbnQgX19pc3B1bmN0X2wgKGludCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7CmV4dGVy biBpbnQgX19pc3NwYWNlX2wgKGludCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7CmV4dGVybiBpbnQg X19pc3VwcGVyX2wgKGludCwgX19sb2NhbGVfdCkgdGhyb3cgKCk7CmV4dGVybiBpbnQgX19pc3hk aWdpdF9sIChpbnQsIF9fbG9jYWxlX3QpIHRocm93ICgpOwoKZXh0ZXJuIGludCBfX2lzYmxhbmtf bCAoaW50LCBfX2xvY2FsZV90KSB0aHJvdyAoKTsKCgoKZXh0ZXJuIGludCBfX3RvbG93ZXJfbCAo aW50IF9fYywgX19sb2NhbGVfdCBfX2wpIHRocm93ICgpOwoKCmV4dGVybiBpbnQgX190b3VwcGVy X2wgKGludCBfX2MsIF9fbG9jYWxlX3QgX19sKSB0aHJvdyAoKTsKIyAyNzUgIi91c3IvaW5jbHVk ZS9jdHlwZS5oIiAzCn0KIyAzOSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RkX2NjdHlwZS5oIiAyIDMKIyA1NSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysr LXYzL2JpdHMvc3RkX2NjdHlwZS5oIiAzCm5hbWVzcGFjZSBzdGQKewogIHVzaW5nIDo6aXNhbG51 bTsKICB1c2luZyA6OmlzYWxwaGE7CiAgdXNpbmcgOjppc2NudHJsOwogIHVzaW5nIDo6aXNkaWdp dDsKICB1c2luZyA6OmlzZ3JhcGg7CiAgdXNpbmcgOjppc2xvd2VyOwogIHVzaW5nIDo6aXNwcmlu dDsKICB1c2luZyA6OmlzcHVuY3Q7CiAgdXNpbmcgOjppc3NwYWNlOwogIHVzaW5nIDo6aXN1cHBl cjsKICB1c2luZyA6OmlzeGRpZ2l0OwogIHVzaW5nIDo6dG9sb3dlcjsKICB1c2luZyA6OnRvdXBw ZXI7Cn0KIyA0NCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxl ZndkLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Z1 bmN0ZXhjZXB0LmgiIDEgMwojIDM0ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv Yml0cy9mdW5jdGV4Y2VwdC5oIiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysr LXYzL2V4Y2VwdGlvbl9kZWZpbmVzLmgiIDEgMwojIDM1ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5j bHVkZS9nKystdjMvYml0cy9mdW5jdGV4Y2VwdC5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewoKICB2 b2lkCiAgX190aHJvd19iYWRfZXhjZXB0aW9uKHZvaWQpOwoKCiAgdm9pZAogIF9fdGhyb3dfYmFk X2FsbG9jKHZvaWQpOwoKCiAgdm9pZAogIF9fdGhyb3dfYmFkX2Nhc3Qodm9pZCk7CgogIHZvaWQK ICBfX3Rocm93X2JhZF90eXBlaWQodm9pZCk7CgoKICB2b2lkCiAgX190aHJvd19sb2dpY19lcnJv cihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19kb21haW5fZXJyb3IoY29uc3Qg Y2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfaW52YWxpZF9hcmd1bWVudChjb25zdCBjaGFy KiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19sZW5ndGhfZXJyb3IoY29uc3QgY2hhciogX19zKTsK CiAgdm9pZAogIF9fdGhyb3dfb3V0X29mX3JhbmdlKGNvbnN0IGNoYXIqIF9fcyk7CgogIHZvaWQK ICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhy b3dfcmFuZ2VfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfb3ZlcmZs b3dfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfdW5kZXJmbG93X2Vy cm9yKGNvbnN0IGNoYXIqIF9fcyk7CgoKICB2b2lkCiAgX190aHJvd19pb3NfZmFpbHVyZShjb25z dCBjaGFyKiBfX3MpOwp9CiMgNDUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i aXRzL2xvY2FsZWZ3ZC5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewojIDU2ICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9sb2NhbGVmd2QuaCIgMwogIHRlbXBsYXRlPHR5cGVu YW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgogICAgY2xhc3MgdmVjdG9yOwogIGNsYXNzIGxvY2Fs ZTsKCgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc3Nw YWNlKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4K ICAgIGlubGluZSBib29sCiAgICBpc3ByaW50KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc2NudHJsKF9DaGFy VCwgY29uc3QgbG9jYWxlJik7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGlu ZSBib29sCiAgICBpc3VwcGVyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc2xvd2VyKF9DaGFyVCwgY29uc3Qg bG9jYWxlJik7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAg ICBpc2FscGhhKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9D aGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc2RpZ2l0KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7 CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc3B1bmN0 KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAg IGlubGluZSBib29sCiAgICBpc3hkaWdpdChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOwoKICB0ZW1w bGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICBpbmxpbmUgYm9vbAogICAgaXNhbG51bShfQ2hhclQs IGNvbnN0IGxvY2FsZSYpOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICBpbmxpbmUg Ym9vbAogICAgaXNncmFwaChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOwoKICB0ZW1wbGF0ZTx0eXBl bmFtZSBfQ2hhclQ+CiAgICBpbmxpbmUgX0NoYXJUCiAgICB0b3VwcGVyKF9DaGFyVCwgY29uc3Qg bG9jYWxlJik7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBfQ2hhclQK ICAgIHRvbG93ZXIoX0NoYXJULCBjb25zdCBsb2NhbGUmKTsKCgoKICBjbGFzcyBjdHlwZV9iYXNl OwogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGNsYXNzIGN0eXBlOwogIHRlbXBsYXRl PD4gY2xhc3MgY3R5cGU8Y2hhcj47CgoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAg Y2xhc3MgY3R5cGVfYnluYW1lOwoKCiAgY2xhc3MgY29kZWN2dF9iYXNlOwogIHRlbXBsYXRlPHR5 cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVCwgdHlwZW5hbWUgX1N0YXRlVD4KICAg IGNsYXNzIGNvZGVjdnQ7CiAgdGVtcGxhdGU8PiBjbGFzcyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1i c3RhdGVfdD47CgoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRl cm5ULCB0eXBlbmFtZSBfU3RhdGVUPgogICAgY2xhc3MgY29kZWN2dF9ieW5hbWU7CgoKICB0ZW1w bGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXIgPSBpc3RyZWFtYnVmX2l0ZXJh dG9yPF9DaGFyVD4gPgogICAgY2xhc3MgbnVtX2dldDsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hh clQsIHR5cGVuYW1lIF9PdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KICAg IGNsYXNzIG51bV9wdXQ7CiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPiBjbGFzcyBudW1wdW5j dDsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+IGNsYXNzIG51bXB1bmN0X2J5bmFtZTsKCgog IHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGNsYXNzIGNvbGxhdGU7CiAgdGVtcGxhdGU8 dHlwZW5hbWUgX0NoYXJUPiBjbGFzcwogICAgY29sbGF0ZV9ieW5hbWU7CgoKICBjbGFzcyB0aW1l X2Jhc2U7CiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyID0gaXN0 cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KICAgIGNsYXNzIHRpbWVfZ2V0OwogIHRlbXBsYXRl PHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlciA9IGlzdHJlYW1idWZfaXRlcmF0b3I8 X0NoYXJUPiA+CiAgICBjbGFzcyB0aW1lX2dldF9ieW5hbWU7CiAgdGVtcGxhdGU8dHlwZW5hbWUg X0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+ CiAgICBjbGFzcyB0aW1lX3B1dDsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1l IF9PdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KICAgIGNsYXNzIHRpbWVf cHV0X2J5bmFtZTsKCgogIGNsYXNzIG1vbmV5X2Jhc2U7CiAgdGVtcGxhdGU8dHlwZW5hbWUgX0No YXJULCB0eXBlbmFtZSBfSW5JdGVyID0gaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KICAg IGNsYXNzIG1vbmV5X2dldDsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9P dXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KICAgIGNsYXNzIG1vbmV5X3B1 dDsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGwgPSBmYWxzZT4KICAgIGNs YXNzIG1vbmV5cHVuY3Q7CiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsID0g ZmFsc2U+CiAgICBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTsKCgogIGNsYXNzIG1lc3NhZ2VzX2Jh c2U7CiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAgY2xhc3MgbWVzc2FnZXM7CiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAgY2xhc3MgbWVzc2FnZXNfYnluYW1lOwoKCiAgY2xh c3MgbG9jYWxlCiAgewogIHB1YmxpYzoKCiAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBjYXRlZ29y eTsKCgogICAgY2xhc3MgZmFjZXQ7CiAgICBjbGFzcyBpZDsKICAgIGNsYXNzIF9JbXBsOwoKICAg IGZyaWVuZCBjbGFzcyBmYWNldDsKICAgIGZyaWVuZCBjbGFzcyBfSW1wbDsKCiAgICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfRmFjZXQ+CiAgICAgIGZyaWVuZCBjb25zdCBfRmFjZXQmCiAgICAgIHVzZV9m YWNldChjb25zdCBsb2NhbGUmKTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CiAgICAg IGZyaWVuZCBib29sCiAgICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSB0aHJvdygpOwoKCgog ICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IG5vbmUgPSAwOwogICAgc3RhdGljIGNvbnN0IGNhdGVn b3J5IGN0eXBlID0gMUwgPDwgMDsKICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBudW1lcmljID0g MUwgPDwgMTsKICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBjb2xsYXRlID0gMUwgPDwgMjsKICAg IHN0YXRpYyBjb25zdCBjYXRlZ29yeSB0aW1lID0gMUwgPDwgMzsKICAgIHN0YXRpYyBjb25zdCBj YXRlZ29yeSBtb25ldGFyeSA9IDFMIDw8IDQ7CiAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgbWVz c2FnZXMgPSAxTCA8PCA1OwogICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IGFsbCA9IChjb2xsYXRl IHwgY3R5cGUgfCBtb25ldGFyeSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBudW1lcmljIHwgdGltZSB8IG1lc3NhZ2VzKTsKCgogICAgbG9jYWxlKCkgdGhyb3co KTsKCiAgICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX290aGVyKSB0aHJvdygpOwoKICAgIGV4cGxp Y2l0CiAgICBsb2NhbGUoY29uc3QgY2hhciogX19zdGRfbmFtZSk7CgogICAgbG9jYWxlKGNvbnN0 IGxvY2FsZSYgX19iYXNlLCBjb25zdCBjaGFyKiBfX3MsIGNhdGVnb3J5IF9fY2F0KTsKCiAgICBs b2NhbGUoY29uc3QgbG9jYWxlJiBfX2Jhc2UsIGNvbnN0IGxvY2FsZSYgX19hZGQsIGNhdGVnb3J5 IF9fY2F0KTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CiAgICAgIGxvY2FsZShjb25z dCBsb2NhbGUmIF9fb3RoZXIsIF9GYWNldCogX19mKTsKCiAgICB+bG9jYWxlKCkgdGhyb3coKTsK CiAgICBjb25zdCBsb2NhbGUmCiAgICBvcGVyYXRvcj0oY29uc3QgbG9jYWxlJiBfX290aGVyKSB0 aHJvdygpOwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KICAgICAgbG9jYWxlCiAgICAg IGNvbWJpbmUoY29uc3QgbG9jYWxlJiBfX290aGVyKTsKCgogICAgc3RyaW5nCiAgICBuYW1lKCkg Y29uc3Q7CgogICAgYm9vbAogICAgb3BlcmF0b3I9PShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIGNv bnN0IHRocm93ICgpOwoKICAgIGlubGluZSBib29sCiAgICBvcGVyYXRvciE9KGNvbnN0IGxvY2Fs ZSYgX19vdGhlcikgY29uc3QgdGhyb3cgKCkKICAgIHsgcmV0dXJuICEodGhpcy0+b3BlcmF0b3I9 PShfX290aGVyKSk7IH0KCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhciwgdHlwZW5hbWUgX1Ry YWl0cywgdHlwZW5hbWUgX0FsbG9jPgogICAgICBib29sCiAgICAgIG9wZXJhdG9yKCkoY29uc3Qg YmFzaWNfc3RyaW5nPF9DaGFyLCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MxLAogICAgICAgICAgICAg ICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhciwgX1RyYWl0cywgX0FsbG9jPiYgX19zMikgY29u c3Q7CgoKICAgIHN0YXRpYyBsb2NhbGUKICAgIGdsb2JhbChjb25zdCBsb2NhbGUmKTsKCiAgICBz dGF0aWMgY29uc3QgbG9jYWxlJgogICAgY2xhc3NpYygpOwoKICBwcml2YXRlOgoKICAgIF9JbXBs KiBfTV9pbXBsOwoKCiAgICBzdGF0aWMgX0ltcGwqIF9TX2NsYXNzaWM7CgoKICAgIHN0YXRpYyBf SW1wbCogX1NfZ2xvYmFsOwoKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgX1NfbnVtX2NhdGVnb3Jp ZXMgPSA2OwogICAgc3RhdGljIGNvbnN0IHNpemVfdCBfU19udW1fZmFjZXRzID0gMTM7CgogICAg ZXhwbGljaXQKICAgIGxvY2FsZShfSW1wbCopIHRocm93KCk7CgogICAgc3RhdGljIGlubGluZSB2 b2lkCiAgICBfU19pbml0aWFsaXplKCkKICAgIHsgaWYgKCFfU19jbGFzc2ljKSBjbGFzc2ljKCk7 IH0KCiAgICBzdGF0aWMgY2F0ZWdvcnkKICAgIF9TX25vcm1hbGl6ZV9jYXRlZ29yeShjYXRlZ29y eSk7CgogICAgdm9pZAogICAgX01fY29hbGVzY2UoY29uc3QgbG9jYWxlJiBfX2Jhc2UsIGNvbnN0 IGxvY2FsZSYgX19hZGQsIGNhdGVnb3J5IF9fY2F0KTsKICB9OwoKCgogIGNsYXNzIGxvY2FsZTo6 X0ltcGwKICB7CiAgcHVibGljOgoKICAgIHR5cGVkZWYgdmVjdG9yPGZhY2V0KiwgYWxsb2NhdG9y PGZhY2V0Kj4gPiBfX3ZlY19mYWNldDsKCgogICAgZnJpZW5kIGNsYXNzIGxvY2FsZTsKICAgIGZy aWVuZCBjbGFzcyBsb2NhbGU6OmZhY2V0OwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4K ICAgICAgZnJpZW5kIGNvbnN0IF9GYWNldCYKICAgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYp OwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KICAgICAgZnJpZW5kIGJvb2wKICAgICAg aGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYpIHRocm93KCk7CgogIHByaXZhdGU6CgogICAgc2l6ZV90 IF9NX3JlZmVyZW5jZXM7CiAgICBfX3ZlY19mYWNldCogX01fZmFjZXRzOwogICAgc3RyaW5nIF9N X25hbWVzW19TX251bV9jYXRlZ29yaWVzXTsKICAgIF9fY19sb2NhbGUgX01fY19sb2NhbGU7CiAg ICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QgX1NfaWRfY3R5cGVbXTsKICAgIHN0YXRp YyBjb25zdCBsb2NhbGU6OmlkKiBjb25zdCBfU19pZF9udW1lcmljW107CiAgICBzdGF0aWMgY29u c3QgbG9jYWxlOjppZCogY29uc3QgX1NfaWRfY29sbGF0ZVtdOwogICAgc3RhdGljIGNvbnN0IGxv Y2FsZTo6aWQqIGNvbnN0IF9TX2lkX3RpbWVbXTsKICAgIHN0YXRpYyBjb25zdCBsb2NhbGU6Omlk KiBjb25zdCBfU19pZF9tb25ldGFyeVtdOwogICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNv bnN0IF9TX2lkX21lc3NhZ2VzW107CiAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3Qq IGNvbnN0IF9TX2ZhY2V0X2NhdGVnb3JpZXNbXTsKCiAgICBpbmxpbmUgdm9pZAogICAgX01fYWRk X3JlZmVyZW5jZSgpIHRocm93KCkKICAgIHsgKytfTV9yZWZlcmVuY2VzOyB9CgogICAgaW5saW5l IHZvaWQKICAgIF9NX3JlbW92ZV9yZWZlcmVuY2UoKSB0aHJvdygpCiAgICB7CiAgICAgIGlmIChf TV9yZWZlcmVuY2VzLS0gPT0gMCkKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAg eyBkZWxldGUgdGhpczsgfQogICAgICAgICAgY2F0Y2goLi4uKQogICAgICAgICAgICB7IH0KICAg ICAgICB9CiAgICB9CgogICAgX0ltcGwoY29uc3QgX0ltcGwmLCBzaXplX3QpOwogICAgX0ltcGwo c3RyaW5nIF9fbmFtZSwgc2l6ZV90KTsKICAgfl9JbXBsKCkgdGhyb3coKTsKCiAgICBib29sCiAg ICBfTV9jaGVja19zYW1lX25hbWUoKQogICAgewogICAgICBib29sIF9fcmV0ID0gdHJ1ZTsKICAg ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfU19udW1fY2F0ZWdvcmllcyAtIDE7ICsraSkKICAg ICAgICBfX3JldCAmPSBfTV9uYW1lc1tpXSA9PSBfTV9uYW1lc1tpICsgMV07CiAgICAgIHJldHVy biBfX3JldDsKICAgIH0KICAgIHZvaWQKICAgIF9NX3JlcGxhY2VfY2F0ZWdvcmllcyhjb25zdCBf SW1wbCosIGNhdGVnb3J5KTsKCiAgICB2b2lkCiAgICBfTV9yZXBsYWNlX2NhdGVnb3J5KGNvbnN0 IF9JbXBsKiwgY29uc3QgbG9jYWxlOjppZCogY29uc3QqKTsKCiAgICB2b2lkCiAgICBfTV9yZXBs YWNlX2ZhY2V0KGNvbnN0IF9JbXBsKiwgY29uc3QgbG9jYWxlOjppZCopOwoKICAgIHZvaWQKICAg IF9NX2luc3RhbGxfZmFjZXQoY29uc3QgbG9jYWxlOjppZCosIGZhY2V0Kik7CgogICAgdGVtcGxh dGU8dHlwZW5hbWUgX0ZhY2V0PgogICAgICBpbmxpbmUgdm9pZAogICAgICBfTV9pbml0X2ZhY2V0 KF9GYWNldCogX19mYWNldCkKICAgICAgeyBfTV9pbnN0YWxsX2ZhY2V0KCZfRmFjZXQ6OmlkLCBf X2ZhY2V0KTsgfQogIH07CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KICAgIGxvY2FsZTo6 bG9jYWxlKGNvbnN0IGxvY2FsZSYgX19vdGhlciwgX0ZhY2V0KiBfX2YpCiAgICB7CiAgICAgIF9N X2ltcGwgPSBuZXcgX0ltcGwoKl9fb3RoZXIuX01faW1wbCwgMSk7CiAgICAgIF9NX2ltcGwtPl9N X2luc3RhbGxfZmFjZXQoJl9GYWNldDo6aWQsIF9fZik7CiAgICAgIGZvciAoc2l6ZV90IF9faSA9 IDA7IF9faSA8IF9TX251bV9jYXRlZ29yaWVzOyArK19faSkKICAgICAgICBfTV9pbXBsLT5fTV9u YW1lc1tfX2ldID0gIioiOwogICAgfQoKCiAgY2xhc3MgbG9jYWxlOjpmYWNldAogIHsKICAgIGZy aWVuZCBjbGFzcyBsb2NhbGU7CiAgICBmcmllbmQgY2xhc3MgbG9jYWxlOjpfSW1wbDsKCiAgcHJv dGVjdGVkOgogICAgZXhwbGljaXQKICAgIGZhY2V0KHNpemVfdCBfX3JlZnMgPSAwKSB0aHJvdygp OwoKICAgIHZpcnR1YWwKICAgIH5mYWNldCgpIHsgfTsKCiAgICBzdGF0aWMgdm9pZAogICAgX1Nf Y3JlYXRlX2NfbG9jYWxlKF9fY19sb2NhbGUmIF9fY2xvYywgY29uc3QgY2hhciogX19zKTsKCiAg ICBzdGF0aWMgdm9pZAogICAgX1NfZGVzdHJveV9jX2xvY2FsZShfX2NfbG9jYWxlJiBfX2Nsb2Mp OwoKICBwcml2YXRlOgogICAgc2l6ZV90IF9NX3JlZmVyZW5jZXM7CgogICAgdm9pZAogICAgX01f YWRkX3JlZmVyZW5jZSgpIHRocm93KCk7CgogICAgdm9pZAogICAgX01fcmVtb3ZlX3JlZmVyZW5j ZSgpIHRocm93KCk7CgogICAgZmFjZXQoY29uc3QgZmFjZXQmKTsKCiAgICB2b2lkCiAgICBvcGVy YXRvcj0oY29uc3QgZmFjZXQmKTsKICB9OwoKCgogIGNsYXNzIGxvY2FsZTo6aWQKICB7CiAgcHJp dmF0ZToKICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU7CiAgICBmcmllbmQgY2xhc3MgbG9jYWxlOjpf SW1wbDsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KICAgICAgZnJpZW5kIGNvbnN0IF9G YWNldCYKICAgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYpOwogICAgdGVtcGxhdGU8dHlwZW5h bWUgX0ZhY2V0PgogICAgICBmcmllbmQgYm9vbAogICAgICBoYXNfZmFjZXQoY29uc3QgbG9jYWxl JikgdGhyb3cgKCk7CgoKCgogICAgbXV0YWJsZSBzaXplX3QgX01faW5kZXg7CgoKICAgIHN0YXRp YyBzaXplX3QgX1NfaGlnaHdhdGVyOwoKICAgIHZvaWQKICAgIG9wZXJhdG9yPShjb25zdCBpZCYp OwoKICAgIGlkKGNvbnN0IGlkJik7CgogIHB1YmxpYzoKCgoKICAgIGlkKCkgeyB9CiAgfTsKCiAg dGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgogICAgY29uc3QgX0ZhY2V0JgogICAgdXNlX2ZhY2V0 KGNvbnN0IGxvY2FsZSYgX19sb2MpOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CiAgICBi b29sCiAgICBoYXNfZmFjZXQoY29uc3QgbG9jYWxlJiBfX2xvYykgdGhyb3coKTsKfQojIDQ0ICIv dXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9zLmgiIDIgMwojIDEg Ii91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2lvc19iYXNlLmgiIDEgMwoj IDM4ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9pb3NfYmFzZS5oIiAz CgpuYW1lc3BhY2Ugc3RkCnsKCgoKCiAgZW51bSBfSW9zX0ZtdGZsYWdzIHsgX01faW9zX2ZtdGZs YWdzX2VuZCA9IDFMIDw8IDE2IH07CgogIGlubGluZSBfSW9zX0ZtdGZsYWdzCiAgb3BlcmF0b3Im KF9Jb3NfRm10ZmxhZ3MgX19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKICB7IHJldHVybiBfSW9zX0Zt dGZsYWdzKHN0YXRpY19jYXN0PGludD4oX19hKSAmIHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0K CiAgaW5saW5lIF9Jb3NfRm10ZmxhZ3MKICBvcGVyYXRvcnwoX0lvc19GbXRmbGFncyBfX2EsIF9J b3NfRm10ZmxhZ3MgX19iKQogIHsgcmV0dXJuIF9Jb3NfRm10ZmxhZ3Moc3RhdGljX2Nhc3Q8aW50 PihfX2EpIHwgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQoKICBpbmxpbmUgX0lvc19GbXRmbGFn cwogIG9wZXJhdG9yXihfSW9zX0ZtdGZsYWdzIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCiAgeyBy ZXR1cm4gX0lvc19GbXRmbGFncyhzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxp bnQ+KF9fYikpOyB9CgogIGlubGluZSBfSW9zX0ZtdGZsYWdzCiAgb3BlcmF0b3J8PShfSW9zX0Zt dGZsYWdzJiBfX2EsIF9Jb3NfRm10ZmxhZ3MgX19iKQogIHsgcmV0dXJuIF9fYSA9IF9fYSB8IF9f YjsgfQoKICBpbmxpbmUgX0lvc19GbXRmbGFncwogIG9wZXJhdG9yJj0oX0lvc19GbXRmbGFncyYg X19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKICB7IHJldHVybiBfX2EgPSBfX2EgJiBfX2I7IH0KCiAg aW5saW5lIF9Jb3NfRm10ZmxhZ3MKICBvcGVyYXRvcl49KF9Jb3NfRm10ZmxhZ3MmIF9fYSwgX0lv c19GbXRmbGFncyBfX2IpCiAgeyByZXR1cm4gX19hID0gX19hIF4gX19iOyB9CgogIGlubGluZSBf SW9zX0ZtdGZsYWdzCiAgb3BlcmF0b3J+KF9Jb3NfRm10ZmxhZ3MgX19hKQogIHsgcmV0dXJuIF9J b3NfRm10ZmxhZ3MofnN0YXRpY19jYXN0PGludD4oX19hKSk7IH0KCgogIGVudW0gX0lvc19PcGVu bW9kZSB7IF9NX2lvc19vcGVubW9kZV9lbmQgPSAxTCA8PCAxNiB9OwoKICBpbmxpbmUgX0lvc19P cGVubW9kZQogIG9wZXJhdG9yJihfSW9zX09wZW5tb2RlIF9fYSwgX0lvc19PcGVubW9kZSBfX2Ip CiAgeyByZXR1cm4gX0lvc19PcGVubW9kZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgJiBzdGF0aWNf Y2FzdDxpbnQ+KF9fYikpOyB9CgogIGlubGluZSBfSW9zX09wZW5tb2RlCiAgb3BlcmF0b3J8KF9J b3NfT3Blbm1vZGUgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKICB7IHJldHVybiBfSW9zX09wZW5t b2RlKHN0YXRpY19jYXN0PGludD4oX19hKSB8IHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KCiAg aW5saW5lIF9Jb3NfT3Blbm1vZGUKICBvcGVyYXRvcl4oX0lvc19PcGVubW9kZSBfX2EsIF9Jb3Nf T3Blbm1vZGUgX19iKQogIHsgcmV0dXJuIF9Jb3NfT3Blbm1vZGUoc3RhdGljX2Nhc3Q8aW50Pihf X2EpIF4gc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQoKICBpbmxpbmUgX0lvc19PcGVubW9kZQog IG9wZXJhdG9yfD0oX0lvc19PcGVubW9kZSYgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKICB7IHJl dHVybiBfX2EgPSBfX2EgfCBfX2I7IH0KCiAgaW5saW5lIF9Jb3NfT3Blbm1vZGUKICBvcGVyYXRv ciY9KF9Jb3NfT3Blbm1vZGUmIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCiAgeyByZXR1cm4gX19h ID0gX19hICYgX19iOyB9CgogIGlubGluZSBfSW9zX09wZW5tb2RlCiAgb3BlcmF0b3JePShfSW9z X09wZW5tb2RlJiBfX2EsIF9Jb3NfT3Blbm1vZGUgX19iKQogIHsgcmV0dXJuIF9fYSA9IF9fYSBe IF9fYjsgfQoKICBpbmxpbmUgX0lvc19PcGVubW9kZQogIG9wZXJhdG9yfihfSW9zX09wZW5tb2Rl IF9fYSkKICB7IHJldHVybiBfSW9zX09wZW5tb2RlKH5zdGF0aWNfY2FzdDxpbnQ+KF9fYSkpOyB9 CgoKICBlbnVtIF9Jb3NfSW9zdGF0ZSB7IF9NX2lvc19pb3N0YXRlX2VuZCA9IDFMIDw8IDE2IH07 CgogIGlubGluZSBfSW9zX0lvc3RhdGUKICBvcGVyYXRvciYoX0lvc19Jb3N0YXRlIF9fYSwgX0lv c19Jb3N0YXRlIF9fYikKICB7IHJldHVybiBfSW9zX0lvc3RhdGUoc3RhdGljX2Nhc3Q8aW50Pihf X2EpICYgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQoKICBpbmxpbmUgX0lvc19Jb3N0YXRlCiAg b3BlcmF0b3J8KF9Jb3NfSW9zdGF0ZSBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCiAgeyByZXR1cm4g X0lvc19Jb3N0YXRlKHN0YXRpY19jYXN0PGludD4oX19hKSB8IHN0YXRpY19jYXN0PGludD4oX19i KSk7IH0KCiAgaW5saW5lIF9Jb3NfSW9zdGF0ZQogIG9wZXJhdG9yXihfSW9zX0lvc3RhdGUgX19h LCBfSW9zX0lvc3RhdGUgX19iKQogIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZShzdGF0aWNfY2FzdDxp bnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CgogIGlubGluZSBfSW9zX0lvc3Rh dGUKICBvcGVyYXRvcnw9KF9Jb3NfSW9zdGF0ZSYgX19hLCBfSW9zX0lvc3RhdGUgX19iKQogIHsg cmV0dXJuIF9fYSA9IF9fYSB8IF9fYjsgfQoKICBpbmxpbmUgX0lvc19Jb3N0YXRlCiAgb3BlcmF0 b3ImPShfSW9zX0lvc3RhdGUmIF9fYSwgX0lvc19Jb3N0YXRlIF9fYikKICB7IHJldHVybiBfX2Eg PSBfX2EgJiBfX2I7IH0KCiAgaW5saW5lIF9Jb3NfSW9zdGF0ZQogIG9wZXJhdG9yXj0oX0lvc19J b3N0YXRlJiBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCiAgeyByZXR1cm4gX19hID0gX19hIF4gX19i OyB9CgogIGlubGluZSBfSW9zX0lvc3RhdGUKICBvcGVyYXRvcn4oX0lvc19Jb3N0YXRlIF9fYSkK ICB7IHJldHVybiBfSW9zX0lvc3RhdGUofnN0YXRpY19jYXN0PGludD4oX19hKSk7IH0KCiAgZW51 bSBfSW9zX1NlZWtkaXIgeyBfTV9pb3Nfc2Vla2Rpcl9lbmQgPSAxTCA8PCAxNiB9OwoKCiAgY2xh c3MgaW9zX2Jhc2UKICB7CiAgcHVibGljOgoKCiAgICBjbGFzcyBmYWlsdXJlIDogcHVibGljIGV4 Y2VwdGlvbgogICAgewogICAgcHVibGljOgoKCiAgICAgIGV4cGxpY2l0CiAgICAgIGZhaWx1cmUo Y29uc3Qgc3RyaW5nJiBfX3N0cikgdGhyb3coKTsKCiAgICAgIHZpcnR1YWwKICAgICAgfmZhaWx1 cmUoKSB0aHJvdygpOwoKICAgICAgdmlydHVhbCBjb25zdCBjaGFyKgogICAgICB3aGF0KCkgY29u c3QgdGhyb3coKTsKCiAgICBwcml2YXRlOgogICAgICBlbnVtIHsgX01fYnVmc2l6ZSA9IDI1NiB9 OwogICAgICBjaGFyIF9NX25hbWVbX01fYnVmc2l6ZV07CgogICAgfTsKCgogICAgdHlwZWRlZiBf SW9zX0ZtdGZsYWdzIGZtdGZsYWdzOwoKICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBib29sYWxw aGEgPSBmbXRmbGFncyhfX2lvc19mbGFnczo6X1NfYm9vbGFscGhhKTsKICAgIHN0YXRpYyBjb25z dCBmbXRmbGFncyBkZWMgPSBmbXRmbGFncyhfX2lvc19mbGFnczo6X1NfZGVjKTsKICAgIHN0YXRp YyBjb25zdCBmbXRmbGFncyBmaXhlZCA9IGZtdGZsYWdzKF9faW9zX2ZsYWdzOjpfU19maXhlZCk7 CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgaGV4ID0gZm10ZmxhZ3MoX19pb3NfZmxhZ3M6Ol9T X2hleCk7CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgaW50ZXJuYWwgPSBmbXRmbGFncyhfX2lv c19mbGFnczo6X1NfaW50ZXJuYWwpOwogICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGxlZnQgPSBm bXRmbGFncyhfX2lvc19mbGFnczo6X1NfbGVmdCk7CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mg b2N0ID0gZm10ZmxhZ3MoX19pb3NfZmxhZ3M6Ol9TX29jdCk7CiAgICBzdGF0aWMgY29uc3QgZm10 ZmxhZ3MgcmlnaHQgPSBmbXRmbGFncyhfX2lvc19mbGFnczo6X1NfcmlnaHQpOwogICAgc3RhdGlj IGNvbnN0IGZtdGZsYWdzIHNjaWVudGlmaWMgPSBmbXRmbGFncyhfX2lvc19mbGFnczo6X1Nfc2Np ZW50aWZpYyk7CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2hvd2Jhc2UgPSBmbXRmbGFncyhf X2lvc19mbGFnczo6X1Nfc2hvd2Jhc2UpOwogICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNob3dw b2ludCA9IGZtdGZsYWdzKF9faW9zX2ZsYWdzOjpfU19zaG93cG9pbnQpOwogICAgc3RhdGljIGNv bnN0IGZtdGZsYWdzIHNob3dwb3MgPSBmbXRmbGFncyhfX2lvc19mbGFnczo6X1Nfc2hvd3Bvcyk7 CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2tpcHdzID0gZm10ZmxhZ3MoX19pb3NfZmxhZ3M6 Ol9TX3NraXB3cyk7CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgdW5pdGJ1ZiA9IGZtdGZsYWdz KF9faW9zX2ZsYWdzOjpfU191bml0YnVmKTsKICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyB1cHBl cmNhc2UgPSBmbXRmbGFncyhfX2lvc19mbGFnczo6X1NfdXBwZXJjYXNlKTsKICAgIHN0YXRpYyBj b25zdCBmbXRmbGFncyBhZGp1c3RmaWVsZCA9IGZtdGZsYWdzKF9faW9zX2ZsYWdzOjpfU19hZGp1 c3RmaWVsZCk7CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgYmFzZWZpZWxkID0gZm10ZmxhZ3Mo X19pb3NfZmxhZ3M6Ol9TX2Jhc2VmaWVsZCk7CiAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZmxv YXRmaWVsZCA9IGZtdGZsYWdzKF9faW9zX2ZsYWdzOjpfU19mbG9hdGZpZWxkKTsKCgogICAgdHlw ZWRlZiBfSW9zX0lvc3RhdGUgaW9zdGF0ZTsKICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGJhZGJp dCA9IGlvc3RhdGUoX19pb3NfZmxhZ3M6Ol9TX2JhZGJpdCk7CiAgICBzdGF0aWMgY29uc3QgaW9z dGF0ZSBlb2ZiaXQgPSBpb3N0YXRlKF9faW9zX2ZsYWdzOjpfU19lb2ZiaXQpOwogICAgc3RhdGlj IGNvbnN0IGlvc3RhdGUgZmFpbGJpdCA9IGlvc3RhdGUoX19pb3NfZmxhZ3M6Ol9TX2ZhaWxiaXQp OwogICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgZ29vZGJpdCA9IGlvc3RhdGUoMCk7CgoKICAgIHR5 cGVkZWYgX0lvc19PcGVubW9kZSBvcGVubW9kZTsKICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBh cHAgPSBvcGVubW9kZShfX2lvc19mbGFnczo6X1NfYXBwKTsKICAgIHN0YXRpYyBjb25zdCBvcGVu bW9kZSBhdGUgPSBvcGVubW9kZShfX2lvc19mbGFnczo6X1NfYXRlKTsKICAgIHN0YXRpYyBjb25z dCBvcGVubW9kZSBiaW5hcnkgPSBvcGVubW9kZShfX2lvc19mbGFnczo6X1NfYmluKTsKICAgIHN0 YXRpYyBjb25zdCBvcGVubW9kZSBpbiA9IG9wZW5tb2RlKF9faW9zX2ZsYWdzOjpfU19pbik7CiAg ICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgb3V0ID0gb3Blbm1vZGUoX19pb3NfZmxhZ3M6Ol9TX291 dCk7CiAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgdHJ1bmMgPSBvcGVubW9kZShfX2lvc19mbGFn czo6X1NfdHJ1bmMpOwoKCiAgICB0eXBlZGVmIF9Jb3NfU2Vla2RpciBzZWVrZGlyOwogICAgc3Rh dGljIGNvbnN0IHNlZWtkaXIgYmVnID0gc2Vla2RpcigwKTsKICAgIHN0YXRpYyBjb25zdCBzZWVr ZGlyIGN1ciA9IHNlZWtkaXIoMSk7CiAgICBzdGF0aWMgY29uc3Qgc2Vla2RpciBlbmQgPSBzZWVr ZGlyKDIpOwojIDIxNiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvaW9z X2Jhc2UuaCIgMwogICAgZW51bSBldmVudAogICAgewogICAgICBlcmFzZV9ldmVudCwKICAgICAg aW1idWVfZXZlbnQsCiAgICAgIGNvcHlmbXRfZXZlbnQKICAgIH07CgogICAgdHlwZWRlZiB2b2lk ICgqZXZlbnRfY2FsbGJhY2spIChldmVudCwgaW9zX2Jhc2UmLCBpbnQpOwoKICAgIHZvaWQKICAg IHJlZ2lzdGVyX2NhbGxiYWNrKGV2ZW50X2NhbGxiYWNrIF9fZm4sIGludCBfX2luZGV4KTsKCiAg cHJvdGVjdGVkOgoKICAgIHN0cmVhbXNpemUgX01fcHJlY2lzaW9uOwogICAgc3RyZWFtc2l6ZSBf TV93aWR0aDsKICAgIGZtdGZsYWdzIF9NX2ZsYWdzOwoKCgogICAgc3RydWN0IF9DYWxsYmFja19s aXN0CiAgICB7CgogICAgICBfQ2FsbGJhY2tfbGlzdCogX01fbmV4dDsKICAgICAgaW9zX2Jhc2U6 OmV2ZW50X2NhbGxiYWNrIF9NX2ZuOwogICAgICBpbnQgX01faW5kZXg7CiAgICAgIGludCBfTV9y ZWZjb3VudDsKCiAgICAgIF9DYWxsYmFja19saXN0KGlvc19iYXNlOjpldmVudF9jYWxsYmFjayBf X2ZuLCBpbnQgX19pbmRleCwKICAgICAgICAgICAgICAgICAgICAgX0NhbGxiYWNrX2xpc3QqIF9f Y2IpCiAgICAgIDogX01fbmV4dChfX2NiKSwgX01fZm4oX19mbiksIF9NX2luZGV4KF9faW5kZXgp LCBfTV9yZWZjb3VudCgwKSB7IH0KCiAgICAgIHZvaWQKICAgICAgX01fYWRkX3JlZmVyZW5jZSgp IHsgKytfTV9yZWZjb3VudDsgfQoKICAgICAgaW50CiAgICAgIF9NX3JlbW92ZV9yZWZlcmVuY2Uo KSB7IHJldHVybiBfTV9yZWZjb3VudC0tOyB9CiAgICB9OwoKICAgICBfQ2FsbGJhY2tfbGlzdCog X01fY2FsbGJhY2tzOwoKICAgIHZvaWQKICAgIF9NX2NhbGxfY2FsbGJhY2tzKGV2ZW50IF9fZXYp IHRocm93KCk7CgogICAgdm9pZAogICAgX01fZGlzcG9zZV9jYWxsYmFja3Modm9pZCk7CgoKICAg IHN0cnVjdCBfV29yZHMKICAgIHsKICAgICAgdm9pZCogX01fcHdvcmQ7CiAgICAgIGxvbmcgX01f aXdvcmQ7CiAgICB9OwoKICAgIHN0YXRpYyBjb25zdCBpbnQgX1NfbG9jYWxfd29yZHMgPSA4Owog ICAgX1dvcmRzIF9NX3dvcmRfYXJyYXlbX1NfbG9jYWxfd29yZHNdOwogICAgX1dvcmRzIF9NX2R1 bW15OwogICAgX1dvcmRzKiBfTV93b3JkczsKICAgIGludCBfTV93b3JkX2xpbWl0OwoKICAgIF9X b3JkcyYKICAgIF9NX2dyb3dfd29yZHMoaW50IF9faW5kZXgpOwoKCiAgICBsb2NhbGUgX01faW9z X2xvY2FsZTsKCiAgICB2b2lkCiAgICBfTV9pbml0KCk7CgogIHB1YmxpYzoKCgoKCgogICAgY2xh c3MgSW5pdAogICAgewogICAgICBmcmllbmQgY2xhc3MgaW9zX2Jhc2U7CiAgICBwdWJsaWM6CiAg ICAgIEluaXQoKTsKICAgICAgfkluaXQoKTsKCiAgICAgIHN0YXRpYyB2b2lkCiAgICAgIF9TX2lv c19jcmVhdGUoYm9vbCBfX3N5bmMpOwoKICAgICAgc3RhdGljIHZvaWQKICAgICAgX1NfaW9zX2Rl c3Ryb3koKTsKCiAgICBwcml2YXRlOgogICAgICBzdGF0aWMgaW50IF9TX2lvc19iYXNlX2luaXQ7 CiAgICAgIHN0YXRpYyBib29sIF9TX3N5bmNlZF93aXRoX3N0ZGlvOwogICAgfTsKCgogICAgaW5s aW5lIGZtdGZsYWdzCiAgICBmbGFncygpIGNvbnN0IHsgcmV0dXJuIF9NX2ZsYWdzOyB9CgogICAg aW5saW5lIGZtdGZsYWdzCiAgICBmbGFncyhmbXRmbGFncyBfX2ZtdGZsKQogICAgewogICAgICBm bXRmbGFncyBfX29sZCA9IF9NX2ZsYWdzOwogICAgICBfTV9mbGFncyA9IF9fZm10Zmw7CiAgICAg IHJldHVybiBfX29sZDsKICAgIH0KCiAgICBpbmxpbmUgZm10ZmxhZ3MKICAgIHNldGYoZm10Zmxh Z3MgX19mbXRmbCkKICAgIHsKICAgICAgZm10ZmxhZ3MgX19vbGQgPSBfTV9mbGFnczsKICAgICAg X01fZmxhZ3MgfD0gX19mbXRmbDsKICAgICAgcmV0dXJuIF9fb2xkOwogICAgfQoKICAgIGlubGlu ZSBmbXRmbGFncwogICAgc2V0ZihmbXRmbGFncyBfX2ZtdGZsLCBmbXRmbGFncyBfX21hc2spCiAg ICB7CiAgICAgIGZtdGZsYWdzIF9fb2xkID0gX01fZmxhZ3M7CiAgICAgIF9NX2ZsYWdzICY9IH5f X21hc2s7CiAgICAgIF9NX2ZsYWdzIHw9IChfX2ZtdGZsICYgX19tYXNrKTsKICAgICAgcmV0dXJu IF9fb2xkOwogICAgfQoKICAgIGlubGluZSB2b2lkCiAgICB1bnNldGYoZm10ZmxhZ3MgX19tYXNr KSB7IF9NX2ZsYWdzICY9IH5fX21hc2s7IH0KCiAgICBpbmxpbmUgc3RyZWFtc2l6ZQogICAgcHJl Y2lzaW9uKCkgY29uc3QgeyByZXR1cm4gX01fcHJlY2lzaW9uOyB9CgogICAgaW5saW5lIHN0cmVh bXNpemUKICAgIHByZWNpc2lvbihzdHJlYW1zaXplIF9fcHJlYykKICAgIHsKICAgICAgc3RyZWFt c2l6ZSBfX29sZCA9IF9NX3ByZWNpc2lvbjsKICAgICAgX01fcHJlY2lzaW9uID0gX19wcmVjOwog ICAgICByZXR1cm4gX19vbGQ7CiAgICB9CgogICAgaW5saW5lIHN0cmVhbXNpemUKICAgIHdpZHRo KCkgY29uc3QgeyByZXR1cm4gX01fd2lkdGg7IH0KCiAgICBpbmxpbmUgc3RyZWFtc2l6ZQogICAg d2lkdGgoc3RyZWFtc2l6ZSBfX3dpZGUpCiAgICB7CiAgICAgIHN0cmVhbXNpemUgX19vbGQgPSBf TV93aWR0aDsKICAgICAgX01fd2lkdGggPSBfX3dpZGU7CiAgICAgIHJldHVybiBfX29sZDsKICAg IH0KCiAgICBzdGF0aWMgYm9vbAogICAgc3luY193aXRoX3N0ZGlvKGJvb2wgX19zeW5jID0gdHJ1 ZSk7CgoKICAgIGxvY2FsZQogICAgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CgogICAgaW5s aW5lIGxvY2FsZQogICAgZ2V0bG9jKCkgY29uc3QgeyByZXR1cm4gX01faW9zX2xvY2FsZTsgfQoK CiAgICBzdGF0aWMgaW50CiAgICB4YWxsb2MoKSB0aHJvdygpOwoKICAgIGlubGluZSBsb25nJgog ICAgaXdvcmQoaW50IF9faXgpCiAgICB7CiAgICAgIF9Xb3JkcyYgX193b3JkID0gKF9faXggPCBf TV93b3JkX2xpbWl0KQogICAgICAgICAgICAgICAgICAgICAgICA/IF9NX3dvcmRzW19faXhdIDog X01fZ3Jvd193b3JkcyhfX2l4KTsKICAgICAgcmV0dXJuIF9fd29yZC5fTV9pd29yZDsKICAgIH0K CiAgICBpbmxpbmUgdm9pZComCiAgICBwd29yZChpbnQgX19peCkKICAgIHsKICAgICAgX1dvcmRz JiBfX3dvcmQgPSAoX19peCA8IF9NX3dvcmRfbGltaXQpCiAgICAgICAgICAgICAgICAgICAgICAg ID8gX01fd29yZHNbX19peF0gOiBfTV9ncm93X3dvcmRzKF9faXgpOwogICAgICByZXR1cm4gX193 b3JkLl9NX3B3b3JkOwogICAgfQoKCiAgICB+aW9zX2Jhc2UoKTsKCiAgcHJvdGVjdGVkOgogICAg aW9zX2Jhc2UoKTsKCgogIHByaXZhdGU6CiAgICBpb3NfYmFzZShjb25zdCBpb3NfYmFzZSYpOwoK ICAgIGlvc19iYXNlJgogICAgb3BlcmF0b3I9KGNvbnN0IGlvc19iYXNlJik7CgogIH07CgoKICBp bmxpbmUgaW9zX2Jhc2UmCiAgYm9vbGFscGhhKGlvc19iYXNlJiBfX2Jhc2UpCiAgewogICAgX19i YXNlLnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7CiAgICByZXR1cm4gX19iYXNlOwogIH0KCiAg aW5saW5lIGlvc19iYXNlJgogIG5vYm9vbGFscGhhKGlvc19iYXNlJiBfX2Jhc2UpCiAgewogICAg X19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKTsKICAgIHJldHVybiBfX2Jhc2U7CiAg fQoKICBpbmxpbmUgaW9zX2Jhc2UmCiAgc2hvd2Jhc2UoaW9zX2Jhc2UmIF9fYmFzZSkKICB7CiAg ICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOwogICAgcmV0dXJuIF9fYmFzZTsKICB9 CgogIGlubGluZSBpb3NfYmFzZSYKICBub3Nob3diYXNlKGlvc19iYXNlJiBfX2Jhc2UpCiAgewog ICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOwogICAgcmV0dXJuIF9fYmFzZTsK ICB9CgogIGlubGluZSBpb3NfYmFzZSYKICBzaG93cG9pbnQoaW9zX2Jhc2UmIF9fYmFzZSkKICB7 CiAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KTsKICAgIHJldHVybiBfX2Jhc2U7 CiAgfQoKICBpbmxpbmUgaW9zX2Jhc2UmCiAgbm9zaG93cG9pbnQoaW9zX2Jhc2UmIF9fYmFzZSkK ICB7CiAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpOwogICAgcmV0dXJuIF9f YmFzZTsKICB9CgogIGlubGluZSBpb3NfYmFzZSYKICBzaG93cG9zKGlvc19iYXNlJiBfX2Jhc2Up CiAgewogICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpOwogICAgcmV0dXJuIF9fYmFz ZTsKICB9CgogIGlubGluZSBpb3NfYmFzZSYKICBub3Nob3dwb3MoaW9zX2Jhc2UmIF9fYmFzZSkK ICB7CiAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93cG9zKTsKICAgIHJldHVybiBfX2Jh c2U7CiAgfQoKICBpbmxpbmUgaW9zX2Jhc2UmCiAgc2tpcHdzKGlvc19iYXNlJiBfX2Jhc2UpCiAg ewogICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNraXB3cyk7CiAgICByZXR1cm4gX19iYXNlOwog IH0KCiAgaW5saW5lIGlvc19iYXNlJgogIG5vc2tpcHdzKGlvc19iYXNlJiBfX2Jhc2UpCiAgewog ICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2tpcHdzKTsKICAgIHJldHVybiBfX2Jhc2U7CiAg fQoKICBpbmxpbmUgaW9zX2Jhc2UmCiAgdXBwZXJjYXNlKGlvc19iYXNlJiBfX2Jhc2UpCiAgewog ICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSk7CiAgICByZXR1cm4gX19iYXNlOwog IH0KCiAgaW5saW5lIGlvc19iYXNlJgogIG5vdXBwZXJjYXNlKGlvc19iYXNlJiBfX2Jhc2UpCiAg ewogICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsKICAgIHJldHVybiBfX2Jh c2U7CiAgfQoKICBpbmxpbmUgaW9zX2Jhc2UmCiAgdW5pdGJ1Zihpb3NfYmFzZSYgX19iYXNlKQog IHsKICAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1Zik7CiAgICAgcmV0dXJuIF9fYmFz ZTsKICB9CgogIGlubGluZSBpb3NfYmFzZSYKICBub3VuaXRidWYoaW9zX2Jhc2UmIF9fYmFzZSkK ICB7CiAgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1Zik7CiAgICAgcmV0dXJuIF9f YmFzZTsKICB9CgoKICBpbmxpbmUgaW9zX2Jhc2UmCiAgaW50ZXJuYWwoaW9zX2Jhc2UmIF9fYmFz ZSkKICB7CiAgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmludGVybmFsLCBpb3NfYmFzZTo6YWRq dXN0ZmllbGQpOwogICAgIHJldHVybiBfX2Jhc2U7CiAgfQoKICBpbmxpbmUgaW9zX2Jhc2UmCiAg bGVmdChpb3NfYmFzZSYgX19iYXNlKQogIHsKICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpsZWZ0 LCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpOwogICAgcmV0dXJuIF9fYmFzZTsKICB9CgogIGlubGlu ZSBpb3NfYmFzZSYKICByaWdodChpb3NfYmFzZSYgX19iYXNlKQogIHsKICAgIF9fYmFzZS5zZXRm KGlvc19iYXNlOjpyaWdodCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsKICAgIHJldHVybiBfX2Jh c2U7CiAgfQoKCiAgaW5saW5lIGlvc19iYXNlJgogIGRlYyhpb3NfYmFzZSYgX19iYXNlKQogIHsK ICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpkZWMsIGlvc19iYXNlOjpiYXNlZmllbGQpOwogICAg cmV0dXJuIF9fYmFzZTsKICB9CgogIGlubGluZSBpb3NfYmFzZSYKICBoZXgoaW9zX2Jhc2UmIF9f YmFzZSkKICB7CiAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6aGV4LCBpb3NfYmFzZTo6YmFzZWZp ZWxkKTsKICAgIHJldHVybiBfX2Jhc2U7CiAgfQoKICBpbmxpbmUgaW9zX2Jhc2UmCiAgb2N0KGlv c19iYXNlJiBfX2Jhc2UpCiAgewogICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6Om9jdCwgaW9zX2Jh c2U6OmJhc2VmaWVsZCk7CiAgICByZXR1cm4gX19iYXNlOwogIH0KCgogIGlubGluZSBpb3NfYmFz ZSYKICBmaXhlZChpb3NfYmFzZSYgX19iYXNlKQogIHsKICAgIF9fYmFzZS5zZXRmKGlvc19iYXNl OjpmaXhlZCwgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpOwogICAgcmV0dXJuIF9fYmFzZTsKICB9Cgog IGlubGluZSBpb3NfYmFzZSYKICBzY2llbnRpZmljKGlvc19iYXNlJiBfX2Jhc2UpCiAgewogICAg X19iYXNlLnNldGYoaW9zX2Jhc2U6OnNjaWVudGlmaWMsIGlvc19iYXNlOjpmbG9hdGZpZWxkKTsK ICAgIHJldHVybiBfX2Jhc2U7CiAgfQoKfQojIDQ1ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVk ZS9nKystdjMvYml0cy9zdGRfaW9zLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9iaXRzL3N0ZF9zdHJlYW1idWYuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9zdHJlYW1idWYuaCIgMwoKIyAxICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25m aWcuaCIgMSAzCiMgNDAgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0 ZF9zdHJlYW1idWYuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYz L2JpdHMvc3RkX2lvc2Z3ZC5oIiAxIDMKIyA0MSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX3N0cmVhbWJ1Zi5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAv aW5jbHVkZS9nKystdjMvYml0cy9zdGRfY3N0ZGlvLmgiIDEgMwojIDQyICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfc3RyZWFtYnVmLmgiIDIgMwojIDEgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2xvY2FsZWZ3ZC5oIiAxIDMKIyA0MyAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3N0cmVhbWJ1Zi5oIiAy IDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9pb3NfYmFzZS5o IiAxIDMKIyA0NCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3N0 cmVhbWJ1Zi5oIiAyIDMKCm5hbWVzcGFjZSBzdGQKewogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFy VCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIHN0cmVhbXNpemUKICAgIF9fY29weV9zdHJlYW1idWZz KGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JiBfaW9zLAogICAgICAgICAgICAgICAgICAgICAg YmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JpbiwKICAgICAgICAgICAgICAg ICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3Nib3V0KTsKCgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGNsYXNzIGJhc2lj X3N0cmVhbWJ1ZgogICAgewogICAgcHVibGljOgoKICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90 eXBlOwogICAgICB0eXBlZGVmIF9UcmFpdHMgdHJhaXRzX3R5cGU7CiAgICAgIHR5cGVkZWYgdHlw ZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOwogICAgICB0eXBlZGVmIHR5cGVu YW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSBwb3NfdHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFt ZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgb2ZmX3R5cGU7CgoKICAgICAgdHlwZWRlZiBjdHlwZTxj aGFyX3R5cGU+IF9fY3R5cGVfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8Y2hh cl90eXBlLCB0cmFpdHNfdHlwZT4gX19zdHJlYW1idWZfdHlwZTsKCiAgICAgIGZyaWVuZCBjbGFz cyBiYXNpY19pb3M8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT47CiAgICAgIGZyaWVuZCBjbGFzcyBi YXNpY19pc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OwogICAgICBmcmllbmQgY2xhc3Mg YmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjsKICAgICAgZnJpZW5kIGNsYXNz IGlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT47CiAgICAgIGZyaWVu ZCBjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OwoKICAg ICAgZnJpZW5kIHN0cmVhbXNpemUKICAgICAgX19jb3B5X3N0cmVhbWJ1ZnM8PihiYXNpY19pb3M8 Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4mIF9faW9zLAogICAgICAgICAgICAgICAgICAgICAgICAg IF9fc3RyZWFtYnVmX3R5cGUqIF9fc2JpbixfX3N0cmVhbWJ1Zl90eXBlKiBfX3Nib3V0KTsKCiAg ICBwcm90ZWN0ZWQ6CgoKCgoKCiAgICAgIGNoYXJfdHlwZSogX01fYnVmOwoKCiAgICAgIGludF90 eXBlIF9NX2J1Zl9zaXplOwoKCiAgICAgIGludF90eXBlIF9NX2J1Zl9zaXplX29wdDsKCgoKICAg ICAgYm9vbCBfTV9idWZfdW5pZmllZDsKCgoKCgoKICAgICAgY2hhcl90eXBlKiBfTV9pbl9iZWc7 CiAgICAgIGNoYXJfdHlwZSogX01faW5fY3VyOwogICAgICBjaGFyX3R5cGUqIF9NX2luX2VuZDsK ICAgICAgY2hhcl90eXBlKiBfTV9vdXRfYmVnOwogICAgICBjaGFyX3R5cGUqIF9NX291dF9jdXI7 CiAgICAgIGNoYXJfdHlwZSogX01fb3V0X2VuZDsKCgogICAgICBpb3NfYmFzZTo6b3Blbm1vZGUg X01fbW9kZTsKCgogICAgICBsb2NhbGUgX01fYnVmX2xvY2FsZTsKCgogICAgICBib29sIF9NX2J1 Zl9sb2NhbGVfaW5pdDsKCgoKCgoKICAgICAgaW50X3R5cGUgX01fcGJhY2tfc2l6ZTsKICAgICAg Y2hhcl90eXBlKiBfTV9wYmFjazsKICAgICAgY2hhcl90eXBlKiBfTV9wYmFja19jdXJfc2F2ZTsK ICAgICAgY2hhcl90eXBlKiBfTV9wYmFja19lbmRfc2F2ZTsKICAgICAgYm9vbCBfTV9wYmFja19p bml0OwoKCgoKICAgICAgdm9pZAogICAgICBfTV9wYmFja19jcmVhdGUoKQogICAgICB7CiAgICAg ICAgaWYgKCFfTV9wYmFja19pbml0KQogICAgICAgICAgewogICAgICAgICAgICBpbnRfdHlwZSBf X2Rpc3QgPSBfTV9pbl9lbmQgLSBfTV9pbl9jdXI7CiAgICAgICAgICAgIGludF90eXBlIF9fbGVu ID0gbWluKF9NX3BiYWNrX3NpemUsIF9fZGlzdCk7CiAgICAgICAgICAgIHRyYWl0c190eXBlOjpj b3B5KF9NX3BiYWNrLCBfTV9pbl9jdXIsIF9fbGVuKTsKICAgICAgICAgICAgX01fcGJhY2tfY3Vy X3NhdmUgPSBfTV9pbl9jdXI7CiAgICAgICAgICAgIF9NX3BiYWNrX2VuZF9zYXZlID0gX01faW5f ZW5kOwogICAgICAgICAgICB0aGlzLT5zZXRnKF9NX3BiYWNrLCBfTV9wYmFjaywgX01fcGJhY2sg KyBfX2xlbik7CiAgICAgICAgICAgIF9NX3BiYWNrX2luaXQgPSB0cnVlOwogICAgICAgICAgfQog ICAgICB9CgoKCgogICAgICB2b2lkCiAgICAgIF9NX3BiYWNrX2Rlc3Ryb3koKQogICAgICB7CiAg ICAgICAgaWYgKF9NX3BiYWNrX2luaXQpCiAgICAgICAgICB7CgogICAgICAgICAgICBpbnRfdHlw ZSBfX29mZl9jdXIgPSBfTV9pbl9jdXIgLSBfTV9wYmFjazsKCgogICAgICAgICAgICBpbnRfdHlw ZSBfX29mZl9lbmQgPSAwOwogICAgICAgICAgICBpbnRfdHlwZSBfX3BiYWNrX2xlbiA9IF9NX2lu X2VuZCAtIF9NX3BiYWNrOwogICAgICAgICAgICBpbnRfdHlwZSBfX3NhdmVfbGVuID0gX01fcGJh Y2tfZW5kX3NhdmUgLSBfTV9idWY7CiAgICAgICAgICAgIGlmIChfX3BiYWNrX2xlbiA+IF9fc2F2 ZV9sZW4pCiAgICAgICAgICAgICAgX19vZmZfZW5kID0gX19wYmFja19sZW4gLSBfX3NhdmVfbGVu OwoKICAgICAgICAgICAgdGhpcy0+c2V0ZyhfTV9idWYsIF9NX3BiYWNrX2N1cl9zYXZlICsgX19v ZmZfY3VyLAogICAgICAgICAgICAgICAgICAgICAgIF9NX3BiYWNrX2VuZF9zYXZlICsgX19vZmZf ZW5kKTsKICAgICAgICAgICAgX01fcGJhY2tfY3VyX3NhdmUgPSBfX251bGw7CiAgICAgICAgICAg IF9NX3BiYWNrX2VuZF9zYXZlID0gX19udWxsOwogICAgICAgICAgICBfTV9wYmFja19pbml0ID0g ZmFsc2U7CiAgICAgICAgICB9CiAgICAgIH0KCgoKICAgICAgdm9pZAogICAgICBfTV9pbl9jdXJf bW92ZShvZmZfdHlwZSBfX24pCiAgICAgIHsKICAgICAgICBib29sIF9fdGVzdG91dCA9IF9NX291 dF9jdXI7CiAgICAgICAgX01faW5fY3VyICs9IF9fbjsKICAgICAgICBpZiAoX190ZXN0b3V0ICYm IF9NX2J1Zl91bmlmaWVkKQogICAgICAgICAgX01fb3V0X2N1ciArPSBfX247CiAgICAgIH0KIyAx OTMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9zdHJlYW1idWYu aCIgMwogICAgICB2b2lkCiAgICAgIF9NX291dF9jdXJfbW92ZShvZmZfdHlwZSBfX24pCiAgICAg IHsKICAgICAgICBib29sIF9fdGVzdGluID0gX01faW5fY3VyOwoKICAgICAgICBfTV9vdXRfY3Vy ICs9IF9fbjsKICAgICAgICBpZiAoX190ZXN0aW4gJiYgX01fYnVmX3VuaWZpZWQpCiAgICAgICAg ICBfTV9pbl9jdXIgKz0gX19uOwogICAgICAgIGlmIChfTV9vdXRfY3VyID4gX01fb3V0X2VuZCkK ICAgICAgICAgIHsKICAgICAgICAgICAgX01fb3V0X2VuZCA9IF9NX291dF9jdXI7CgogICAgICAg ICAgICBpZiAoX190ZXN0aW4pCiAgICAgICAgICAgICAgX01faW5fZW5kICs9IF9fbjsKICAgICAg ICAgIH0KICAgICAgfQoKCgoKICAgICAgb2ZmX3R5cGUKICAgICAgX01fb3V0X2J1Zl9zaXplKCkK ICAgICAgewogICAgICAgIG9mZl90eXBlIF9fcmV0ID0gMDsKICAgICAgICBpZiAoX01fb3V0X2N1 cikKICAgICAgICAgIHsKCiAgICAgICAgICAgIGlmIChfTV9vdXRfYmVnID09IF9NX2J1ZikKICAg ICAgICAgICAgICBfX3JldCA9IF9NX291dF9iZWcgKyBfTV9idWZfc2l6ZSAtIF9NX291dF9jdXI7 CgogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgX19yZXQgPSBfTV9vdXRfZW5kIC0gX01f b3V0X2N1cjsKICAgICAgICAgIH0KICAgICAgICByZXR1cm4gX19yZXQ7CiAgICAgIH0KIyAyMzYg Ii91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9zdHJlYW1idWYuaCIg MwogICAgICB2b2lkCiAgICAgIF9NX3NldF9pbmRldGVybWluYXRlKHZvaWQpCiAgICAgIHsKICAg ICAgICBpZiAoX01fbW9kZSAmIGlvc19iYXNlOjppbikKICAgICAgICAgIHRoaXMtPnNldGcoX01f YnVmLCBfTV9idWYsIF9NX2J1Zik7CiAgICAgICAgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0 KQogICAgICAgICAgdGhpcy0+c2V0cChfTV9idWYsIF9NX2J1Zik7CiAgICAgIH0KCiAgICAgIHZv aWQKICAgICAgX01fc2V0X2RldGVybWluYXRlKG9mZl90eXBlIF9fb2ZmKQogICAgICB7CiAgICAg ICAgYm9vbCBfX3Rlc3RpbiA9IF9NX21vZGUgJiBpb3NfYmFzZTo6aW47CiAgICAgICAgYm9vbCBf X3Rlc3RvdXQgPSBfTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKICAgICAgICBpZiAoX190ZXN0aW4p CiAgICAgICAgICB0aGlzLT5zZXRnKF9NX2J1ZiwgX01fYnVmLCBfTV9idWYgKyBfX29mZik7CiAg ICAgICAgaWYgKF9fdGVzdG91dCkKICAgICAgICAgIHRoaXMtPnNldHAoX01fYnVmLCBfTV9idWYg KyBfX29mZik7CiAgICAgIH0KCiAgICAgIGJvb2wKICAgICAgX01faXNfaW5kZXRlcm1pbmF0ZSh2 b2lkKQogICAgICB7CiAgICAgICAgYm9vbCBfX3JldCA9IGZhbHNlOwoKICAgICAgICBpZiAoX01f YnVmKQogICAgICAgICAgewogICAgICAgICAgICBpZiAoX01fbW9kZSAmIGlvc19iYXNlOjppbikK ICAgICAgICAgICAgICBfX3JldCA9IF9NX2luX2JlZyA9PSBfTV9pbl9jdXIgJiYgX01faW5fY3Vy ID09IF9NX2luX2VuZDsKICAgICAgICAgICAgaWYgKF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0KQog ICAgICAgICAgICAgIF9fcmV0ID0gX01fb3V0X2JlZyA9PSBfTV9vdXRfY3VyICYmIF9NX291dF9j dXIgPT0gX01fb3V0X2VuZDsKICAgICAgICAgIH0KICAgICAgICByZXR1cm4gX19yZXQ7CiAgICAg IH0KCiAgcHVibGljOgogICAgICB2aXJ0dWFsCiAgICAgIH5iYXNpY19zdHJlYW1idWYoKQogICAg ICB7CiAgICAgICAgX01fYnVmX3VuaWZpZWQgPSBmYWxzZTsKICAgICAgICBfTV9idWZfc2l6ZSA9 IDA7CiAgICAgICAgX01fYnVmX3NpemVfb3B0ID0gMDsKICAgICAgICBfTV9tb2RlID0gaW9zX2Jh c2U6Om9wZW5tb2RlKDApOwogICAgICAgIF9NX2J1Zl9sb2NhbGVfaW5pdCA9IGZhbHNlOwogICAg ICB9CgoKICAgICAgbG9jYWxlCiAgICAgIHB1YmltYnVlKGNvbnN0IGxvY2FsZSAmX19sb2MpCiAg ICAgIHsKICAgICAgICBsb2NhbGUgX190bXAodGhpcy0+Z2V0bG9jKCkpOwogICAgICAgIHRoaXMt PmltYnVlKF9fbG9jKTsKICAgICAgICByZXR1cm4gX190bXA7CiAgICAgIH0KCiAgICAgIGxvY2Fs ZQogICAgICBnZXRsb2MoKSBjb25zdAogICAgICB7CiAgICAgICAgaWYgKF9NX2J1Zl9sb2NhbGVf aW5pdCkKICAgICAgICAgIHJldHVybiBfTV9idWZfbG9jYWxlOwogICAgICAgIGVsc2UKICAgICAg ICAgIHJldHVybiBsb2NhbGUoKTsKICAgICAgfQoKCiAgICAgIF9fc3RyZWFtYnVmX3R5cGUqCiAg ICAgIHB1YnNldGJ1ZihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCiAgICAgIHsgcmV0 dXJuIHRoaXMtPnNldGJ1ZihfX3MsIF9fbik7IH0KCiAgICAgIHBvc190eXBlCiAgICAgIHB1YnNl ZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LAogICAgICAgICAg ICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFz ZTo6b3V0KQogICAgICB7IHJldHVybiB0aGlzLT5zZWVrb2ZmKF9fb2ZmLCBfX3dheSwgX19tb2Rl KTsgfQoKICAgICAgcG9zX3R5cGUKICAgICAgcHVic2Vla3Bvcyhwb3NfdHlwZSBfX3NwLAogICAg ICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBp b3NfYmFzZTo6b3V0KQogICAgICB7IHJldHVybiB0aGlzLT5zZWVrcG9zKF9fc3AsIF9fbW9kZSk7 IH0KCiAgICAgIGludAogICAgICBwdWJzeW5jKCkgeyByZXR1cm4gdGhpcy0+c3luYygpOyB9CgoK CiAgICAgIHN0cmVhbXNpemUKICAgICAgaW5fYXZhaWwoKQogICAgICB7CiAgICAgICAgc3RyZWFt c2l6ZSBfX3JldDsKICAgICAgICBpZiAoX01faW5fY3VyICYmIF9NX2luX2N1ciA8IF9NX2luX2Vu ZCkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKF9NX3BiYWNrX2luaXQpCiAgICAgICAgICAg ICAgewogICAgICAgICAgICAgICAgaW50X3R5cGUgX19zYXZlX2xlbiA9IF9NX3BiYWNrX2VuZF9z YXZlIC0gX01fcGJhY2tfY3VyX3NhdmU7CiAgICAgICAgICAgICAgICBpbnRfdHlwZSBfX3BiYWNr X2xlbiA9IF9NX2luX2N1ciAtIF9NX3BiYWNrOwogICAgICAgICAgICAgICAgX19yZXQgPSBfX3Nh dmVfbGVuIC0gX19wYmFja19sZW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAg ICAgICAgICAgICAgX19yZXQgPSB0aGlzLT5lZ3B0cigpIC0gdGhpcy0+Z3B0cigpOwogICAgICAg ICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIF9fcmV0ID0gdGhpcy0+c2hvd21hbnljKCk7CiAg ICAgICAgcmV0dXJuIF9fcmV0OwogICAgICB9CgogICAgICBpbnRfdHlwZQogICAgICBzbmV4dGMo KQogICAgICB7CiAgICAgICAgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CiAg ICAgICAgcmV0dXJuICh0aGlzLT5zYnVtcGMoKSA9PSBfX2VvZiA/IF9fZW9mIDogdGhpcy0+c2dl dGMoKSk7CiAgICAgIH0KCiAgICAgIGludF90eXBlCiAgICAgIHNidW1wYygpOwoKICAgICAgaW50 X3R5cGUKICAgICAgc2dldGMoKQogICAgICB7CiAgICAgICAgaW50X3R5cGUgX19yZXQ7CiAgICAg ICAgaWYgKF9NX2luX2N1ciAmJiBfTV9pbl9jdXIgPCBfTV9pbl9lbmQpCiAgICAgICAgICBfX3Jl dCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqKHRoaXMtPmdwdHIoKSkpOwogICAgICAgIGVs c2UKICAgICAgICAgIF9fcmV0ID0gdGhpcy0+dW5kZXJmbG93KCk7CiAgICAgICAgcmV0dXJuIF9f cmV0OwogICAgICB9CgogICAgICBzdHJlYW1zaXplCiAgICAgIHNnZXRuKGNoYXJfdHlwZSogX19z LCBzdHJlYW1zaXplIF9fbikKICAgICAgeyByZXR1cm4gdGhpcy0+eHNnZXRuKF9fcywgX19uKTsg fQoKCiAgICAgIGludF90eXBlCiAgICAgIHNwdXRiYWNrYyhjaGFyX3R5cGUgX19jKTsKCiAgICAg IGludF90eXBlCiAgICAgIHN1bmdldGMoKTsKCgogICAgICBpbnRfdHlwZQogICAgICBzcHV0Yyhj aGFyX3R5cGUgX19jKTsKCiAgICAgIHN0cmVhbXNpemUKICAgICAgc3B1dG4oY29uc3QgY2hhcl90 eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQogICAgICB7IHJldHVybiB0aGlzLT54c3B1dG4oX19z LCBfX24pOyB9CgogICAgcHJvdGVjdGVkOgogICAgICBiYXNpY19zdHJlYW1idWYoKQogICAgICA6 IF9NX2J1ZihfX251bGwpLCBfTV9idWZfc2l6ZSgwKSwKICAgICAgX01fYnVmX3NpemVfb3B0KHN0 YXRpY19jYXN0PGludF90eXBlPig4MTkyKSksIF9NX2J1Zl91bmlmaWVkKGZhbHNlKSwKICAgICAg X01faW5fYmVnKDApLCBfTV9pbl9jdXIoMCksIF9NX2luX2VuZCgwKSwgX01fb3V0X2JlZygwKSwg X01fb3V0X2N1cigwKSwKICAgICAgX01fb3V0X2VuZCgwKSwgX01fbW9kZShpb3NfYmFzZTo6b3Bl bm1vZGUoMCkpLCBfTV9idWZfbG9jYWxlKGxvY2FsZSgpKSwKICAgICAgX01fYnVmX2xvY2FsZV9p bml0KGZhbHNlKSwgX01fcGJhY2tfc2l6ZSgxKSwgX01fcGJhY2soX19udWxsKSwKICAgICAgX01f cGJhY2tfY3VyX3NhdmUoX19udWxsKSwgX01fcGJhY2tfZW5kX3NhdmUoX19udWxsKSwgX01fcGJh Y2tfaW5pdChmYWxzZSkKICAgICAgeyB9CgoKICAgICAgY2hhcl90eXBlKgogICAgICBlYmFjaygp IGNvbnN0IHsgcmV0dXJuIF9NX2luX2JlZzsgfQoKICAgICAgY2hhcl90eXBlKgogICAgICBncHRy KCkgY29uc3QgeyByZXR1cm4gX01faW5fY3VyOyB9CgogICAgICBjaGFyX3R5cGUqCiAgICAgIGVn cHRyKCkgY29uc3QgeyByZXR1cm4gX01faW5fZW5kOyB9CgogICAgICB2b2lkCiAgICAgIGdidW1w KGludCBfX24pIHsgX01faW5fY3VyICs9IF9fbjsgfQoKICAgICAgdm9pZAogICAgICBzZXRnKGNo YXJfdHlwZSogX19nYmVnLCBjaGFyX3R5cGUqIF9fZ25leHQsIGNoYXJfdHlwZSogX19nZW5kKQog ICAgICB7CiAgICAgICAgX01faW5fYmVnID0gX19nYmVnOwogICAgICAgIF9NX2luX2N1ciA9IF9f Z25leHQ7CiAgICAgICAgX01faW5fZW5kID0gX19nZW5kOwogICAgICAgIGlmICghKF9NX21vZGUg JiBpb3NfYmFzZTo6aW4pICYmIF9fZ2JlZyAmJiBfX2duZXh0ICYmIF9fZ2VuZCkKICAgICAgICAg IF9NX21vZGUgPSBfTV9tb2RlIHwgaW9zX2Jhc2U6OmluOwogICAgICB9CgoKICAgICAgY2hhcl90 eXBlKgogICAgICBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX291dF9iZWc7IH0KCiAgICAgIGNo YXJfdHlwZSoKICAgICAgcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9NX291dF9jdXI7IH0KCiAgICAg IGNoYXJfdHlwZSoKICAgICAgZXBwdHIoKSBjb25zdCB7IHJldHVybiBfTV9vdXRfZW5kOyB9Cgog ICAgICB2b2lkCiAgICAgIHBidW1wKGludCBfX24pIHsgX01fb3V0X2N1ciArPSBfX247IH0KCiAg ICAgIHZvaWQKICAgICAgc2V0cChjaGFyX3R5cGUqIF9fcGJlZywgY2hhcl90eXBlKiBfX3BlbmQp CiAgICAgIHsKICAgICAgICBfTV9vdXRfYmVnID0gX01fb3V0X2N1ciA9IF9fcGJlZzsKICAgICAg ICBfTV9vdXRfZW5kID0gX19wZW5kOwogICAgICAgIGlmICghKF9NX21vZGUgJiBpb3NfYmFzZTo6 b3V0KSAmJiBfX3BiZWcgJiYgX19wZW5kKQogICAgICAgICAgX01fbW9kZSA9IF9NX21vZGUgfCBp b3NfYmFzZTo6b3V0OwogICAgICB9CgoKCiAgICAgIHZpcnR1YWwgdm9pZAogICAgICBpbWJ1ZShj b25zdCBsb2NhbGUmIF9fbG9jKQogICAgICB7CiAgICAgICAgX01fYnVmX2xvY2FsZV9pbml0ID0g dHJ1ZTsKICAgICAgICBpZiAoX01fYnVmX2xvY2FsZSAhPSBfX2xvYykKICAgICAgICAgIF9NX2J1 Zl9sb2NhbGUgPSBfX2xvYzsKICAgICAgfQoKCiAgICAgIHZpcnR1YWwgYmFzaWNfc3RyZWFtYnVm PGNoYXJfdHlwZSxfVHJhaXRzPioKICAgICAgc2V0YnVmKGNoYXJfdHlwZSosIHN0cmVhbXNpemUp CiAgICAgIHsgcmV0dXJuIHRoaXM7IH0KCiAgICAgIHZpcnR1YWwgcG9zX3R5cGUKICAgICAgc2Vl a29mZihvZmZfdHlwZSwgaW9zX2Jhc2U6OnNlZWtkaXIsCiAgICAgICAgICAgICAgaW9zX2Jhc2U6 Om9wZW5tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKICAgICAgeyByZXR1cm4g cG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsgfQoKICAgICAgdmlydHVhbCBwb3NfdHlwZQogICAgICBz ZWVrcG9zKHBvc190eXBlLAogICAgICAgICAgICAgIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19i YXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCiAgICAgIHsgcmV0dXJuIHBvc190eXBlKG9mZl90eXBl KC0xKSk7IH0KCiAgICAgIHZpcnR1YWwgaW50CiAgICAgIHN5bmMoKSB7IHJldHVybiAwOyB9CgoK ICAgICAgdmlydHVhbCBzdHJlYW1zaXplCiAgICAgIHNob3dtYW55YygpIHsgcmV0dXJuIDA7IH0K CiAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZQogICAgICB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0 cmVhbXNpemUgX19uKTsKCiAgICAgIHZpcnR1YWwgaW50X3R5cGUKICAgICAgdW5kZXJmbG93KCkK ICAgICAgeyByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOyB9CgogICAgICB2aXJ0dWFsIGludF90 eXBlCiAgICAgIHVmbG93KCkKICAgICAgewogICAgICAgIGludF90eXBlIF9fcmV0ID0gdHJhaXRz X3R5cGU6OmVvZigpOwogICAgICAgIGJvb2wgX190ZXN0ZW9mID0gdGhpcy0+dW5kZXJmbG93KCkg PT0gX19yZXQ7CiAgICAgICAgYm9vbCBfX3Rlc3RwZW5kaW5nID0gX01faW5fY3VyICYmIF9NX2lu X2N1ciA8IF9NX2luX2VuZDsKICAgICAgICBpZiAoIV9fdGVzdGVvZiAmJiBfX3Rlc3RwZW5kaW5n KQogICAgICAgICAgewogICAgICAgICAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlw ZSgqX01faW5fY3VyKTsKICAgICAgICAgICAgKytfTV9pbl9jdXI7CiAgICAgICAgICAgIGlmIChf TV9idWZfdW5pZmllZCAmJiBfTV9tb2RlICYgaW9zX2Jhc2U6Om91dCkKICAgICAgICAgICAgICAr K19NX291dF9jdXI7CiAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9fcmV0OwogICAgICB9CgoK ICAgICAgdmlydHVhbCBpbnRfdHlwZQogICAgICBwYmFja2ZhaWwoaW50X3R5cGUgPSB0cmFpdHNf dHlwZTo6ZW9mKCkpCiAgICAgIHsgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsgfQoKCiAgICAg IHZpcnR1YWwgc3RyZWFtc2l6ZQogICAgICB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0 cmVhbXNpemUgX19uKTsKCiAgICAgIHZpcnR1YWwgaW50X3R5cGUKICAgICAgb3ZlcmZsb3coaW50 X3R5cGUgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpCiAgICAgIHsgcmV0dXJuIHRyYWl0c190eXBlOjpl b2YoKTsgfQojIDUxNiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3Rk X3N0cmVhbWJ1Zi5oIiAzCiAgICBwcml2YXRlOgogICAgICBiYXNpY19zdHJlYW1idWYoY29uc3Qg X19zdHJlYW1idWZfdHlwZSYpOwoKICAgICAgX19zdHJlYW1idWZfdHlwZSYKICAgICAgb3BlcmF0 b3I9KGNvbnN0IF9fc3RyZWFtYnVmX3R5cGUmKTsKCiAgICB9OwoKfQoKCgoKIyAxICIvdXNyL2xv Y2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdHJlYW1idWYudGNjIiAxIDMKIyAzNyAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RyZWFtYnVmLnRjYyIgMwpu YW1lc3BhY2Ugc3RkIHsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJh aXRzPgogICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCiAgICBi YXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6CiAgICBzYnVtcGMoKQogICAgewogICAg ICBpbnRfdHlwZSBfX3JldDsKICAgICAgaWYgKF9NX2luX2N1ciAmJiBfTV9pbl9jdXIgPCBfTV9p bl9lbmQpCiAgICAgICAgewogICAgICAgICAgY2hhcl90eXBlIF9fYyA9ICpncHRyKCk7CiAgICAg ICAgICBfTV9pbl9jdXJfbW92ZSgxKTsKICAgICAgICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRv X2ludF90eXBlKF9fYyk7CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgX19yZXQgPSB0aGlz LT51ZmxvdygpOwogICAgICByZXR1cm4gX19yZXQ7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1l IF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9U cmFpdHM+OjppbnRfdHlwZQogICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46Ogog ICAgc3B1dGJhY2tjKGNoYXJfdHlwZSBfX2MpCiAgICB7CiAgICAgIGludF90eXBlIF9fcmV0Owog ICAgICBib29sIF9fdGVzdHBvcyA9IF9NX2luX2N1ciAmJiBfTV9pbl9iZWcgPCBfTV9pbl9jdXI7 CiAgICAgIGJvb2wgX190ZXN0bmUgPSBfTV9pbl9jdXIgJiYgIXRyYWl0c190eXBlOjplcShfX2Ms IHRoaXMtPmdwdHIoKVstMV0pOwogICAgICBpZiAoIV9fdGVzdHBvcyB8fCBfX3Rlc3RuZSkKICAg ICAgICBfX3JldCA9IHBiYWNrZmFpbCh0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19jKSk7CiAg ICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBfTV9pbl9jdXJfbW92ZSgtMSk7CiAgICAgICAg ICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKICAgICAg ICB9CiAgICAgIHJldHVybiBfX3JldDsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJU LCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46 OmludF90eXBlCiAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6CiAgICBzdW5n ZXRjKCkKICAgIHsKICAgICAgaW50X3R5cGUgX19yZXQ7CiAgICAgIGlmIChfTV9pbl9jdXIgJiYg X01faW5fYmVnIDwgX01faW5fY3VyKQogICAgICAgIHsKICAgICAgICAgIF9NX2luX2N1cl9tb3Zl KC0xKTsKICAgICAgICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCpfTV9pbl9j dXIpOwogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIF9fcmV0ID0gdGhpcy0+cGJhY2tmYWls KCk7CiAgICAgIHJldHVybiBfX3JldDsKICAgIH0KCgoKCgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBf Q2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJh aXRzPjo6aW50X3R5cGUKICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKICAg IHNwdXRjKGNoYXJfdHlwZSBfX2MpCiAgICB7CiAgICAgIGludF90eXBlIF9fcmV0OwogICAgICBp ZiAoX01fb3V0X2J1Zl9zaXplKCkpCiAgICAgICAgewogICAgICAgICAgKl9NX291dF9jdXIgPSBf X2M7CiAgICAgICAgICBfTV9vdXRfY3VyX21vdmUoMSk7CiAgICAgICAgICBfX3JldCA9IHRyYWl0 c190eXBlOjp0b19pbnRfdHlwZShfX2MpOwogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIF9f cmV0ID0gdGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fYykpOwogICAg ICByZXR1cm4gX19yZXQ7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5h bWUgX1RyYWl0cz4KICAgIHN0cmVhbXNpemUKICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9U cmFpdHM+OjoKICAgIHhzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCiAgICB7 CiAgICAgIHN0cmVhbXNpemUgX19yZXQgPSAwOwogICAgICB3aGlsZSAoX19yZXQgPCBfX24pCiAg ICAgICAgewogICAgICAgICAgc2l6ZV90IF9fYnVmX2xlbiA9IF9NX2luX2VuZCAtIF9NX2luX2N1 cjsKICAgICAgICAgIGlmIChfX2J1Zl9sZW4gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgc2l6ZV90IF9fcmVtYWluaW5nID0gX19uIC0gX19yZXQ7CiAgICAgICAgICAgICAgc2l6ZV90 IF9fbGVuID0gbWluKF9fYnVmX2xlbiwgX19yZW1haW5pbmcpOwogICAgICAgICAgICAgIHRyYWl0 c190eXBlOjpjb3B5KF9fcywgX01faW5fY3VyLCBfX2xlbik7CiAgICAgICAgICAgICAgX19yZXQg Kz0gX19sZW47CiAgICAgICAgICAgICAgX19zICs9IF9fbGVuOwogICAgICAgICAgICAgIF9NX2lu X2N1cl9tb3ZlKF9fbGVuKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIGlmIChfX3JldCA8IF9f bikKICAgICAgICAgICAgewogICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IHRoaXMtPnVmbG93 KCk7CiAgICAgICAgICAgICAgaWYgKF9fYyAhPSB0cmFpdHNfdHlwZTo6ZW9mKCkpCiAgICAgICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcysrLCB0 cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYykpOwogICAgICAgICAgICAgICAgICArK19fcmV0 OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGJy ZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gX19yZXQ7CiAgICB9CgoK CgoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgc3Ry ZWFtc2l6ZQogICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OgogICAgeHNwdXRu KGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKICAgIHsKICAgICAgc3RyZWFt c2l6ZSBfX3JldCA9IDA7CiAgICAgIHdoaWxlIChfX3JldCA8IF9fbikKICAgICAgICB7CiAgICAg ICAgICBvZmZfdHlwZSBfX2J1Zl9sZW4gPSBfTV9vdXRfYnVmX3NpemUoKTsKICAgICAgICAgIGlm IChfX2J1Zl9sZW4gPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgb2ZmX3R5cGUgX19y ZW1haW5pbmcgPSBfX24gLSBfX3JldDsKICAgICAgICAgICAgICBvZmZfdHlwZSBfX2xlbiA9IG1p bihfX2J1Zl9sZW4sIF9fcmVtYWluaW5nKTsKICAgICAgICAgICAgICB0cmFpdHNfdHlwZTo6Y29w eShfTV9vdXRfY3VyLCBfX3MsIF9fbGVuKTsKICAgICAgICAgICAgICBfX3JldCArPSBfX2xlbjsK ICAgICAgICAgICAgICBfX3MgKz0gX19sZW47CiAgICAgICAgICAgICAgX01fb3V0X2N1cl9tb3Zl KF9fbGVuKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIGlmIChfX3JldCA8IF9fbikKICAgICAg ICAgICAgewogICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IHRoaXMtPm92ZXJmbG93KHRyYWl0 c190eXBlOjp0b19pbnRfdHlwZSgqX19zKSk7CiAgICAgICAgICAgICAgaWYgKF9fYyAhPSB0cmFp dHNfdHlwZTo6ZW9mKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICsrX19y ZXQ7CiAgICAgICAgICAgICAgICAgICsrX19zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg ICAgIGVsc2UKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQog ICAgICByZXR1cm4gX19yZXQ7CiAgICB9CgoKCgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQs IHR5cGVuYW1lIF9UcmFpdHM+CiAgICBzdHJlYW1zaXplCiAgICBfX2NvcHlfc3RyZWFtYnVmcyhi YXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYgX19pb3MsCiAgICAgICAgICAgICAgICAgICAgICBi YXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYmluLAogICAgICAgICAgICAgICAg ICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JvdXQpCiAgewogICAg ICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIGludF90eXBlOwoKICAgICAgc3Ry ZWFtc2l6ZSBfX3JldCA9IDA7CiAgICAgIHN0cmVhbXNpemUgX19idWZzaXplID0gX19zYmluLT5p bl9hdmFpbCgpOwogICAgICBzdHJlYW1zaXplIF9feHRyY3Q7CiAgICAgIGJvb2wgX190ZXN0cHV0 ID0gX19zYm91dC0+X01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CiAgICAgIHRyeSB7CiAgICAgICAg d2hpbGUgKF9fdGVzdHB1dCAmJiBfX2J1ZnNpemUgIT0gLTEpCiAgICAgICAgICB7CiAgICAgICAg ICAgIF9feHRyY3QgPSBfX3Nib3V0LT5zcHV0bihfX3NiaW4tPmdwdHIoKSwgX19idWZzaXplKTsK ICAgICAgICAgICAgX19yZXQgKz0gX194dHJjdDsKICAgICAgICAgICAgX19zYmluLT5fTV9pbl9j dXJfbW92ZShfX3h0cmN0KTsKICAgICAgICAgICAgaWYgKF9feHRyY3QgPT0gX19idWZzaXplKQog ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IF9fc2Jpbi0+c2dl dGMoKTsKICAgICAgICAgICAgICAgIGlmIChfX2MgPT0gX1RyYWl0czo6ZW9mKCkpCiAgICAgICAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBfX2lvcy5zZXRzdGF0ZShpb3NfYmFzZTo6 ZW9mYml0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQog ICAgICAgICAgICAgICAgX19idWZzaXplID0gX19zYmluLT5pbl9hdmFpbCgpOwogICAgICAgICAg ICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQog ICAgICB9CiAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKSB7CiAgICAgICAgaWYgKChfX2lv cy5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6ZmFpbGJpdCkgIT0gMCkKICAgICAgICAgIHRocm93 OwogICAgICB9CiAgICAgIHJldHVybiBfX3JldDsKICAgIH0KfQojIDUzMCAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3N0cmVhbWJ1Zi5oIiAyIDMKIyA0NiAiL3Vz ci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2lvcy5oIiAyIDMKIyAxICIv dXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9iYXNpY19pb3MuaCIgMSAzCiMg MzQgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Jhc2ljX2lvcy5oIiAz CgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3NidWZfaXRlci5o IiAxIDMKIyAzNiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc2J1Zl9p dGVyLmgiIDMKCm5hbWVzcGFjZSBzdGQKewogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlw ZW5hbWUgX1RyYWl0cz4KICAgIGNsYXNzIG9zdHJlYW1idWZfaXRlcmF0b3IKICAgIDogcHVibGlj IGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CiAg ICB7CiAgICBwdWJsaWM6CgogICAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CiAgICAgIHR5 cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8 X0NoYXJULCBfVHJhaXRzPiBzdHJlYW1idWZfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19vc3Ry ZWFtPF9DaGFyVCwgX1RyYWl0cz4gb3N0cmVhbV90eXBlOwoKICAgIHByaXZhdGU6CiAgICAgIHN0 cmVhbWJ1Zl90eXBlKiBfTV9zYnVmOwogICAgICBib29sIF9NX2ZhaWxlZDsKCiAgICBwdWJsaWM6 CiAgICAgIGlubGluZQogICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yKG9zdHJlYW1fdHlwZSYgX19z KSB0aHJvdyAoKQogICAgICA6IF9NX3NidWYoX19zLnJkYnVmKCkpLCBfTV9mYWlsZWQoIV9NX3Ni dWYpIHsgfQoKICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcihzdHJlYW1idWZfdHlwZSogX19zKSB0 aHJvdyAoKQogICAgICA6IF9NX3NidWYoX19zKSwgX01fZmFpbGVkKCFfTV9zYnVmKSB7IH0KCiAg ICAgIG9zdHJlYW1idWZfaXRlcmF0b3ImCiAgICAgIG9wZXJhdG9yPShfQ2hhclQgX19jKTsKCiAg ICAgIG9zdHJlYW1idWZfaXRlcmF0b3ImCiAgICAgIG9wZXJhdG9yKigpIHRocm93KCkKICAgICAg eyByZXR1cm4gKnRoaXM7IH0KCiAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3ImCiAgICAgIG9wZXJh dG9yKysoaW50KSB0aHJvdygpCiAgICAgIHsgcmV0dXJuICp0aGlzOyB9CgogICAgICBvc3RyZWFt YnVmX2l0ZXJhdG9yJgogICAgICBvcGVyYXRvcisrKCkgdGhyb3coKQogICAgICB7IHJldHVybiAq dGhpczsgfQoKICAgICAgYm9vbAogICAgICBmYWlsZWQoKSBjb25zdCB0aHJvdygpCiAgICAgIHsg cmV0dXJuIF9NX2ZhaWxlZDsgfQogICAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0 eXBlbmFtZSBfVHJhaXRzPgogICAgaW5saW5lIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBf VHJhaXRzPiYKICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPjo6b3BlcmF0 b3I9KF9DaGFyVCBfX2MpCiAgICB7CiAgICAgIGlmICghX01fZmFpbGVkICYmCiAgICAgICAgICBf VHJhaXRzOjplcV9pbnRfdHlwZShfTV9zYnVmLT5zcHV0YyhfX2MpLF9UcmFpdHM6OmVvZigpKSkK ICAgICAgX01fZmFpbGVkID0gdHJ1ZTsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKCgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGNsYXNzIGlzdHJl YW1idWZfaXRlcmF0b3IKICAgIDogcHVibGljIGl0ZXJhdG9yPGlucHV0X2l0ZXJhdG9yX3RhZywg X0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSwKICAgICAgICAgICAgICAgICAgICAg IF9DaGFyVCosIF9DaGFyVCY+CiAgICB7CiAgICBwdWJsaWM6CgogICAgICB0eXBlZGVmIF9DaGFy VCBjaGFyX3R5cGU7CiAgICAgIHR5cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKICAgICAgdHlw ZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKICAgICAgdHlwZWRlZiBi YXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiBzdHJlYW1idWZfdHlwZTsKICAgICAgdHlw ZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gaXN0cmVhbV90eXBlOwoKICAgICAg dHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX19pc3RyZWFtYnVm aXRlcl90eXBlOwoKICAgIHByaXZhdGU6CgoKCgoKCgogICAgICBzdHJlYW1idWZfdHlwZSogX01f c2J1ZjsKICAgICAgaW50X3R5cGUgX01fYzsKCiAgICBwdWJsaWM6CiAgICAgIGlzdHJlYW1idWZf aXRlcmF0b3IoKSB0aHJvdygpCiAgICAgIDogX01fc2J1ZihfX251bGwpLCBfTV9jKC0yKSB7IH0K CiAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3IoaXN0cmVhbV90eXBlJiBfX3MpIHRocm93KCkKICAg ICAgOiBfTV9zYnVmKF9fcy5yZGJ1ZigpKSwgX01fYygtMikgeyB9CgogICAgICBpc3RyZWFtYnVm X2l0ZXJhdG9yKHN0cmVhbWJ1Zl90eXBlKiBfX3MpIHRocm93KCkKICAgICAgOiBfTV9zYnVmKF9f cyksIF9NX2MoLTIpIHsgfQoKCgoKICAgICAgY2hhcl90eXBlCiAgICAgIG9wZXJhdG9yKigpIGNv bnN0CiAgICAgIHsKCiAgICAgICAgY2hhcl90eXBlIF9fcmV0OwogICAgICAgIGlmIChfTV9zYnVm ICYmIF9NX2MgIT0gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KC0yKSkKICAgICAgICAgIF9fcmV0ID0g X01fYzsKICAgICAgICBlbHNlIGlmIChfTV9zYnVmKQogICAgICAgICAgX19yZXQgPSB0cmFpdHNf dHlwZTo6dG9fY2hhcl90eXBlKF9NX3NidWYtPnNnZXRjKCkpOwogICAgICAgIGVsc2UKICAgICAg ICAgIF9fcmV0ID0gc3RhdGljX2Nhc3Q8Y2hhcl90eXBlPih0cmFpdHNfdHlwZTo6ZW9mKCkpOwog ICAgICAgIHJldHVybiBfX3JldDsKICAgICAgfQoKICAgICAgX19pc3RyZWFtYnVmaXRlcl90eXBl JgogICAgICBvcGVyYXRvcisrKCkKICAgICAgewogICAgICAgIGlmIChfTV9zYnVmKQogICAgICAg ICAgX01fc2J1Zi0+c2J1bXBjKCk7CiAgICAgICAgX01fYyA9IC0yOwogICAgICAgIHJldHVybiAq dGhpczsKICAgICAgfQoKICAgICAgX19pc3RyZWFtYnVmaXRlcl90eXBlCiAgICAgIG9wZXJhdG9y KysoaW50KQogICAgICB7CiAgICAgICAgX19pc3RyZWFtYnVmaXRlcl90eXBlIF9fb2xkID0gKnRo aXM7CiAgICAgICAgaWYgKF9NX3NidWYpCiAgICAgICAgICBfX29sZC5fTV9jID0gX01fc2J1Zi0+ c2J1bXBjKCk7CiAgICAgICAgX01fYyA9IC0yOwogICAgICAgIHJldHVybiBfX29sZDsKICAgICAg fQoKICAgICAgYm9vbAogICAgICBlcXVhbChjb25zdCBfX2lzdHJlYW1idWZpdGVyX3R5cGUmIF9f YikKICAgICAgewogICAgICAgIGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOwog ICAgICAgIGJvb2wgX190aGlzZW9mID0gIV9NX3NidWYgfHwgX01fc2J1Zi0+c2dldGMoKSA9PSBf X2VvZjsKICAgICAgICBib29sIF9fYmVvZiA9ICFfX2IuX01fc2J1ZgogICAgICAgICAgICAgICAg ICAgICAgfHwgX19iLl9NX3NidWYtPnNnZXRjKCkgPT0gX19lb2Y7CiAgICAgICAgcmV0dXJuIChf X3RoaXNlb2YgJiYgX19iZW9mIHx8ICghX190aGlzZW9mICYmICFfX2Jlb2YpKTsKICAgICAgfQoK CgoKICAgICAgYm9vbAogICAgICBlcXVhbChjb25zdCBfX2lzdHJlYW1idWZpdGVyX3R5cGUmIF9f YikgY29uc3QKICAgICAgewogICAgICAgIGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVv ZigpOwogICAgICAgIGJvb2wgX190aGlzZW9mID0gIV9NX3NidWYgfHwgX01fc2J1Zi0+c2dldGMo KSA9PSBfX2VvZjsKICAgICAgICBib29sIF9fYmVvZiA9ICFfX2IuX01fc2J1ZgogICAgICAgICAg ICAgICAgICAgICAgfHwgX19iLl9NX3NidWYtPnNnZXRjKCkgPT0gX19lb2Y7CiAgICAgICAgcmV0 dXJuIChfX3RoaXNlb2YgJiYgX19iZW9mIHx8ICghX190aGlzZW9mICYmICFfX2Jlb2YpKTsKICAg ICAgfQoKICAgIH07CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0 cz4KICAgIGlubGluZSBib29sCiAgICBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0 b3I8X0NoYXJULCBfVHJhaXRzPiYgX19hLAogICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtYnVm X2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9fYikKICAgIHsgcmV0dXJuIF9fYS5lcXVhbChf X2IpOyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAg IGlubGluZSBib29sCiAgICBvcGVyYXRvciE9KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0No YXJULCBfVHJhaXRzPiYgX19hLAogICAgICAgICAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJh dG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9fYikKICAgIHsgcmV0dXJuICFfX2EuZXF1YWwoX19iKTsg fQp9CiMgMzYgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Jhc2ljX2lv cy5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9sb2Nh bGVfZmFjZXRzLmgiIDEgMwojIDQwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv Yml0cy9sb2NhbGVfZmFjZXRzLmgiIDMKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX2N0aW1lLmgiIDEgMwojIDQyICIvdXNyL2xvY2FsL2djYy0zLjAvaW5j bHVkZS9nKystdjMvYml0cy9sb2NhbGVfZmFjZXRzLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pb3MuaCIgMSAzCiMgNDMgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2xvY2FsZV9mYWNldHMuaCIgMiAzCgoKCgoKCm5h bWVzcGFjZSBzdGQKewoKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2 ODYtcGMtbGludXgtZ251L2JpdHMvY3R5cGVfYmFzZS5oIiAxIDMKIyA1MCAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvY3R5cGVfYmFzZS5o IiAzCiAgc3RydWN0IGN0eXBlX2Jhc2UKICB7CgogICAgdHlwZWRlZiBjb25zdCBpbnQqIF9fdG9f dHlwZTsKCgoKICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbWFzazsKICAgIHN0YXRpYyBjb25z dCBtYXNrIHVwcGVyID0gX0lTdXBwZXI7CiAgICBzdGF0aWMgY29uc3QgbWFzayBsb3dlciA9IF9J U2xvd2VyOwogICAgc3RhdGljIGNvbnN0IG1hc2sgYWxwaGEgPSBfSVNhbHBoYTsKICAgIHN0YXRp YyBjb25zdCBtYXNrIGRpZ2l0ID0gX0lTZGlnaXQ7CiAgICBzdGF0aWMgY29uc3QgbWFzayB4ZGln aXQgPSBfSVN4ZGlnaXQ7CiAgICBzdGF0aWMgY29uc3QgbWFzayBzcGFjZSA9IF9JU3NwYWNlOwog ICAgc3RhdGljIGNvbnN0IG1hc2sgcHJpbnQgPSBfSVNwcmludDsKICAgIHN0YXRpYyBjb25zdCBt YXNrIGdyYXBoID0gX0lTZ3JhcGg7CiAgICBzdGF0aWMgY29uc3QgbWFzayBjbnRybCA9IF9JU2Nu dHJsOwogICAgc3RhdGljIGNvbnN0IG1hc2sgcHVuY3QgPSBfSVNwdW5jdDsKICAgIHN0YXRpYyBj b25zdCBtYXNrIGFsbnVtID0gX0lTYWxudW07CiAgfTsKIyA1NCAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy5oIiAyIDMKCgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9DaGFyVD4KICAgIGNsYXNzIF9fY3R5cGVfYWJzdHJhY3RfYmFzZSA6IHB1YmxpYyBs b2NhbGU6OmZhY2V0LCBwdWJsaWMgY3R5cGVfYmFzZQogICAgewogICAgcHVibGljOgoKICAgICAg dHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwoKICAgICAgYm9vbAogICAgICBpcyhtYXNrIF9fbSwg Y2hhcl90eXBlIF9fYykgY29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZG9faXMoX19tLCBfX2Mp OyB9CgogICAgICBjb25zdCBjaGFyX3R5cGUqCiAgICAgIGlzKGNvbnN0IGNoYXJfdHlwZSAqX19s bywgY29uc3QgY2hhcl90eXBlICpfX2hpLCBtYXNrICpfX3ZlYykgY29uc3QKICAgICAgeyByZXR1 cm4gdGhpcy0+ZG9faXMoX19sbywgX19oaSwgX192ZWMpOyB9CgogICAgICBjb25zdCBjaGFyX3R5 cGUqCiAgICAgIHNjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3Qg Y2hhcl90eXBlKiBfX2hpKSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5kb19zY2FuX2lzKF9f bSwgX19sbywgX19oaSk7IH0KCiAgICAgIGNvbnN0IGNoYXJfdHlwZSoKICAgICAgc2Nhbl9ub3Qo bWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBj b25zdAogICAgICB7IHJldHVybiB0aGlzLT5kb19zY2FuX25vdChfX20sIF9fbG8sIF9faGkpOyB9 CgogICAgICBjaGFyX3R5cGUKICAgICAgdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdAogICAg ICB7IHJldHVybiB0aGlzLT5kb190b3VwcGVyKF9fYyk7IH0KCiAgICAgIGNvbnN0IGNoYXJfdHlw ZSoKICAgICAgdG91cHBlcihjaGFyX3R5cGUgKl9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkg Y29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG91cHBlcihfX2xvLCBfX2hpKTsgfQoKICAg ICAgY2hhcl90eXBlCiAgICAgIHRvbG93ZXIoY2hhcl90eXBlIF9fYykgY29uc3QKICAgICAgeyBy ZXR1cm4gdGhpcy0+ZG9fdG9sb3dlcihfX2MpOyB9CgogICAgICBjb25zdCBjaGFyX3R5cGUqCiAg ICAgIHRvbG93ZXIoY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0 CiAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RvbG93ZXIoX19sbywgX19oaSk7IH0KCiAgICAgIGNo YXJfdHlwZQogICAgICB3aWRlbihjaGFyIF9fYykgY29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ ZG9fd2lkZW4oX19jKTsgfQoKICAgICAgY29uc3QgY2hhcioKICAgICAgd2lkZW4oY29uc3QgY2hh ciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBfX3RvKSBjb25zdAogICAgICB7 IHJldHVybiB0aGlzLT5kb193aWRlbihfX2xvLCBfX2hpLCBfX3RvKTsgfQoKICAgICAgY2hhcgog ICAgICBuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKICAgICAgeyBy ZXR1cm4gdGhpcy0+ZG9fbmFycm93KF9fYywgX19kZmF1bHQpOyB9CgogICAgICBjb25zdCBjaGFy X3R5cGUqCiAgICAgIG5hcnJvdyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlw ZSogX19oaSwKICAgICAgICAgICAgICBjaGFyIF9fZGZhdWx0LCBjaGFyICpfX3RvKSBjb25zdAog ICAgICB7IHJldHVybiB0aGlzLT5kb19uYXJyb3coX19sbywgX19oaSwgX19kZmF1bHQsIF9fdG8p OyB9CgogICAgcHJvdGVjdGVkOgogICAgICBleHBsaWNpdAogICAgICBfX2N0eXBlX2Fic3RyYWN0 X2Jhc2Uoc2l6ZV90IF9fcmVmcyA9IDApOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykgeyB9CgogICAg ICB2aXJ0dWFsCiAgICAgIH5fX2N0eXBlX2Fic3RyYWN0X2Jhc2UoKSB7IH0KCiAgICAgIHZpcnR1 YWwgYm9vbAogICAgICBkb19pcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3QgPSAwOwoK ICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCiAgICAgIGRvX2lzKGNvbnN0IGNoYXJfdHlw ZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAogICAgICAgICAgICBtYXNrKiBfX3ZlYykg Y29uc3QgPSAwOwoKICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCiAgICAgIGRvX3NjYW5f aXMobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywKICAgICAgICAgICAgICAgICBjb25z dCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0ID0gMDsKCiAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90 eXBlKgogICAgICBkb19zY2FuX25vdChtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLAog ICAgICAgICAgICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0ID0gMDsKCiAgICAg IHZpcnR1YWwgY2hhcl90eXBlCiAgICAgIGRvX3RvdXBwZXIoY2hhcl90eXBlKSBjb25zdCA9IDA7 CgogICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKICAgICAgZG9fdG91cHBlcihjaGFyX3R5 cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QgPSAwOwoKICAgICAgdmlydHVh bCBjaGFyX3R5cGUKICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUpIGNvbnN0ID0gMDsKCiAgICAg IHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgogICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSogX19s bywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CgogICAgICB2aXJ0dWFsIGNoYXJf dHlwZQogICAgICBkb193aWRlbihjaGFyKSBjb25zdCA9IDA7CgogICAgICB2aXJ0dWFsIGNvbnN0 IGNoYXIqCiAgICAgIGRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGks CiAgICAgICAgICAgICAgIGNoYXJfdHlwZSogX19kZXN0KSBjb25zdCA9IDA7CgogICAgICB2aXJ0 dWFsIGNoYXIKICAgICAgZG9fbmFycm93KGNoYXJfdHlwZSwgY2hhciBfX2RmYXVsdCkgY29uc3Qg PSAwOwoKICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCiAgICAgIGRvX25hcnJvdyhjb25z dCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKICAgICAgICAgICAgICAg ICBjaGFyIF9fZGZhdWx0LCBjaGFyKiBfX2Rlc3QpIGNvbnN0ID0gMDsKICAgIH07CgoKICB0ZW1w bGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICBjbGFzcyBjdHlwZSA6IHB1YmxpYyBfX2N0eXBlX2Fi c3RyYWN0X2Jhc2U8X0NoYXJUPgogICAgewogICAgcHVibGljOgoKICAgICAgdHlwZWRlZiBfQ2hh clQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIHR5cGVuYW1lIGN0eXBlOjptYXNrIG1hc2s7Cgog ICAgICBleHBsaWNpdAogICAgICBjdHlwZShzaXplX3QgX19yZWZzID0gMCkgOiBfX2N0eXBlX2Fi c3RyYWN0X2Jhc2U8X0NoYXJUPihfX3JlZnMpIHsgfQoKICAgICAgc3RhdGljIGxvY2FsZTo6aWQg aWQ7CgogICBwcm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwKICAgICAgfmN0eXBlKCkgeyB9CgogICAg ICB2aXJ0dWFsIGJvb2wKICAgICAgZG9faXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0 CiAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoK ICAgICAgZG9faXMoY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGks IG1hc2sqIF9fdmVjKSBjb25zdAogICAgICB7IHJldHVybiBfX2hpOyB9CgogICAgICB2aXJ0dWFs IGNvbnN0IGNoYXJfdHlwZSoKICAgICAgZG9fc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhcl90 eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9f aGk7IH0KCiAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgogICAgICBkb19zY2FuX25vdCht YXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLAogICAgICAgICAgICAgICAgICBjb25zdCBj aGFyX3R5cGUqIF9faGkpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9faGk7IH0KCiAgICAgIHZpcnR1 YWwgY2hhcl90eXBlCiAgICAgIGRvX3RvdXBwZXIoY2hhcl90eXBlIF9fYykgY29uc3QKICAgICAg eyByZXR1cm4gX19jOyB9CgogICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKICAgICAgZG9f dG91cHBlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKICAg ICAgeyByZXR1cm4gX19oaTsgfQoKICAgICAgdmlydHVhbCBjaGFyX3R5cGUKICAgICAgZG9fdG9s b3dlcihjaGFyX3R5cGUgX19jKSBjb25zdAogICAgICB7IHJldHVybiBfX2M7IH0KCiAgICAgIHZp cnR1YWwgY29uc3QgY2hhcl90eXBlKgogICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSogX19sbywg Y29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAogICAgICB7IHJldHVybiBfX2hpOyB9CgogICAg ICB2aXJ0dWFsIGNoYXJfdHlwZQogICAgICBkb193aWRlbihjaGFyIF9fYykgY29uc3QKICAgICAg eyByZXR1cm4gY2hhcl90eXBlKCk7IH0KCiAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKICAgICAg ZG9fd2lkZW4oY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBf X2Rlc3QpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9faGk7IH0KCiAgICAgIHZpcnR1YWwgY2hhcgog ICAgICBkb19uYXJyb3coY2hhcl90eXBlLCBjaGFyIF9fZGZhdWx0KSBjb25zdAogICAgICB7IHJl dHVybiBfX2RmYXVsdDsgfQoKICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCiAgICAgIGRv X25hcnJvdyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKICAg ICAgICAgICAgICAgIGNoYXIgX19kZmF1bHQsIGNoYXIqIF9fZGVzdCkgY29uc3QKICAgICAgeyBy ZXR1cm4gX19oaTsgfQogICAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAgbG9j YWxlOjppZCBjdHlwZTxfQ2hhclQ+OjppZDsKCgogIHRlbXBsYXRlPD4KICAgIGNsYXNzIGN0eXBl PGNoYXI+IDogcHVibGljIF9fY3R5cGVfYWJzdHJhY3RfYmFzZTxjaGFyPgogICAgewogICAgcHVi bGljOgoKICAgICAgdHlwZWRlZiBjaGFyIGNoYXJfdHlwZTsKCiAgICBwcml2YXRlOgoKICAgICAg Ym9vbCBfTV9kZWw7CiAgICAgIF9fdG9fdHlwZSBjb25zdCYgX01fdG91cHBlcjsKICAgICAgX190 b190eXBlIGNvbnN0JiBfTV90b2xvd2VyOwogICAgICBjb25zdCBtYXNrKiBjb25zdCYgX01fY3Rh YmxlOwogICAgICBjb25zdCBtYXNrKiBfTV90YWJsZTsKCiAgICBwdWJsaWM6CiAgICAgIHN0YXRp YyBsb2NhbGU6OmlkIGlkOwogICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IHRhYmxlX3NpemUgPSAx ICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oLTEpOwoKICAgICAgZXhwbGljaXQKICAgICAg Y3R5cGUoY29uc3QgbWFzayogX190YWJsZSA9IDAsIGJvb2wgX19kZWwgPSBmYWxzZSwgc2l6ZV90 IF9fcmVmcyA9IDApOwoKICAgICAgaW5saW5lIGJvb2wKICAgICAgaXMobWFzayBfX20sIGNoYXIg X19jKSBjb25zdDsKCiAgICAgIGlubGluZSBjb25zdCBjaGFyKgogICAgICBpcyhjb25zdCBjaGFy KiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBtYXNrKiBfX3ZlYykgY29uc3Q7CgogICAgICBpbmxp bmUgY29uc3QgY2hhcioKICAgICAgc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhciogX19sbywg Y29uc3QgY2hhciogX19oaSkgY29uc3Q7CgogICAgICBpbmxpbmUgY29uc3QgY2hhcioKICAgICAg c2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGkpIGNv bnN0OwoKICAgIHByb3RlY3RlZDoKICAgICAgdmlydHVhbAogICAgICB+Y3R5cGUoKTsKCiAgICAg IGNvbnN0IG1hc2sqCiAgICAgIHRhYmxlKCkgY29uc3QgdGhyb3coKQogICAgICB7IHJldHVybiBf TV90YWJsZTsgfQoKICAgICAgY29uc3QgbWFzayoKICAgICAgY2xhc3NpY190YWJsZSgpIHRocm93 KCkKICAgICAgeyByZXR1cm4gX01fY3RhYmxlOyB9CgogICAgICB2aXJ0dWFsIGJvb2wKICAgICAg ZG9faXMobWFzayBfX20sIGNoYXJfdHlwZSBfX2MpIGNvbnN0OwoKICAgICAgdmlydHVhbCBjb25z dCBjaGFyX3R5cGUqCiAgICAgIGRvX2lzKGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hh cl90eXBlKiBfX2hpLCBtYXNrKiBfX3ZlYykgY29uc3Q7CgogICAgICB2aXJ0dWFsIGNvbnN0IGNo YXJfdHlwZSoKICAgICAgZG9fc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xv LCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OwoKICAgICAgdmlydHVhbCBjb25zdCBjaGFy X3R5cGUqCiAgICAgIGRvX3NjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8s CiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CgogICAgICB2 aXJ0dWFsIGNoYXJfdHlwZQogICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSkgY29uc3Q7CgogICAg ICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUqIF9f bG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CgogICAgICB2aXJ0dWFsIGNoYXJfdHlw ZQogICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSkgY29uc3Q7CgogICAgICB2aXJ0dWFsIGNvbnN0 IGNoYXJfdHlwZSoKICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJf dHlwZSogX19oaSkgY29uc3Q7CgogICAgICB2aXJ0dWFsIGNoYXJfdHlwZQogICAgICBkb193aWRl bihjaGFyKSBjb25zdDsKCiAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKICAgICAgZG9fd2lkZW4o Y29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBfX2Rlc3QpIGNv bnN0OwoKICAgICAgdmlydHVhbCBjaGFyCiAgICAgIGRvX25hcnJvdyhjaGFyX3R5cGUsIGNoYXIg X19kZmF1bHQpIGNvbnN0OwoKICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCiAgICAgIGRv X25hcnJvdyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKICAg ICAgICAgICAgICAgICBjaGFyIF9fZGZhdWx0LCBjaGFyKiBfX2Rlc3QpIGNvbnN0OwogICAgfTsK CiAgdGVtcGxhdGU8PgogICAgY29uc3QgY3R5cGU8Y2hhcj4mCiAgICB1c2VfZmFjZXQ8Y3R5cGU8 Y2hhcj4gPihjb25zdCBsb2NhbGUmIF9fbG9jKTsKIyAzOTIgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL2xvY2FsZV9mYWNldHMuaCIgMwojIDEgIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL2N0eXBlX2lubGluZS5o IiAxIDMKIyAzNyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGlu dXgtZ251L2JpdHMvY3R5cGVfaW5saW5lLmgiIDMKICBib29sCiAgY3R5cGU8Y2hhcj46OgogIGlz KG1hc2sgX19tLCBjaGFyIF9fYykgY29uc3QKICB7IHJldHVybiBfTV90YWJsZVtfX2NdICYgX19t OyB9CgogIGNvbnN0IGNoYXIqCiAgY3R5cGU8Y2hhcj46OgogIGlzKGNvbnN0IGNoYXIqIF9fbG93 LCBjb25zdCBjaGFyKiBfX2hpZ2gsIG1hc2sqIF9fdmVjKSBjb25zdAogIHsKICAgIHdoaWxlIChf X2xvdyA8IF9faGlnaCkKICAgICAgKl9fdmVjKysgPSBfTV90YWJsZVsqX19sb3crK107CiAgICBy ZXR1cm4gX19oaWdoOwogIH0KCiAgY29uc3QgY2hhcioKICBjdHlwZTxjaGFyPjo6CiAgc2Nhbl9p cyhtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QK ICB7CiAgICB3aGlsZSAoX19sb3cgPCBfX2hpZ2ggJiYgIShfTV90YWJsZVsqX19sb3ddICYgX19t KSkKICAgICAgKytfX2xvdzsKICAgIHJldHVybiBfX2xvdzsKICB9CgogIGNvbnN0IGNoYXIqCiAg Y3R5cGU8Y2hhcj46OgogIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvdywgY29u c3QgY2hhciogX19oaWdoKSBjb25zdAogIHsKICAgIHdoaWxlIChfX2xvdyA8IF9faGlnaAogICAg ICAgICAgICYmIChfTV90YWJsZVsqX19sb3ddICYgX19tKSAhPSAwKQogICAgICArK19fbG93Owog ICAgcmV0dXJuIF9fbG93OwogIH0KIyAzOTMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2cr Ky12My9iaXRzL2xvY2FsZV9mYWNldHMuaCIgMiAzCgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hh clQ+CiAgICBjbGFzcyBjdHlwZV9ieW5hbWUgOiBwdWJsaWMgY3R5cGU8X0NoYXJUPgogICAgewog ICAgcHVibGljOgogICAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CgogICAgICBleHBsaWNp dAogICAgICBjdHlwZV9ieW5hbWUoY29uc3QgY2hhciosIHNpemVfdCBfX3JlZnMgPSAwKTsKCiAg ICBwcm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwKICAgICAgfmN0eXBlX2J5bmFtZSgpIHsgfQogICAg fTsKCgogIHRlbXBsYXRlPD4KICAgIGN0eXBlX2J5bmFtZTxjaGFyPjo6Y3R5cGVfYnluYW1lKGNv bnN0IGNoYXIqLCBzaXplX3QgcmVmcyk7CgoKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1 ZGUvZysrLXYzL2JpdHMvY29kZWN2dC5oIiAxIDMKIyA0MiAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvY29kZWN2dC5oIiAzCiMgMTczICIvdXNyL2xvY2FsL2djYy0zLjAv aW5jbHVkZS9nKystdjMvYml0cy9jb2RlY3Z0LmgiIDMKICBjbGFzcyBjb2RlY3Z0X2Jhc2UKICB7 CiAgcHVibGljOgogICAgZW51bSByZXN1bHQKICAgIHsKICAgICAgb2ssCiAgICAgIHBhcnRpYWws CiAgICAgIGVycm9yLAogICAgICBub2NvbnYKICAgIH07CiAgfTsKCgoKCgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVCwgdHlwZW5hbWUgX1N0YXRlVD4KICAg IGNsYXNzIF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlCiAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0 LCBwdWJsaWMgY29kZWN2dF9iYXNlCiAgICB7CiAgICBwdWJsaWM6CgogICAgICB0eXBlZGVmIGNv ZGVjdnRfYmFzZTo6cmVzdWx0IHJlc3VsdDsKICAgICAgdHlwZWRlZiBfSW50ZXJuVCBpbnRlcm5f dHlwZTsKICAgICAgdHlwZWRlZiBfRXh0ZXJuVCBleHRlcm5fdHlwZTsKICAgICAgdHlwZWRlZiBf U3RhdGVUIHN0YXRlX3R5cGU7CgoKICAgICAgcmVzdWx0CiAgICAgIG91dChzdGF0ZV90eXBlJiBf X3N0YXRlLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tLAogICAgICAgICAgY29uc3QgaW50ZXJu X3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCiAgICAg ICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAogICAgICAgICAg ZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CiAgICAgIHsKICAgICAgICByZXR1cm4gdGhp cy0+ZG9fb3V0KF9fc3RhdGUsIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfX3RvLCBfX3RvX2VuZCwgX190b19uZXh0KTsKICAgICAg fQoKICAgICAgcmVzdWx0CiAgICAgIHVuc2hpZnQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgZXh0ZXJu X3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKICAgICAgICAgICAgICBleHRlcm5f dHlwZSomIF9fdG9fbmV4dCkgY29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdW5zaGlmdChf X3N0YXRlLCBfX3RvLF9fdG9fZW5kLF9fdG9fbmV4dCk7IH0KCiAgICAgIHJlc3VsdAogICAgICBp bihzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAogICAgICAg ICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zy b21fbmV4dCwKICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2Vu ZCwKICAgICAgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CiAgICAgIHsKICAgICAg ICByZXR1cm4gdGhpcy0+ZG9faW4oX19zdGF0ZSwgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21f bmV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX190bywgX190b19lbmQsIF9fdG9fbmV4 dCk7CiAgICAgIH0KCiAgICAgIGludAogICAgICBlbmNvZGluZygpIGNvbnN0IHRocm93KCkKICAg ICAgeyByZXR1cm4gdGhpcy0+ZG9fZW5jb2RpbmcoKTsgfQoKICAgICAgYm9vbAogICAgICBhbHdh eXNfbm9jb252KCkgY29uc3QgdGhyb3coKQogICAgICB7IHJldHVybiB0aGlzLT5kb19hbHdheXNf bm9jb252KCk7IH0KCiAgICAgIGludAogICAgICBsZW5ndGgoY29uc3Qgc3RhdGVfdHlwZSYgX19z dGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKICAgICAgICAgICAgIGNvbnN0IGV4dGVy bl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5k b19sZW5ndGgoX19zdGF0ZSwgX19mcm9tLCBfX2VuZCwgX19tYXgpOyB9CgogICAgICBpbnQKICAg ICAgbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCkKICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fbWF4 X2xlbmd0aCgpOyB9CgogICAgcHJvdGVjdGVkOgogICAgICBleHBsaWNpdAogICAgICBfX2NvZGVj dnRfYWJzdHJhY3RfYmFzZShzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVm cykgeyB9CgogICAgICB2aXJ0dWFsCiAgICAgIH5fX2NvZGVjdnRfYWJzdHJhY3RfYmFzZSgpIHsg fQoKICAgICAgdmlydHVhbCByZXN1bHQKICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUs IGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sCiAgICAgICAgICAgICBjb25zdCBpbnRlcm5fdHlw ZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKICAgICAgICAg ICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCiAgICAgICAgICAg ICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QgPSAwOwoKICAgICAgdmlydHVhbCByZXN1 bHQKICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLCBleHRlcm5fdHlwZSogX190 bywKICAgICAgICAgICAgICAgICBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYg X190b19uZXh0KSBjb25zdCA9IDA7CgogICAgICB2aXJ0dWFsIHJlc3VsdAogICAgICBkb19pbihz dGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAogICAgICAgICAg ICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zy b21fbmV4dCwKICAgICAgICAgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3Rv X2VuZCwKICAgICAgICAgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0ID0gMDsKCiAg ICAgIHZpcnR1YWwgaW50CiAgICAgIGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKSA9IDA7Cgog ICAgICB2aXJ0dWFsIGJvb2wKICAgICAgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCkg PSAwOwoKICAgICAgdmlydHVhbCBpbnQKICAgICAgZG9fbGVuZ3RoKGNvbnN0IHN0YXRlX3R5cGUm LCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAogICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJu X3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0ID0gMDsKCiAgICAgIHZpcnR1YWwgaW50 CiAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpID0gMDsKICAgIH07CgoKCiAgdGVt cGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3Rh dGVUPgogICAgY2xhc3MgY29kZWN2dAogICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jh c2U8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPgogICAgewogICAgcHVibGljOgoKICAgICAg dHlwZWRlZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCByZXN1bHQ7CiAgICAgIHR5cGVkZWYgX0ludGVy blQgaW50ZXJuX3R5cGU7CiAgICAgIHR5cGVkZWYgX0V4dGVyblQgZXh0ZXJuX3R5cGU7CiAgICAg IHR5cGVkZWYgX1N0YXRlVCBzdGF0ZV90eXBlOwoKCiAgICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlk OwoKICAgICAgZXhwbGljaXQKICAgICAgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkKICAgICAg OiBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZTxfSW50ZXJuVCxfRXh0ZXJuVCxfU3RhdGVUPiAoX19y ZWZzKSB7IH0KCiAgICBwcm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwKICAgICAgfmNvZGVjdnQoKSB7 IH0KICAgIH07CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJu VCwgdHlwZW5hbWUgX1N0YXRlVD4KICAgIGxvY2FsZTo6aWQgY29kZWN2dDxfSW50ZXJuVCwgX0V4 dGVyblQsIF9TdGF0ZVQ+OjppZDsKIyA1OTQgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2cr Ky12My9iaXRzL2NvZGVjdnQuaCIgMwogIHRlbXBsYXRlPD4KICAgIGNsYXNzIGNvZGVjdnQ8Y2hh ciwgY2hhciwgbWJzdGF0ZV90PgogICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8 Y2hhciwgY2hhciwgbWJzdGF0ZV90PgogICAgewogICAgcHVibGljOgoKICAgICAgdHlwZWRlZiBj aGFyIGludGVybl90eXBlOwogICAgICB0eXBlZGVmIGNoYXIgZXh0ZXJuX3R5cGU7CiAgICAgIHR5 cGVkZWYgbWJzdGF0ZV90IHN0YXRlX3R5cGU7CgoKICAgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7 CgogICAgICBleHBsaWNpdAogICAgICBjb2RlY3Z0KHNpemVfdCBfX3JlZnMgPSAwKTsKCiAgICBw cm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwKICAgICAgfmNvZGVjdnQoKTsKCiAgICAgIHZpcnR1YWwg cmVzdWx0CiAgICAgIGRvX291dChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBpbnRlcm5fdHlw ZSogX19mcm9tLAogICAgICAgICAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNv bnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCiAgICAgICAgICAgICBleHRlcm5fdHlwZSog X190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAogICAgICAgICAgICAgZXh0ZXJuX3R5cGUqJiBf X3RvX25leHQpIGNvbnN0OwoKICAgICAgdmlydHVhbCByZXN1bHQKICAgICAgZG9fdW5zaGlmdChz dGF0ZV90eXBlJiBfX3N0YXRlLCBleHRlcm5fdHlwZSogX190bywKICAgICAgICAgICAgICAgICBl eHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKCiAg ICAgIHZpcnR1YWwgcmVzdWx0CiAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0 IGV4dGVybl90eXBlKiBfX2Zyb20sCiAgICAgICAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zy b21fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAogICAgICAgICAgICBpbnRl cm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLAogICAgICAgICAgICBpbnRlcm5f dHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CgogICAgICB2aXJ0dWFsIGludAogICAgICBkb19lbmNv ZGluZygpIGNvbnN0IHRocm93KCk7CgogICAgICB2aXJ0dWFsIGJvb2wKICAgICAgZG9fYWx3YXlz X25vY29udigpIGNvbnN0IHRocm93KCk7CgogICAgICB2aXJ0dWFsIGludAogICAgICBkb19sZW5n dGgoY29uc3Qgc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCiAgICAgICAg ICAgICAgICBjb25zdCBleHRlcm5fdHlwZSogX19lbmQsIHNpemVfdCBfX21heCkgY29uc3Q7Cgog ICAgICB2aXJ0dWFsIGludAogICAgICBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKTsKICB9 OwojIDcwMCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvY29kZWN2dC5o IiAzCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBl bmFtZSBfU3RhdGVUPgogICAgY2xhc3MgY29kZWN2dF9ieW5hbWUgOiBwdWJsaWMgY29kZWN2dDxf SW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+CiAgICB7CiAgICBwdWJsaWM6CiAgICAgIGV4cGxp Y2l0CiAgICAgIGNvZGVjdnRfYnluYW1lKGNvbnN0IGNoYXIqLCBzaXplX3QgX19yZWZzID0gMCkK ICAgICAgOiBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD4oX19yZWZzKSB7IH0K ICAgIHByb3RlY3RlZDoKICAgICAgdmlydHVhbAogICAgICB+Y29kZWN2dF9ieW5hbWUoKSB7IH0K ICAgIH07CiMgNDE2ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9sb2Nh bGVfZmFjZXRzLmgiIDIgMwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9J bkl0ZXI+CiAgICBjbGFzcyBfTnVtZXJpY19nZXQ7CgoKCgoKCiAgdGVtcGxhdGU8dHlwZW5hbWUg X0NoYXJUPgogICAgY2xhc3MgX0Zvcm1hdF9jYWNoZQogICAgewogICAgcHVibGljOgoKICAgICAg dHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFy VD4gdHJhaXRzX3R5cGU7CiAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4gc3RyaW5n X3R5cGU7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RyaW5nX3R5cGU6OnNpemVfdHlwZSBzaXpl X3R5cGU7CgoKICAgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTsKICAgICAgdGVtcGxhdGU8dHlwZW5h bWUgX0NoYXIsIHR5cGVuYW1lIF9Jbkl0ZXI+CiAgICAgICAgZnJpZW5kIGNsYXNzIF9OdW1lcmlj X2dldDsKICAgICAgZnJpZW5kIGNsYXNzIG51bV9nZXQ8X0NoYXJUPjsKICAgICAgZnJpZW5kIGNs YXNzIG51bV9wdXQ8X0NoYXJUPjsKICAgICAgZnJpZW5kIGNsYXNzIHRpbWVfZ2V0PF9DaGFyVD47 CiAgICAgIGZyaWVuZCBjbGFzcyBtb25leV9nZXQ8X0NoYXJUPjsKICAgICAgZnJpZW5kIGNsYXNz IHRpbWVfcHV0PF9DaGFyVD47CiAgICAgIGZyaWVuZCBjbGFzcyBtb25leV9wdXQ8X0NoYXJUPjsK CgoKCiAgICAgIHN0YXRpYyBpbnQgX1NfcHdvcmRfaXg7CgoKCiAgICAgIGJvb2wgX01fdmFsaWQ7 CgoKCiAgICAgIHN0YXRpYyBjb25zdCBjaGFyIF9TX2xpdGVyYWxzW107CgoKCgogICAgICBlbnVt CiAgICAgIHsKICAgICAgICBfU19taW51cywKICAgICAgICBfU19wbHVzLAogICAgICAgIF9TX3gs CiAgICAgICAgX1NfWCwKICAgICAgICBfU19kaWdpdHMsCiAgICAgICAgX1NfZGlnaXRzX2VuZCA9 IF9TX2RpZ2l0cyArIDE2LAogICAgICAgIF9TX3VkaWdpdHMgPSBfU19kaWdpdHNfZW5kLAogICAg ICAgIF9TX3VkaWdpdHNfZW5kID0gX1NfdWRpZ2l0cyArIDE2LAogICAgICAgIF9TX2VlID0gX1Nf ZGlnaXRzICsgMTQsCiAgICAgICAgX1NfRWUgPSBfU191ZGlnaXRzICsgMTQKICAgICAgfTsKCgoK CiAgICAgIGNoYXJfdHlwZSBfTV9kZWNpbWFsX3BvaW50OwoKCgoKCiAgICAgIGNoYXJfdHlwZSBf TV90aG91c2FuZHNfc2VwOwoKCgogICAgICBzdHJpbmdfdHlwZSBfTV90cnVlbmFtZTsKICAgICAg c3RyaW5nX3R5cGUgX01fZmFsc2VuYW1lOwoKCgogICAgICBib29sIF9NX3VzZV9ncm91cGluZzsK CgoKICAgICAgc3RyaW5nIF9NX2dyb3VwaW5nOwoKICAgICAgX0Zvcm1hdF9jYWNoZSgpOwoKICAg ICAgfl9Gb3JtYXRfY2FjaGUoKSB0aHJvdygpIHsgfQoKCgoKICAgICAgc3RhdGljIF9Gb3JtYXRf Y2FjaGU8X0NoYXJUPioKICAgICAgX1NfZ2V0KGlvc19iYXNlJiBfX2lvcyk7CgogICAgICB2b2lk CiAgICAgIF9NX3BvcHVsYXRlKGlvc19iYXNlJik7CgogICAgICBzdGF0aWMgdm9pZAogICAgICBf U19jYWxsYmFjayhpb3NfYmFzZTo6ZXZlbnQgX19ldmVudCwgaW9zX2Jhc2UmIF9faW9zLCBpbnQg X19peCkgdGhyb3coKTsKICAgIH07CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlu dCBfRm9ybWF0X2NhY2hlPF9DaGFyVD46Ol9TX3B3b3JkX2l4OwoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQ+CiAgICBjb25zdCBjaGFyIF9Gb3JtYXRfY2FjaGU8X0NoYXJUPjo6CiAgICBfU19s aXRlcmFsc1tdID0gIi0reFgwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRiI7CgogICB0 ZW1wbGF0ZTw+IF9Gb3JtYXRfY2FjaGU8Y2hhcj46Ol9Gb3JtYXRfY2FjaGUoKTsKCgoKCgoKICB0 ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CiAgICBjbGFzcyBfTnVt ZXJpY19nZXQKICAgIHsKICAgIHB1YmxpYzoKCiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlw ZTsKICAgICAgdHlwZWRlZiBfSW5JdGVyIGl0ZXJfdHlwZTsKCgogICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBfQ2hhciwgdHlwZW5hbWUgX0luSXRlclQ+CiAgICAgIGZyaWVuZCBjbGFzcyBudW1fZ2V0 OwogICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhciwgdHlwZW5hbWUgX0luSXRlclQ+CiAgICAg IGZyaWVuZCBjbGFzcyB0aW1lX2dldDsKICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXIsIHR5 cGVuYW1lIF9Jbkl0ZXJUPgogICAgICBmcmllbmQgY2xhc3MgbW9uZXlfZ2V0OwogICAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBfQ2hhciwgdHlwZW5hbWUgX0luSXRlclQ+CiAgICAgIGZyaWVuZCBjbGFz cyBudW1fcHV0OwogICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhciwgdHlwZW5hbWUgX0luSXRl clQ+CiAgICAgIGZyaWVuZCBjbGFzcyB0aW1lX3B1dDsKICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg X0NoYXIsIHR5cGVuYW1lIF9Jbkl0ZXJUPgogICAgICBmcmllbmQgY2xhc3MgbW9uZXlfcHV0OwoK ICAgIHByaXZhdGU6CiAgICAgIGV4cGxpY2l0CiAgICAgIF9OdW1lcmljX2dldCgpIHsgfQoKICAg ICAgdmlydHVhbAogICAgICB+X051bWVyaWNfZ2V0KCkgeyB9CgogICAgICBpdGVyX3R5cGUKICAg ICAgX01fZ2V0X2RpZ2l0cyhpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kKSBjb25zdDsK ICAgIH07CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KICAg IGNsYXNzIG51bV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAogICAgewogICAgcHVibGljOgoK ICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIF9Jbkl0ZXIgaXRl cl90eXBlOwogICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4gX190cmFpdHNfdHlwZTsK CiAgICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOwoKICAgICAgZXhwbGljaXQKICAgICAgbnVtX2dl dChzaXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykgeyB9CgogICAgICBp dGVyX3R5cGUKICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19i YXNlJiBfX2lvLAogICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBib29sJiBfX3Yp IGNvbnN0CiAgICAgIHsgcmV0dXJuIGRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9f dik7IH0KCgogICAgICBpdGVyX3R5cGUKICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5 cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAogICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9f ZXJyLCBzaG9ydCYgX192KSBjb25zdAogICAgICB7IHJldHVybiBkb19nZXQoX19pbiwgX19lbmQs IF9faW8sIF9fZXJyLCBfX3YpOyB9CgogICAgICBpdGVyX3R5cGUKICAgICAgZ2V0KGl0ZXJfdHlw ZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAogICAgICAgICAgaW9zX2Jh c2U6Omlvc3RhdGUmIF9fZXJyLCBpbnQmIF9fdikgY29uc3QKICAgICAgeyByZXR1cm4gZG9fZ2V0 KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQoKCiAgICAgIGl0ZXJfdHlwZQogICAg ICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAg ICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcmIF9fdikgY29uc3QKICAgICAg eyByZXR1cm4gZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQoKCiAgICAg IGl0ZXJfdHlwZQogICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9z X2Jhc2UmIF9faW8sCiAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgbG9u ZyYgX192KSBjb25zdAogICAgICB7IHJldHVybiBkb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9f ZXJyLCBfX3YpOyB9CgoKICAgICAgaXRlcl90eXBlCiAgICAgIGdldChpdGVyX3R5cGUgX19pbiwg aXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKICAgICAgICAgIGlvc19iYXNlOjppb3N0 YXRlJiBfX2VyciwgdW5zaWduZWQgc2hvcnQmIF9fdikgY29uc3QKICAgICAgeyByZXR1cm4gZG9f Z2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQoKICAgICAgaXRlcl90eXBlCiAg ICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywK ICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3YpIGNv bnN0CiAgICAgIHsgcmV0dXJuIGRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7 IH0KCiAgICAgIGl0ZXJfdHlwZQogICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBf X2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIs IHVuc2lnbmVkIGxvbmcmIF9fdikgY29uc3QKICAgICAgeyByZXR1cm4gZG9fZ2V0KF9faW4sIF9f ZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQoKCiAgICAgIGl0ZXJfdHlwZQogICAgICBnZXQoaXRl cl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAgICAgICAgICBp b3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGxvbmcgbG9uZyYgX192KSBjb25zdAog ICAgICB7IHJldHVybiBkb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CgoK ICAgICAgaXRlcl90eXBlCiAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5k LCBpb3NfYmFzZSYgX19pbywKICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZmxv YXQmIF9fdikgY29uc3QKICAgICAgeyByZXR1cm4gZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBf X2VyciwgX192KTsgfQoKICAgICAgaXRlcl90eXBlCiAgICAgIGdldChpdGVyX3R5cGUgX19pbiwg aXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKICAgICAgICAgIGlvc19iYXNlOjppb3N0 YXRlJiBfX2VyciwgZG91YmxlJiBfX3YpIGNvbnN0CiAgICAgIHsgcmV0dXJuIGRvX2dldChfX2lu LCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KCiAgICAgIGl0ZXJfdHlwZQogICAgICBnZXQo aXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAgICAgICAg ICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGxvbmcgZG91YmxlJiBfX3YpIGNvbnN0CiAgICAg IHsgcmV0dXJuIGRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KCiAgICAg IGl0ZXJfdHlwZQogICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9z X2Jhc2UmIF9faW8sCiAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHZvaWQqJiBf X3YpIGNvbnN0CiAgICAgIHsgcmV0dXJuIGRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIs IF9fdik7IH0KCiAgICBwcm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwgfm51bV9nZXQoKSB7IH0KCgoK CgogICAgICB2b2lkCiAgICAgIF9NX2V4dHJhY3QoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUg X19lbmQsIGlvc19iYXNlJiBfX2lvLAogICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRl JiBfX2VyciwgY2hhciogX194dHJjLAogICAgICAgICAgICAgICAgIGludCYgX19iYXNlLCBib29s IF9fZnAgPSB0cnVlKSBjb25zdDsKCiAgICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX2dl dChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsIGJv b2wmKSBjb25zdDsKCgogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAgICBkb19nZXQoaXRlcl90 eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLCBzaG9ydCYpIGNv bnN0OwogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVy X3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLCBpbnQmKSBjb25zdDsKCiAgICAg IHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX2dldCAoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlv c19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLCBsb25nJikgY29uc3Q7CgogICAgICB2aXJ0dWFs IGl0ZXJfdHlwZQogICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwg aW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAogICAgICAgICAgICAgbG9uZyBsb25nJikgY29uc3Q7 CgogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5 cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAogICAgICAgICAgICAgIHVu c2lnbmVkIHNob3J0JikgY29uc3Q7CiAgICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX2dl dChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLAogICAgICAgICAgICAgIGlvc19iYXNl Ojppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JikgY29uc3Q7CiAgICAgIHZpcnR1YWwgaXRl cl90eXBlCiAgICAgIGRvX2dldChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLAogICAg ICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgbG9uZyYpIGNvbnN0 OwoKICAgICAgdmlydHVhbCBpdGVyX3R5cGUKICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90 eXBlLCBpb3NfYmFzZSYsCiAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVu c2lnbmVkIGxvbmcgbG9uZyYpIGNvbnN0OwoKICAgICAgdmlydHVhbCBpdGVyX3R5cGUKICAgICAg ZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRl JiBfX2VyciwKICAgICAgICAgICAgIGZsb2F0JikgY29uc3Q7CgogICAgICB2aXJ0dWFsIGl0ZXJf dHlwZQogICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jh c2U6Omlvc3RhdGUmIF9fZXJyLAogICAgICAgICAgICAgZG91YmxlJikgY29uc3Q7CgogICAgICB2 aXJ0dWFsIGl0ZXJfdHlwZQogICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19i YXNlJiwKICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUm KSBjb25zdDsKCiAgICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX2dldChpdGVyX3R5cGUs IGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCiAgICAgICAg ICAgICB2b2lkKiYpIGNvbnN0OwogICAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0 eXBlbmFtZSBfSW5JdGVyPgogICAgbG9jYWxlOjppZCBudW1fZ2V0PF9DaGFyVCwgX0luSXRlcj46 OmlkOwoKCiAgdGVtcGxhdGU8PgogICAgdm9pZAogICAgbnVtX2dldDxjaGFyLCBpc3RyZWFtYnVm X2l0ZXJhdG9yPGNoYXI+ID46OgogICAgX01fZXh0cmFjdChpc3RyZWFtYnVmX2l0ZXJhdG9yPGNo YXI+IF9fYmVnLAogICAgICAgICAgICAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+IF9fZW5k LCBpb3NfYmFzZSYgX19pbywKICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJy LCBjaGFyKiBfX3h0cmMsCiAgICAgICAgICAgICAgIGludCYgX19iYXNlLCBib29sIF9fZnApIGNv bnN0OwoKCgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CiAg ICBjbGFzcyBfTnVtZXJpY19wdXQKICAgIHsKICAgIHB1YmxpYzoKICAgICAgdHlwZWRlZiBfQ2hh clQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIF9PdXRJdGVyIGl0ZXJfdHlwZTsKICAgIHByb3Rl Y3RlZDoKICAgICAgZXhwbGljaXQKICAgICAgX051bWVyaWNfcHV0KCkgeyB9CgogICAgICB2aXJ0 dWFsCiAgICAgIH5fTnVtZXJpY19wdXQoKSB7IH0KICAgIH07CgogIHRlbXBsYXRlPHR5cGVuYW1l IF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CiAgICBjbGFzcyBudW1fcHV0IDogcHVibGljIGxv Y2FsZTo6ZmFjZXQKICAgIHsKICAgIHB1YmxpYzoKCiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJf dHlwZTsKICAgICAgdHlwZWRlZiBfT3V0SXRlciBpdGVyX3R5cGU7CgogICAgICBzdGF0aWMgbG9j YWxlOjppZCBpZDsKCiAgICAgIGV4cGxpY2l0CiAgICAgIG51bV9wdXQoc2l6ZV90IF9fcmVmcyA9 IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHsgfQoKICAgICAgaXRlcl90eXBlCiAgICAgIHB1 dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9f dikgY29uc3QKICAgICAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdik7IH0K CiAgICAgIGl0ZXJfdHlwZQogICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwg Y2hhcl90eXBlIF9fZmlsbCwgbG9uZyBfX3YpIGNvbnN0CiAgICAgIHsgcmV0dXJuIGRvX3B1dChf X3MsIF9fZiwgX19maWxsLCBfX3YpOyB9CgogICAgICBpdGVyX3R5cGUKICAgICAgcHV0KGl0ZXJf dHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCiAgICAgICAgICB1bnNp Z25lZCBsb25nIF9fdikgY29uc3QKICAgICAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2Zp bGwsIF9fdik7IH0KCgogICAgICBpdGVyX3R5cGUKICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlv c19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsIGxvbmcgbG9uZyBfX3YpIGNvbnN0CiAgICAg IHsgcmV0dXJuIGRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3YpOyB9CgogICAgICBpdGVyX3R5 cGUKICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2Zp bGwsCiAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgX192KSBjb25zdAogICAgICB7IHJldHVy biBkb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192KTsgfQoKCiAgICAgIGl0ZXJfdHlwZQogICAg ICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwgZG91 YmxlIF9fdikgY29uc3QKICAgICAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9f dik7IH0KCiAgICAgIGl0ZXJfdHlwZQogICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2Um IF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKICAgICAgICAgIGxvbmcgZG91YmxlIF9fdikgY29uc3QK ICAgICAgeyByZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdik7IH0KCiAgICAgIGl0 ZXJfdHlwZQogICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBl IF9fZmlsbCwKICAgICAgICAgIGNvbnN0IHZvaWQqIF9fdikgY29uc3QKICAgICAgeyByZXR1cm4g ZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdik7IH0KCiAgICBwcm90ZWN0ZWQ6CiAgICAgIHZp cnR1YWwKICAgICAgfm51bV9wdXQoKSB7IH07CgogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAg ICBkb19wdXQoaXRlcl90eXBlLCBpb3NfYmFzZSYsIGNoYXJfdHlwZSBfX2ZpbGwsIGJvb2wgX192 KSBjb25zdDsKCiAgICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX3B1dChpdGVyX3R5cGUs IGlvc19iYXNlJiwgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBfX3YpIGNvbnN0OwoKCiAgICAgIHZp cnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90 eXBlIF9fZmlsbCwgbG9uZyBsb25nIF9fdikgY29uc3Q7CgoKICAgICAgdmlydHVhbCBpdGVyX3R5 cGUKICAgICAgZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUgX19maWxsLCB1 bnNpZ25lZCBsb25nKSBjb25zdDsKCgogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAgICBkb19w dXQoaXRlcl90eXBlLCBpb3NfYmFzZSYsIGNoYXJfdHlwZSBfX2ZpbGwsIHVuc2lnbmVkIGxvbmcg bG9uZykgY29uc3Q7CgoKICAgICAgdmlydHVhbCBpdGVyX3R5cGUKICAgICAgZG9fcHV0KGl0ZXJf dHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUgX19maWxsLCBkb3VibGUgX192KSBjb25zdDsKCiAg ICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwg Y2hhcl90eXBlIF9fZmlsbCwgbG9uZyBkb3VibGUgX192KSBjb25zdDsKCiAgICAgIHZpcnR1YWwg aXRlcl90eXBlCiAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlIF9f ZmlsbCwgY29uc3Qgdm9pZCogX192KSBjb25zdDsKICAgIH07CgogIHRlbXBsYXRlIDx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgogICAgbG9jYWxlOjppZCBudW1fcHV0PF9DaGFy VCwgX091dEl0ZXI+OjppZDsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAgY2xhc3Mg bnVtcHVuY3QgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAogICAgewogICAgcHVibGljOgoKICAgICAg dHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hh clQ+IHN0cmluZ190eXBlOwoKICAgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CgogICAgcHJpdmF0 ZToKICAgICAgY2hhcl90eXBlIF9NX2RlY2ltYWxfcG9pbnQ7CiAgICAgIGNoYXJfdHlwZSBfTV90 aG91c2FuZHNfc2VwOwogICAgICBzdHJpbmcgX01fZ3JvdXBpbmc7CiAgICAgIHN0cmluZ190eXBl IF9NX3RydWVuYW1lOwogICAgICBzdHJpbmdfdHlwZSBfTV9mYWxzZW5hbWU7CgogICAgcHVibGlj OgogICAgICBleHBsaWNpdAogICAgICBudW1wdW5jdChzaXplX3QgX19yZWZzID0gMCkgOiBsb2Nh bGU6OmZhY2V0KF9fcmVmcykKICAgICAgeyBfTV9pbml0aWFsaXplX251bXB1bmN0KCk7IH0KCiAg ICAgIGV4cGxpY2l0CiAgICAgIG51bXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19y ZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKICAgICAgeyBfTV9pbml0aWFsaXplX251 bXB1bmN0KF9fY2xvYyk7IH0KCiAgICAgIGNoYXJfdHlwZQogICAgICBkZWNpbWFsX3BvaW50KCkg Y29uc3QKICAgICAgeyByZXR1cm4gZG9fZGVjaW1hbF9wb2ludCgpOyB9CgogICAgICBjaGFyX3R5 cGUKICAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0CiAgICAgIHsgcmV0dXJuIGRvX3Rob3VzYW5k c19zZXAoKTsgfQoKICAgICAgc3RyaW5nCiAgICAgIGdyb3VwaW5nKCkgY29uc3QKICAgICAgeyBy ZXR1cm4gZG9fZ3JvdXBpbmcoKTsgfQoKICAgICAgc3RyaW5nX3R5cGUKICAgICAgdHJ1ZW5hbWUo KSBjb25zdAogICAgICB7IHJldHVybiBkb190cnVlbmFtZSgpOyB9CgogICAgICBzdHJpbmdfdHlw ZQogICAgICBmYWxzZW5hbWUoKSBjb25zdAogICAgICB7IHJldHVybiBkb19mYWxzZW5hbWUoKTsg fQoKICAgIHByb3RlY3RlZDoKICAgICAgdmlydHVhbAogICAgICB+bnVtcHVuY3QoKSB7IH0KCiAg ICAgIHZpcnR1YWwgY2hhcl90eXBlCiAgICAgIGRvX2RlY2ltYWxfcG9pbnQoKSBjb25zdAogICAg ICB7IHJldHVybiBfTV9kZWNpbWFsX3BvaW50OyB9CgogICAgICB2aXJ0dWFsIGNoYXJfdHlwZQog ICAgICBkb190aG91c2FuZHNfc2VwKCkgY29uc3QKICAgICAgeyByZXR1cm4gX01fdGhvdXNhbmRz X3NlcDsgfQoKICAgICAgdmlydHVhbCBzdHJpbmcKICAgICAgZG9fZ3JvdXBpbmcoKSBjb25zdAog ICAgICB7IHJldHVybiBfTV9ncm91cGluZzsgfQoKICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQog ICAgICBkb190cnVlbmFtZSgpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9NX3RydWVuYW1lOyB9Cgog ICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCiAgICAgIGRvX2ZhbHNlbmFtZSgpIGNvbnN0CiAgICAg IHsgcmV0dXJuIF9NX2ZhbHNlbmFtZTsgfQoKCiAgICAgIHZvaWQKICAgICAgX01faW5pdGlhbGl6 ZV9udW1wdW5jdChfX2NfbG9jYWxlIF9fY2xvYyA9IF9fbnVsbCk7CiAgICB9OwoKICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICBsb2NhbGU6OmlkIG51bXB1bmN0PF9DaGFyVD46OmlkOwoK ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICB2b2lkCiAgICBudW1wdW5jdDxfQ2hhclQ+ OjpfTV9pbml0aWFsaXplX251bXB1bmN0KF9fY19sb2NhbGUgKQogICAgewoKICAgIH0KCiAgdGVt cGxhdGU8PgogICAgdm9pZAogICAgbnVtcHVuY3Q8Y2hhcj46Ol9NX2luaXRpYWxpemVfbnVtcHVu Y3QoX19jX2xvY2FsZSBfX2Nsb2MpOwoKCgoKCgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+ CiAgICBjbGFzcyBudW1wdW5jdF9ieW5hbWUgOiBwdWJsaWMgbnVtcHVuY3Q8X0NoYXJUPgogICAg ewogICAgICBfX2NfbG9jYWxlIF9NX2NfbG9jYWxlX251bXB1bmN0OwogICAgcHVibGljOgogICAg ICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5cGU7CiAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9D aGFyVD4gc3RyaW5nX3R5cGU7CgogICAgICBleHBsaWNpdAogICAgICBudW1wdW5jdF9ieW5hbWUo Y29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzID0gMCkKICAgICAgOiBudW1wdW5jdDxfQ2hh clQ+KF9fcmVmcykKICAgICAgewogICAgICAgIF9TX2NyZWF0ZV9jX2xvY2FsZShfTV9jX2xvY2Fs ZV9udW1wdW5jdCwgX19zKTsKICAgICAgICBfTV9pbml0aWFsaXplX251bXB1bmN0KF9NX2NfbG9j YWxlX251bXB1bmN0KTsKICAgICAgfQoKICAgIHByb3RlY3RlZDoKICAgICAgdmlydHVhbAogICAg ICB+bnVtcHVuY3RfYnluYW1lKCkKICAgICAgeyBfU19kZXN0cm95X2NfbG9jYWxlKF9NX2NfbG9j YWxlX251bXB1bmN0KTsgfQogICAgfTsKCgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAg IGNsYXNzIGNvbGxhdGUgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAogICAgewogICAgcHVibGljOgoK ICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIGJhc2ljX3N0cmlu ZzxfQ2hhclQ+IHN0cmluZ190eXBlOwoKICAgICAgc3RhdGljIGxvY2FsZTo6aWQgaWQ7CgogICAg ICBleHBsaWNpdAogICAgICBjb2xsYXRlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFj ZXQoX19yZWZzKSB7IH0KCiAgICAgIGludAogICAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19s bzEsIGNvbnN0IF9DaGFyVCogX19oaTEsCiAgICAgICAgICAgICAgY29uc3QgX0NoYXJUKiBfX2xv MiwgY29uc3QgX0NoYXJUKiBfX2hpMikgY29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fY29t cGFyZShfX2xvMSwgX19oaTEsIF9fbG8yLCBfX2hpMik7IH0KCiAgICAgIHN0cmluZ190eXBlCiAg ICAgIHRyYW5zZm9ybShjb25zdCBfQ2hhclQqIF9fbG8sIGNvbnN0IF9DaGFyVCogX19oaSkgY29u c3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdHJhbnNmb3JtKF9fbG8sIF9faGkpOyB9CgogICAg ICBsb25nCiAgICAgIGhhc2goY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkp IGNvbnN0CiAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2hhc2goX19sbywgX19oaSk7IH0KCiAgcHJv dGVjdGVkOgogICAgICB+Y29sbGF0ZSgpIHsgfQoKICAgICAgdmlydHVhbCBpbnQKICAgICAgZG9f Y29tcGFyZShjb25zdCBfQ2hhclQqIF9fbG8xLCBjb25zdCBfQ2hhclQqIF9faGkxLAogICAgICAg ICAgICAgICAgIGNvbnN0IF9DaGFyVCogX19sbzIsIGNvbnN0IF9DaGFyVCogX19oaTIpIGNvbnN0 OwoKICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQogICAgICBkb190cmFuc2Zvcm0oY29uc3QgX0No YXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0OwoKICAgICAgdmlydHVhbCBsb25n CiAgICAgIGRvX2hhc2goY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNv bnN0OwogICAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAgbG9jYWxlOjppZCBj b2xsYXRlPF9DaGFyVD46OmlkOwoKCiAgdGVtcGxhdGU8PgogICAgaW50CiAgICBjb2xsYXRlPGNo YXI+Ojpkb19jb21wYXJlKGNvbnN0IGNoYXIqIF9fbG8xLCBjb25zdCBjaGFyKiBfX2hpMSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19sbzIsIGNvbnN0IGNoYXIq IF9faGkyKSBjb25zdDsKCiAgdGVtcGxhdGU8PgogICAgc3RyaW5nCiAgICBjb2xsYXRlPGNoYXI+ Ojpkb190cmFuc2Zvcm0oY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSkgY29uc3Q7 CgogIHRlbXBsYXRlPD4KICAgIGxvbmcKICAgIGNvbGxhdGU8Y2hhcj46OmRvX2hhc2goY29uc3Qg Y2hhciogX19sbywgY29uc3QgY2hhciogX19oaSkgY29uc3Q7CiMgMTAxNCAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy5oIiAzCiAgdGVtcGxhdGU8 dHlwZW5hbWUgX0NoYXJUPgogICAgY2xhc3MgY29sbGF0ZV9ieW5hbWUgOiBwdWJsaWMgY29sbGF0 ZTxfQ2hhclQ+CiAgICB7CiAgICBwdWJsaWM6CgogICAgICB0eXBlZGVmIF9DaGFyVCBjaGFyX3R5 cGU7CiAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4gc3RyaW5nX3R5cGU7CgogICAg ICBleHBsaWNpdAogICAgICBjb2xsYXRlX2J5bmFtZShjb25zdCBjaGFyKiwgc2l6ZV90IF9fcmVm cyA9IDApOwoKICAgIHByb3RlY3RlZDoKICAgICAgdmlydHVhbAogICAgICB+Y29sbGF0ZV9ieW5h bWUoKSB7IH0KICAgIH07CgogIHRlbXBsYXRlPD4KICAgIGNvbGxhdGVfYnluYW1lPGNoYXI+Ojpj b2xsYXRlX2J5bmFtZShjb25zdCBjaGFyKiwgc2l6ZV90IF9fcmVmcyk7CgoKCgoKICBjbGFzcyB0 aW1lX2Jhc2UKICB7CiAgcHVibGljOgogICAgZW51bSBkYXRlb3JkZXIgeyBub19vcmRlciwgZG15 LCBtZHksIHltZCwgeWRtIH07CiAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBl bmFtZSBfSW5JdGVyPgogICAgY2xhc3MgdGltZV9nZXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwg cHVibGljIHRpbWVfYmFzZQogICAgewogICAgcHVibGljOgoKICAgICAgdHlwZWRlZiBfQ2hhclQg Y2hhcl90eXBlOwogICAgICB0eXBlZGVmIF9Jbkl0ZXIgaXRlcl90eXBlOwoKICAgICAgc3RhdGlj IGxvY2FsZTo6aWQgaWQ7CgogICAgICBleHBsaWNpdAogICAgICB0aW1lX2dldChzaXplX3QgX19y ZWZzID0gMCkKICAgICAgOiBsb2NhbGU6OmZhY2V0IChfX3JlZnMpLCBfTV9kYXluYW1lcygwKSwg X01fbW9udGhuYW1lcygwKSB7IH0KCiAgICAgIGRhdGVvcmRlcgogICAgICBkYXRlX29yZGVyKCkg Y29uc3QKICAgICAgeyByZXR1cm4gZG9fZGF0ZV9vcmRlcigpOyB9CgogICAgICBpdGVyX3R5cGUK ICAgICAgZ2V0X3RpbWUoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYg X19mLAogICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3QpIGNv bnN0CiAgICAgIHsgcmV0dXJuIGRvX2dldF90aW1lKF9fcywgX19lbmQsIF9fZiwgX19lcnIsIF9f dCk7IH0KCiAgICAgIGl0ZXJfdHlwZQogICAgICBnZXRfZGF0ZShpdGVyX3R5cGUgX19zLCBpdGVy X3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2YsCiAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0 YXRlJiBfX2VyciwgdG0qIF9fdCkgY29uc3QKICAgICAgeyByZXR1cm4gZG9fZ2V0X2RhdGUoX19z LCBfX2VuZCwgX19mLCBfX2VyciwgX190KTsgfQoKICAgICAgaXRlcl90eXBlCiAgICAgIGdldF93 ZWVrZGF5KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9fZiwKICAg ICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190KSBjb25zdAog ICAgICB7IHJldHVybiBkb19nZXRfd2Vla2RheShfX3MsX19lbmQsX19mLF9fZXJyLF9fdCk7IH0K CiAgICAgIGl0ZXJfdHlwZQogICAgICBnZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX3MsIGl0ZXJf dHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9fZiwKICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6 aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3QpIGNvbnN0CiAgICAgIHsgcmV0dXJuIGRvX2dldF9tb250 aG5hbWUoX19zLF9fZW5kLF9fZixfX2VycixfX3QpOyB9CgogICAgICBpdGVyX3R5cGUKICAgICAg Z2V0X3llYXIoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19mLAog ICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3QpIGNvbnN0CiAg ICAgIHsgcmV0dXJuIGRvX2dldF95ZWFyKF9fcyxfX2VuZCxfX2YsX19lcnIsX190KTsgfQoKICAg IHByb3RlY3RlZDoKICAgICAgdmlydHVhbAogICAgICB+dGltZV9nZXQoKQogICAgICB7CiAgICAg ICAgZGVsZXRlIFtdIF9NX21vbnRobmFtZXM7CiAgICAgICAgZGVsZXRlIFtdIF9NX2RheW5hbWVz OwogICAgICB9CgogICAgICB2aXJ0dWFsIGRhdGVvcmRlcgogICAgICBkb19kYXRlX29yZGVyKCkg Y29uc3QKICAgICAgeyByZXR1cm4gdGltZV9iYXNlOjp5bWQ7IH0KCiAgICAgIHZpcnR1YWwgaXRl cl90eXBlCiAgICAgIGRvX2dldF90aW1lKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSAsIGlvc19i YXNlJiwKICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmICwgdG0qICkgY29uc3QK ICAgICAgeyByZXR1cm4gX19zOyB9CgogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAgICBkb19n ZXRfZGF0ZShpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgLCBpb3NfYmFzZSYsCiAgICAgICAgICAg ICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiAsIHRtKiApIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9f czsgfQoKICAgICAgdmlydHVhbCBpdGVyX3R5cGUKICAgICAgZG9fZ2V0X3dlZWtkYXkoaXRlcl90 eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYsCiAgICAgICAgICAgICAgICAgICAg IGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdCkgY29uc3Q7CgogICAgICB2aXJ0dWFs IGl0ZXJfdHlwZQogICAgICBkb19nZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlw ZSBfX2VuZCwgaW9zX2Jhc2UmLAogICAgICAgICAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0 YXRlJiBfX2VyciwgdG0qIF9fdCkgY29uc3Q7CgogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAg ICBkb19nZXRfeWVhcihpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgLCBpb3NfYmFzZSYsCiAgICAg ICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgLCB0bSogKSBjb25zdAogICAgICB7IHJl dHVybiBfX3M7IH0KCiAgICAgIG11dGFibGUgYmFzaWNfc3RyaW5nPF9DaGFyVD4qIF9NX2RheW5h bWVzOwogICAgICBtdXRhYmxlIGJhc2ljX3N0cmluZzxfQ2hhclQ+KiBfTV9tb250aG5hbWVzOwog ICAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgogICAg bG9jYWxlOjppZCB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjppZDsKCiAgdGVtcGxhdGU8dHlw ZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgogICAgY2xhc3MgdGltZV9nZXRfYnluYW1l IDogcHVibGljIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj4KICAgIHsKICAgIHB1YmxpYzoKICAg ICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIF9Jbkl0ZXIgaXRlcl90 eXBlOwoKICAgICAgZXhwbGljaXQKICAgICAgdGltZV9nZXRfYnluYW1lKGNvbnN0IGNoYXIqLCBz aXplX3QgX19yZWZzID0gMCkKICAgICAgOiB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+KF9fcmVm cykgeyB9CiAgICBwcm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwKICAgICAgfnRpbWVfZ2V0X2J5bmFt ZSgpIHsgfQogICAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0 SXRlcj4KICAgIGNsYXNzIHRpbWVfcHV0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyB0 aW1lX2Jhc2UKICAgIHsKICAgIHB1YmxpYzoKICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBl OwogICAgICB0eXBlZGVmIF9PdXRJdGVyIGl0ZXJfdHlwZTsKCiAgICAgIHN0YXRpYyBsb2NhbGU6 OmlkIGlkOwoKICAgICAgZXhwbGljaXQKICAgICAgdGltZV9wdXQoc2l6ZV90IF9fcmVmcyA9IDAp IDogbG9jYWxlOjpmYWNldCAoX19yZWZzKSB7IH0KCgogICAgICBpdGVyX3R5cGUKICAgICAgcHV0 KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiAsIGNoYXJfdHlwZSAsCiAgICAgICAgICBjb25zdCB0 bSogLCBjb25zdCBfQ2hhclQqICwKICAgICAgICAgIGNvbnN0IF9DaGFyVCogKSBjb25zdAogICAg ICB7IHJldHVybiBfX3M7IH0KCiAgICAgIGl0ZXJfdHlwZQogICAgICBwdXQoaXRlcl90eXBlIF9f cywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKICAgICAgICAgIGNvbnN0IHRtKiBf X3RtYiwgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZGlmaWVyID0gMCkgY29uc3QKICAgICAgeyBy ZXR1cm4gZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdG1iLCBfX2Zvcm1hdCwgX19tb2RpZmll cik7IH0KCiAgICBwcm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwKICAgICAgfnRpbWVfcHV0KCkgeyB9 CgogICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQogICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9z X2Jhc2UmLCBjaGFyX3R5cGUsIGNvbnN0IHRtKiAsCiAgICAgICAgICAgICBjaGFyICwgY2hhciAp IGNvbnN0CiAgICAgIHsgcmV0dXJuIF9fczsgfQogICAgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUg X0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KICAgIGxvY2FsZTo6aWQgdGltZV9wdXQ8X0NoYXJU LCBfT3V0SXRlcj46OmlkOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9P dXRJdGVyPgogICAgY2xhc3MgdGltZV9wdXRfYnluYW1lIDogcHVibGljIHRpbWVfcHV0PF9DaGFy VCwgX091dEl0ZXI+CiAgICB7CiAgICBwdWJsaWM6CiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJf dHlwZTsKICAgICAgdHlwZWRlZiBfT3V0SXRlciBpdGVyX3R5cGU7CgogICAgICBleHBsaWNpdAog ICAgICB0aW1lX3B1dF9ieW5hbWUoY29uc3QgY2hhciosIHNpemVfdCBfX3JlZnMgPSAwKQogICAg ICA6IHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+IChfX3JlZnMpIHsgfQoKICAgIHByb3RlY3Rl ZDoKICAgICAgdmlydHVhbAogICAgICB+dGltZV9wdXRfYnluYW1lKCkgeyB9CiAgICB9OwoKCiAg dGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgogICAgY2xhc3MgbW9u ZXlfZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKICAgIHsKICAgIHB1YmxpYzoKICAgICAgdHlw ZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIF9Jbkl0ZXIgaXRlcl90eXBlOwog ICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+IHN0cmluZ190eXBlOwoKICAgICAgc3Rh dGljIGxvY2FsZTo6aWQgaWQ7CgogICAgICBleHBsaWNpdAogICAgICBtb25leV9nZXQoc2l6ZV90 IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNldChfX3JlZnMpIHsgfQoKICAgICAgaXRlcl90eXBl CiAgICAgIGdldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLAog ICAgICAgICAgaW9zX2Jhc2UmIF9fZiwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRv dWJsZSYgX191bml0cykgY29uc3QKICAgICAgeyByZXR1cm4gZG9fZ2V0KF9fcywgX19lbmQsIF9f aW50bCwgX19mLCBfX2VyciwgX191bml0cyk7IH0KCiAgICAgIGl0ZXJfdHlwZQogICAgICBnZXQo aXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9f ZiwKICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHN0cmluZ190eXBlJiBfX2Rp Z2l0cykgY29uc3QKICAgICAgeyByZXR1cm4gZG9fZ2V0KF9fcywgX19lbmQsIF9faW50bCwgX19m LCBfX2VyciwgX19kaWdpdHMpOyB9CgogICAgcHJvdGVjdGVkOgogICAgICB2aXJ0dWFsCiAgICAg IH5tb25leV9nZXQoKSB7IH0KCiAgICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX2dldChp dGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgLCBib29sICwKICAgICAgICAgICAgIGlvc19iYXNlJiAs IGlvc19iYXNlOjppb3N0YXRlJiAsCiAgICAgICAgICAgICBsb25nIGRvdWJsZSYgKSBjb25zdAog ICAgICB7IHJldHVybiBfX3M7IH0KCiAgICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX2dl dChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgLCBib29sICwKICAgICAgICAgICAgIGlvc19iYXNl JiAsIGlvc19iYXNlOjppb3N0YXRlJiAsCiAgICAgICAgICAgICBzdHJpbmdfdHlwZSYgKSBjb25z dAogICAgICB7IHJldHVybiBfX3M7IH0KICAgIH07CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFy VCwgdHlwZW5hbWUgX0luSXRlcj4KICAgIGxvY2FsZTo6aWQgbW9uZXlfZ2V0PF9DaGFyVCwgX0lu SXRlcj46OmlkOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVy PgogICAgY2xhc3MgbW9uZXlfcHV0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKICAgIHsKICAgIHB1 YmxpYzoKICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIF9PdXRJ dGVyIGl0ZXJfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPiBzdHJpbmdf dHlwZTsKCiAgICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOwoKICAgICAgZXhwbGljaXQKICAgICAg bW9uZXlfcHV0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7IH0K CiAgICAgIGl0ZXJfdHlwZQogICAgICBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlv c19iYXNlJiBfX2YsCiAgICAgICAgICBjaGFyX3R5cGUgX19maWxsLCBsb25nIGRvdWJsZSBfX3Vu aXRzKSBjb25zdAogICAgICB7IHJldHVybiBkb19wdXQoX19zLCBfX2ludGwsIF9fZiwgX19maWxs LCBfX3VuaXRzKTsgfQoKICAgICAgaXRlcl90eXBlCiAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBi b29sIF9faW50bCwgaW9zX2Jhc2UmIF9fZiwKICAgICAgICAgIGNoYXJfdHlwZSBfX2ZpbGwsIGNv bnN0IHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QKICAgICAgeyByZXR1cm4gZG9fcHV0KF9f cywgX19pbnRsLCBfX2YsIF9fZmlsbCwgX19kaWdpdHMpOyB9CgogICAgcHJvdGVjdGVkOgogICAg ICB2aXJ0dWFsCiAgICAgIH5tb25leV9wdXQoKSB7IH0KCiAgICAgIHZpcnR1YWwgaXRlcl90eXBl CiAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBib29sLCBpb3NfYmFzZSYgLCBjaGFyX3R5cGUg LAogICAgICAgICAgICAgbG9uZyBkb3VibGUgKSBjb25zdAogICAgICB7IHJldHVybiBfX3M7IH0K CiAgICAgIHZpcnR1YWwgaXRlcl90eXBlCiAgICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBib29s LCBpb3NfYmFzZSYgLCBjaGFyX3R5cGUgLAogICAgICAgICAgICAgY29uc3Qgc3RyaW5nX3R5cGUm ICkgY29uc3QKICAgICAgeyByZXR1cm4gX19zOyB9CiAgICB9OwoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgogICAgbG9jYWxlOjppZCBtb25leV9wdXQ8X0No YXJULCBfT3V0SXRlcj46OmlkOwoKICBzdHJ1Y3QgbW9uZXlfYmFzZQogIHsKICAgIGVudW0gcGFy dCB7IG5vbmUsIHNwYWNlLCBzeW1ib2wsIHNpZ24sIHZhbHVlIH07CiAgICBzdHJ1Y3QgcGF0dGVy biB7IGNoYXIgZmllbGRbNF07IH07CgogICAgc3RhdGljIGNvbnN0IHBhdHRlcm4gX1NfZGVmYXVs dF9wYXR0ZXJuOwoKCgogICAgc3RhdGljIHBhdHRlcm4KICAgIF9TX2NvbnN0cnVjdF9wYXR0ZXJu KGNoYXIgX19wcmVjZWVkcywgY2hhciBfX3NwYWNlLCBjaGFyIF9fcG9zbik7CiAgfTsKCiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgogICAgY2xhc3MgbW9uZXlwdW5jdCA6 IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgbW9uZXlfYmFzZQogICAgewogICAgcHVibGlj OgoKICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIGJhc2ljX3N0 cmluZzxfQ2hhclQ+IHN0cmluZ190eXBlOwoKICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaW50bCA9 IF9JbnRsOwogICAgICBzdGF0aWMgbG9jYWxlOjppZCBpZDsKCiAgICBwcml2YXRlOgogICAgICBj aGFyX3R5cGUgX01fZGVjaW1hbF9wb2ludDsKICAgICAgY2hhcl90eXBlIF9NX3Rob3VzYW5kc19z ZXA7CiAgICAgIHN0cmluZyBfTV9ncm91cGluZzsKICAgICAgc3RyaW5nX3R5cGUgX01fY3Vycl9z eW1ib2w7CiAgICAgIHN0cmluZ190eXBlIF9NX3Bvc2l0aXZlX3NpZ247CiAgICAgIHN0cmluZ190 eXBlIF9NX25lZ2F0aXZlX3NpZ247CiAgICAgIGludCBfTV9mcmFjX2RpZ2l0czsKICAgICAgcGF0 dGVybiBfTV9wb3NfZm9ybWF0OwogICAgICBwYXR0ZXJuIF9NX25lZ19mb3JtYXQ7CgogICAgcHVi bGljOgogICAgICBleHBsaWNpdAogICAgICBtb25leXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKSA6 IGxvY2FsZTo6ZmFjZXQoX19yZWZzKQogICAgICB7IF9NX2luaXRpYWxpemVfbW9uZXlwdW5jdCgp OyB9CgogICAgICBleHBsaWNpdAogICAgICBtb25leXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBz aXplX3QgX19yZWZzID0gMCkgOiBsb2NhbGU6OmZhY2V0KF9fcmVmcykKICAgICAgeyBfTV9pbml0 aWFsaXplX21vbmV5cHVuY3QoX19jbG9jKTsgfQoKICAgICAgY2hhcl90eXBlCiAgICAgIGRlY2lt YWxfcG9pbnQoKSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5kb19kZWNpbWFsX3BvaW50KCk7 IH0KCiAgICAgIGNoYXJfdHlwZQogICAgICB0aG91c2FuZHNfc2VwKCkgY29uc3QKICAgICAgeyBy ZXR1cm4gdGhpcy0+ZG9fdGhvdXNhbmRzX3NlcCgpOyB9CgogICAgICBzdHJpbmcKICAgICAgZ3Jv dXBpbmcoKSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5kb19ncm91cGluZygpOyB9CgogICAg ICBzdHJpbmdfdHlwZQogICAgICBjdXJyX3N5bWJvbCgpIGNvbnN0CiAgICAgIHsgcmV0dXJuIHRo aXMtPmRvX2N1cnJfc3ltYm9sKCk7IH0KCiAgICAgIHN0cmluZ190eXBlCiAgICAgIHBvc2l0aXZl X3NpZ24oKSBjb25zdAogICAgICB7IHJldHVybiB0aGlzLT5kb19wb3NpdGl2ZV9zaWduKCk7IH0K CiAgICAgIHN0cmluZ190eXBlCiAgICAgIG5lZ2F0aXZlX3NpZ24oKSBjb25zdAogICAgICB7IHJl dHVybiB0aGlzLT5kb19uZWdhdGl2ZV9zaWduKCk7IH0KCiAgICAgIGludAogICAgICBmcmFjX2Rp Z2l0cygpIGNvbnN0CiAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2ZyYWNfZGlnaXRzKCk7IH0KCiAg ICAgIHBhdHRlcm4KICAgICAgcG9zX2Zvcm1hdCgpIGNvbnN0CiAgICAgIHsgcmV0dXJuIHRoaXMt PmRvX3Bvc19mb3JtYXQoKTsgfQoKICAgICAgcGF0dGVybgogICAgICBuZWdfZm9ybWF0KCkgY29u c3QKICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fbmVnX2Zvcm1hdCgpOyB9CgogICAgcHJvdGVjdGVk OgogICAgICB2aXJ0dWFsCiAgICAgIH5tb25leXB1bmN0KCkgeyB9CgogICAgICB2aXJ0dWFsIGNo YXJfdHlwZQogICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3QKICAgICAgeyByZXR1cm4gX01f ZGVjaW1hbF9wb2ludDsgfQoKICAgICAgdmlydHVhbCBjaGFyX3R5cGUKICAgICAgZG9fdGhvdXNh bmRzX3NlcCgpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9NX3Rob3VzYW5kc19zZXA7IH0KCiAgICAg IHZpcnR1YWwgc3RyaW5nCiAgICAgIGRvX2dyb3VwaW5nKCkgY29uc3QKICAgICAgeyByZXR1cm4g X01fZ3JvdXBpbmc7IH0KCiAgICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUKICAgICAgZG9fY3Vycl9z eW1ib2woKSBjb25zdAogICAgICB7IHJldHVybiBfTV9jdXJyX3N5bWJvbDsgfQoKICAgICAgdmly dHVhbCBzdHJpbmdfdHlwZQogICAgICBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3QKICAgICAgeyBy ZXR1cm4gX01fcG9zaXRpdmVfc2lnbjsgfQoKICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQogICAg ICBkb19uZWdhdGl2ZV9zaWduKCkgY29uc3QKICAgICAgeyByZXR1cm4gX01fbmVnYXRpdmVfc2ln bjsgfQoKICAgICAgdmlydHVhbCBpbnQKICAgICAgZG9fZnJhY19kaWdpdHMoKSBjb25zdAogICAg ICB7IHJldHVybiBfTV9mcmFjX2RpZ2l0czsgfQoKICAgICAgdmlydHVhbCBwYXR0ZXJuCiAgICAg IGRvX3Bvc19mb3JtYXQoKSBjb25zdAogICAgICB7IHJldHVybiBfTV9wb3NfZm9ybWF0OyB9Cgog ICAgICB2aXJ0dWFsIHBhdHRlcm4KICAgICAgZG9fbmVnX2Zvcm1hdCgpIGNvbnN0CiAgICAgIHsg cmV0dXJuIF9NX25lZ19mb3JtYXQ7IH0KCgogICAgICB2b2lkCiAgICAgIF9NX2luaXRpYWxpemVf bW9uZXlwdW5jdChfX2NfbG9jYWxlIF9fY2xvYyA9IF9fbnVsbCk7CiAgICB9OwoKICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CiAgICBsb2NhbGU6OmlkIG1vbmV5cHVuY3Q8 X0NoYXJULCBfSW50bD46OmlkOwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0lu dGw+CiAgICBjb25zdCBib29sIG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD46OmludGw7CgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KICAgIHZvaWQKICAgIG1vbmV5cHVu Y3Q8X0NoYXJULCBfSW50bD46Ol9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2NfbG9jYWxlICkK ICAgIHsKCiAgICB9CgogIHRlbXBsYXRlPD4KICAgIHZvaWQKICAgIG1vbmV5cHVuY3Q8Y2hhcj46 Ol9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2NfbG9jYWxlIF9fY2xvYyk7CgoKCgoKCiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgogICAgY2xhc3MgbW9uZXlwdW5jdF9i eW5hbWUgOiBwdWJsaWMgbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPgogICAgewogICAgICBfX2Nf bG9jYWxlIF9NX2NfbG9jYWxlX21vbmV5cHVuY3Q7CiAgICBwdWJsaWM6CiAgICAgIHR5cGVkZWYg X0NoYXJUIGNoYXJfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPiBzdHJp bmdfdHlwZTsKCiAgICAgIHN0YXRpYyBjb25zdCBib29sIGludGwgPSBfSW50bDsKCiAgICAgIGV4 cGxpY2l0CiAgICAgIG1vbmV5cHVuY3RfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9f cmVmcyA9IDApCiAgICAgIDogbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPihfX3JlZnMpCiAgICAg IHsKICAgICAgICBfU19jcmVhdGVfY19sb2NhbGUoX01fY19sb2NhbGVfbW9uZXlwdW5jdCwgX19z KTsKICAgICAgICBfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX01fY19sb2NhbGVfbW9uZXlwdW5j dCk7CiAgICAgIH0KCiAgICBwcm90ZWN0ZWQ6CiAgICAgIHZpcnR1YWwKICAgICAgfm1vbmV5cHVu Y3RfYnluYW1lKCkKICAgICAgeyBfU19kZXN0cm95X2NfbG9jYWxlKF9NX2NfbG9jYWxlX21vbmV5 cHVuY3QpOyB9CiAgICB9OwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+ CiAgICBjb25zdCBib29sIG1vbmV5cHVuY3RfYnluYW1lPF9DaGFyVCwgX0ludGw+OjppbnRsOwoK CiAgc3RydWN0IG1lc3NhZ2VzX2Jhc2UKICB7CiAgICB0eXBlZGVmIGludCBjYXRhbG9nOwogIH07 CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGNsYXNzIG1lc3NhZ2VzIDogcHVibGlj IGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtZXNzYWdlc19iYXNlCiAgICB7CiAgICBwdWJsaWM6CiAg ICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8 X0NoYXJUPiBzdHJpbmdfdHlwZTsKCiAgICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOwoKICAgICAg ZXhwbGljaXQKICAgICAgbWVzc2FnZXMoc2l6ZV90IF9fcmVmcyA9IDApIDogbG9jYWxlOjpmYWNl dChfX3JlZnMpIHsgfQoKICAgICAgY2F0YWxvZwogICAgICBvcGVuKGNvbnN0IGJhc2ljX3N0cmlu ZzxjaGFyPiYgX19zLCBjb25zdCBsb2NhbGUmIF9fbG9jKSBjb25zdAogICAgICB7IHJldHVybiBk b19vcGVuKF9fcywgX19sb2MpOyB9CgogICAgICBzdHJpbmdfdHlwZQogICAgICBnZXQoY2F0YWxv ZyBfX2MsIGludCBfX3NldCwgaW50IF9fbXNnaWQsIGNvbnN0IHN0cmluZ190eXBlJiBfX3MpIGNv bnN0CiAgICAgIHsgcmV0dXJuIGRvX2dldChfX2MsX19zZXQsX19tc2dpZCxfX3MpOyB9CgogICAg ICB2b2lkCiAgICAgIGNsb3NlKGNhdGFsb2cgX19jKSBjb25zdAogICAgICB7IHJldHVybiBkb19j bG9zZShfX2MpOyB9CgogICAgcHJvdGVjdGVkOgogICAgICB2aXJ0dWFsCiAgICAgIH5tZXNzYWdl cygpIHsgfQoKCgogICAgICB2aXJ0dWFsIGNhdGFsb2cKICAgICAgZG9fb3Blbihjb25zdCBiYXNp Y19zdHJpbmc8Y2hhcj4mLCBjb25zdCBsb2NhbGUmKSBjb25zdAogICAgICB7IHJldHVybiAwOyB9 CgogICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCiAgICAgIGRvX2dldChjYXRhbG9nLCBpbnQsIGlu dCAsIGNvbnN0IHN0cmluZ190eXBlJiBfX2RmYXVsdCkgY29uc3QKICAgICAgeyByZXR1cm4gX19k ZmF1bHQ7IH0KCiAgICAgIHZpcnR1YWwgdm9pZAogICAgICBkb19jbG9zZShjYXRhbG9nKSBjb25z dCB7IH0KICAgIH07CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGxvY2FsZTo6aWQg bWVzc2FnZXM8X0NoYXJUPjo6aWQ7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGNs YXNzIG1lc3NhZ2VzX2J5bmFtZSA6IHB1YmxpYyBtZXNzYWdlczxfQ2hhclQ+CiAgICB7CiAgICBw dWJsaWM6CiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNp Y19zdHJpbmc8X0NoYXJUPiBzdHJpbmdfdHlwZTsKCiAgICAgIGV4cGxpY2l0CiAgICAgIG1lc3Nh Z2VzX2J5bmFtZShjb25zdCBjaGFyKiwgc2l6ZV90IF9fcmVmcyA9IDApOwoKICAgIHByb3RlY3Rl ZDoKICAgICAgdmlydHVhbAogICAgICB+bWVzc2FnZXNfYnluYW1lKCkgeyB9CiAgICB9OwoKICB0 ZW1wbGF0ZTw+CiAgICBtZXNzYWdlc19ieW5hbWU8Y2hhcj46Om1lc3NhZ2VzX2J5bmFtZShjb25z dCBjaGFyKiwgc2l6ZV90IF9fcmVmcyk7CiMgMTUzMiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1 ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy5oIiAzCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0No YXJUPgogICAgaW5saW5lIGJvb2wKICAgIGlzc3BhY2UoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxl JiBfX2xvYykKICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlz KGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4K ICAgIGlubGluZSBib29sCiAgICBpc3ByaW50KF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19s b2MpCiAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlw ZV9iYXNlOjpwcmludCwgX19jKTsgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICBp bmxpbmUgYm9vbAogICAgaXNjbnRybChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQog ICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFz ZTo6Y250cmwsIF9fYyk7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAgaW5saW5l IGJvb2wKICAgIGlzdXBwZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKICAgIHsg cmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnVw cGVyLCBfX2MpOyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29s IGlzbG93ZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKICAgIHsgcmV0dXJuIHVz ZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6Omxvd2VyLCBfX2Mp OyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc2Fs cGhhKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCiAgICB7IHJldHVybiB1c2VfZmFj ZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgX19jKTsgfQoK ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICBpbmxpbmUgYm9vbAogICAgaXNkaWdpdChf Q2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQogICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0 eXBlPF9DaGFyVD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsIF9fYyk7IH0KCiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJUPgogICAgaW5saW5lIGJvb2wKICAgIGlzcHVuY3QoX0NoYXJU IF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxf Q2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnB1bmN0LCBfX2MpOyB9CgogIHRlbXBsYXRl PHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc3hkaWdpdChfQ2hhclQgX19j LCBjb25zdCBsb2NhbGUmIF9fbG9jKQogICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFy VD4gPihfX2xvYykuaXMoY3R5cGVfYmFzZTo6eGRpZ2l0LCBfX2MpOyB9CgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBib29sCiAgICBpc2FsbnVtKF9DaGFyVCBfX2MsIGNv bnN0IGxvY2FsZSYgX19sb2MpCiAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+ KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjphbG51bSwgX19jKTsgfQoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQ+CiAgICBpbmxpbmUgYm9vbAogICAgaXNncmFwaChfQ2hhclQgX19jLCBjb25zdCBs b2NhbGUmIF9fbG9jKQogICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xv YykuaXMoY3R5cGVfYmFzZTo6Z3JhcGgsIF9fYyk7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0No YXJUPgogICAgaW5saW5lIF9DaGFyVAogICAgdG91cHBlcihfQ2hhclQgX19jLCBjb25zdCBsb2Nh bGUmIF9fbG9jKQogICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyku dG91cHBlcihfX2MpOyB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIGlubGluZSBf Q2hhclQKICAgIHRvbG93ZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKICAgIHsg cmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLnRvbG93ZXIoX19jKTsgfQp9 CiMgMzcgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Jhc2ljX2lvcy5o IiAyIDMKCm5hbWVzcGFjZSBzdGQKewoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVu YW1lIF9UcmFpdHM+CiAgICBjbGFzcyBiYXNpY19pb3MgOiBwdWJsaWMgaW9zX2Jhc2UKICAgIHsK ICAgIHB1YmxpYzoKCiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKICAgICAgdHlwZWRl ZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKICAgICAgdHlwZWRlZiB0eXBl bmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBf VHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKICAgICAgdHlwZWRlZiBfVHJhaXRzIHRyYWl0c190 eXBlOwoKCiAgICAgIHR5cGVkZWYgY3R5cGU8X0NoYXJUPiBfX2N0eXBlX3R5cGU7CiAgICAgIHR5 cGVkZWYgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+IF9fb3N0cmVhbWJ1Zl9p dGVyOwogICAgICB0eXBlZGVmIG51bV9wdXQ8X0NoYXJULCBfX29zdHJlYW1idWZfaXRlcj4gX19u dW1wdXRfdHlwZTsKICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1Ry YWl0cz4gX19pc3RyZWFtYnVmX2l0ZXI7CiAgICAgIHR5cGVkZWYgbnVtX2dldDxfQ2hhclQsIF9f aXN0cmVhbWJ1Zl9pdGVyPiBfX251bWdldF90eXBlOwoKCiAgICBwcml2YXRlOgogICAgICBiYXNp Y19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qIF9NX3RpZTsKICAgICAgY2hhcl90eXBlIF9NX2Zp bGw7CiAgICAgIGlvc3RhdGUgX01fZXhjZXB0aW9uOwoKICAgIHByb3RlY3RlZDoKICAgICAgYmFz aWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9NX3N0cmVhbWJ1ZjsKICAgICAgaW9zdGF0 ZSBfTV9zdHJlYW1idWZfc3RhdGU7CgoKICAgICAgY29uc3QgX19jdHlwZV90eXBlKiBfTV9pb3Nf ZmN0eXBlOwoKICAgICAgY29uc3QgX19udW1wdXRfdHlwZSogX01fZm51bXB1dDsKCiAgICAgIGNv bnN0IF9fbnVtZ2V0X3R5cGUqIF9NX2ZudW1nZXQ7CgogICAgcHVibGljOgogICAgICBpbmxpbmUg Y29uc3QgX19jdHlwZV90eXBlKgogICAgICBfTV9nZXRfZmN0eXBlX2lvcyh2b2lkKQogICAgICB7 IHJldHVybiBfTV9pb3NfZmN0eXBlOyB9CgogICAgICBvcGVyYXRvciB2b2lkKigpIGNvbnN0CiAg ICAgIHsgcmV0dXJuIHRoaXMtPmZhaWwoKSA/IDAgOiBjb25zdF9jYXN0PGJhc2ljX2lvcyo+KHRo aXMpOyB9CgogICAgICBpbmxpbmUgYm9vbAogICAgICBvcGVyYXRvciEoKSBjb25zdAogICAgICB7 IHJldHVybiB0aGlzLT5mYWlsKCk7IH0KCiAgICAgIGlubGluZSBpb3N0YXRlCiAgICAgIHJkc3Rh dGUoKSBjb25zdAogICAgICB7IHJldHVybiBfTV9zdHJlYW1idWZfc3RhdGU7IH0KCiAgICAgIGlu bGluZSB2b2lkCiAgICAgIGNsZWFyKGlvc3RhdGUgX19zdGF0ZSA9IGdvb2RiaXQpCiAgICAgIHsK ICAgICAgICBpZiAodGhpcy0+cmRidWYoKSkKICAgICAgICAgIF9NX3N0cmVhbWJ1Zl9zdGF0ZSA9 IF9fc3RhdGU7CiAgICAgICAgZWxzZQogICAgICAgICAgX01fc3RyZWFtYnVmX3N0YXRlID0gX19z dGF0ZSB8IGJhZGJpdDsKICAgICAgICBpZiAoKHRoaXMtPnJkc3RhdGUoKSAmIHRoaXMtPmV4Y2Vw dGlvbnMoKSkpCiAgICAgICAgICBfX3Rocm93X2lvc19mYWlsdXJlKCJiYXNpY19pb3M6OmNsZWFy KGlvc3RhdGUpIGNhdXNlZCBleGNlcHRpb24iKTsKICAgICAgfQoKICAgICAgaW5saW5lIHZvaWQK ICAgICAgc2V0c3RhdGUoaW9zdGF0ZSBfX3N0YXRlKQogICAgICB7IHRoaXMtPmNsZWFyKHRoaXMt PnJkc3RhdGUoKSB8IF9fc3RhdGUpOyB9CgogICAgICBpbmxpbmUgYm9vbAogICAgICBnb29kKCkg Y29uc3QKICAgICAgeyByZXR1cm4gdGhpcy0+cmRzdGF0ZSgpID09IDA7IH0KCiAgICAgIGlubGlu ZSBib29sCiAgICAgIGVvZigpIGNvbnN0CiAgICAgIHsgcmV0dXJuICh0aGlzLT5yZHN0YXRlKCkg JiBlb2ZiaXQpICE9IDA7IH0KCiAgICAgIGlubGluZSBib29sCiAgICAgIGZhaWwoKSBjb25zdAog ICAgICB7IHJldHVybiAodGhpcy0+cmRzdGF0ZSgpICYgKGJhZGJpdCB8IGZhaWxiaXQpKSAhPSAw OyB9CgogICAgICBpbmxpbmUgYm9vbAogICAgICBiYWQoKSBjb25zdAogICAgICB7IHJldHVybiAo dGhpcy0+cmRzdGF0ZSgpICYgYmFkYml0KSAhPSAwOyB9CgogICAgICBpbmxpbmUgaW9zdGF0ZQog ICAgICBleGNlcHRpb25zKCkgY29uc3QKICAgICAgeyByZXR1cm4gX01fZXhjZXB0aW9uOyB9Cgog ICAgICBpbmxpbmUgdm9pZAogICAgICBleGNlcHRpb25zKGlvc3RhdGUgX19leGNlcHQpCiAgICAg IHsKICAgICAgICBfTV9leGNlcHRpb24gPSBfX2V4Y2VwdDsKICAgICAgICB0aGlzLT5jbGVhcihf TV9zdHJlYW1idWZfc3RhdGUpOwogICAgICB9CgoKICAgICAgZXhwbGljaXQKICAgICAgYmFzaWNf aW9zKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKSA6IGlvc19iYXNlKCkK ICAgICAgeyB0aGlzLT5pbml0KF9fc2IpOyB9CgogICAgICB2aXJ0dWFsCiAgICAgIH5iYXNpY19p b3MoKSB7IH0KCgogICAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Kgog ICAgICB0aWUoKSBjb25zdAogICAgICB7IHJldHVybiBfTV90aWU7IH0KCiAgICAgIGlubGluZSBi YXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qCiAgICAgIHRpZShiYXNpY19vc3RyZWFtPF9D aGFyVCwgX1RyYWl0cz4qIF9fdGllc3RyKQogICAgICB7CiAgICAgICAgYmFzaWNfb3N0cmVhbTxf Q2hhclQsIF9UcmFpdHM+KiBfX29sZCA9IF9NX3RpZTsKICAgICAgICBfTV90aWUgPSBfX3RpZXN0 cjsKICAgICAgICByZXR1cm4gX19vbGQ7CiAgICAgIH0KCiAgICAgIGlubGluZSBiYXNpY19zdHJl YW1idWY8X0NoYXJULCBfVHJhaXRzPioKICAgICAgcmRidWYoKSBjb25zdAogICAgICB7IHJldHVy biBfTV9zdHJlYW1idWY7IH0KCiAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+ KgogICAgICByZGJ1ZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYik7Cgog ICAgICBiYXNpY19pb3MmCiAgICAgIGNvcHlmbXQoY29uc3QgYmFzaWNfaW9zJiBfX3Jocyk7Cgog ICAgICBpbmxpbmUgY2hhcl90eXBlCiAgICAgIGZpbGwoKSBjb25zdAogICAgICB7IHJldHVybiBf TV9maWxsOyB9CgogICAgICBpbmxpbmUgY2hhcl90eXBlCiAgICAgIGZpbGwoY2hhcl90eXBlIF9f Y2gpCiAgICAgIHsKICAgICAgICBjaGFyX3R5cGUgX19vbGQgPSBfTV9maWxsOwogICAgICAgIF9N X2ZpbGwgPSBfX2NoOwogICAgICAgIHJldHVybiBfX29sZDsKICAgICAgfQoKCiAgICAgIGxvY2Fs ZQogICAgICBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKCiAgICAgIGNoYXIKICAgICAgbmFy cm93KGNoYXJfdHlwZSBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0OwoKICAgICAgY2hhcl90eXBl CiAgICAgIHdpZGVuKGNoYXIgX19jKSBjb25zdDsKCiAgICBwcm90ZWN0ZWQ6CgogICAgICBiYXNp Y19pb3MoKSA6IGlvc19iYXNlKCkKICAgICAgeyB9CgogICAgICB2b2lkCiAgICAgIGluaXQoYmFz aWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpOwoKICAgICAgYm9vbAogICAgICBf TV9jaGVja19mYWNldChjb25zdCBsb2NhbGU6OmZhY2V0KiBfX2YpCiAgICAgIHsKICAgICAgICBi b29sIF9fcmV0ID0gZmFsc2U7CiAgICAgICAgaWYgKF9fZikKICAgICAgICAgIF9fcmV0ID0gdHJ1 ZTsKICAgICAgICBlbHNlCiAgICAgICAgICBfX3Rocm93X2JhZF9jYXN0KCk7CiAgICAgICAgcmV0 dXJuIF9fcmV0OwogICAgICB9CgogICAgICB2b2lkCiAgICAgIF9NX2NhY2hlX2ZhY2V0cyhjb25z dCBsb2NhbGUmIF9fbG9jKTsKICAgIH07Cn0KCgoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5j bHVkZS9nKystdjMvYml0cy9iYXNpY19pb3MudGNjIiAxIDMKIyAzMyAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvYmFzaWNfaW9zLnRjYyIgMwpuYW1lc3BhY2Ugc3RkCnsK ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19z dHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+ OjpyZGJ1ZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYikKICAgIHsKICAg ICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fb2xkID0gX01fc3RyZWFtYnVm OwogICAgICBfTV9zdHJlYW1idWYgPSBfX3NiOwogICAgICB0aGlzLT5jbGVhcigpOwogICAgICBy ZXR1cm4gX19vbGQ7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUg X1RyYWl0cz4KICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfaW9zPF9D aGFyVCwgX1RyYWl0cz46OmNvcHlmbXQoY29uc3QgYmFzaWNfaW9zJiBfX3JocykKICAgIHsKCgoK CiAgICAgIF9Xb3JkcyogX193b3JkcyA9IChfX3Jocy5fTV93b3JkX2xpbWl0IDw9IF9TX2xvY2Fs X3dvcmRzKSA/CiAgICAgICAgX01fd29yZF9hcnJheSA6IG5ldyBfV29yZHNbX19yaHMuX01fd29y ZF9saW1pdF07CiMgNjMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Jh c2ljX2lvcy50Y2MiIDMKICAgICAgX0NhbGxiYWNrX2xpc3QqIF9fY2IgPSBfX3Jocy5fTV9jYWxs YmFja3M7CiAgICAgIGlmIChfX2NiKQogICAgICAgIF9fY2ItPl9NX2FkZF9yZWZlcmVuY2UoKTsK ICAgICAgX01fY2FsbF9jYWxsYmFja3MoZXJhc2VfZXZlbnQpOwogICAgICBpZiAoX01fd29yZHMg IT0gX01fd29yZF9hcnJheSkKICAgICAgICBkZWxldGUgW10gX01fd29yZHM7CiAgICAgIF9NX2Rp c3Bvc2VfY2FsbGJhY2tzKCk7CgogICAgICBfTV9jYWxsYmFja3MgPSBfX2NiOwogICAgICBmb3Ig KGludCBfX2kgPSAwOyBfX2kgPCBfX3Jocy5fTV93b3JkX2xpbWl0OyArK19faSkKICAgICAgICBf X3dvcmRzW19faV0gPSBfX3Jocy5fTV93b3Jkc1tfX2ldOwogICAgICBpZiAoX01fd29yZHMgIT0g X01fd29yZF9hcnJheSkKICAgICAgICBkZWxldGUgW10gX01fd29yZHM7CiAgICAgIF9NX3dvcmRz ID0gX193b3JkczsKICAgICAgX01fd29yZF9saW1pdCA9IF9fcmhzLl9NX3dvcmRfbGltaXQ7Cgog ICAgICB0aGlzLT5mbGFncyhfX3Jocy5mbGFncygpKTsKICAgICAgdGhpcy0+d2lkdGgoX19yaHMu d2lkdGgoKSk7CiAgICAgIHRoaXMtPnByZWNpc2lvbihfX3Jocy5wcmVjaXNpb24oKSk7CiAgICAg IHRoaXMtPnRpZShfX3Jocy50aWUoKSk7CiAgICAgIHRoaXMtPmZpbGwoX19yaHMuZmlsbCgpKTsK CiAgICAgIHRoaXMtPmV4Y2VwdGlvbnMoX19yaHMuZXhjZXB0aW9ucygpKTsKCiAgICAgIF9NX2Nh bGxfY2FsbGJhY2tzKGNvcHlmbXRfZXZlbnQpOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9Cgog IHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGNoYXIKICAg IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBf X2RmYXVsdCkgY29uc3QKICAgIHsgcmV0dXJuIF9NX2lvc19mY3R5cGUtPm5hcnJvdyhfX2MsIF9f ZGZhdWx0KTsgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+ CiAgICBfQ2hhclQKICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojp3aWRlbihjaGFyIF9f YykgY29uc3QKICAgIHsgcmV0dXJuIF9NX2lvc19mY3R5cGUtPndpZGVuKF9fYyk7IH0KCgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGxvY2FsZQogICAg YmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OmltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpCiAg ICB7CiAgICAgIGxvY2FsZSBfX29sZCh0aGlzLT5nZXRsb2MoKSk7CiAgICAgIGlvc19iYXNlOjpp bWJ1ZShfX2xvYyk7CiAgICAgIF9NX2NhY2hlX2ZhY2V0cyhfX2xvYyk7CiAgICAgIGlmICh0aGlz LT5yZGJ1ZigpICE9IDApCiAgICAgICAgdGhpcy0+cmRidWYoKS0+cHViaW1idWUoX19sb2MpOwog ICAgICByZXR1cm4gX19vbGQ7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlw ZW5hbWUgX1RyYWl0cz4KICAgIHZvaWQKICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojpp bml0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKQogICAgewoKICAgICAg aW9zX2Jhc2U6Ol9NX2luaXQoKTsKICAgICAgX01fY2FjaGVfZmFjZXRzKF9NX2lvc19sb2NhbGUp OwogICAgICBfTV90aWUgPSAwOwogICAgICBfTV9maWxsID0gdGhpcy0+d2lkZW4oJyAnKTsKICAg ICAgX01fZXhjZXB0aW9uID0gZ29vZGJpdDsKICAgICAgX01fc3RyZWFtYnVmID0gX19zYjsKICAg ICAgX01fc3RyZWFtYnVmX3N0YXRlID0gX19zYiA/IGdvb2RiaXQgOiBiYWRiaXQ7CiAgICB9Cgog IHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIHZvaWQKICAg IGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpfTV9jYWNoZV9mYWNldHMoY29uc3QgbG9jYWxl JiBfX2xvYykKICAgIHsKICAgICAgaWYgKGhhc19mYWNldDxfX2N0eXBlX3R5cGU+KF9fbG9jKSkK ICAgICAgICBfTV9pb3NfZmN0eXBlID0gJnVzZV9mYWNldDxfX2N0eXBlX3R5cGU+KF9fbG9jKTsK CiAgICAgIGlmIChoYXNfZmFjZXQ8X19udW1wdXRfdHlwZT4oX19sb2MpKQogICAgICAgIF9NX2Zu dW1wdXQgPSAmdXNlX2ZhY2V0PF9fbnVtcHV0X3R5cGU+KF9fbG9jKTsKICAgICAgaWYgKGhhc19m YWNldDxfX251bWdldF90eXBlPihfX2xvYykpCiAgICAgICAgX01fZm51bWdldCA9ICZ1c2VfZmFj ZXQ8X19udW1nZXRfdHlwZT4oX19sb2MpOwogICAgfQp9CiMgMjE0ICIvdXNyL2xvY2FsL2djYy0z LjAvaW5jbHVkZS9nKystdjMvYml0cy9iYXNpY19pb3MuaCIgMiAzCiMgNDcgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pb3MuaCIgMiAzCiMgNDAgIi91c3IvbG9j YWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9vc3RyZWFtLmgiIDIgMwoKbmFtZXNw YWNlIHN0ZAp7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4K ICAgIGNsYXNzIGJhc2ljX29zdHJlYW0gOiB2aXJ0dWFsIHB1YmxpYyBiYXNpY19pb3M8X0NoYXJU LCBfVHJhaXRzPgogICAgewogICAgcHVibGljOgoKCiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJf dHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsK ICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKICAgICAg dHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKICAgICAgdHlwZWRl ZiBfVHJhaXRzIHRyYWl0c190eXBlOwoKCiAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9D aGFyVCwgX1RyYWl0cz4gX19zdHJlYW1idWZfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19pb3M8 X0NoYXJULCBfVHJhaXRzPiBfX2lvc190eXBlOwogICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08 X0NoYXJULCBfVHJhaXRzPiBfX29zdHJlYW1fdHlwZTsKICAgICAgdHlwZWRlZiBvc3RyZWFtYnVm X2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gX19vc3RyZWFtYnVmX2l0ZXI7CiAgICAgIHR5cGVk ZWYgbnVtX3B1dDxfQ2hhclQsIF9fb3N0cmVhbWJ1Zl9pdGVyPiBfX251bXB1dF90eXBlOwogICAg ICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4gX19jdHlwZV90eXBlOwoKCiAgICAgIGV4cGxpY2l0CiAg ICAgIGJhc2ljX29zdHJlYW0oX19zdHJlYW1idWZfdHlwZSogX19zYikKICAgICAgeyB0aGlzLT5p bml0KF9fc2IpOyB9CgogICAgICB2aXJ0dWFsCiAgICAgIH5iYXNpY19vc3RyZWFtKCkgeyB9CgoK ICAgICAgY2xhc3Mgc2VudHJ5OwogICAgICBmcmllbmQgY2xhc3Mgc2VudHJ5OwoKCgogICAgICBf X29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PChfX29zdHJlYW1fdHlwZSYgKCpfX3BmKShf X29zdHJlYW1fdHlwZSYpKTsKCiAgICAgIF9fb3N0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcjw8 KF9faW9zX3R5cGUmICgqX19wZikoX19pb3NfdHlwZSYpKTsKCiAgICAgIF9fb3N0cmVhbV90eXBl JgogICAgICBvcGVyYXRvcjw8KGlvc19iYXNlJiAoKl9fcGYpIChpb3NfYmFzZSYpKTsKCgogICAg ICBfX29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PChsb25nIF9fbik7CgogICAgICBfX29z dHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIF9fbik7CgogICAgICBf X29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PChib29sIF9fbik7CgogICAgICBfX29zdHJl YW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PChzaG9ydCBfX24pCiAgICAgIHsKICAgICAgICBpb3Nf YmFzZTo6Zm10ZmxhZ3MgX19mbXQgPSB0aGlzLT5mbGFncygpICYgaW9zX2Jhc2U6OmJhc2VmaWVs ZDsKICAgICAgICBpZiAoX19mbXQgJiBpb3NfYmFzZTo6b2N0IHx8IF9fZm10ICYgaW9zX2Jhc2U6 OmhleCkKICAgICAgICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PHVuc2ln bmVkIGxvbmc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8 dW5zaWduZWQgc2hvcnQ+KF9fbikpKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gdGhp cy0+b3BlcmF0b3I8PChzdGF0aWNfY2FzdDxsb25nPihfX24pKTsKICAgICAgfQoKICAgICAgX19v c3RyZWFtX3R5cGUmCiAgICAgIG9wZXJhdG9yPDwodW5zaWduZWQgc2hvcnQgX19uKQogICAgICB7 IHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fbikp OyB9CgogICAgICBfX29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PChpbnQgX19uKQogICAg ICB7CiAgICAgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZm10ID0gdGhpcy0+ZmxhZ3MoKSAmIGlv c19iYXNlOjpiYXNlZmllbGQ7CiAgICAgICAgaWYgKF9fZm10ICYgaW9zX2Jhc2U6Om9jdCB8fCBf X2ZtdCAmIGlvc19iYXNlOjpoZXgpCiAgICAgICAgICByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChz dGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oX19uKSkpOwogICAgICAgIGVsc2UKICAgICAg ICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PGxvbmc+KF9fbikpOwogICAg ICB9CgogICAgICBfX29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PCh1bnNpZ25lZCBpbnQg X19uKQogICAgICB7IHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PHVuc2lnbmVk IGxvbmc+KF9fbikpOyB9CgoKICAgICAgX19vc3RyZWFtX3R5cGUmCiAgICAgIG9wZXJhdG9yPDwo bG9uZyBsb25nIF9fbik7CgogICAgICBfX29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8PCh1 bnNpZ25lZCBsb25nIGxvbmcgX19uKTsKCgogICAgICBfX29zdHJlYW1fdHlwZSYKICAgICAgb3Bl cmF0b3I8PChkb3VibGUgX19mKTsKCiAgICAgIF9fb3N0cmVhbV90eXBlJgogICAgICBvcGVyYXRv cjw8KGZsb2F0IF9fZikKICAgICAgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3I8PChzdGF0aWNfY2Fz dDxkb3VibGU+KF9fZikpOyB9CgogICAgICBfX29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I8 PChsb25nIGRvdWJsZSBfX2YpOwoKICAgICAgX19vc3RyZWFtX3R5cGUmCiAgICAgIG9wZXJhdG9y PDwoY29uc3Qgdm9pZCogX19wKTsKCiAgICAgIF9fb3N0cmVhbV90eXBlJgogICAgICBvcGVyYXRv cjw8KF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IpOwoKCiAgICAgIF9fb3N0cmVhbV90eXBlJgogICAg ICBwdXQoY2hhcl90eXBlIF9fYyk7CgogICAgICBfX29zdHJlYW1fdHlwZSYKICAgICAgd3JpdGUo Y29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKCiAgICAgIF9fb3N0cmVhbV90 eXBlJgogICAgICBmbHVzaCgpOwoKCiAgICAgIHBvc190eXBlCiAgICAgIHRlbGxwKCk7CgogICAg ICBfX29zdHJlYW1fdHlwZSYKICAgICAgc2Vla3AocG9zX3R5cGUpOwoKICAgICAgX19vc3RyZWFt X3R5cGUmCiAgICAgIHNlZWtwKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2Rpcik7CgogICAgcHJp dmF0ZToKCgogICAgICBfX29zdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fb3N0 cmVhbV90eXBlJik7CgogICAgICBiYXNpY19vc3RyZWFtKGNvbnN0IF9fb3N0cmVhbV90eXBlJik7 CgogICAgfTsKCgogIHRlbXBsYXRlIDx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+ CiAgICBjbGFzcyBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlbnRyeQogICAgewoK ICAgICAgYm9vbCBfTV9vazsKICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsX1RyYWl0cz4mIF9N X29zOwoKICAgIHB1YmxpYzoKICAgICAgZXhwbGljaXQKICAgICAgc2VudHJ5KGJhc2ljX29zdHJl YW08X0NoYXJULF9UcmFpdHM+JiBfX29zKTsKCiAgICAgIH5zZW50cnkoKQogICAgICB7CgogICAg ICAgIGlmIChfTV9vcy5mbGFncygpICYgaW9zX2Jhc2U6OnVuaXRidWYgJiYgIXVuY2F1Z2h0X2V4 Y2VwdGlvbigpKQogICAgICAgICAgewoKICAgICAgICAgICAgaWYgKF9NX29zLnJkYnVmKCkgJiYg X01fb3MucmRidWYoKS0+cHVic3luYygpID09IC0xKQogICAgICAgICAgICAgIF9NX29zLnNldHN0 YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgfQogICAgICB9CgogICAgICBvcGVyYXRv ciBib29sKCkKICAgICAgeyByZXR1cm4gX01fb2s7IH0KICAgIH07CgogIHRlbXBsYXRlPHR5cGVu YW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBf VHJhaXRzPiYKICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBf X291dCwgX0NoYXJUIF9fYyk7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUg X1RyYWl0cz4KICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIG9wZXJhdG9y PDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwgY2hhciBfX2MpCiAgICB7 IHJldHVybiAoX19vdXQgPDwgX19vdXQud2lkZW4oX19jKSk7IH0KCgogIHRlbXBsYXRlIDxjbGFz cyBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKICAgIG9wZXJhdG9y PDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIGNoYXIgX19jKTsKCgogIHRl bXBsYXRlPGNsYXNzIF9UcmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+Jgog ICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgc2lnbmVk IGNoYXIgX19jKQogICAgeyByZXR1cm4gKF9fb3V0IDw8IHN0YXRpY19jYXN0PGNoYXI+KF9fYykp OyB9CgogIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPGNoYXIsIF9U cmFpdHM+JgogICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291 dCwgdW5zaWduZWQgY2hhciBfX2MpCiAgICB7IHJldHVybiAoX19vdXQgPDwgc3RhdGljX2Nhc3Q8 Y2hhcj4oX19jKSk7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJh aXRzPgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgb3BlcmF0b3I8PChi YXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCBfQ2hhclQqIF9fcyk7 CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2lj X29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAmCiAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08 X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIGNvbnN0IGNoYXIqIF9fcyk7CgoKICB0ZW1wbGF0ZTxj bGFzcyBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKICAgIG9wZXJh dG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIGNvbnN0IGNoYXIqIF9f cyk7CgoKICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVhbTxjaGFyLCBf VHJhaXRzPiYKICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19v dXQsIGNvbnN0IHNpZ25lZCBjaGFyKiBfX3MpCiAgICB7IHJldHVybiAoX19vdXQgPDwgcmVpbnRl cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19zKSk7IH0KCiAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0 cz4KICAgIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4gJgogICAgb3BlcmF0b3I8PChiYXNp Y19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgY29uc3QgdW5zaWduZWQgY2hhciogX19z KQogICAgeyByZXR1cm4gKF9fb3V0IDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KF9f cykpOyB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAg ICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBlbmRsKGJhc2ljX29zdHJlYW08 X0NoYXJULCBfVHJhaXRzPiYgX19vcykKICAgIHsgcmV0dXJuIGZsdXNoKF9fb3MucHV0KF9fb3Mu d2lkZW4oJ1xuJykpKTsgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9U cmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBlbmRzKGJhc2lj X29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykKICAgIHsgcmV0dXJuIF9fb3MucHV0KF9D aGFyVCgpKTsgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+ CiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBmbHVzaChiYXNpY19vc3Ry ZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpCiAgICB7IHJldHVybiBfX29zLmZsdXNoKCk7IH0K Cn0KCgoKCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvb3N0cmVh bS50Y2MiIDEgMwojIDMyICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9v c3RyZWFtLnRjYyIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRz L3N0ZF9sb2NhbGUuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12 My9iaXRzL3N0ZF9sb2NhbGUuaCIgMwoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9sb2NhbGVmd2QuaCIgMSAzCiMgNDAgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNs dWRlL2crKy12My9iaXRzL3N0ZF9sb2NhbGUuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy5oIiAxIDMKIyA0MSAiL3Vzci9sb2Nh bC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2xvY2FsZS5oIiAyIDMKIyAxICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9sb2NhbGVfZmFjZXRzLnRjYyIgMSAz CiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2xvY2FsZV9mYWNl dHMudGNjIiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3Rk X2NlcnJuby5oIiAxIDMKIyAzOCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RkX2NlcnJuby5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2Vycm5vLmgiIDEgMwojIDI5ICIv dXNyL2luY2x1ZGUvZXJybm8uaCIgMwojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMK IyAzMCAiL3Vzci9pbmNsdWRlL2Vycm5vLmgiIDIgMwoKCmV4dGVybiAiQyIgewoKCgojIDEgIi91 c3IvaW5jbHVkZS9iaXRzL2Vycm5vLmgiIDEgMwojIDI1ICIvdXNyL2luY2x1ZGUvYml0cy9lcnJu by5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2xpbnV4L2Vycm5vLmgiIDEgMwoKCgojIDEgIi91c3Iv aW5jbHVkZS9hc20vZXJybm8uaCIgMSAzCiMgNSAiL3Vzci9pbmNsdWRlL2xpbnV4L2Vycm5vLmgi IDIgMwojIDI2ICIvdXNyL2luY2x1ZGUvYml0cy9lcnJuby5oIiAyIDMKIyAzNiAiL3Vzci9pbmNs dWRlL2JpdHMvZXJybm8uaCIgMwpleHRlcm4gaW50IGVycm5vOwoKCmV4dGVybiBpbnQgKl9fZXJy bm9fbG9jYXRpb24gKHZvaWQpIHRocm93ICgpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsK IyAzNyAiL3Vzci9pbmNsdWRlL2Vycm5vLmgiIDIgMwojIDU1ICIvdXNyL2luY2x1ZGUvZXJybm8u aCIgMwpleHRlcm4gY2hhciAqcHJvZ3JhbV9pbnZvY2F0aW9uX25hbWUsICpwcm9ncmFtX2ludm9j YXRpb25fc2hvcnRfbmFtZTsKCgoKfQojIDY5ICIvdXNyL2luY2x1ZGUvZXJybm8uaCIgMwp0eXBl ZGVmIGludCBlcnJvcl90OwojIDM5ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv Yml0cy9zdGRfY2Vycm5vLmgiIDIgMwojIDM2ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvYml0cy9sb2NhbGVfZmFjZXRzLnRjYyIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4w L2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2Nsb2NhbGUuaCIgMSAzCiMgMzggIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jbG9jYWxlLmgiIDMKIyAxICIvdXNyL2lu Y2x1ZGUvbG9jYWxlLmgiIDEgMwojIDI2ICIvdXNyL2luY2x1ZGUvbG9jYWxlLmgiIDMKIyAxICIv dXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiMgMjcgIi91c3IvaW5jbHVkZS9sb2NhbGUuaCIg MiAzCgoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1n bnUvMy4wL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwojIDMwICIvdXNyL2luY2x1ZGUvbG9jYWxlLmgi IDIgMwoKZXh0ZXJuICJDIiB7CiMgNDUgIi91c3IvaW5jbHVkZS9sb2NhbGUuaCIgMwpzdHJ1Y3Qg bGNvbnYKewoKCiAgY2hhciAqZGVjaW1hbF9wb2ludDsKICBjaGFyICp0aG91c2FuZHNfc2VwOwoK CgoKCiAgY2hhciAqZ3JvdXBpbmc7CgoKCgoKICBjaGFyICppbnRfY3Vycl9zeW1ib2w7CiAgY2hh ciAqY3VycmVuY3lfc3ltYm9sOwogIGNoYXIgKm1vbl9kZWNpbWFsX3BvaW50OwogIGNoYXIgKm1v bl90aG91c2FuZHNfc2VwOwogIGNoYXIgKm1vbl9ncm91cGluZzsKICBjaGFyICpwb3NpdGl2ZV9z aWduOwogIGNoYXIgKm5lZ2F0aXZlX3NpZ247CiAgY2hhciBpbnRfZnJhY19kaWdpdHM7CiAgY2hh ciBmcmFjX2RpZ2l0czsKCiAgY2hhciBwX2NzX3ByZWNlZGVzOwoKICBjaGFyIHBfc2VwX2J5X3Nw YWNlOwoKICBjaGFyIG5fY3NfcHJlY2VkZXM7CgogIGNoYXIgbl9zZXBfYnlfc3BhY2U7CgoKCgoK CiAgY2hhciBwX3NpZ25fcG9zbjsKICBjaGFyIG5fc2lnbl9wb3NuOwp9OwoKCgpleHRlcm4gY2hh ciAqc2V0bG9jYWxlIChpbnQgX19jYXRlZ29yeSwgX19jb25zdCBjaGFyICpfX2xvY2FsZSkgdGhy b3cgKCk7CgoKZXh0ZXJuIHN0cnVjdCBsY29udiAqbG9jYWxlY29udiAodm9pZCkgdGhyb3cgKCk7 CiMgMTA5ICIvdXNyL2luY2x1ZGUvbG9jYWxlLmgiIDMKIyAxICIvdXNyL2luY2x1ZGUveGxvY2Fs ZS5oIiAxIDMKIyAxMTAgIi91c3IvaW5jbHVkZS9sb2NhbGUuaCIgMiAzCgoKCgoKCgpleHRlcm4g X19sb2NhbGVfdCBfX25ld2xvY2FsZSAoaW50IF9fY2F0ZWdvcnlfbWFzaywgX19jb25zdCBjaGFy ICpfX2xvY2FsZSwgX19sb2NhbGVfdCBfX2Jhc2UpIHRocm93ICgpOwoKCgoKCmV4dGVybiBfX2xv Y2FsZV90IF9fZHVwbG9jYWxlIChfX2xvY2FsZV90IF9fZGF0YXNldCkgdGhyb3cgKCk7CgoKCmV4 dGVybiB2b2lkIF9fZnJlZWxvY2FsZSAoX19sb2NhbGVfdCBfX2RhdGFzZXQpIHRocm93ICgpOwoK Cn0KIyAzOSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2Nsb2Nh bGUuaCIgMiAzCgoKCgoKbmFtZXNwYWNlIHN0ZAp7CiAgdXNpbmcgOjpsY29udjsKICB1c2luZyA6 OnNldGxvY2FsZTsKICB1c2luZyA6OmxvY2FsZWNvbnY7Cn0KIyAzNyAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy50Y2MiIDIgMwojIDEgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jc3RkbGliLmgiIDEgMwojIDM4 ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9sb2NhbGVfZmFjZXRzLnRj YyIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGlu dXgtZ251L2JpdHMvc3RkX2xpbWl0cy5oIiAxIDMKIyA0NSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvc3RkX2xpbWl0cy5oIiAzCiMgMSAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMv YysrY29uZmlnLmgiIDEgMwojIDQ2ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv aTY4Ni1wYy1saW51eC1nbnUvYml0cy9zdGRfbGltaXRzLmgiIDIgMwojIDEgIi91c3IvbG9jYWwv Z2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jZmxvYXQuaCIgMSAzCiMgMzggIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jZmxvYXQuaCIgMwojIDEgIi91 c3IvbG9jYWwvZ2NjLTMuMC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjAvaW5jbHVk ZS9mbG9hdC5oIiAxIDMKIyAzOSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jp dHMvc3RkX2NmbG9hdC5oIiAyIDMKIyA0NyAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysr LXYzL2k2ODYtcGMtbGludXgtZ251L2JpdHMvc3RkX2xpbWl0cy5oIiAyIDMKCm5hbWVzcGFjZSBz dGQgewoKICAgIGVudW0gZmxvYXRfcm91bmRfc3R5bGUgewogICAgICAgIHJvdW5kX2luZGV0ZXJt aW5hdGUgPSAtMSwKICAgICAgICByb3VuZF90b3dhcmRfemVybyA9IDAsCiAgICAgICAgcm91bmRf dG9fbmVhcmVzdCA9IDEsCiAgICAgICAgcm91bmRfdG93YXJkX2luZmluaXR5ID0gMiwKICAgICAg ICByb3VuZF90b3dhcmRfbmVnX2luZmluaXR5ID0gMwogICAgfTsKCiAgICBlbnVtIGZsb2F0X2Rl bm9ybV9zdHlsZSB7CiAgICAgICAgZGVub3JtX2luZGV0ZXJtaW5hdGUgPSAtMSwKICAgICAgICBk ZW5vcm1fYWJzZW50ID0gMCwKICAgICAgICBkZW5vcm1fcHJlc2VudCA9IDEKICAgIH07CgogICAg dGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdHJ1Y3QgbnVtZXJpY19saW1pdHMgewogICAgICAgIHN0 YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyBf VHAgbWluKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDApOyB9CiAgICAgICAg c3RhdGljIF9UcCBtYXgoKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMCk7IH0K CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMgPSAwOwogICAgICAgIHN0YXRpYyBjb25z dCBpbnQgZGlnaXRzMTAgPSAwOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9 IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKICAg ICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19leGFjdCA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBj b25zdCBpbnQgcmFkaXggPSAwOwoKICAgICAgICBzdGF0aWMgX1RwIGVwc2lsb24oKSB0aHJvdygp IHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMCk7IH0KICAgICAgICBzdGF0aWMgX1RwIHJvdW5k X2Vycm9yKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDApOyB9CgogICAgICAg IHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50ID0gMDsKICAgICAgICBzdGF0aWMgY29uc3Qg aW50IG1pbl9leHBvbmVudDEwID0gMDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBv bmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQxMCA9IDA7Cgog ICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOwogICAgICAgIHN0 YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29u c3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBm bG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7CiAgICAgICAgc3Rh dGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyBf VHAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMCk7IH0KICAg ICAgICBzdGF0aWMgX1RwIHF1aWV0X05hTigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8 X1RwPigwKTsgfQogICAgICAgIHN0YXRpYyBfVHAgc2lnbmFsaW5nX05hTigpIHRocm93KCkgeyBy ZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwKTsgfQogICAgICAgIHN0YXRpYyBfVHAgZGVub3JtX21p bigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwKTsgfQoKICAgICAgICBzdGF0 aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9v bCBpc19ib3VuZGVkID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxv ID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzID0gZmFsc2U7CiAgICAg ICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CiAgICAgICAgc3Rh dGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3pl cm87CiAgICB9OwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gX1RwIF9fbGltaXRzX2luZmlu aXR5KCk7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IF9UcCBfX2xpbWl0c19xdWlldF9OYU4o KTsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gX1RwIF9fbGltaXRzX3NpZ25hbGluZ19OYU4o KTsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gX1RwIF9fbGltaXRzX2Rlbm9ybV9taW4oKTsK CiAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmljX2xpbWl0czxib29sPiB7CiAgICAgICAgc3Rh dGljIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOwoKICAgICAgICBzdGF0aWMgYm9v bCBtaW4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICBzdGF0aWMg Ym9vbCBtYXgoKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gdHJ1ZTsgfQoKICAgICAgICBzdGF0 aWMgY29uc3QgaW50IGRpZ2l0cyA9IDg7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMx MCA9IDI7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CiAgICAg ICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CiAgICAgICAgc3RhdGljIGNv bnN0IGJvb2wgaXNfZXhhY3QgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXgg PSAyOwogICAgICAgIHN0YXRpYyBib29sIGVwc2lsb24oKSB0aHJvdygpCiAgICAgICAgeyByZXR1 cm4gMDsgfQogICAgICAgIHN0YXRpYyBib29sIHJvdW5kX2Vycm9yKCkgdGhyb3coKQogICAgICAg IHsgcmV0dXJuIDA7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQgPSAw OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50MTAgPSAwOwogICAgICAgIHN0 YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50ID0gMDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50 IG1heF9leHBvbmVudDEwID0gMDsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2luZmlu aXR5ID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IGZh bHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7 CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gZGVu b3JtX2Fic2VudDsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBm YWxzZTsKCiAgICAgICAgc3RhdGljIGJvb2wgaW5maW5pdHkoKSB0aHJvdygpCiAgICAgICAgeyBy ZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oMCk7IH0KICAgICAgICBzdGF0aWMgYm9vbCBxdWlldF9O YU4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oMCk7IH0KICAg ICAgICBzdGF0aWMgYm9vbCBzaWduYWxpbmdfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJu IHN0YXRpY19jYXN0PGJvb2w+KDApOyB9CiAgICAgICAgc3RhdGljIGJvb2wgZGVub3JtX21pbigp IHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPigwKTsgfQoKICAgICAg ICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25z dCBib29sIGlzX2JvdW5kZWQgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX21v ZHVsbyA9IHRydWU7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzID0gdHJ1ZTsKICAg ICAgICBzdGF0aWMgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKICAgICAgICBz dGF0aWMgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRf emVybzsKICAgIH07CgogICAgdGVtcGxhdGU8PiBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8Y2hhcj4g ewogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKCiAgICAg ICAgc3RhdGljIGNoYXIgbWluKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuICgtMTI4KTsgfQog ICAgICAgIHN0YXRpYyBjaGFyIG1heCgpIHRocm93KCkKICAgICAgICB7IHJldHVybiAxMjc7IH0K CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMgPSA3OwogICAgICAgIHN0YXRpYyBjb25z dCBpbnQgZGlnaXRzMTAgPSAyOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9 IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CiAgICAg ICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25z dCBpbnQgcmFkaXggPSAyOwogICAgICAgIHN0YXRpYyBjaGFyIGVwc2lsb24oKSB0aHJvdygpCiAg ICAgICAgeyByZXR1cm4gMDsgfQogICAgICAgIHN0YXRpYyBjaGFyIHJvdW5kX2Vycm9yKCkgdGhy b3coKQogICAgICAgIHsgcmV0dXJuIDA7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtaW5f ZXhwb25lbnQgPSAwOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50MTAgPSAw OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50ID0gMDsKICAgICAgICBzdGF0 aWMgY29uc3QgaW50IG1heF9leHBvbmVudDEwID0gMDsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJv b2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3F1 aWV0X05hTiA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19zaWduYWxpbmdf TmFOID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNf ZGVub3JtID0gZGVub3JtX2Fic2VudDsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZGVu b3JtX2xvc3MgPSBmYWxzZTsKCiAgICAgICAgc3RhdGljIGNoYXIgaW5maW5pdHkoKSB0aHJvdygp CiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oMCk7IH0KICAgICAgICBzdGF0aWMg Y2hhciBxdWlldF9OYU4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hh cj4oMCk7IH0KICAgICAgICBzdGF0aWMgY2hhciBzaWduYWxpbmdfTmFOKCkgdGhyb3coKQogICAg ICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KDApOyB9CiAgICAgICAgc3RhdGljIGNoYXIg ZGVub3JtX21pbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPigw KTsgfQoKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKICAgICAg ICBzdGF0aWMgY29uc3QgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKICAgICAgICBzdGF0aWMgY29u c3QgYm9vbCBpc19tb2R1bG8gPSBmYWxzZTsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdHJh cHMgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZh bHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9 IHJvdW5kX3Rvd2FyZF96ZXJvOwogICAgfTsKCiAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmlj X2xpbWl0czxzaWduZWQgY2hhcj4gewogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNp YWxpemVkID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIHNpZ25lZCBjaGFyIG1pbigpIHRocm93KCkK ICAgICAgICB7IHJldHVybiAoLTEyOCk7IH0KICAgICAgICBzdGF0aWMgc2lnbmVkIGNoYXIgbWF4 KCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIDEyNzsgfQoKICAgICAgICBzdGF0aWMgY29uc3Qg aW50IGRpZ2l0cyA9IDc7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMxMCA9IDI7CiAg ICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKICAgICAgICBzdGF0aWMg Y29uc3QgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBp c19leGFjdCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCByYWRpeCA9IDI7CiAgICAg ICAgc3RhdGljIHNpZ25lZCBjaGFyIGVwc2lsb24oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4g MDsgfQogICAgICAgIHN0YXRpYyBzaWduZWQgY2hhciByb3VuZF9lcnJvcigpIHRocm93KCkKICAg ICAgICB7IHJldHVybiAwOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50 ID0gMDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gMDsKICAgICAg ICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0 IGludCBtYXhfZXhwb25lbnQxMCA9IDA7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19p bmZpbml0eSA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4g PSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZh bHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9 IGRlbm9ybV9hYnNlbnQ7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3Nz ID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyBzaWduZWQgY2hhciBpbmZpbml0eSgpIHRocm93KCkK ICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oMCk7IH0KICAgICAgICBz dGF0aWMgc2lnbmVkIGNoYXIgcXVpZXRfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0 YXRpY19jYXN0PHNpZ25lZCBjaGFyPigwKTsgfQogICAgICAgIHN0YXRpYyBzaWduZWQgY2hhciBz aWduYWxpbmdfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpZ25l ZCBjaGFyPigwKTsgfQogICAgICAgIHN0YXRpYyBzaWduZWQgY2hhciBkZW5vcm1fbWluKCkgdGhy b3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigwKTsgfQoKICAg ICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKICAgICAgICBzdGF0aWMg Y29uc3QgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBp c19tb2R1bG8gPSBmYWxzZTsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgPSB0cnVl OwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOwogICAg ICAgIHN0YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rv d2FyZF96ZXJvOwogICAgfTsKCiAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmljX2xpbWl0czx1 bnNpZ25lZCBjaGFyPiB7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQg PSB0cnVlOwoKICAgICAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBtaW4oKSB0aHJvdygpCiAgICAg ICAgeyByZXR1cm4gMDsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG1heCgpIHRocm93 KCkKICAgICAgICB7IHJldHVybiAyNTU7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdp dHMgPSA4OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgPSAyOwogICAgICAgIHN0 YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBi b29sIGlzX2ludGVnZXIgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2V4YWN0 ID0gdHJ1ZTsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IHJhZGl4ID0gMjsKICAgICAgICBzdGF0 aWMgdW5zaWduZWQgY2hhciBlcHNpbG9uKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIDA7IH0K ICAgICAgICBzdGF0aWMgdW5zaWduZWQgY2hhciByb3VuZF9lcnJvcigpIHRocm93KCkKICAgICAg ICB7IHJldHVybiAwOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50ID0g MDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gMDsKICAgICAgICBz dGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGlu dCBtYXhfZXhwb25lbnQxMCA9IDA7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZp bml0eSA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gPSBm YWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNl OwogICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRl bm9ybV9hYnNlbnQ7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0g ZmFsc2U7CgogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGluZmluaXR5KCkgdGhyb3coKQog ICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDApOyB9CiAgICAgICAg c3RhdGljIHVuc2lnbmVkIGNoYXIgcXVpZXRfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJu IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDApOyB9CiAgICAgICAgc3RhdGljIHVuc2lnbmVk IGNoYXIgc2lnbmFsaW5nX05hTigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2Fz dDx1bnNpZ25lZCBjaGFyPigwKTsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRlbm9y bV9taW4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hh cj4oMCk7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CiAg ICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CiAgICAgICAgc3RhdGlj IGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg dHJhcHMgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9 IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHls ZSA9IHJvdW5kX3Rvd2FyZF96ZXJvOwogICAgfTsKCiAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBudW1l cmljX2xpbWl0czxzaG9ydD4gewogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxp emVkID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIHNob3J0IG1pbigpIHRocm93KCkKICAgICAgICB7 IHJldHVybiAoLTMyNzY3LTEpOyB9CiAgICAgICAgc3RhdGljIHNob3J0IG1heCgpIHRocm93KCkK ICAgICAgICB7IHJldHVybiAzMjc2NzsgfQoKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0 cyA9IDE1OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgPSA0OwogICAgICAgIHN0 YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJv b2wgaXNfaW50ZWdlciA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhhY3Qg PSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOwogICAgICAgIHN0YXRp YyBzaG9ydCBlcHNpbG9uKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIDA7IH0KICAgICAgICBz dGF0aWMgc2hvcnQgcm91bmRfZXJyb3IoKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gMDsgfQoK ICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGlj IGNvbnN0IGludCBtaW5fZXhwb25lbnQxMCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBt YXhfZXhwb25lbnQgPSAwOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50MTAg PSAwOwoKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKICAg ICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CiAgICAgICAgc3Rh dGljIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKICAgICAgICBzdGF0aWMg Y29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OwogICAg ICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOwoKICAgICAgICBz dGF0aWMgc2hvcnQgaW5maW5pdHkoKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nh c3Q8c2hvcnQ+KDApOyB9CiAgICAgICAgc3RhdGljIHNob3J0IHF1aWV0X05hTigpIHRocm93KCkK ICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaG9ydD4oMCk7IH0KICAgICAgICBzdGF0aWMg c2hvcnQgc2lnbmFsaW5nX05hTigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2Fz dDxzaG9ydD4oMCk7IH0KICAgICAgICBzdGF0aWMgc2hvcnQgZGVub3JtX21pbigpIHRocm93KCkK ICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaG9ydD4oMCk7IH0KCiAgICAgICAgc3RhdGlj IGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg aXNfYm91bmRlZCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0g ZmFsc2U7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzID0gdHJ1ZTsKICAgICAgICBz dGF0aWMgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKICAgICAgICBzdGF0aWMg Y29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybzsK ICAgIH07CgogICAgdGVtcGxhdGU8PiBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgc2hv cnQ+IHsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7Cgog ICAgICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtaW4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1 cm4gMDsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYXgoKSB0aHJvdygpCiAgICAg ICAgeyByZXR1cm4gNjU1MzU7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMgPSAx NjsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0czEwID0gNDsKICAgICAgICBzdGF0aWMg Y29uc3QgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBp c19pbnRlZ2VyID0gdHJ1ZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19leGFjdCA9IHRy dWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCByYWRpeCA9IDI7CiAgICAgICAgc3RhdGljIHVu c2lnbmVkIHNob3J0IGVwc2lsb24oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gMDsgfQogICAg ICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCByb3VuZF9lcnJvcigpIHRocm93KCkKICAgICAgICB7 IHJldHVybiAwOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50ID0gMDsK ICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gMDsKICAgICAgICBzdGF0 aWMgY29uc3QgaW50IG1heF9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBt YXhfZXhwb25lbnQxMCA9IDA7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZpbml0 eSA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gPSBmYWxz ZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOwog ICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9y bV9hYnNlbnQ7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFs c2U7CgogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbmZpbml0eSgpIHRocm93KCkKICAg ICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oMCk7IH0KICAgICAgICBz dGF0aWMgdW5zaWduZWQgc2hvcnQgcXVpZXRfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJu IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigwKTsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25l ZCBzaG9ydCBzaWduYWxpbmdfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19j YXN0PHVuc2lnbmVkIHNob3J0PigwKTsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBk ZW5vcm1fbWluKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVk IHNob3J0PigwKTsgfQoKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSBmYWxz ZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKICAgICAgICBz dGF0aWMgY29uc3QgYm9vbCBpc19tb2R1bG8gPSB0cnVlOwoKICAgICAgICBzdGF0aWMgY29uc3Qg Ym9vbCB0cmFwcyA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVm b3JlID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5k X3N0eWxlID0gcm91bmRfdG93YXJkX3plcm87CiAgICB9OwoKICAgIHRlbXBsYXRlPD4gc3RydWN0 IG51bWVyaWNfbGltaXRzPGludD4gewogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNp YWxpemVkID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIGludCBtaW4oKSB0aHJvdygpCiAgICAgICAg eyByZXR1cm4gKC0yMTQ3NDgzNjQ3LTEpOyB9CiAgICAgICAgc3RhdGljIGludCBtYXgoKSB0aHJv dygpCiAgICAgICAgeyByZXR1cm4gMjE0NzQ4MzY0NzsgfQoKICAgICAgICBzdGF0aWMgY29uc3Qg aW50IGRpZ2l0cyA9IDMxOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgPSA5Owog ICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9IHRydWU7CiAgICAgICAgc3RhdGlj IGNvbnN0IGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg aXNfZXhhY3QgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOwogICAg ICAgIHN0YXRpYyBpbnQgZXBzaWxvbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAwOyB9CiAg ICAgICAgc3RhdGljIGludCByb3VuZF9lcnJvcigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAw OyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50ID0gMDsKICAgICAgICBz dGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gMDsKICAgICAgICBzdGF0aWMgY29uc3Qg aW50IG1heF9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25l bnQxMCA9IDA7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZpbml0eSA9IGZhbHNl OwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKICAgICAg ICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOwogICAgICAgIHN0 YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7 CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CgogICAg ICAgIHN0YXRpYyBpbnQgaW5maW5pdHkoKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGlj X2Nhc3Q8aW50PigwKTsgfQogICAgICAgIHN0YXRpYyBpbnQgcXVpZXRfTmFOKCkgdGhyb3coKQog ICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oMCk7IH0KICAgICAgICBzdGF0aWMgaW50 IHNpZ25hbGluZ19OYU4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50 PigwKTsgfQogICAgICAgIHN0YXRpYyBpbnQgZGVub3JtX21pbigpIHRocm93KCkKICAgICAgICB7 IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KDApOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBib29s IGlzX2llYzU1OSA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9 IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CgogICAg ICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzID0gdHJ1ZTsKICAgICAgICBzdGF0aWMgY29uc3Qg Ym9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXRf cm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90b3dhcmRfemVybzsKICAgIH07CgogICAg dGVtcGxhdGU8PiBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50PiB7CiAgICAgICAg c3RhdGljIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOwoKICAgICAgICBzdGF0aWMg dW5zaWduZWQgaW50IG1pbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAwOyB9CiAgICAgICAg c3RhdGljIHVuc2lnbmVkIGludCBtYXgoKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gKDIxNDc0 ODM2NDcgKiAyVSArIDEpOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzID0gMzI7 CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMxMCA9IDk7CiAgICAgICAgc3RhdGljIGNv bnN0IGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNf aW50ZWdlciA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSB0cnVl OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOwogICAgICAgIHN0YXRpYyB1bnNp Z25lZCBpbnQgZXBzaWxvbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAwOyB9CiAgICAgICAg c3RhdGljIHVuc2lnbmVkIGludCByb3VuZF9lcnJvcigpIHRocm93KCkKICAgICAgICB7IHJldHVy biAwOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50ID0gMDsKICAgICAg ICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gMDsKICAgICAgICBzdGF0aWMgY29u c3QgaW50IG1heF9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhw b25lbnQxMCA9IDA7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZpbml0eSA9IGZh bHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKICAg ICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOwogICAgICAg IHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNl bnQ7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7Cgog ICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW5maW5pdHkoKSB0aHJvdygpCiAgICAgICAgeyBy ZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigwKTsgfQogICAgICAgIHN0YXRpYyB1bnNp Z25lZCBpbnQgcXVpZXRfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0 PHVuc2lnbmVkIGludD4oMCk7IH0KICAgICAgICBzdGF0aWMgdW5zaWduZWQgaW50IHNpZ25hbGlu Z19OYU4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50 PigwKTsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVub3JtX21pbigpIHRocm93KCkK ICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDApOyB9CgogICAgICAg IHN0YXRpYyBjb25zdCBib29sIGlzX2llYzU1OSA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0 IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9k dWxvID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgPSB0cnVlOwogICAg ICAgIHN0YXRpYyBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOwogICAgICAgIHN0 YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rvd2FyZF96 ZXJvOwogICAgfTsKCiAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmljX2xpbWl0czxsb25nPiB7 CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOwoKICAgICAg ICBzdGF0aWMgbG9uZyBtaW4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gKC0yMTQ3NDgzNjQ3 TC0xKTsgfQogICAgICAgIHN0YXRpYyBsb25nIG1heCgpIHRocm93KCkKICAgICAgICB7IHJldHVy biAyMTQ3NDgzNjQ3TDsgfQoKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0cyA9IDMxOwog ICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgPSA5OwogICAgICAgIHN0YXRpYyBjb25z dCBib29sIGlzX3NpZ25lZCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50 ZWdlciA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSB0cnVlOwog ICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOwogICAgICAgIHN0YXRpYyBsb25nIGVw c2lsb24oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gMDsgfQogICAgICAgIHN0YXRpYyBsb25n IHJvdW5kX2Vycm9yKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIDA7IH0KCiAgICAgICAgc3Rh dGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQgPSAwOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQg bWluX2V4cG9uZW50MTAgPSAwOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50 ID0gMDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudDEwID0gMDsKCiAgICAg ICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CiAgICAgICAgc3RhdGlj IGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBi b29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0 X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gZGVub3JtX2Fic2VudDsKICAgICAgICBzdGF0aWMg Y29uc3QgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKCiAgICAgICAgc3RhdGljIGxvbmcg aW5maW5pdHkoKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oMCk7 IH0KICAgICAgICBzdGF0aWMgbG9uZyBxdWlldF9OYU4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1 cm4gc3RhdGljX2Nhc3Q8bG9uZz4oMCk7IH0KICAgICAgICBzdGF0aWMgbG9uZyBzaWduYWxpbmdf TmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KDApOyB9CiAg ICAgICAgc3RhdGljIGxvbmcgZGVub3JtX21pbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBz dGF0aWNfY2FzdDxsb25nPigwKTsgfQoKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1 NTkgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2JvdW5kZWQgPSB0cnVlOwog ICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX21vZHVsbyA9IGZhbHNlOwoKICAgICAgICBzdGF0 aWMgY29uc3QgYm9vbCB0cmFwcyA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdGlu eW5lc3NfYmVmb3JlID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0 eWxlIHJvdW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3plcm87CiAgICB9OwoKICAgIHRlbXBsYXRl PD4gc3RydWN0IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmc+IHsKICAgICAgICBzdGF0aWMg Y29uc3QgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CgogICAgICAgIHN0YXRpYyB1bnNpZ25l ZCBsb25nIG1pbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAwOyB9CiAgICAgICAgc3RhdGlj IHVuc2lnbmVkIGxvbmcgbWF4KCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuICgyMTQ3NDgzNjQ3 TCAqIDJVTCArIDEpOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzID0gMzI7CiAg ICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMxMCA9IDk7CiAgICAgICAgc3RhdGljIGNvbnN0 IGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaW50 ZWdlciA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSB0cnVlOwog ICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOwogICAgICAgIHN0YXRpYyB1bnNpZ25l ZCBsb25nIGVwc2lsb24oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gMDsgfQogICAgICAgIHN0 YXRpYyB1bnNpZ25lZCBsb25nIHJvdW5kX2Vycm9yKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJu IDA7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQgPSAwOwogICAgICAg IHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50MTAgPSAwOwogICAgICAgIHN0YXRpYyBjb25z dCBpbnQgbWF4X2V4cG9uZW50ID0gMDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBv bmVudDEwID0gMDsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ID0gZmFs c2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOwogICAg ICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CiAgICAgICAg c3RhdGljIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gZGVub3JtX2Fic2Vu dDsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKCiAg ICAgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5maW5pdHkoKSB0aHJvdygpCiAgICAgICAgeyBy ZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oMCk7IH0KICAgICAgICBzdGF0aWMgdW5z aWduZWQgbG9uZyBxdWlldF9OYU4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nh c3Q8dW5zaWduZWQgbG9uZz4oMCk7IH0KICAgICAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzaWdu YWxpbmdfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVk IGxvbmc+KDApOyB9CiAgICAgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVub3JtX21pbigpIHRo cm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQoK ICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSB0cnVlOwogICAgICAgIHN0YXRp YyBjb25zdCBib29sIGlzX2JvdW5kZWQgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29s IGlzX21vZHVsbyA9IHRydWU7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzID0gdHJ1 ZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKICAg ICAgICBzdGF0aWMgY29uc3QgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgPSByb3VuZF90 b3dhcmRfemVybzsKICAgIH07CgogICAgdGVtcGxhdGU8PiBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8 bG9uZyBsb25nPiB7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0 cnVlOwoKICAgICAgICBzdGF0aWMgbG9uZyBsb25nIG1pbigpIHRocm93KCkKICAgICAgICB7IHJl dHVybiAoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTC0xKTsgfQogICAgICAgIHN0YXRpYyBsb25nIGxv bmcgbWF4KCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsg fQoKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0cyA9IDYzOwogICAgICAgIHN0YXRpYyBj b25zdCBpbnQgZGlnaXRzMTAgPSAxODsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zaWdu ZWQgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIgPSB0cnVlOwog ICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKICAgICAgICBzdGF0aWMg Y29uc3QgaW50IHJhZGl4ID0gMjsKICAgICAgICBzdGF0aWMgbG9uZyBsb25nIGVwc2lsb24oKSB0 aHJvdygpCiAgICAgICAgeyByZXR1cm4gMDsgfQogICAgICAgIHN0YXRpYyBsb25nIGxvbmcgcm91 bmRfZXJyb3IoKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gMDsgfQoKICAgICAgICBzdGF0aWMg Y29uc3QgaW50IG1pbl9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtaW5f ZXhwb25lbnQxMCA9IDA7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQgPSAw OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOwoKICAgICAgICBz dGF0aWMgY29uc3QgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29u c3QgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg aGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXRfZGVu b3JtX3N0eWxlIGhhc19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OwogICAgICAgIHN0YXRpYyBjb25z dCBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOwoKICAgICAgICBzdGF0aWMgbG9uZyBsb25n IGluZmluaXR5KCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmcgbG9u Zz4oMCk7IH0KICAgICAgICBzdGF0aWMgbG9uZyBsb25nIHF1aWV0X05hTigpIHRocm93KCkKICAg ICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KDApOyB9CiAgICAgICAgc3RhdGlj IGxvbmcgbG9uZyBzaWduYWxpbmdfTmFOKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRp Y19jYXN0PGxvbmcgbG9uZz4oMCk7IH0KICAgICAgICBzdGF0aWMgbG9uZyBsb25nIGRlbm9ybV9t aW4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZyBsb25nPigwKTsg fQoKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19pZWM1NTkgPSB0cnVlOwogICAgICAgIHN0 YXRpYyBjb25zdCBib29sIGlzX2JvdW5kZWQgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBi b29sIGlzX21vZHVsbyA9IGZhbHNlOwoKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCB0cmFwcyA9 IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7 CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gcm91 bmRfdG93YXJkX3plcm87CiAgICB9OwoKICAgIHRlbXBsYXRlPD4gc3RydWN0IG51bWVyaWNfbGlt aXRzPHVuc2lnbmVkIGxvbmcgbG9uZz4gewogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3Nw ZWNpYWxpemVkID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW4o KSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gMDsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBs b25nIGxvbmcgbWF4KCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuICg5MjIzMzcyMDM2ODU0Nzc1 ODA3TEwgKiAyVUxMICsgMSk7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBkaWdpdHMgPSA2 NDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0czEwID0gMTk7CiAgICAgICAgc3RhdGlj IGNvbnN0IGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg aXNfaW50ZWdlciA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhhY3QgPSB0 cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOwogICAgICAgIHN0YXRpYyB1 bnNpZ25lZCBsb25nIGxvbmcgZXBzaWxvbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAwOyB9 CiAgICAgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyByb3VuZF9lcnJvcigpIHRocm93KCkK ICAgICAgICB7IHJldHVybiAwOyB9CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9u ZW50ID0gMDsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gMDsKICAg ICAgICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudCA9IDA7CiAgICAgICAgc3RhdGljIGNv bnN0IGludCBtYXhfZXhwb25lbnQxMCA9IDA7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhh c19pbmZpbml0eSA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9O YU4gPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9 IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9y bSA9IGRlbm9ybV9hYnNlbnQ7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9s b3NzID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaW5maW5pdHko KSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25n PigwKTsgfQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcXVpZXRfTmFOKCkgdGhy b3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oMCk7 IH0KICAgICAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNpZ25hbGluZ19OYU4oKSB0aHJv dygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigwKTsg fQogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZGVub3JtX21pbigpIHRocm93KCkK ICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KDApOyB9Cgog ICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2llYzU1OSA9IHRydWU7CiAgICAgICAgc3RhdGlj IGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg aXNfbW9kdWxvID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgPSB0cnVl OwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOwogICAg ICAgIHN0YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IHJvdW5kX3Rv d2FyZF96ZXJvOwogICAgfTsKCiAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBudW1lcmljX2xpbWl0czxm bG9hdD4gewogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsK CiAgICAgICAgc3RhdGljIGZsb2F0IG1pbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAxLjE3 NTQ5NDM1ZS0zOEY7IH0KICAgICAgICBzdGF0aWMgZmxvYXQgbWF4KCkgdGhyb3coKQogICAgICAg IHsgcmV0dXJuIDMuNDAyODIzNDdlKzM4RjsgfQoKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRp Z2l0cyA9IDI0OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgPSA3OwogICAgICAg IHN0YXRpYyBjb25zdCBib29sIGlzX3NpZ25lZCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0 IGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2V4 YWN0ID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGludCByYWRpeCA9IDI7CiAgICAgICAg c3RhdGljIGZsb2F0IGVwc2lsb24oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gMS4xOTIwOTI5 MGUtMDdGOyB9CiAgICAgICAgc3RhdGljIGZsb2F0IHJvdW5kX2Vycm9yKCkgdGhyb3coKQogICAg ICAgIHsgcmV0dXJuIDEuMGY7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25l bnQgPSAtMTI1OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50MTAgPSAtMzc7 CiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQgPSAxMjg7CiAgICAgICAgc3Rh dGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQxMCA9IDM4OwoKICAgICAgICBzdGF0aWMgY29uc3Qg Ym9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNf cXVpZXRfTmFOID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGlu Z19OYU4gPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhh c19kZW5vcm0gPSBkZW5vcm1fYWJzZW50OwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19k ZW5vcm1fbG9zcyA9IGZhbHNlOwoKICAgICAgICBzdGF0aWMgZmxvYXQgaW5maW5pdHkoKSB0aHJv dygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KDApOyB9CiAgICAgICAgc3Rh dGljIGZsb2F0IHF1aWV0X05hTigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2Fz dDxmbG9hdD4oMCk7IH0KICAgICAgICBzdGF0aWMgZmxvYXQgc2lnbmFsaW5nX05hTigpIHRocm93 KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4oMCk7IH0KICAgICAgICBzdGF0 aWMgZmxvYXQgZGVub3JtX21pbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2Fz dDxmbG9hdD4oMCk7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gZmFs c2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CiAgICAgICAg c3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyBjb25z dCBib29sIHRyYXBzID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3Nf YmVmb3JlID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJv dW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3plcm87CiAgICB9OwoKICAgIHRlbXBsYXRlPD4gc3Ry dWN0IG51bWVyaWNfbGltaXRzPGRvdWJsZT4gewogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlz X3NwZWNpYWxpemVkID0gdHJ1ZTsKCiAgICAgICAgc3RhdGljIGRvdWJsZSBtaW4oKSB0aHJvdygp CiAgICAgICAgeyByZXR1cm4gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7IH0KICAgICAgICBzdGF0 aWMgZG91YmxlIG1heCgpIHRocm93KCkKICAgICAgICB7IHJldHVybiAxLjc5NzY5MzEzNDg2MjMx NTdlKzMwODsgfQoKICAgICAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0cyA9IDUzOwogICAgICAg IHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgPSAxNTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9v bCBpc19zaWduZWQgPSB0cnVlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIg PSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19leGFjdCA9IGZhbHNlOwogICAg ICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXggPSAyOwogICAgICAgIHN0YXRpYyBkb3VibGUgZXBz aWxvbigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAyLjIyMDQ0NjA0OTI1MDMxMzFlLTE2OyB9 CiAgICAgICAgc3RhdGljIGRvdWJsZSByb3VuZF9lcnJvcigpIHRocm93KCkKICAgICAgICB7IHJl dHVybiAxLjA7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQgPSAtMTAy MTsKICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gLTMwNzsKICAgICAg ICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudCA9IDEwMjQ7CiAgICAgICAgc3RhdGljIGNv bnN0IGludCBtYXhfZXhwb25lbnQxMCA9IDMwODsKCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg aGFzX2luZmluaXR5ID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3F1aWV0 X05hTiA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19zaWduYWxpbmdfTmFO ID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVu b3JtID0gZGVub3JtX2Fic2VudDsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZGVub3Jt X2xvc3MgPSBmYWxzZTsKCiAgICAgICAgc3RhdGljIGRvdWJsZSBpbmZpbml0eSgpIHRocm93KCkK ICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KDApOyB9CiAgICAgICAgc3RhdGlj IGRvdWJsZSBxdWlldF9OYU4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8 ZG91YmxlPigwKTsgfQogICAgICAgIHN0YXRpYyBkb3VibGUgc2lnbmFsaW5nX05hTigpIHRocm93 KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KDApOyB9CiAgICAgICAgc3Rh dGljIGRvdWJsZSBkZW5vcm1fbWluKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIHN0YXRpY19j YXN0PGRvdWJsZT4oMCk7IH0KCiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0g ZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CiAgICAg ICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyBj b25zdCBib29sIHRyYXBzID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5l c3NfYmVmb3JlID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxl IHJvdW5kX3N0eWxlID0gcm91bmRfdG93YXJkX3plcm87CiAgICB9OwoKICAgIHRlbXBsYXRlPD4g c3RydWN0IG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPiB7CiAgICAgICAgc3RhdGljIGNvbnN0 IGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOwoKICAgICAgICBzdGF0aWMgbG9uZyBkb3VibGUg bWluKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIDMuMzYyMTAzMTQzMTEyMDkzNTA2MjZlLTQ5 MzJMOyB9CiAgICAgICAgc3RhdGljIGxvbmcgZG91YmxlIG1heCgpIHRocm93KCkKICAgICAgICB7 IHJldHVybiAxLjE4OTczMTQ5NTM1NzIzMTc2NTAyZSs0OTMyTDsgfQoKICAgICAgICBzdGF0aWMg Y29uc3QgaW50IGRpZ2l0cyA9IDY0OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAg PSAxOTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zaWduZWQgPSB0cnVlOwogICAgICAg IHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29u c3QgYm9vbCBpc19leGFjdCA9IGZhbHNlOwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgcmFkaXgg PSAyOwogICAgICAgIHN0YXRpYyBsb25nIGRvdWJsZSBlcHNpbG9uKCkgdGhyb3coKQogICAgICAg IHsgcmV0dXJuIDEuMDg0MjAyMTcyNDg1NTA0NDM0MDFlLTE5TDsgfQogICAgICAgIHN0YXRpYyBs b25nIGRvdWJsZSByb3VuZF9lcnJvcigpIHRocm93KCkKICAgICAgICB7IHJldHVybiAxLjBMOyB9 CgogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50ID0gLTE2MzgxOwogICAgICAg IHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50MTAgPSAtNDkzMTsKICAgICAgICBzdGF0aWMg Y29uc3QgaW50IG1heF9leHBvbmVudCA9IDE2Mzg0OwogICAgICAgIHN0YXRpYyBjb25zdCBpbnQg bWF4X2V4cG9uZW50MTAgPSA0OTMyOwoKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfaW5m aW5pdHkgPSBmYWxzZTsKICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOID0g ZmFsc2U7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxz ZTsKICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gPSBk ZW5vcm1fYWJzZW50OwogICAgICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19kZW5vcm1fbG9zcyA9 IGZhbHNlOwoKICAgICAgICBzdGF0aWMgbG9uZyBkb3VibGUgaW5maW5pdHkoKSB0aHJvdygpCiAg ICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZyBkb3VibGU+KDApOyB9CiAgICAgICAgc3Rh dGljIGxvbmcgZG91YmxlIHF1aWV0X05hTigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0 aWNfY2FzdDxsb25nIGRvdWJsZT4oMCk7IH0KICAgICAgICBzdGF0aWMgbG9uZyBkb3VibGUgc2ln bmFsaW5nX05hTigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGRv dWJsZT4oMCk7IH0KICAgICAgICBzdGF0aWMgbG9uZyBkb3VibGUgZGVub3JtX21pbigpIHRocm93 KCkKICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGRvdWJsZT4oMCk7IH0KCiAgICAg ICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CiAgICAgICAgc3RhdGljIGNv bnN0IGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNf bW9kdWxvID0gZmFsc2U7CgogICAgICAgIHN0YXRpYyBjb25zdCBib29sIHRyYXBzID0gZmFsc2U7 CiAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CiAgICAg ICAgc3RhdGljIGNvbnN0IGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlID0gcm91bmRfdG93 YXJkX3plcm87CiAgICB9OwoKfQojIDM5ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKyst djMvYml0cy9sb2NhbGVfZmFjZXRzLnRjYyIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvc3RkX21lbW9yeS5oIiAxIDMKIyA0MCAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy50Y2MiIDIgMwojIDEgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3NidWZfaXRlci5oIiAxIDMKIyA0MSAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy50Y2Mi IDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9jY3R5 cGUuaCIgMSAzCiMgNDIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2xv Y2FsZV9mYWNldHMudGNjIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKyst djMvdHlwZWluZm8iIDEgMwojIDMzICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv dHlwZWluZm8iIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvZXhjZXB0 aW9uIiAxIDMKIyAzNCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL3R5cGVpbmZv IiAyIDMKCmV4dGVybiAiQysrIiB7CgpuYW1lc3BhY2UgX19jeHhhYml2MQp7CiAgY2xhc3MgX19j bGFzc190eXBlX2luZm87Cn0KIyA1MCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYz L3R5cGVpbmZvIiAzCm5hbWVzcGFjZSBzdGQKewogIGNsYXNzIHR5cGVfaW5mbwogIHsKICBwdWJs aWM6CgoKCgogICAgdmlydHVhbCB+dHlwZV9pbmZvKCk7CgogIHByaXZhdGU6CgogICAgdHlwZV9p bmZvJiBvcGVyYXRvcj0oY29uc3QgdHlwZV9pbmZvJik7CiAgICB0eXBlX2luZm8oY29uc3QgdHlw ZV9pbmZvJik7CgogIHByb3RlY3RlZDoKICAgIGNvbnN0IGNoYXIgKl9fbmFtZTsKCiAgcHJvdGVj dGVkOgogICAgZXhwbGljaXQgdHlwZV9pbmZvKGNvbnN0IGNoYXIgKl9fbik6IF9fbmFtZShfX24p IHsgfQoKICBwdWJsaWM6CgogICAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0CiAgICB7IHJldHVy biBfX25hbWU7IH0KIyA4NiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL3R5cGVp bmZvIiAzCiAgICBib29sIGJlZm9yZShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdAogICAg eyByZXR1cm4gX19uYW1lIDwgX19hcmcuX19uYW1lOyB9CiAgICBib29sIG9wZXJhdG9yPT0oY29u c3QgdHlwZV9pbmZvJiBfX2FyZykgY29uc3QKICAgIHsgcmV0dXJuIF9fbmFtZSA9PSBfX2FyZy5f X25hbWU7IH0KCiAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgdHlwZV9pbmZvJiBfX2FyZykgY29u c3QKICAgIHsgcmV0dXJuICFvcGVyYXRvcj09KF9fYXJnKTsgfQoKCiAgcHVibGljOgoKICAgIHZp cnR1YWwgYm9vbCBfX2lzX3BvaW50ZXJfcCgpIGNvbnN0OwoKICAgIHZpcnR1YWwgYm9vbCBfX2lz X2Z1bmN0aW9uX3AoKSBjb25zdDsKCgoKCgoKCiAgICB2aXJ0dWFsIGJvb2wgX19kb19jYXRjaChj b25zdCB0eXBlX2luZm8gKl9fdGhyX3R5cGUsIHZvaWQgKipfX3Rocl9vYmosCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBfX291dGVyKSBjb25zdDsKCgogICAgdmlydHVhbCBi b29sIF9fZG9fdXBjYXN0KGNvbnN0IF9fY3h4YWJpdjE6Ol9fY2xhc3NfdHlwZV9pbmZvICpfX3Rh cmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqX19vYmpfcHRyKSBjb25z dDsKICB9OwoKICBjbGFzcyBiYWRfY2FzdCA6IHB1YmxpYyBleGNlcHRpb24KICB7CiAgcHVibGlj OgogICAgYmFkX2Nhc3QoKSB0aHJvdygpIHsgfQogICAgdmlydHVhbCB+YmFkX2Nhc3QoKSB0aHJv dygpOwogIH07CgogIGNsYXNzIGJhZF90eXBlaWQgOiBwdWJsaWMgZXhjZXB0aW9uCiAgewogIHB1 YmxpYzoKICAgIGJhZF90eXBlaWQgKCkgdGhyb3coKSB7IH0KICAgIHZpcnR1YWwgfmJhZF90eXBl aWQgKCkgdGhyb3coKTsKICB9Owp9Cgp9CiMgNDMgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL2xvY2FsZV9mYWNldHMudGNjIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0z LjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfdmVjdG9yLmgiIDEgMwojIDMxICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfdmVjdG9yLmgiIDMKCiMgMSAiL3Vzci9s b2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvZnVuY3RleGNlcHQuaCIgMSAzCiMgMzQg Ii91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Z1bmN0ZXhjZXB0LmgiIDMK IyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvZXhjZXB0aW9uX2RlZmluZXMu aCIgMSAzCiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Z1bmN0 ZXhjZXB0LmgiIDIgMwoKbmFtZXNwYWNlIHN0ZAp7CgogIHZvaWQKICBfX3Rocm93X2JhZF9leGNl cHRpb24odm9pZCk7CgoKICB2b2lkCiAgX190aHJvd19iYWRfYWxsb2Modm9pZCk7CgoKICB2b2lk CiAgX190aHJvd19iYWRfY2FzdCh2b2lkKTsKCiAgdm9pZAogIF9fdGhyb3dfYmFkX3R5cGVpZCh2 b2lkKTsKCgogIHZvaWQKICBfX3Rocm93X2xvZ2ljX2Vycm9yKGNvbnN0IGNoYXIqIF9fcyk7Cgog IHZvaWQKICBfX3Rocm93X2RvbWFpbl9lcnJvcihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAg X190aHJvd19pbnZhbGlkX2FyZ3VtZW50KGNvbnN0IGNoYXIqIF9fcyk7CgogIHZvaWQKICBfX3Ro cm93X2xlbmd0aF9lcnJvcihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19vdXRf b2ZfcmFuZ2UoY29uc3QgY2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfcnVudGltZV9lcnJv cihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19yYW5nZV9lcnJvcihjb25zdCBj aGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19vdmVyZmxvd19lcnJvcihjb25zdCBjaGFyKiBf X3MpOwoKICB2b2lkCiAgX190aHJvd191bmRlcmZsb3dfZXJyb3IoY29uc3QgY2hhciogX19zKTsK CgogIHZvaWQKICBfX3Rocm93X2lvc19mYWlsdXJlKGNvbnN0IGNoYXIqIF9fcyk7Cn0KIyAzMyAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3ZlY3Rvci5oIiAyIDMK IyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYWxnb2Jhc2Uu aCIgMSAzCiMgMzQgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF92 ZWN0b3IuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMv c3RsX2FsbG9jLmgiIDEgMwojIDM1ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMv Yml0cy9zdGRfdmVjdG9yLmgiIDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2cr Ky12My9iaXRzL3N0bF9jb25zdHJ1Y3QuaCIgMSAzCiMgMzYgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0ZF92ZWN0b3IuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaCIgMSAzCiMgMzcgIi91 c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF92ZWN0b3IuaCIgMiAzCiMg MSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3ZlY3Rvci5oIiAx IDMKIyAzNCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3ZlY3Rv ci5oIiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2l0 ZXJhdG9yX2Jhc2VfZnVuY3MuaCIgMSAzCiMgMzUgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL3N0bF92ZWN0b3IuaCIgMiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvZnVuY3RleGNlcHQuaCIgMSAzCiMgMzQgIi91c3IvbG9jYWwvZ2Nj LTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Z1bmN0ZXhjZXB0LmgiIDMKIyAxICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvZXhjZXB0aW9uX2RlZmluZXMuaCIgMSAzCiMgMzUgIi91 c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2Z1bmN0ZXhjZXB0LmgiIDIgMwoK bmFtZXNwYWNlIHN0ZAp7CgogIHZvaWQKICBfX3Rocm93X2JhZF9leGNlcHRpb24odm9pZCk7CgoK ICB2b2lkCiAgX190aHJvd19iYWRfYWxsb2Modm9pZCk7CgoKICB2b2lkCiAgX190aHJvd19iYWRf Y2FzdCh2b2lkKTsKCiAgdm9pZAogIF9fdGhyb3dfYmFkX3R5cGVpZCh2b2lkKTsKCgogIHZvaWQK ICBfX3Rocm93X2xvZ2ljX2Vycm9yKGNvbnN0IGNoYXIqIF9fcyk7CgogIHZvaWQKICBfX3Rocm93 X2RvbWFpbl9lcnJvcihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19pbnZhbGlk X2FyZ3VtZW50KGNvbnN0IGNoYXIqIF9fcyk7CgogIHZvaWQKICBfX3Rocm93X2xlbmd0aF9lcnJv cihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAgX190aHJvd19vdXRfb2ZfcmFuZ2UoY29uc3Qg Y2hhciogX19zKTsKCiAgdm9pZAogIF9fdGhyb3dfcnVudGltZV9lcnJvcihjb25zdCBjaGFyKiBf X3MpOwoKICB2b2lkCiAgX190aHJvd19yYW5nZV9lcnJvcihjb25zdCBjaGFyKiBfX3MpOwoKICB2 b2lkCiAgX190aHJvd19vdmVyZmxvd19lcnJvcihjb25zdCBjaGFyKiBfX3MpOwoKICB2b2lkCiAg X190aHJvd191bmRlcmZsb3dfZXJyb3IoY29uc3QgY2hhciogX19zKTsKCgogIHZvaWQKICBfX3Ro cm93X2lvc19mYWlsdXJlKGNvbnN0IGNoYXIqIF9fcyk7Cn0KIyAzNiAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3ZlY3Rvci5oIiAyIDMKIyAxICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9jb25jZXB0X2NoZWNrLmgiIDEgMwojIDM3ICIv dXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfdmVjdG9yLmgiIDIgMwoK bmFtZXNwYWNlIHN0ZAp7CiMgNDggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i aXRzL3N0bF92ZWN0b3IuaCIgMwp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9y LCBib29sIF9Jc1N0YXRpYz4KY2xhc3MgX1ZlY3Rvcl9hbGxvY19iYXNlIHsKcHVibGljOgogIHR5 cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvY2F0b3I+OjphbGxvY2F0b3Jf dHlwZQogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9j YXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2RhdGFfYWxsb2NhdG9yOyB9CgogIF9WZWN0b3JfYWxs b2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQogICAgOiBfTV9kYXRhX2FsbG9jYXRv cihfX2EpLCBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKQog IHt9Cgpwcm90ZWN0ZWQ6CiAgYWxsb2NhdG9yX3R5cGUgX01fZGF0YV9hbGxvY2F0b3I7CiAgX1Rw KiBfTV9zdGFydDsKICBfVHAqIF9NX2ZpbmlzaDsKICBfVHAqIF9NX2VuZF9vZl9zdG9yYWdlOwoK ICBfVHAqIF9NX2FsbG9jYXRlKHNpemVfdCBfX24pCiAgICB7IHJldHVybiBfTV9kYXRhX2FsbG9j YXRvci5hbGxvY2F0ZShfX24pOyB9CiAgdm9pZCBfTV9kZWFsbG9jYXRlKF9UcCogX19wLCBzaXpl X3QgX19uKQogICAgeyBpZiAoX19wKSBfTV9kYXRhX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9fcCwg X19uKTsgfQp9OwoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgpjbGFz cyBfVmVjdG9yX2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2NhdG9yLCB0cnVlPiB7CnB1YmxpYzoKICB0 eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9y X3R5cGUKICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxv Y2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3JfdHlwZSgpOyB9CgogIF9WZWN0b3JfYWxs b2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYpCiAgICA6IF9NX3N0YXJ0KDApLCBfTV9maW5p c2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKDApCiAge30KCnByb3RlY3RlZDoKICBfVHAqIF9NX3N0 YXJ0OwogIF9UcCogX01fZmluaXNoOwogIF9UcCogX01fZW5kX29mX3N0b3JhZ2U7CgogIHR5cGVk ZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvY2F0b3I+OjpfQWxsb2NfdHlwZSBf QWxsb2NfdHlwZTsKICBfVHAqIF9NX2FsbG9jYXRlKHNpemVfdCBfX24pCiAgICB7IHJldHVybiBf QWxsb2NfdHlwZTo6YWxsb2NhdGUoX19uKTsgfQogIHZvaWQgX01fZGVhbGxvY2F0ZShfVHAqIF9f cCwgc2l6ZV90IF9fbikKICAgIHsgX0FsbG9jX3R5cGU6OmRlYWxsb2NhdGUoX19wLCBfX24pO30K fTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kc3RydWN0IF9WZWN0b3JfYmFz ZQogIDogcHVibGljIF9WZWN0b3JfYWxsb2NfYmFzZTxfVHAsIF9BbGxvYywKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvYz46Ol9TX2luc3RhbmNl bGVzcz4KewogIHR5cGVkZWYgX1ZlY3Rvcl9hbGxvY19iYXNlPF9UcCwgX0FsbG9jLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjpfU19pbnN0 YW5jZWxlc3M+CiAgICAgICAgICBfQmFzZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxv Y2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgX1ZlY3Rvcl9iYXNlKGNvbnN0IGFsbG9jYXRv cl90eXBlJiBfX2EpIDogX0Jhc2UoX19hKSB7fQogIF9WZWN0b3JfYmFzZShzaXplX3QgX19uLCBj b25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6IF9CYXNlKF9fYSkgewogICAgX01fc3RhcnQgPSBf TV9hbGxvY2F0ZShfX24pOwogICAgX01fZmluaXNoID0gX01fc3RhcnQ7CiAgICBfTV9lbmRfb2Zf c3RvcmFnZSA9IF9NX3N0YXJ0ICsgX19uOwogIH0KCiAgfl9WZWN0b3JfYmFzZSgpIHsgX01fZGVh bGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9zdGFydCk7IH0KfTsKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CmNsYXNz IHZlY3RvciA6IHByb3RlY3RlZCBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+CnsKCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKCnByaXZhdGU6 CiAgdHlwZWRlZiBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+IF9CYXNlOwogIHR5cGVkZWYgdmVj dG9yPF9UcCwgX0FsbG9jPiB2ZWN0b3JfdHlwZTsKcHVibGljOgogIHR5cGVkZWYgX1RwIHZhbHVl X3R5cGU7CiAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgdmFs dWVfdHlwZSogY29uc3RfcG9pbnRlcjsKICB0eXBlZGVmIF9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50 ZXIsIHZlY3Rvcl90eXBlPiBpdGVyYXRvcjsKICB0eXBlZGVmIF9fbm9ybWFsX2l0ZXJhdG9yPGNv bnN0X3BvaW50ZXIsIHZlY3Rvcl90eXBlPiBjb25zdF9pdGVyYXRvcjsKICB0eXBlZGVmIHZhbHVl X3R5cGUmIHJlZmVyZW5jZTsKICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVy ZW5jZTsKICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgZGlm ZmVyZW5jZV90eXBlOwoKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBh bGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyBy ZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQoKICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0 b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CiAgdHlwZWRlZiByZXZl cnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOwoKcHJvdGVjdGVkOgogIHVz aW5nIF9CYXNlOjpfTV9hbGxvY2F0ZTsKICB1c2luZyBfQmFzZTo6X01fZGVhbGxvY2F0ZTsKICB1 c2luZyBfQmFzZTo6X01fc3RhcnQ7CiAgdXNpbmcgX0Jhc2U6Ol9NX2ZpbmlzaDsKICB1c2luZyBf QmFzZTo6X01fZW5kX29mX3N0b3JhZ2U7Cgpwcm90ZWN0ZWQ6CiAgdm9pZCBfTV9pbnNlcnRfYXV4 KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KTsKICB2b2lkIF9NX2luc2VydF9h dXgoaXRlcmF0b3IgX19wb3NpdGlvbik7CgpwdWJsaWM6CiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJl dHVybiBpdGVyYXRvciAoX01fc3RhcnQpOyB9CiAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25z dAogICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IgKF9NX3N0YXJ0KTsgfQogIGl0ZXJhdG9yIGVu ZCgpIHsgcmV0dXJuIGl0ZXJhdG9yIChfTV9maW5pc2gpOyB9CiAgY29uc3RfaXRlcmF0b3IgZW5k KCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IgKF9NX2ZpbmlzaCk7IH0KCiAgcmV2ZXJz ZV9pdGVyYXRvciByYmVnaW4oKQogICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7 IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0CiAgICB7IHJldHVybiBj b25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQogIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgp CiAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CiAgY29uc3RfcmV2ZXJz ZV9pdGVyYXRvciByZW5kKCkgY29uc3QKICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0 b3IoYmVnaW4oKSk7IH0KCiAgc2l6ZV90eXBlIHNpemUoKSBjb25zdAogICAgeyByZXR1cm4gc2l6 ZV90eXBlKGVuZCgpIC0gYmVnaW4oKSk7IH0KICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdAog ICAgeyByZXR1cm4gc2l6ZV90eXBlKC0xKSAvIHNpemVvZihfVHApOyB9CiAgc2l6ZV90eXBlIGNh cGFjaXR5KCkgY29uc3QKICAgIHsgcmV0dXJuIHNpemVfdHlwZShjb25zdF9pdGVyYXRvcihfTV9l bmRfb2Zfc3RvcmFnZSkgLSBiZWdpbigpKTsgfQogIGJvb2wgZW1wdHkoKSBjb25zdAogICAgeyBy ZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQoKICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5 cGUgX19uKSB7IHJldHVybiAqKGJlZ2luKCkgKyBfX24pOyB9CiAgY29uc3RfcmVmZXJlbmNlIG9w ZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKihiZWdpbigpICsgX19uKTsg fQoKICB2b2lkIF9NX3JhbmdlX2NoZWNrKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKICAgIGlmIChf X24gPj0gdGhpcy0+c2l6ZSgpKQogICAgICBfX3Rocm93X291dF9vZl9yYW5nZSgidmVjdG9yIik7 CiAgfQoKICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikKICAgIHsgX01fcmFuZ2VfY2hlY2so X19uKTsgcmV0dXJuICgqdGhpcylbX19uXTsgfQogIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5 cGUgX19uKSBjb25zdAogICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtf X25dOyB9CgogIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxs b2NhdG9yX3R5cGUoKSkKICAgIDogX0Jhc2UoX19hKSB7fQoKICB2ZWN0b3Ioc2l6ZV90eXBlIF9f biwgY29uc3QgX1RwJiBfX3ZhbHVlLAogICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19h ID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX0Jhc2UoX19uLCBfX2EpCiAgICB7IF9NX2Zpbmlz aCA9IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9NX3N0YXJ0LCBfX24sIF9fdmFsdWUpOyB9CgogIGV4 cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKQogICAgOiBfQmFzZShfX24sIGFsbG9jYXRvcl90 eXBlKCkpCiAgICB7IF9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9NX3N0YXJ0LCBf X24sIF9UcCgpKTsgfQoKICB2ZWN0b3IoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194KQog ICAgOiBfQmFzZShfX3guc2l6ZSgpLCBfX3guZ2V0X2FsbG9jYXRvcigpKQogICAgeyBfTV9maW5p c2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX01fc3RhcnQp OyB9CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdmVjdG9yKF9JbnB1dEl0 ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgY29uc3QgYWxs b2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpIDogX0Jhc2UoX19hKSB7CiAgICB0 eXBlZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X0ludGVncmFsIF9J bnRlZ3JhbDsKICAgIF9NX2luaXRpYWxpemVfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFs KCkpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgogIHZvaWQgX01faW5pdGlhbGl6 ZV9hdXgoX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbHVlLCBfX3RydWVfdHlwZSkgewogICAg X01fc3RhcnQgPSBfTV9hbGxvY2F0ZShfX24pOwogICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfTV9z dGFydCArIF9fbjsKICAgIF9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfZmlsbF9uKF9NX3N0YXJ0 LCBfX24sIF9fdmFsdWUpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgog IHZvaWQgX01faW5pdGlhbGl6ZV9hdXgoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRl cmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgX19mYWxzZV90eXBlKSB7CiAg ICBfTV9yYW5nZV9pbml0aWFsaXplKF9fZmlyc3QsIF9fbGFzdCwgX19pdGVyYXRvcl9jYXRlZ29y eShfX2ZpcnN0KSk7CiAgfQoKICB+dmVjdG9yKCkgeyBkZXN0cm95KF9NX3N0YXJ0LCBfTV9maW5p c2gpOyB9CgogIHZlY3RvcjxfVHAsIF9BbGxvYz4mIG9wZXJhdG9yPShjb25zdCB2ZWN0b3I8X1Rw LCBfQWxsb2M+JiBfX3gpOwogIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKSB7CiAgICBpZiAo Y2FwYWNpdHkoKSA8IF9fbikgewogICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNp emUoKTsKICAgICAgcG9pbnRlciBfX3RtcCA9IF9NX2FsbG9jYXRlX2FuZF9jb3B5KF9fbiwgX01f c3RhcnQsIF9NX2ZpbmlzaCk7CiAgICAgIGRlc3Ryb3koX01fc3RhcnQsIF9NX2ZpbmlzaCk7CiAg ICAgIF9NX2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnQp OwogICAgICBfTV9zdGFydCA9IF9fdG1wOwogICAgICBfTV9maW5pc2ggPSBfX3RtcCArIF9fb2xk X3NpemU7CiAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX01fc3RhcnQgKyBfX247CiAgICB9CiAg fQoKCgoKCgogIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpIHsg X01fZmlsbF9hc3NpZ24oX19uLCBfX3ZhbCk7IH0KICB2b2lkIF9NX2ZpbGxfYXNzaWduKHNpemVf dHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpOwoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl cmF0b3I+CiAgdm9pZCBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0 b3IgX19sYXN0KSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJh dG9yPjo6X0ludGVncmFsIF9JbnRlZ3JhbDsKICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfX2ZpcnN0 LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4K ICB2b2lkIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLCBf X3RydWVfdHlwZSkKICAgIHsgX01fZmlsbF9hc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBf X3ZhbCk7IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CiAgdm9pZCBfTV9hc3NpZ25f ZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX19mYWxzZV90 eXBlKQogICAgeyBfTV9hc3NpZ25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19pdGVyYXRvcl9jYXRl Z29yeShfX2ZpcnN0KSk7IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZv aWQgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBf X2xhc3QsCiAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZyk7CgogIHRlbXBs YXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2Fy ZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7CgogIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0 dXJuICpiZWdpbigpOyB9CiAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4g KmJlZ2luKCk7IH0KICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQog IGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9Cgog IHZvaWQgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KSB7CiAgICBpZiAoX01fZmluaXNoICE9IF9N X2VuZF9vZl9zdG9yYWdlKSB7CiAgICAgIGNvbnN0cnVjdChfTV9maW5pc2gsIF9feCk7CiAgICAg ICsrX01fZmluaXNoOwogICAgfQogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBf X3gpOwogIH0KICB2b2lkIHB1c2hfYmFjaygpIHsKICAgIGlmIChfTV9maW5pc2ggIT0gX01fZW5k X29mX3N0b3JhZ2UpIHsKICAgICAgY29uc3RydWN0KF9NX2ZpbmlzaCk7CiAgICAgICsrX01fZmlu aXNoOwogICAgfQogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpKTsKICB9CiAgdm9p ZCBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCkgewogICAgc3RkOjpzd2FwKF9NX3N0YXJ0 LCBfX3guX01fc3RhcnQpOwogICAgc3RkOjpzd2FwKF9NX2ZpbmlzaCwgX194Ll9NX2ZpbmlzaCk7 CiAgICBzdGQ6OnN3YXAoX01fZW5kX29mX3N0b3JhZ2UsIF9feC5fTV9lbmRfb2Zfc3RvcmFnZSk7 CiAgfQoKICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBf X3gpIHsKICAgIHNpemVfdHlwZSBfX24gPSBfX3Bvc2l0aW9uIC0gYmVnaW4oKTsKICAgIGlmIChf TV9maW5pc2ggIT0gX01fZW5kX29mX3N0b3JhZ2UgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkgewog ICAgICBjb25zdHJ1Y3QoX01fZmluaXNoLCBfX3gpOwogICAgICArK19NX2ZpbmlzaDsKICAgIH0K ICAgIGVsc2UKICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvcihfX3Bvc2l0aW9uKSwgX194KTsK ICAgIHJldHVybiBiZWdpbigpICsgX19uOwogIH0KICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3Ig X19wb3NpdGlvbikgewogICAgc2l6ZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOwog ICAgaWYgKF9NX2ZpbmlzaCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSAmJiBfX3Bvc2l0aW9uID09IGVu ZCgpKSB7CiAgICAgIGNvbnN0cnVjdChfTV9maW5pc2gpOwogICAgICArK19NX2ZpbmlzaDsKICAg IH0KICAgIGVsc2UKICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvcihfX3Bvc2l0aW9uKSk7CiAg ICByZXR1cm4gYmVnaW4oKSArIF9fbjsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVy YXRvcj4KICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJz dCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc19pbnRl Z2VyPF9JbnB1dEl0ZXJhdG9yPjo6X0ludGVncmFsIF9JbnRlZ3JhbDsKICAgIF9NX2luc2VydF9k aXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CiAgfQoKICB0ZW1w bGF0ZSA8Y2xhc3MgX0ludGVnZXI+CiAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3Ig X19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgX190cnVlX3R5cGUpCiAgICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBl KSBfX24sIChfVHApIF9fdmFsKTsgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+ CiAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmFsc2VfdHlwZSkgewogICAgX01fcmFuZ2Vf aW5zZXJ0KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJz dCkpOwogIH0KCiAgdm9pZCBpbnNlcnQgKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBj b25zdCBfVHAmIF9feCkKICAgIHsgX01fZmlsbF9pbnNlcnQoX19wb3MsIF9fbiwgX194KTsgfQoK ICB2b2lkIF9NX2ZpbGxfaW5zZXJ0IChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29u c3QgX1RwJiBfX3gpOwoKICB2b2lkIHBvcF9iYWNrKCkgewogICAgLS1fTV9maW5pc2g7CiAgICBk ZXN0cm95KF9NX2ZpbmlzaCk7CiAgfQogIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRp b24pIHsKICAgIGlmIChfX3Bvc2l0aW9uICsgMSAhPSBlbmQoKSkKICAgICAgY29weShfX3Bvc2l0 aW9uICsgMSwgZW5kKCksIF9fcG9zaXRpb24pOwogICAgLS1fTV9maW5pc2g7CiAgICBkZXN0cm95 KF9NX2ZpbmlzaCk7CiAgICByZXR1cm4gX19wb3NpdGlvbjsKICB9CiAgaXRlcmF0b3IgZXJhc2Uo aXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KSB7CiAgICBpdGVyYXRvciBfX2koY29w eShfX2xhc3QsIGVuZCgpLCBfX2ZpcnN0KSk7CiAgICBkZXN0cm95KF9faSwgZW5kKCkpOwogICAg X01fZmluaXNoID0gX01fZmluaXNoIC0gKF9fbGFzdCAtIF9fZmlyc3QpOwogICAgcmV0dXJuIF9f Zmlyc3Q7CiAgfQoKICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1Rw JiBfX3gpIHsKICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQogICAgICBlcmFzZShiZWdpbigp ICsgX19uZXdfc2l6ZSwgZW5kKCkpOwogICAgZWxzZQogICAgICBpbnNlcnQoZW5kKCksIF9fbmV3 X3NpemUgLSBzaXplKCksIF9feCk7CiAgfQogIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX25ld19z aXplKSB7IHJlc2l6ZShfX25ld19zaXplLCBfVHAoKSk7IH0KICB2b2lkIGNsZWFyKCkgeyBlcmFz ZShiZWdpbigpLCBlbmQoKSk7IH0KCnByb3RlY3RlZDoKCiAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3 YXJkSXRlcmF0b3I+CiAgcG9pbnRlciBfTV9hbGxvY2F0ZV9hbmRfY29weShzaXplX3R5cGUgX19u LCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCiAgewogICAgcG9pbnRl ciBfX3Jlc3VsdCA9IF9NX2FsbG9jYXRlKF9fbik7CiAgICB0cnkgewogICAgICB1bmluaXRpYWxp emVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7CiAgICAgIHJldHVybiBfX3Jlc3Vs dDsKICAgIH0KICAgIGNhdGNoKC4uLikgeyBfTV9kZWFsbG9jYXRlKF9fcmVzdWx0LCBfX24pOyB0 aHJvdzsgfTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9N X3JhbmdlX2luaXRpYWxpemUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBpbnB1dF9pdGVyYXRvcl90YWcpCiAg ewogICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgICBwdXNoX2Jh Y2soKl9fZmlyc3QpOwogIH0KCgogIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgog IHZvaWQgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBmb3J3YXJkX2l0 ZXJhdG9yX3RhZykKICB7CiAgICBzaXplX3R5cGUgX19uID0gMDsKICAgIGRpc3RhbmNlKF9fZmly c3QsIF9fbGFzdCwgX19uKTsKICAgIF9NX3N0YXJ0ID0gX01fYWxsb2NhdGUoX19uKTsKICAgIF9N X2VuZF9vZl9zdG9yYWdlID0gX01fc3RhcnQgKyBfX247CiAgICBfTV9maW5pc2ggPSB1bmluaXRp YWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfTV9zdGFydCk7CiAgfQoKICB0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19w b3MsCiAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0 SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3Rh Zyk7CgogIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fcmFuZ2Vf aW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLAogICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRl cmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xh c3MgX0FsbG9jPgppbmxpbmUgYm9vbApvcGVyYXRvcj09KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxv Yz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIF9feC5z aXplKCkgPT0gX195LnNpemUoKSAmJgogICAgICAgICBlcXVhbChfX3guYmVnaW4oKSwgX194LmVu ZCgpLCBfX3kuYmVnaW4oKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4K aW5saW5lIGJvb2wKb3BlcmF0b3I8KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29u c3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9j b21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBj bGFzcyBfQWxsb2M+CmlubGluZSB2b2lkIHN3YXAodmVjdG9yPF9UcCwgX0FsbG9jPiYgX194LCB2 ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpCnsKICBfX3guc3dhcChfX3kpOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sCm9wZXJhdG9yIT0oY29uc3QgdmVj dG9yPF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpIHsK ICByZXR1cm4gIShfX3ggPT0gX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Fs bG9jPgppbmxpbmUgYm9vbApvcGVyYXRvcj4oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194 LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpIHsKICByZXR1cm4gX195IDwgX194Owp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sCm9wZXJhdG9y PD0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxs b2M+JiBfX3kpIHsKICByZXR1cm4gIShfX3kgPCBfX3gpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sCm9wZXJhdG9yPj0oY29uc3QgdmVjdG9yPF9UcCwg X0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpIHsKICByZXR1cm4g IShfX3ggPCBfX3kpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZlY3Rv cjxfVHAsX0FsbG9jPiYKdmVjdG9yPF9UcCxfQWxsb2M+OjpvcGVyYXRvcj0oY29uc3QgdmVjdG9y PF9UcCwgX0FsbG9jPiYgX194KQp7CiAgaWYgKCZfX3ggIT0gdGhpcykgewogICAgY29uc3Qgc2l6 ZV90eXBlIF9feGxlbiA9IF9feC5zaXplKCk7CiAgICBpZiAoX194bGVuID4gY2FwYWNpdHkoKSkg ewogICAgICBwb2ludGVyIF9fdG1wID0gX01fYWxsb2NhdGVfYW5kX2NvcHkoX194bGVuLCBfX3gu YmVnaW4oKSwgX194LmVuZCgpKTsKICAgICAgZGVzdHJveShfTV9zdGFydCwgX01fZmluaXNoKTsK ICAgICAgX01fZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9zdGFy dCk7CiAgICAgIF9NX3N0YXJ0ID0gX190bXA7CiAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX01f c3RhcnQgKyBfX3hsZW47CiAgICB9CiAgICBlbHNlIGlmIChzaXplKCkgPj0gX194bGVuKSB7CiAg ICAgIGl0ZXJhdG9yIF9faShjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIGJlZ2luKCkpKTsK ICAgICAgZGVzdHJveShfX2ksIGVuZCgpKTsKICAgIH0KICAgIGVsc2UgewogICAgICBjb3B5KF9f eC5iZWdpbigpLCBfX3guYmVnaW4oKSArIHNpemUoKSwgX01fc3RhcnQpOwogICAgICB1bmluaXRp YWxpemVkX2NvcHkoX194LmJlZ2luKCkgKyBzaXplKCksIF9feC5lbmQoKSwgX01fZmluaXNoKTsK ICAgIH0KICAgIF9NX2ZpbmlzaCA9IF9NX3N0YXJ0ICsgX194bGVuOwogIH0KICByZXR1cm4gKnRo aXM7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZCB2ZWN0b3I8X1Rw LCBfQWxsb2M+OjpfTV9maWxsX2Fzc2lnbihzaXplX3QgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBf X3ZhbCkKewogIGlmIChfX24gPiBjYXBhY2l0eSgpKSB7CiAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+ IF9fdG1wKF9fbiwgX192YWwsIGdldF9hbGxvY2F0b3IoKSk7CiAgICBfX3RtcC5zd2FwKCp0aGlz KTsKICB9CiAgZWxzZSBpZiAoX19uID4gc2l6ZSgpKSB7CiAgICBmaWxsKGJlZ2luKCksIGVuZCgp LCBfX3ZhbCk7CiAgICBfTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2ZpbGxfbihfTV9maW5pc2gs IF9fbiAtIHNpemUoKSwgX192YWwpOwogIH0KICBlbHNlCiAgICBlcmFzZShmaWxsX24oYmVnaW4o KSwgX19uLCBfX3ZhbCksIGVuZCgpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Fs bG9jPiB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcj4Kdm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+ OjpfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcp IHsKICBpdGVyYXRvciBfX2N1cihiZWdpbigpKTsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0 ICYmIF9fY3VyICE9IGVuZCgpOyArK19fY3VyLCArK19fZmlyc3QpCiAgICAqX19jdXIgPSAqX19m aXJzdDsKICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAgICBlcmFzZShfX2N1ciwgZW5kKCkpOwog IGVsc2UKICAgIGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsKfQoKdGVtcGxhdGUgPGNs YXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyPgp2b2lk CnZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3Qs IF9Gb3J3YXJkSXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Zm9yd2FyZF9pdGVyYXRvcl90YWcpIHsKICBzaXplX3R5cGUgX19sZW4gPSAwOwogIGRpc3RhbmNl KF9fZmlyc3QsIF9fbGFzdCwgX19sZW4pOwoKICBpZiAoX19sZW4gPiBjYXBhY2l0eSgpKSB7CiAg ICBwb2ludGVyIF9fdG1wKF9NX2FsbG9jYXRlX2FuZF9jb3B5KF9fbGVuLCBfX2ZpcnN0LCBfX2xh c3QpKTsKICAgIGRlc3Ryb3koX01fc3RhcnQsIF9NX2ZpbmlzaCk7CiAgICBfTV9kZWFsbG9jYXRl KF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAgIF9NX3N0YXJ0ID0g X190bXA7CiAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9NX2ZpbmlzaCA9IF9NX3N0YXJ0ICsgX19s ZW47CiAgfQogIGVsc2UgaWYgKHNpemUoKSA+PSBfX2xlbikgewogICAgaXRlcmF0b3IgX19uZXdf ZmluaXNoKGNvcHkoX19maXJzdCwgX19sYXN0LCBfTV9zdGFydCkpOwogICAgZGVzdHJveShfX25l d19maW5pc2gsIGVuZCgpKTsKICAgIF9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaC5iYXNlKCk7CiAg fQogIGVsc2UgewogICAgX0ZvcndhcmRJdGVyIF9fbWlkID0gX19maXJzdDsKICAgIGFkdmFuY2Uo X19taWQsIHNpemUoKSk7CiAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBfTV9zdGFydCk7CiAgICBf TV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFzdCwgX01fZmluaXNoKTsK ICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZAp2ZWN0b3I8X1Rw LCBfQWxsb2M+OjpfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYg X194KQp7CiAgaWYgKF9NX2ZpbmlzaCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkgewogICAgY29uc3Ry dWN0KF9NX2ZpbmlzaCwgKihfTV9maW5pc2ggLSAxKSk7CiAgICArK19NX2ZpbmlzaDsKICAgIF9U cCBfX3hfY29weSA9IF9feDsKICAgIGNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgaXRlcmF0b3Io X01fZmluaXNoIC0gMiksIGl0ZXJhdG9yKF9NX2ZpbmlzaC0gMSkpOwogICAgKl9fcG9zaXRpb24g PSBfX3hfY29weTsKICB9CiAgZWxzZSB7CiAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9 IHNpemUoKTsKICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgIT0gMCA/IDIg KiBfX29sZF9zaXplIDogMTsKICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0KF9NX2FsbG9jYXRlKF9f bGVuKSk7CiAgICBpdGVyYXRvciBfX25ld19maW5pc2goX19uZXdfc3RhcnQpOwogICAgdHJ5IHsK ICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KGl0ZXJhdG9yKF9NX3N0YXJ0 KSwgX19wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9f bmV3X3N0YXJ0KTsKICAgICAgY29uc3RydWN0KF9fbmV3X2ZpbmlzaC5iYXNlKCksIF9feCk7CiAg ICAgICsrX19uZXdfZmluaXNoOwogICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2Nv cHkoX19wb3NpdGlvbiwgaXRlcmF0b3IoX01fZmluaXNoKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9fbmV3X2ZpbmlzaCk7CiAgICB9CiAgICBjYXRjaCguLi4pIHsg KGRlc3Ryb3koX19uZXdfc3RhcnQsX19uZXdfZmluaXNoKSwgX01fZGVhbGxvY2F0ZShfX25ld19z dGFydC5iYXNlKCksX19sZW4pKTsgdGhyb3c7IH07CgogICAgZGVzdHJveShiZWdpbigpLCBlbmQo KSk7CiAgICBfTV9kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0 YXJ0KTsKICAgIF9NX3N0YXJ0ID0gX19uZXdfc3RhcnQuYmFzZSgpOwogICAgX01fZmluaXNoID0g X19uZXdfZmluaXNoLmJhc2UoKTsKICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQu YmFzZSgpICsgX19sZW47CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ CnZvaWQKdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0 aW9uKQp7CiAgaWYgKF9NX2ZpbmlzaCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkgewogICAgY29uc3Ry dWN0KF9NX2ZpbmlzaCwgKihfTV9maW5pc2ggLSAxKSk7CiAgICArK19NX2ZpbmlzaDsKICAgIGNv cHlfYmFja3dhcmQoX19wb3NpdGlvbiwgaXRlcmF0b3IoX01fZmluaXNoIC0gMiksCiAgICAgICAg ICAgICAgICAgIGl0ZXJhdG9yKF9NX2ZpbmlzaCAtIDEpKTsKICAgICpfX3Bvc2l0aW9uID0gX1Rw KCk7CiAgfQogIGVsc2UgewogICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7 CiAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICE9IDAgPyAyICogX19vbGRf c2l6ZSA6IDE7CiAgICBwb2ludGVyIF9fbmV3X3N0YXJ0ID0gX01fYWxsb2NhdGUoX19sZW4pOwog ICAgcG9pbnRlciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKICAgIHRyeSB7CiAgICAgIF9f bmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShpdGVyYXRvcihfTV9zdGFydCksIF9fcG9z aXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25ld19zdGFy dCk7CiAgICAgIGNvbnN0cnVjdChfX25ld19maW5pc2gpOwogICAgICArK19fbmV3X2ZpbmlzaDsK ICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9fcG9zaXRpb24sIGl0ZXJh dG9yKF9NX2ZpbmlzaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBf X25ld19maW5pc2gpOwogICAgfQogICAgY2F0Y2goLi4uKSB7IChkZXN0cm95KF9fbmV3X3N0YXJ0 LF9fbmV3X2ZpbmlzaCksIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKTsgdGhyb3c7 IH07CgogICAgZGVzdHJveShiZWdpbigpLCBlbmQoKSk7CiAgICBfTV9kZWFsbG9jYXRlKF9NX3N0 YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAgIF9NX3N0YXJ0ID0gX19uZXdf c3RhcnQ7CiAgICBfTV9maW5pc2ggPSBfX25ld19maW5pc2g7CiAgICBfTV9lbmRfb2Zfc3RvcmFn ZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFz cyBfQWxsb2M+CnZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fZmlsbF9pbnNlcnQoaXRlcmF0 b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCkKewogIGlmIChfX24gIT0gMCkgewogICAgaWYg KHNpemVfdHlwZShfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX2ZpbmlzaCkgPj0gX19uKSB7CiAgICAg IF9UcCBfX3hfY29weSA9IF9feDsKICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fZWxlbXNfYWZ0ZXIg PSBlbmQoKSAtIF9fcG9zaXRpb247CiAgICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaChfTV9maW5p c2gpOwogICAgICBpZiAoX19lbGVtc19hZnRlciA+IF9fbikgewogICAgICAgIHVuaW5pdGlhbGl6 ZWRfY29weShfTV9maW5pc2ggLSBfX24sIF9NX2ZpbmlzaCwgX01fZmluaXNoKTsKICAgICAgICBf TV9maW5pc2ggKz0gX19uOwogICAgICAgIGNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgX19vbGRf ZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gpOwogICAgICAgIGZpbGwoX19wb3NpdGlvbiwgX19w b3NpdGlvbiArIF9fbiwgX194X2NvcHkpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHVu aW5pdGlhbGl6ZWRfZmlsbF9uKF9NX2ZpbmlzaCwgX19uIC0gX19lbGVtc19hZnRlciwgX194X2Nv cHkpOwogICAgICAgIF9NX2ZpbmlzaCArPSBfX24gLSBfX2VsZW1zX2FmdGVyOwogICAgICAgIHVu aW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCBfX29sZF9maW5pc2gsIF9NX2ZpbmlzaCk7CiAg ICAgICAgX01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CiAgICAgICAgZmlsbChfX3Bvc2l0aW9u LCBfX29sZF9maW5pc2gsIF9feF9jb3B5KTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAg IGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gc2l6ZSgpOwogICAgICBjb25zdCBzaXplX3R5 cGUgX19sZW4gPSBfX29sZF9zaXplICsgbWF4KF9fb2xkX3NpemUsIF9fbik7CiAgICAgIGl0ZXJh dG9yIF9fbmV3X3N0YXJ0KF9NX2FsbG9jYXRlKF9fbGVuKSk7CiAgICAgIGl0ZXJhdG9yIF9fbmV3 X2ZpbmlzaChfX25ld19zdGFydCk7CiAgICAgIHRyeSB7CiAgICAgICAgX19uZXdfZmluaXNoID0g dW5pbml0aWFsaXplZF9jb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIF9fbmV3X3N0YXJ0KTsKICAg ICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2ZpbGxfbihfX25ld19maW5pc2gsIF9f biwgX194KTsKICAgICAgICBfX25ld19maW5pc2gKICAgICAgICAgID0gdW5pbml0aWFsaXplZF9j b3B5KF9fcG9zaXRpb24sIGVuZCgpLCBfX25ld19maW5pc2gpOwogICAgICB9CiAgICAgIGNhdGNo KC4uLikgeyAoZGVzdHJveShfX25ld19zdGFydCxfX25ld19maW5pc2gpLCBfTV9kZWFsbG9jYXRl KF9fbmV3X3N0YXJ0LmJhc2UoKSxfX2xlbikpOyB0aHJvdzsgfTsKCiAgICAgIGRlc3Ryb3koX01f c3RhcnQsIF9NX2ZpbmlzaCk7CiAgICAgIF9NX2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9v Zl9zdG9yYWdlIC0gX01fc3RhcnQpOwogICAgICBfTV9zdGFydCA9IF9fbmV3X3N0YXJ0LmJhc2Uo KTsKICAgICAgX01fZmluaXNoID0gX19uZXdfZmluaXNoLmJhc2UoKTsKICAgICAgX01fZW5kX29m X3N0b3JhZ2UgPSBfX25ld19zdGFydC5iYXNlKCkgKyBfX2xlbjsKICAgIH0KICB9Cn0KCnRlbXBs YXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJh dG9yPgp2b2lkCnZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX3JhbmdlX2luc2VydChpdGVyYXRvciBf X3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9y IF9fZmlyc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVy YXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9p dGVyYXRvcl90YWcpCnsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpIHsK ICAgIF9fcG9zID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CiAgICArK19fcG9zOwogIH0KfQoK dGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0ZSA8Y2xhc3MgX0Zvcndh cmRJdGVyYXRvcj4Kdm9pZAp2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9yYW5nZV9pbnNlcnQoaXRl cmF0b3IgX19wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9G b3J3YXJkSXRlcmF0b3IgX19maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCnsKICBpZiAoX19maXJzdCAhPSBfX2xhc3Qp IHsKICAgIHNpemVfdHlwZSBfX24gPSAwOwogICAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBf X24pOwogICAgaWYgKHNpemVfdHlwZShfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX2ZpbmlzaCkgPj0g X19uKSB7CiAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gZW5kKCkgLSBfX3Bv c2l0aW9uOwogICAgICBpdGVyYXRvciBfX29sZF9maW5pc2goX01fZmluaXNoKTsKICAgICAgaWYg KF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX01fZmlu aXNoIC0gX19uLCBfTV9maW5pc2gsIF9NX2ZpbmlzaCk7CiAgICAgICAgX01fZmluaXNoICs9IF9f bjsKICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIF9fb2xkX2ZpbmlzaCAtIF9fbiwg X19vbGRfZmluaXNoKTsKICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3NpdGlvbik7 CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9f Zmlyc3Q7CiAgICAgICAgYWR2YW5jZShfX21pZCwgX19lbGVtc19hZnRlcik7CiAgICAgICAgdW5p bml0aWFsaXplZF9jb3B5KF9fbWlkLCBfX2xhc3QsIF9NX2ZpbmlzaCk7CiAgICAgICAgX01fZmlu aXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CiAgICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9f cG9zaXRpb24sIF9fb2xkX2ZpbmlzaCwgX01fZmluaXNoKTsKICAgICAgICBfTV9maW5pc2ggKz0g X19lbGVtc19hZnRlcjsKICAgICAgICBjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvc2l0aW9uKTsK ICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXpl ID0gc2l6ZSgpOwogICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgbWF4 KF9fb2xkX3NpemUsIF9fbik7CiAgICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0KF9NX2FsbG9jYXRl KF9fbGVuKSk7CiAgICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CiAgICAg IHRyeSB7CiAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KGl0ZXJhdG9y KF9NX3N0YXJ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19w b3NpdGlvbiwgX19uZXdfc3RhcnQpOwogICAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6 ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fbmV3X2ZpbmlzaCk7CiAgICAgICAgX19uZXdfZmlu aXNoCiAgICAgICAgICA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCBpdGVyYXRvcihf TV9maW5pc2gpLCBfX25ld19maW5pc2gpOwogICAgICB9CiAgICAgIGNhdGNoKC4uLikgeyAoZGVz dHJveShfX25ld19zdGFydCxfX25ld19maW5pc2gpLCBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0 LmJhc2UoKSxfX2xlbikpOyB0aHJvdzsgfTsKCiAgICAgIGRlc3Ryb3koX01fc3RhcnQsIF9NX2Zp bmlzaCk7CiAgICAgIF9NX2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9vZl9zdG9yYWdlIC0g X01fc3RhcnQpOwogICAgICBfTV9zdGFydCA9IF9fbmV3X3N0YXJ0LmJhc2UoKTsKICAgICAgX01f ZmluaXNoID0gX19uZXdfZmluaXNoLmJhc2UoKTsKICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBf X25ld19zdGFydC5iYXNlKCkgKyBfX2xlbjsKICAgIH0KICB9Cn0KCn0KIyAzOCAiL3Vzci9sb2Nh bC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3ZlY3Rvci5oIiAyIDMKIyAxICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGxfYnZlY3Rvci5oIiAxIDMKIyAz NCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX2J2ZWN0b3IuaCIg MwpuYW1lc3BhY2Ugc3RkCnsKCnN0YXRpYyBjb25zdCBpbnQgX19XT1JEX0JJVCA9IGludCg4KnNp emVvZih1bnNpZ25lZCBpbnQpKTsKCnN0cnVjdCBfQml0X3JlZmVyZW5jZSB7CiAgdW5zaWduZWQg aW50KiBfTV9wOwogIHVuc2lnbmVkIGludCBfTV9tYXNrOwogIF9CaXRfcmVmZXJlbmNlKHVuc2ln bmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KQogICAgOiBfTV9wKF9feCksIF9NX21hc2so X195KSB7fQoKcHVibGljOgogIF9CaXRfcmVmZXJlbmNlKCkgOiBfTV9wKDApLCBfTV9tYXNrKDAp IHt9CiAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEoISgqX01fcCAmIF9NX21hc2sp KTsgfQogIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCBfX3gpCiAgewogICAgaWYgKF9f eCkgKl9NX3AgfD0gX01fbWFzazsKICAgIGVsc2UgKl9NX3AgJj0gfl9NX21hc2s7CiAgICByZXR1 cm4gKnRoaXM7CiAgfQogIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvcj0oY29uc3QgX0JpdF9yZWZl cmVuY2UmIF9feCkKICAgIHsgcmV0dXJuICp0aGlzID0gYm9vbChfX3gpOyB9CiAgYm9vbCBvcGVy YXRvcj09KGNvbnN0IF9CaXRfcmVmZXJlbmNlJiBfX3gpIGNvbnN0CiAgICB7IHJldHVybiBib29s KCp0aGlzKSA9PSBib29sKF9feCk7IH0KICBib29sIG9wZXJhdG9yPChjb25zdCBfQml0X3JlZmVy ZW5jZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gIWJvb2woKnRoaXMpICYmIGJvb2woX194KTsK ICB9CiAgdm9pZCBmbGlwKCkgeyAqX01fcCBePSBfTV9tYXNrOyB9Cn07CgppbmxpbmUgdm9pZCBz d2FwKF9CaXRfcmVmZXJlbmNlIF9feCwgX0JpdF9yZWZlcmVuY2UgX195KQp7CiAgYm9vbCBfX3Rt cCA9IF9feDsKICBfX3ggPSBfX3k7CiAgX195ID0gX190bXA7Cn0KCnN0cnVjdCBfQml0X2l0ZXJh dG9yX2Jhc2UgOiBwdWJsaWMgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcjxib29sLCBwdHJkaWZmX3Q+ CnsKICB1bnNpZ25lZCBpbnQqIF9NX3A7CiAgdW5zaWduZWQgaW50IF9NX29mZnNldDsKCiAgX0Jp dF9pdGVyYXRvcl9iYXNlKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KQogICAg OiBfTV9wKF9feCksIF9NX29mZnNldChfX3kpIHt9CgogIHZvaWQgX01fYnVtcF91cCgpIHsKICAg IGlmIChfTV9vZmZzZXQrKyA9PSBfX1dPUkRfQklUIC0gMSkgewogICAgICBfTV9vZmZzZXQgPSAw OwogICAgICArK19NX3A7CiAgICB9CiAgfQogIHZvaWQgX01fYnVtcF9kb3duKCkgewogICAgaWYg KF9NX29mZnNldC0tID09IDApIHsKICAgICAgX01fb2Zmc2V0ID0gX19XT1JEX0JJVCAtIDE7CiAg ICAgIC0tX01fcDsKICAgIH0KICB9CgogIHZvaWQgX01faW5jcihwdHJkaWZmX3QgX19pKSB7CiAg ICBkaWZmZXJlbmNlX3R5cGUgX19uID0gX19pICsgX01fb2Zmc2V0OwogICAgX01fcCArPSBfX24g LyBfX1dPUkRfQklUOwogICAgX19uID0gX19uICUgX19XT1JEX0JJVDsKICAgIGlmIChfX24gPCAw KSB7CiAgICAgIF9NX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIF9fbiArIF9fV09SRF9CSVQ7CiAg ICAgIC0tX01fcDsKICAgIH0gZWxzZQogICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSBf X247CiAgfQoKICBib29sIG9wZXJhdG9yPT0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kp IGNvbnN0IHsKICAgIHJldHVybiBfTV9wID09IF9faS5fTV9wICYmIF9NX29mZnNldCA9PSBfX2ku X01fb2Zmc2V0OwogIH0KICBib29sIG9wZXJhdG9yPChjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2Um IF9faSkgY29uc3QgewogICAgcmV0dXJuIF9NX3AgPCBfX2kuX01fcCB8fCAoX01fcCA9PSBfX2ku X01fcCAmJiBfTV9vZmZzZXQgPCBfX2kuX01fb2Zmc2V0KTsKICB9CiAgYm9vbCBvcGVyYXRvciE9 KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX19pKSBjb25zdCB7CiAgICByZXR1cm4gISgqdGhp cyA9PSBfX2kpOwogIH0KICBib29sIG9wZXJhdG9yPihjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2Um IF9faSkgY29uc3QgewogICAgcmV0dXJuIF9faSA8ICp0aGlzOwogIH0KICBib29sIG9wZXJhdG9y PD0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kpIGNvbnN0IHsKICAgIHJldHVybiAhKF9f aSA8ICp0aGlzKTsKICB9CiAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFz ZSYgX19pKSBjb25zdCB7CiAgICByZXR1cm4gISgqdGhpcyA8IF9faSk7CiAgfQp9OwoKaW5saW5l IHB0cmRpZmZfdApvcGVyYXRvci0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX3gsIGNvbnN0 IF9CaXRfaXRlcmF0b3JfYmFzZSYgX195KSB7CiAgcmV0dXJuIF9fV09SRF9CSVQgKiAoX194Ll9N X3AgLSBfX3kuX01fcCkgKyBfX3guX01fb2Zmc2V0IC0gX195Ll9NX29mZnNldDsKfQoKCnN0cnVj dCBfQml0X2l0ZXJhdG9yIDogcHVibGljIF9CaXRfaXRlcmF0b3JfYmFzZQp7CiAgdHlwZWRlZiBf Qml0X3JlZmVyZW5jZSByZWZlcmVuY2U7CiAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSogcG9pbnRl cjsKICB0eXBlZGVmIF9CaXRfaXRlcmF0b3IgaXRlcmF0b3I7CgogIF9CaXRfaXRlcmF0b3IoKSA6 IF9CaXRfaXRlcmF0b3JfYmFzZSgwLCAwKSB7fQogIF9CaXRfaXRlcmF0b3IodW5zaWduZWQgaW50 KiBfX3gsIHVuc2lnbmVkIGludCBfX3kpCiAgICA6IF9CaXRfaXRlcmF0b3JfYmFzZShfX3gsIF9f eSkge30KCiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHJlZmVyZW5jZShf TV9wLCAxVSA8PCBfTV9vZmZzZXQpOyB9CiAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CiAgICBf TV9idW1wX3VwKCk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGl0ZXJhdG9yIG9wZXJhdG9yKyso aW50KSB7CiAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgX01fYnVtcF91cCgpOwogICAg cmV0dXJuIF9fdG1wOwogIH0KICBpdGVyYXRvciYgb3BlcmF0b3ItLSgpIHsKICAgIF9NX2J1bXBf ZG93bigpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpdGVyYXRvciBvcGVyYXRvci0tKGludCkg ewogICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKICAgIF9NX2J1bXBfZG93bigpOwogICAgcmV0 dXJuIF9fdG1wOwogIH0KICBpdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19p KSB7CiAgICBfTV9pbmNyKF9faSk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGl0ZXJhdG9yJiBv cGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX2kpIHsKICAgICp0aGlzICs9IC1fX2k7CiAgICBy ZXR1cm4gKnRoaXM7CiAgfQogIGl0ZXJhdG9yIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19p KSBjb25zdCB7CiAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgcmV0dXJuIF9fdG1wICs9 IF9faTsKICB9CiAgaXRlcmF0b3Igb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0 IHsKICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CiAgICByZXR1cm4gX190bXAgLT0gX19pOwog IH0KCiAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIF9faSkgeyByZXR1cm4g KigqdGhpcyArIF9faSk7IH0KfTsKCmlubGluZSBfQml0X2l0ZXJhdG9yCm9wZXJhdG9yKyhwdHJk aWZmX3QgX19uLCBjb25zdCBfQml0X2l0ZXJhdG9yJiBfX3gpIHsgcmV0dXJuIF9feCArIF9fbjsg fQoKCnN0cnVjdCBfQml0X2NvbnN0X2l0ZXJhdG9yIDogcHVibGljIF9CaXRfaXRlcmF0b3JfYmFz ZQp7CiAgdHlwZWRlZiBib29sIHJlZmVyZW5jZTsKICB0eXBlZGVmIGJvb2wgY29uc3RfcmVmZXJl bmNlOwogIHR5cGVkZWYgY29uc3QgYm9vbCogcG9pbnRlcjsKICB0eXBlZGVmIF9CaXRfY29uc3Rf aXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CgogIF9CaXRfY29uc3RfaXRlcmF0b3IoKSA6IF9CaXRf aXRlcmF0b3JfYmFzZSgwLCAwKSB7fQogIF9CaXRfY29uc3RfaXRlcmF0b3IodW5zaWduZWQgaW50 KiBfX3gsIHVuc2lnbmVkIGludCBfX3kpCiAgICA6IF9CaXRfaXRlcmF0b3JfYmFzZShfX3gsIF9f eSkge30KICBfQml0X2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9CaXRfaXRlcmF0b3ImIF9feCkKICAg IDogX0JpdF9pdGVyYXRvcl9iYXNlKF9feC5fTV9wLCBfX3guX01fb2Zmc2V0KSB7fQoKICBjb25z dF9yZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewogICAgcmV0dXJuIF9CaXRfcmVmZXJlbmNl KF9NX3AsIDFVIDw8IF9NX29mZnNldCk7CiAgfQogIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcisr KCkgewogICAgX01fYnVtcF91cCgpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBjb25zdF9pdGVy YXRvciBvcGVyYXRvcisrKGludCkgewogICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSAqdGhpczsK ICAgIF9NX2J1bXBfdXAoKTsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgY29uc3RfaXRlcmF0b3Im IG9wZXJhdG9yLS0oKSB7CiAgICBfTV9idW1wX2Rvd24oKTsKICAgIHJldHVybiAqdGhpczsKICB9 CiAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKICAgIGNvbnN0X2l0ZXJhdG9yIF9f dG1wID0gKnRoaXM7CiAgICBfTV9idW1wX2Rvd24oKTsKICAgIHJldHVybiBfX3RtcDsKICB9CiAg Y29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIF9faSkgewogICAgX01f aW5jcihfX2kpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBjb25zdF9pdGVyYXRvciYgb3BlcmF0 b3ItPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CiAgICAqdGhpcyArPSAtX19pOwogICAgcmV0dXJu ICp0aGlzOwogIH0KICBjb25zdF9pdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9f aSkgY29uc3QgewogICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKICAgIHJldHVybiBf X3RtcCArPSBfX2k7CiAgfQogIGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5 cGUgX19pKSBjb25zdCB7CiAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgcmV0 dXJuIF9fdG1wIC09IF9faTsKICB9CiAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVy ZW5jZV90eXBlIF9faSkgewogICAgcmV0dXJuICooKnRoaXMgKyBfX2kpOwogIH0KfTsKCmlubGlu ZSBfQml0X2NvbnN0X2l0ZXJhdG9yCm9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfQml0 X2NvbnN0X2l0ZXJhdG9yJiBfX3gpIHsgcmV0dXJuIF9feCArIF9fbjsgfQoKCgoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgX0FsbG9jYXRvciwgYm9vbCBfX2lzX3N0YXRpYz4KY2xhc3MgX0J2ZWN0b3JfYWxs b2NfYmFzZSB7CnB1YmxpYzoKICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8Ym9vbCwg X0FsbG9jYXRvcj46OmFsbG9jYXRvcl90eXBlCiAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKICBh bGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fZGF0YV9hbGxv Y2F0b3I7IH0KCiAgX0J2ZWN0b3JfYWxsb2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19h KQogICAgOiBfTV9kYXRhX2FsbG9jYXRvcihfX2EpLCBfTV9zdGFydCgpLCBfTV9maW5pc2goKSwg X01fZW5kX29mX3N0b3JhZ2UoMCkge30KCnByb3RlY3RlZDoKICB1bnNpZ25lZCBpbnQqIF9NX2Jp dF9hbGxvYyhzaXplX3QgX19uKQogICAgeyByZXR1cm4gX01fZGF0YV9hbGxvY2F0b3IuYWxsb2Nh dGUoKF9fbiArIF9fV09SRF9CSVQgLSAxKS9fX1dPUkRfQklUKTsgfQogIHZvaWQgX01fZGVhbGxv Y2F0ZSgpIHsKICAgIGlmIChfTV9zdGFydC5fTV9wKQogICAgICBfTV9kYXRhX2FsbG9jYXRvci5k ZWFsbG9jYXRlKF9NX3N0YXJ0Ll9NX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9zdGFydC5fTV9wKTsKICB9CgogIHR5cGVuYW1lIF9B bGxvY190cmFpdHM8dW5zaWduZWQgaW50LCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUKICAg ICAgICAgIF9NX2RhdGFfYWxsb2NhdG9yOwogIF9CaXRfaXRlcmF0b3IgX01fc3RhcnQ7CiAgX0Jp dF9pdGVyYXRvciBfTV9maW5pc2g7CiAgdW5zaWduZWQgaW50KiBfTV9lbmRfb2Zfc3RvcmFnZTsK fTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jYXRvcj4KY2xhc3MgX0J2ZWN0b3JfYWxsb2NfYmFz ZTxfQWxsb2NhdG9yLCB0cnVlPiB7CnB1YmxpYzoKICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190 cmFpdHM8Ym9vbCwgX0FsbG9jYXRvcj46OmFsbG9jYXRvcl90eXBlCiAgICAgICAgICBhbGxvY2F0 b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4g YWxsb2NhdG9yX3R5cGUoKTsgfQoKICBfQnZlY3Rvcl9hbGxvY19iYXNlKGNvbnN0IGFsbG9jYXRv cl90eXBlJikKICAgIDogX01fc3RhcnQoKSwgX01fZmluaXNoKCksIF9NX2VuZF9vZl9zdG9yYWdl KDApIHt9Cgpwcm90ZWN0ZWQ6CiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPHVuc2ln bmVkIGludCwgX0FsbG9jYXRvcj46Ol9BbGxvY190eXBlCiAgICAgICAgICBfQWxsb2NfdHlwZTsK CiAgdW5zaWduZWQgaW50KiBfTV9iaXRfYWxsb2Moc2l6ZV90IF9fbikKICAgIHsgcmV0dXJuIF9B bGxvY190eXBlOjphbGxvY2F0ZSgoX19uICsgX19XT1JEX0JJVCAtIDEpL19fV09SRF9CSVQpOyB9 CiAgdm9pZCBfTV9kZWFsbG9jYXRlKCkgewogICAgaWYgKF9NX3N0YXJ0Ll9NX3ApCiAgICAgIF9B bGxvY190eXBlOjpkZWFsbG9jYXRlKF9NX3N0YXJ0Ll9NX3AsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnQuX01fcCk7CiAgfQoKICBfQml0 X2l0ZXJhdG9yIF9NX3N0YXJ0OwogIF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOwogIHVuc2lnbmVk IGludCogX01fZW5kX29mX3N0b3JhZ2U7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgpjbGFz cyBfQnZlY3Rvcl9iYXNlCiAgOiBwdWJsaWMgX0J2ZWN0b3JfYWxsb2NfYmFzZTxfQWxsb2MsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2NfdHJhaXRzPGJvb2wsIF9BbGxvYz46 Ol9TX2luc3RhbmNlbGVzcz4KewogIHR5cGVkZWYgX0J2ZWN0b3JfYWxsb2NfYmFzZTxfQWxsb2Ms CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8Ym9vbCwgX0FsbG9j Pjo6X1NfaW5zdGFuY2VsZXNzPgogICAgICAgICAgX0Jhc2U7CnB1YmxpYzoKICB0eXBlZGVmIHR5 cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgX0J2ZWN0b3Jf YmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSA6IF9CYXNlKF9fYSkge30KICB+X0J2ZWN0 b3JfYmFzZSgpIHsgX0Jhc2U6Ol9NX2RlYWxsb2NhdGUoKTsgfQp9OwoKfQoKCiMgMSAiL3Vzci9s b2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RsX3ZlY3Rvci5oIiAxIDMKIyAzMTgg Ii91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9idmVjdG9yLmgiIDIg MwpuYW1lc3BhY2Ugc3RkCnsKCnRlbXBsYXRlIDx0eXBlbmFtZSBfQWxsb2M+CiAgY2xhc3MgdmVj dG9yPGJvb2wsIF9BbGxvYz4gOiBwdWJsaWMgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+CiAgewogIHB1 YmxpYzoKICAgIHR5cGVkZWYgYm9vbCB2YWx1ZV90eXBlOwogICAgdHlwZWRlZiBzaXplX3Qgc2l6 ZV90eXBlOwogICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwogICAgdHlwZWRl ZiBfQml0X3JlZmVyZW5jZSByZWZlcmVuY2U7CiAgICB0eXBlZGVmIGJvb2wgY29uc3RfcmVmZXJl bmNlOwogICAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSogcG9pbnRlcjsKICAgIHR5cGVkZWYgY29u c3QgYm9vbCogY29uc3RfcG9pbnRlcjsKCiAgICB0eXBlZGVmIF9CaXRfaXRlcmF0b3IgaXRlcmF0 b3I7CiAgICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CgogICAg dHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0 ZXJhdG9yOwogICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0 ZXJhdG9yOwoKICAgIHR5cGVkZWYgdHlwZW5hbWUgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+OjphbGxv Y2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0 b3IoKSBjb25zdCB7CiAgICAgIHJldHVybiBfQnZlY3Rvcl9iYXNlPF9BbGxvYz46OmdldF9hbGxv Y2F0b3IoKTsKICAgIH0KCiAgcHJvdGVjdGVkOgogICAgdXNpbmcgX0J2ZWN0b3JfYmFzZTxfQWxs b2M+OjpfTV9iaXRfYWxsb2M7CiAgICB1c2luZyBfQnZlY3Rvcl9iYXNlPF9BbGxvYz46Ol9NX2Rl YWxsb2NhdGU7CiAgICB1c2luZyBfQnZlY3Rvcl9iYXNlPF9BbGxvYz46Ol9NX3N0YXJ0OwogICAg dXNpbmcgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+OjpfTV9maW5pc2g7CiAgICB1c2luZyBfQnZlY3Rv cl9iYXNlPF9BbGxvYz46Ol9NX2VuZF9vZl9zdG9yYWdlOwoKICBwcm90ZWN0ZWQ6CiAgICB2b2lk IF9NX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbikgewogICAgICB1bnNpZ25lZCBpbnQqIF9fcSA9 IF9NX2JpdF9hbGxvYyhfX24pOwogICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9fcSArIChfX24g KyBfX1dPUkRfQklUIC0gMSkvX19XT1JEX0JJVDsKICAgICAgX01fc3RhcnQgPSBpdGVyYXRvcihf X3EsIDApOwogICAgICBfTV9maW5pc2ggPSBfTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24p OwogICAgfQogICAgdm9pZCBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wg X194KSB7CiAgICAgIGlmIChfTV9maW5pc2guX01fcCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkgewog ICAgICAgIGNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgX01fZmluaXNoLCBfTV9maW5pc2ggKyAx KTsKICAgICAgICAqX19wb3NpdGlvbiA9IF9feDsKICAgICAgICArK19NX2ZpbmlzaDsKICAgICAg fQogICAgICBlbHNlIHsKICAgICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgPyAyICogc2l6 ZSgpIDogX19XT1JEX0JJVDsKICAgICAgICB1bnNpZ25lZCBpbnQqIF9fcSA9IF9NX2JpdF9hbGxv YyhfX2xlbik7CiAgICAgICAgaXRlcmF0b3IgX19pID0gY29weShiZWdpbigpLCBfX3Bvc2l0aW9u LCBpdGVyYXRvcihfX3EsIDApKTsKICAgICAgICAqX19pKysgPSBfX3g7CiAgICAgICAgX01fZmlu aXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKICAgICAgICBfTV9kZWFsbG9jYXRl KCk7CiAgICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyAoX19sZW4gKyBfX1dPUkRfQklU IC0gMSkvX19XT1JEX0JJVDsKICAgICAgICBfTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CiAg ICAgIH0KICAgIH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgICB2b2lk IF9NX2luaXRpYWxpemVfcmFuZ2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0 b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3Rh ZykgewogICAgICBfTV9zdGFydCA9IGl0ZXJhdG9yKCk7CiAgICAgIF9NX2ZpbmlzaCA9IGl0ZXJh dG9yKCk7CiAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gMDsKICAgICAgZm9yICggOyBfX2ZpcnN0 ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgICAgIHB1c2hfYmFjaygqX19maXJzdCk7CiAgICB9 CgogICAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CiAgICB2b2lkIF9NX2luaXRp YWxpemVfcmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9f bGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykg ewogICAgICBzaXplX3R5cGUgX19uID0gMDsKICAgICAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0 LCBfX24pOwogICAgICBfTV9pbml0aWFsaXplKF9fbik7CiAgICAgIGNvcHkoX19maXJzdCwgX19s YXN0LCBfTV9zdGFydCk7CiAgICB9CgogICAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9y PgogICAgdm9pZCBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3MsCiAgICAgICAgICAgICAg ICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3Qs CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpIHsKICAgICAgZm9y ICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CiAgICAgICAgX19wb3MgPSBpbnNl cnQoX19wb3MsICpfX2ZpcnN0KTsKICAgICAgICArK19fcG9zOwogICAgICB9CiAgICB9CgogICAg dGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CiAgICB2b2lkIF9NX2luc2VydF9yYW5n ZShpdGVyYXRvciBfX3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJ dGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICAgICAg ICAgICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKSB7CiAgICAgIGlmIChfX2ZpcnN0ICE9IF9f bGFzdCkgewogICAgICAgIHNpemVfdHlwZSBfX24gPSAwOwogICAgICAgIGRpc3RhbmNlKF9fZmly c3QsIF9fbGFzdCwgX19uKTsKICAgICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24p IHsKICAgICAgICAgIGNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksIF9NX2ZpbmlzaCAr IGRpZmZlcmVuY2VfdHlwZShfX24pKTsKICAgICAgICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBf X3Bvc2l0aW9uKTsKICAgICAgICAgIF9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsK ICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXpl KCkgKyBtYXgoc2l6ZSgpLCBfX24pOwogICAgICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSBfTV9i aXRfYWxsb2MoX19sZW4pOwogICAgICAgICAgaXRlcmF0b3IgX19pID0gY29weShiZWdpbigpLCBf X3Bvc2l0aW9uLCBpdGVyYXRvcihfX3EsIDApKTsKICAgICAgICAgIF9faSA9IGNvcHkoX19maXJz dCwgX19sYXN0LCBfX2kpOwogICAgICAgICAgX01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBl bmQoKSwgX19pKTsKICAgICAgICAgIF9NX2RlYWxsb2NhdGUoKTsKICAgICAgICAgIF9NX2VuZF9v Zl9zdG9yYWdlID0gX19xICsgKF9fbGVuICsgX19XT1JEX0JJVCAtIDEpL19fV09SRF9CSVQ7CiAg ICAgICAgICBfTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CiAgICAgICAgfQogICAgICB9CiAg ICB9CgogIHB1YmxpYzoKICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01fc3RhcnQ7IH0K ICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fc3RhcnQ7IH0KICAg IGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX2ZpbmlzaDsgfQogICAgY29uc3RfaXRlcmF0b3Ig ZW5kKCkgY29uc3QgeyByZXR1cm4gX01fZmluaXNoOyB9CgogICAgcmV2ZXJzZV9pdGVyYXRvciBy YmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQogICAgY29uc3RfcmV2 ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CiAgICAgIHJldHVybiBjb25zdF9yZXZlcnNl X2l0ZXJhdG9yKGVuZCgpKTsKICAgIH0KICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0 dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0 b3IgcmVuZCgpIGNvbnN0IHsKICAgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVn aW4oKSk7CiAgICB9CgogICAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5 cGUoZW5kKCkgLSBiZWdpbigpKTsgfQogICAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyBy ZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQogICAgc2l6ZV90eXBlIGNhcGFjaXR5KCkgY29uc3Qgewog ICAgICByZXR1cm4gc2l6ZV90eXBlKGNvbnN0X2l0ZXJhdG9yKF9NX2VuZF9vZl9zdG9yYWdlLCAw KSAtIGJlZ2luKCkpOwogICAgfQogICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGJlZ2lu KCkgPT0gZW5kKCk7IH0KCiAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKQog ICAgICB7IHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7IH0KICAgIGNv bnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CiAgICAgIHsgcmV0 dXJuICooYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsgfQoKICAgIHZvaWQgX01fcmFu Z2VfY2hlY2soc2l6ZV90eXBlIF9fbikgY29uc3QgewogICAgICBpZiAoX19uID49IHRoaXMtPnNp emUoKSkKICAgICAgICBfX3Rocm93X3JhbmdlX2Vycm9yKCJ2ZWN0b3I8Ym9vbD4iKTsKICAgIH0K CiAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbikKICAgICAgeyBfTV9yYW5nZV9jaGVjayhf X24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9CiAgICBjb25zdF9yZWZlcmVuY2UgYXQoc2l6ZV90 eXBlIF9fbikgY29uc3QKICAgICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlz KVtfX25dOyB9CgogICAgZXhwbGljaXQgdmVjdG9yKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2Eg PSBhbGxvY2F0b3JfdHlwZSgpKQogICAgICA6IF9CdmVjdG9yX2Jhc2U8X0FsbG9jPihfX2EpIHt9 CgogICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGJvb2wgX192YWx1ZSwKICAgICAgICAgICAgICBj b25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgICAgOiBfQnZl Y3Rvcl9iYXNlPF9BbGxvYz4oX19hKQogICAgewogICAgICBfTV9pbml0aWFsaXplKF9fbik7CiAg ICAgIGZpbGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIF9fdmFsdWUgPyB+MCA6 IDApOwogICAgfQoKICAgIGV4cGxpY2l0IHZlY3RvcihzaXplX3R5cGUgX19uKQogICAgICA6IF9C dmVjdG9yX2Jhc2U8X0FsbG9jPihhbGxvY2F0b3JfdHlwZSgpKQogICAgewogICAgICBfTV9pbml0 aWFsaXplKF9fbik7CiAgICAgIGZpbGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2Us IDApOwogICAgfQoKICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCkgOiBfQnZlY3Rvcl9iYXNl PF9BbGxvYz4oX194LmdldF9hbGxvY2F0b3IoKSkgewogICAgICBfTV9pbml0aWFsaXplKF9feC5z aXplKCkpOwogICAgICBjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9NX3N0YXJ0KTsKICAg IH0KCgoKICAgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KICAgIHZvaWQgX01faW5pdGlhbGl6 ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgX190cnVlX3R5cGUpIHsKICAg ICAgX01faW5pdGlhbGl6ZShfX24pOwogICAgICBmaWxsKF9NX3N0YXJ0Ll9NX3AsIF9NX2VuZF9v Zl9zdG9yYWdlLCBfX3ggPyB+MCA6IDApOwogICAgfQoKICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5w dXRJdGVyYXRvcj4KICAgIHZvaWQgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyYXRv ciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX19mYWxzZV90eXBlKSB7CiAgICAgIF9NX2luaXRpYWxpemVfcmFuZ2UoX19maXJz dCwgX19sYXN0LCBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKICAgIH0KCiAgICB0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19m aXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9y X3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCiAgICAgIDogX0J2ZWN0b3JfYmFzZTxfQWxs b2M+KF9fYSkKICAgIHsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNfaW50ZWdlcjxfSW5wdXRJ dGVyYXRvcj46Ol9JbnRlZ3JhbCBfSW50ZWdyYWw7CiAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0 Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CiAgICB9CgogICAgfnZlY3RvcigpIHsg fQoKICAgIHZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IHZlY3RvciYgX194KSB7CiAgICAgIGlmICgm X194ID09IHRoaXMpIHJldHVybiAqdGhpczsKICAgICAgaWYgKF9feC5zaXplKCkgPiBjYXBhY2l0 eSgpKSB7CiAgICAgICAgX01fZGVhbGxvY2F0ZSgpOwogICAgICAgIF9NX2luaXRpYWxpemUoX194 LnNpemUoKSk7CiAgICAgIH0KICAgICAgY29weShfX3guYmVnaW4oKSwgX194LmVuZCgpLCBiZWdp bigpKTsKICAgICAgX01fZmluaXNoID0gYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX3guc2l6 ZSgpKTsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKCgoKCgogICAgdm9pZCBfTV9maWxsX2Fz c2lnbihzaXplX3QgX19uLCBib29sIF9feCkgewogICAgICBpZiAoX19uID4gc2l6ZSgpKSB7CiAg ICAgICAgZmlsbChfTV9zdGFydC5fTV9wLCBfTV9lbmRfb2Zfc3RvcmFnZSwgX194ID8gfjAgOiAw KTsKICAgICAgICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX194KTsKICAgICAgfQogICAg ICBlbHNlIHsKICAgICAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7CiAgICAgICAgZmls bChfTV9zdGFydC5fTV9wLCBfTV9lbmRfb2Zfc3RvcmFnZSwgX194ID8gfjAgOiAwKTsKICAgICAg fQogICAgfQoKICAgIHZvaWQgYXNzaWduKHNpemVfdCBfX24sIGJvb2wgX194KSB7IF9NX2ZpbGxf YXNzaWduKF9fbiwgX194KTsgfQoKICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4K ICAgIHZvaWQgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9f bGFzdCkgewogICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9y Pjo6X0ludGVncmFsIF9JbnRlZ3JhbDsKICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3Qs IF9fbGFzdCwgX0ludGVncmFsKCkpOwogICAgfQoKICAgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdl cj4KICAgIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192 YWwsIF9fdHJ1ZV90eXBlKQogICAgICB7IF9NX2ZpbGxfYXNzaWduKChzaXplX3QpIF9fbiwgKGJv b2wpIF9fdmFsKTsgfQoKICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgogICAgdm9pZCBf TV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwg X19mYWxzZV90eXBlKQogICAgICB7IF9NX2Fzc2lnbl9hdXgoX19maXJzdCwgX19sYXN0LCBfX2l0 ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsgfQoKICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyYXRvcj4KICAgIHZvaWQgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBf SW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0 b3JfdGFnKSB7CiAgICAgIGl0ZXJhdG9yIF9fY3VyID0gYmVnaW4oKTsKICAgICAgZm9yICggOyBf X2ZpcnN0ICE9IF9fbGFzdCAmJiBfX2N1ciAhPSBlbmQoKTsgKytfX2N1ciwgKytfX2ZpcnN0KQog ICAgICAgICpfX2N1ciA9ICpfX2ZpcnN0OwogICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAg ICAgICAgZXJhc2UoX19jdXIsIGVuZCgpKTsKICAgICAgZWxzZQogICAgICAgIGluc2VydChlbmQo KSwgX19maXJzdCwgX19sYXN0KTsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJ dGVyYXRvcj4KICAgIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3Qs IF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRf aXRlcmF0b3JfdGFnKSB7CiAgICAgIHNpemVfdHlwZSBfX2xlbiA9IDA7CiAgICAgIGRpc3RhbmNl KF9fZmlyc3QsIF9fbGFzdCwgX19sZW4pOwogICAgICBpZiAoX19sZW4gPCBzaXplKCkpCiAgICAg ICAgZXJhc2UoY29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpLCBlbmQoKSk7CiAgICAgIGVs c2UgewogICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OwogICAgICAgIGFk dmFuY2UoX19taWQsIHNpemUoKSk7CiAgICAgICAgY29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4o KSk7CiAgICAgICAgaW5zZXJ0KGVuZCgpLCBfX21pZCwgX19sYXN0KTsKICAgICAgfQogICAgfQoK ICAgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgX19uKSB7CiAgICAgIGlmIChjYXBhY2l0eSgpIDwg X19uKSB7CiAgICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSBfTV9iaXRfYWxsb2MoX19uKTsKICAg ICAgICBfTV9maW5pc2ggPSBjb3B5KGJlZ2luKCksIGVuZCgpLCBpdGVyYXRvcihfX3EsIDApKTsK ICAgICAgICBfTV9kZWFsbG9jYXRlKCk7CiAgICAgICAgX01fc3RhcnQgPSBpdGVyYXRvcihfX3Es IDApOwogICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgKF9fbiArIF9fV09SRF9CSVQg LSAxKS9fX1dPUkRfQklUOwogICAgICB9CiAgICB9CgogICAgcmVmZXJlbmNlIGZyb250KCkgeyBy ZXR1cm4gKmJlZ2luKCk7IH0KICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0 dXJuICpiZWdpbigpOyB9CiAgICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZW5kKCkgLSAx KTsgfQogICAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7IHJldHVybiAqKGVuZCgpIC0g MSk7IH0KICAgIHZvaWQgcHVzaF9iYWNrKGJvb2wgX194KSB7CiAgICAgIGlmIChfTV9maW5pc2gu X01fcCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkKICAgICAgICAqX01fZmluaXNoKysgPSBfX3g7CiAg ICAgIGVsc2UKICAgICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBfX3gpOwogICAgfQogICAgdm9p ZCBzd2FwKHZlY3Rvcjxib29sLCBfQWxsb2M+JiBfX3gpIHsKICAgICAgc3RkOjpzd2FwKF9NX3N0 YXJ0LCBfX3guX01fc3RhcnQpOwogICAgICBzdGQ6OnN3YXAoX01fZmluaXNoLCBfX3guX01fZmlu aXNoKTsKICAgICAgc3RkOjpzd2FwKF9NX2VuZF9vZl9zdG9yYWdlLCBfX3guX01fZW5kX29mX3N0 b3JhZ2UpOwogICAgfQogICAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJv b2wgX194ID0gYm9vbCgpKSB7CiAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX3Bvc2l0aW9u IC0gYmVnaW4oKTsKICAgICAgaWYgKF9NX2ZpbmlzaC5fTV9wICE9IF9NX2VuZF9vZl9zdG9yYWdl ICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpCiAgICAgICAgKl9NX2ZpbmlzaCsrID0gX194OwogICAg ICBlbHNlCiAgICAgICAgX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBfX3gpOwogICAgICByZXR1 cm4gYmVnaW4oKSArIF9fbjsKICAgIH0KCgoKICAgIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4K ICAgIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24s IF9JbnRlZ2VyIF9feCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdHJ1ZV90eXBlKSB7 CiAgICAgIF9NX2ZpbGxfaW5zZXJ0KF9fcG9zLCBfX24sIF9feCk7CiAgICB9CgogICAgdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogICAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRl cmF0b3IgX19wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBf X2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfX2ZhbHNlX3R5cGUpIHsKICAgICAgX01faW5zZXJ0X3JhbmdlKF9fcG9zLCBfX2ZpcnN0LCBf X2xhc3QsIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOwogICAgfQoKICAgIHRlbXBsYXRl IDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICAgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRp b24sCiAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRv ciBfX2xhc3QpIHsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNfaW50ZWdlcjxfSW5wdXRJdGVy YXRvcj46Ol9JbnRlZ3JhbCBfSW50ZWdyYWw7CiAgICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3Bv c2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKICAgIH0KCiAgICB2b2lkIF9N X2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGJvb2wgX194 KSB7CiAgICAgIGlmIChfX24gPT0gMCkgcmV0dXJuOwogICAgICBpZiAoY2FwYWNpdHkoKSAtIHNp emUoKSA+PSBfX24pIHsKICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIGVuZCgpLCBf TV9maW5pc2ggKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CiAgICAgICAgZmlsbChfX3Bvc2l0aW9u LCBfX3Bvc2l0aW9uICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9feCk7CiAgICAgICAgX01fZmlu aXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAg IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSArIG1heChzaXplKCksIF9fbik7CiAgICAgICAgdW5z aWduZWQgaW50KiBfX3EgPSBfTV9iaXRfYWxsb2MoX19sZW4pOwogICAgICAgIGl0ZXJhdG9yIF9f aSA9IGNvcHkoYmVnaW4oKSwgX19wb3NpdGlvbiwgaXRlcmF0b3IoX19xLCAwKSk7CiAgICAgICAg ZmlsbF9uKF9faSwgX19uLCBfX3gpOwogICAgICAgIF9NX2ZpbmlzaCA9IGNvcHkoX19wb3NpdGlv biwgZW5kKCksIF9faSArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKICAgICAgICBfTV9kZWFsbG9j YXRlKCk7CiAgICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyAoX19sZW4gKyBfX1dPUkRf QklUIC0gMSkvX19XT1JEX0JJVDsKICAgICAgICBfTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7 CiAgICAgIH0KICAgIH0KCiAgICB2b2lkIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXpl X3R5cGUgX19uLCBib29sIF9feCkgewogICAgICBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBf X24sIF9feCk7CiAgICB9CgogICAgdm9pZCBwb3BfYmFjaygpIHsgLS1fTV9maW5pc2g7IH0KICAg IGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pIHsKICAgICAgaWYgKF9fcG9zaXRp b24gKyAxICE9IGVuZCgpKQogICAgICAgIGNvcHkoX19wb3NpdGlvbiArIDEsIGVuZCgpLCBfX3Bv c2l0aW9uKTsKICAgICAgICAtLV9NX2ZpbmlzaDsKICAgICAgcmV0dXJuIF9fcG9zaXRpb247CiAg ICB9CiAgICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3Qp IHsKICAgICAgX01fZmluaXNoID0gY29weShfX2xhc3QsIGVuZCgpLCBfX2ZpcnN0KTsKICAgICAg cmV0dXJuIF9fZmlyc3Q7CiAgICB9CiAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6 ZSwgYm9vbCBfX3ggPSBib29sKCkpIHsKICAgICAgaWYgKF9fbmV3X3NpemUgPCBzaXplKCkpCiAg ICAgICAgZXJhc2UoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXplKSwgZW5kKCkp OwogICAgICBlbHNlCiAgICAgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gc2l6ZSgpLCBf X3gpOwogICAgfQogICAgdm9pZCBmbGlwKCkgewogICAgICBmb3IgKHVuc2lnbmVkIGludCogX19w ID0gX01fc3RhcnQuX01fcDsgX19wICE9IF9NX2VuZF9vZl9zdG9yYWdlOyArK19fcCkKICAgICAg ICAqX19wID0gfipfX3A7CiAgICB9CgogICAgdm9pZCBjbGVhcigpIHsgZXJhc2UoYmVnaW4oKSwg ZW5kKCkpOyB9CiAgfTsKCgp0eXBlZGVmIHZlY3Rvcjxib29sLCBhbGxvYz4gYml0X3ZlY3RvcjsK Cn0KIyAzOSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX3ZlY3Rv ci5oIiAyIDMKIyA0NCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9j YWxlX2ZhY2V0cy50Y2MiIDIgMwoKCm5hbWVzcGFjZSBzdGQKewogIHRlbXBsYXRlPHR5cGVuYW1l IF9GYWNldD4KICAgIGxvY2FsZQogICAgbG9jYWxlOjpjb21iaW5lKGNvbnN0IGxvY2FsZSYgX19v dGhlcikKICAgIHsKICAgICAgbG9jYWxlIF9fY29weSgqdGhpcyk7CiAgICAgIF9fY29weS5fTV9p bXBsLT5fTV9yZXBsYWNlX2ZhY2V0KF9fb3RoZXIuX01faW1wbCwgJl9GYWNldDo6aWQpOwogICAg ICByZXR1cm4gX19jb3B5OwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVu YW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJvb2wKICAgIGxvY2FsZTo6b3BlcmF0 b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MxLAog ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMs IF9BbGxvYz4mIF9fczIpIGNvbnN0CiAgICB7CiAgICAgIHR5cGVkZWYgc3RkOjpjb2xsYXRlPF9D aGFyVD4gX19jb2xsYXRlX3R5cGU7CiAgICAgIGNvbnN0IF9fY29sbGF0ZV90eXBlKiBfX2Zjb2xs ID0gJnVzZV9mYWNldDxfX2NvbGxhdGVfdHlwZT4oKnRoaXMpOwogICAgICByZXR1cm4gKF9fZmNv bGwtPmNvbXBhcmUoX19zMS5kYXRhKCksIF9fczEuZGF0YSgpICsgX19zMS5sZW5ndGgoKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fczIuZGF0YSgpLCBfX3MyLmRhdGEoKSArIF9f czIubGVuZ3RoKCkpIDwgMCk7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KICAg IGNvbnN0IF9GYWNldCYKICAgIHVzZV9mYWNldChjb25zdCBsb2NhbGUmIF9fbG9jKQogICAgewog ICAgICB0eXBlZGVmIGxvY2FsZTo6X0ltcGw6Ol9fdmVjX2ZhY2V0IF9fdmVjX2ZhY2V0OwogICAg ICBzaXplX3QgX19pID0gX0ZhY2V0OjppZC5fTV9pbmRleDsKICAgICAgX192ZWNfZmFjZXQqIF9f ZmFjZXQgPSBfX2xvYy5fTV9pbXBsLT5fTV9mYWNldHM7CiAgICAgIGNvbnN0IGxvY2FsZTo6ZmFj ZXQqIF9fZnAgPSAoKl9fZmFjZXQpW19faV07CiAgICAgIGlmIChfX2ZwID09IDAgfHwgX19pID49 IF9fZmFjZXQtPnNpemUoKSkKICAgICAgICBfX3Rocm93X2JhZF9jYXN0KCk7CiAgICAgIHJldHVy biBzdGF0aWNfY2FzdDxjb25zdCBfRmFjZXQmPigqX19mcCk7CiAgICB9CgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9GYWNldD4KICAgIGJvb2wKICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmIF9fbG9j KSB0aHJvdygpCiAgICB7CiAgICAgIHR5cGVkZWYgbG9jYWxlOjpfSW1wbDo6X192ZWNfZmFjZXQg X192ZWNfZmFjZXQ7CiAgICAgIHNpemVfdCBfX2kgPSBfRmFjZXQ6OmlkLl9NX2luZGV4OwogICAg ICBfX3ZlY19mYWNldCogX19mYWNldCA9IF9fbG9jLl9NX2ltcGwtPl9NX2ZhY2V0czsKICAgICAg cmV0dXJuIChfX2kgPCBfX2ZhY2V0LT5zaXplKCkgJiYgKCpfX2ZhY2V0KVtfX2ldICE9IDApOwog ICAgfQoKCgoKCgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfQ2hhclQ+ CiAgICBfSW5JdGVyCiAgICBfX21hdGNoX3BhcmFsbGVsKF9Jbkl0ZXIgX19zLCBfSW5JdGVyIF9f ZW5kLCBpbnQgX19udGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3N0cmlu ZzxfQ2hhclQ+KiBfX3RhcmdldHMsCiAgICAgICAgICAgICAgICAgICAgIGludCogX19tYXRjaGVz LCBpbnQmIF9fcmVtYWluLCBib29sJiBfX2VvZikKICAgIHsKICAgICAgdHlwZWRlZiBiYXNpY19z dHJpbmc8X0NoYXJUPiBfX3N0cmluZ190eXBlOwogICAgICBfX2VvZiA9IGZhbHNlOwogICAgICBm b3IgKGludCBfX3RpID0gMDsgX190aSA8IF9fbnRhcmdzOyArK19fdGkpCiAgICAgICAgX19tYXRj aGVzW19fdGldID0gX190aTsKICAgICAgX19yZW1haW4gPSBfX250YXJnczsKICAgICAgc2l6ZV90 IF9fcG9zID0gMDsKICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICBpbnQgX190aSA9IDA7CiAg ICAgICAgICB3aGlsZSAoX190aSA8IF9fcmVtYWluICYmIF9fcG9zID09IF9fdGFyZ2V0c1tfX21h dGNoZXNbX190aV1dLnNpemUoKSkKICAgICAgICAgICAgKytfX3RpOwogICAgICAgICAgaWYgKF9f dGkgPT0gX19yZW1haW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoX19wb3MgPT0g MCkgX19yZW1haW4gPSAwOwogICAgICAgICAgICAgIHJldHVybiBfX3M7CiAgICAgICAgICAgIH0K ICAgICAgICAgIGlmIChfX3MgPT0gX19lbmQpCiAgICAgICAgICAgIF9fZW9mID0gdHJ1ZTsKICAg ICAgICAgIGJvb2wgX19tYXRjaGVkID0gZmFsc2U7CiAgICAgICAgICBmb3IgKGludCBfX3RpMiA9 IDA7IF9fdGkyIDwgX19yZW1haW47ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0 IF9fc3RyaW5nX3R5cGUmIF9fdGFyZ2V0ID0gX190YXJnZXRzW19fbWF0Y2hlc1tfX3RpMl1dOwog ICAgICAgICAgICAgIGlmIChfX3BvcyA8IF9fdGFyZ2V0LnNpemUoKSkKICAgICAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgICAgaWYgKF9fZW9mIHx8IF9fdGFyZ2V0W19fcG9zXSAhPSAqX19z KQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIF9fbWF0Y2hlc1tf X3RpMl0gPSBfX21hdGNoZXNbLS1fX3JlbWFpbl07CiAgICAgICAgICAgICAgICAgICAgICBjb250 aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIF9fbWF0Y2hlZCA9 IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgKytfX3RpMjsKICAgICAgICAg ICAgfQogICAgICAgICAgaWYgKF9fbWF0Y2hlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAg ICsrX19zOwogICAgICAgICAgICAgICsrX19wb3M7CiAgICAgICAgICAgIH0KICAgICAgICAgIGZv ciAoaW50IF9fdGkzID0gMDsgX190aTMgPCBfX3JlbWFpbjspCiAgICAgICAgICAgIHsKICAgICAg ICAgICAgICBpZiAoX19wb3MgPiBfX3RhcmdldHNbX19tYXRjaGVzW19fdGkzXV0uc2l6ZSgpKQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBfX21hdGNoZXNbX190aTNdID0gX19t YXRjaGVzWy0tX19yZW1haW5dOwogICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg ICAgICAgIH0KICAgICAgICAgICAgICArK19fdGkzOwogICAgICAgICAgICB9CiAgICAgICAgfQog ICAgICB3aGlsZSAoX19yZW1haW4pOwogICAgICByZXR1cm4gX19zOwogICAgfQoKICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICBfRm9ybWF0X2NhY2hlPF9DaGFyVD46Ol9Gb3JtYXRfY2Fj aGUoKQogICAgOiBfTV92YWxpZCh0cnVlKSwgX01fdXNlX2dyb3VwaW5nKGZhbHNlKQogICAgeyB9 CgogIHRlbXBsYXRlPD4KICAgIF9Gb3JtYXRfY2FjaGU8Y2hhcj46Ol9Gb3JtYXRfY2FjaGUoKTsK CiAgdGVtcGxhdGU8PgogICAgX0Zvcm1hdF9jYWNoZTx3Y2hhcl90Pjo6X0Zvcm1hdF9jYWNoZSgp OwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CiAgICB2b2lkCiAgICBfRm9ybWF0X2NhY2hl PF9DaGFyVD46Ol9NX3BvcHVsYXRlKGlvc19iYXNlJiBfX2lvKQogICAgewogICAgICBsb2NhbGUg X19sb2MgPSBfX2lvLmdldGxvYyAoKTsKICAgICAgbnVtcHVuY3Q8X0NoYXJUPiBjb25zdCYgX19u cCA9IHVzZV9mYWNldDxudW1wdW5jdDxfQ2hhclQ+ID4oX19sb2MpOwogICAgICBfTV90cnVlbmFt ZSA9IF9fbnAudHJ1ZW5hbWUoKTsKICAgICAgX01fZmFsc2VuYW1lID0gX19ucC5mYWxzZW5hbWUo KTsKICAgICAgX01fdGhvdXNhbmRzX3NlcCA9IF9fbnAudGhvdXNhbmRzX3NlcCgpOwogICAgICBf TV9kZWNpbWFsX3BvaW50ID0gX19ucC5kZWNpbWFsX3BvaW50KCk7CiAgICAgIF9NX2dyb3VwaW5n ID0gX19ucC5ncm91cGluZygpOwogICAgICBfTV91c2VfZ3JvdXBpbmcgPSBfTV9ncm91cGluZy5z aXplKCkgIT0gMCAmJiBfTV9ncm91cGluZy5kYXRhKClbMF0gIT0gMDsKICAgICAgX01fdmFsaWQg PSB0cnVlOwogICAgfQoKCgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KICAgIHZvaWQKICAg IF9Gb3JtYXRfY2FjaGU8X0NoYXJUPjo6CiAgICBfU19jYWxsYmFjayhpb3NfYmFzZTo6ZXZlbnQg X19ldiwgaW9zX2Jhc2UmIF9faW9zLCBpbnQgX19peCkgdGhyb3coKQogICAgewogICAgICB2b2lk KiYgX19wID0gX19pb3MucHdvcmQoX19peCk7CiAgICAgIHN3aXRjaCAoX19ldikKICAgICAgICB7 CiAgICAgICAgY2FzZSBpb3NfYmFzZTo6ZXJhc2VfZXZlbnQ6CiAgICAgICAgICBkZWxldGUgc3Rh dGljX2Nhc3Q8X0Zvcm1hdF9jYWNoZTxfQ2hhclQ+Kj4oX19wKTsKICAgICAgICAgIF9fcCA9IDA7 CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIGlvc19iYXNlOjpjb3B5Zm10X2V2ZW50OgoK ICAgICAgICAgIHRyeQogICAgICAgICAgICB7IF9fcCA9IG5ldyBfRm9ybWF0X2NhY2hlPF9DaGFy VD47IH0KICAgICAgICAgIGNhdGNoKC4uLikKICAgICAgICAgICAgeyB9CiAgICAgICAgICBicmVh azsKICAgICAgICBjYXNlIGlvc19iYXNlOjppbWJ1ZV9ldmVudDoKICAgICAgICAgIHN0YXRpY19j YXN0PF9Gb3JtYXRfY2FjaGU8X0NoYXJUPio+KF9fcCktPl9NX3ZhbGlkID0gZmFsc2U7CiAgICAg ICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4K ICAgIF9Gb3JtYXRfY2FjaGU8X0NoYXJUPioKICAgIF9Gb3JtYXRfY2FjaGU8X0NoYXJUPjo6X1Nf Z2V0KGlvc19iYXNlJiBfX2lvcykKICAgIHsKICAgICAgaWYgKCFfU19wd29yZF9peCkKICAgICAg ICBfU19wd29yZF9peCA9IGlvc19iYXNlOjp4YWxsb2MoKTsKICAgICAgdm9pZComIF9fcCA9IF9f aW9zLnB3b3JkKF9TX3B3b3JkX2l4KTsKCgogICAgICBpZiAoX19wID09IDApCiAgICAgICAgewog ICAgICAgICAgYXV0b19wdHI8X0Zvcm1hdF9jYWNoZTxfQ2hhclQ+ID4gX19hcChuZXcgX0Zvcm1h dF9jYWNoZTxfQ2hhclQ+KTsKICAgICAgICAgIF9faW9zLnJlZ2lzdGVyX2NhbGxiYWNrKCZfRm9y bWF0X2NhY2hlPF9DaGFyVD46Ol9TX2NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX1NfcHdvcmRfaXgpOwogICAgICAgICAgX19wID0gX19hcC5yZWxlYXNlKCk7CiAg ICAgICAgfQogICAgICBfRm9ybWF0X2NhY2hlPF9DaGFyVD4qIF9fbmNwID0gc3RhdGljX2Nhc3Q8 X0Zvcm1hdF9jYWNoZTxfQ2hhclQ+Kj4oX19wKTsKICAgICAgaWYgKCFfX25jcC0+X01fdmFsaWQp CiAgICAgICAgX19uY3AtPl9NX3BvcHVsYXRlKF9faW9zKTsKCiAgICAgIHJldHVybiBfX25jcDsK ICAgIH0KIyAyNTAgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2xvY2Fs ZV9mYWNldHMudGNjIiAzCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5J dGVyPgogICAgdm9pZAogICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKICAgIF9NX2V4dHJh Y3QoX0luSXRlciAsIF9Jbkl0ZXIgLCBpb3NfYmFzZSYgLAogICAgICAgICAgICAgICBpb3NfYmFz ZTo6aW9zdGF0ZSYgLCBjaGFyKiAsCiAgICAgICAgICAgICAgIGludCYgLCBib29sICkgY29uc3QK ICAgIHsKCiAgICB9CgogIHRlbXBsYXRlPD4KICAgIHZvaWQKICAgIG51bV9nZXQ8Y2hhciwgaXN0 cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPiA+OjoKICAgIF9NX2V4dHJhY3QoaXN0cmVhbWJ1Zl9pdGVy YXRvcjxjaGFyPiBfX2JlZywKICAgICAgICAgICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFy PiBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAgICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRl JiBfX2VyciwgY2hhciogX194dHJjLCBpbnQmIF9fYmFzZSwKICAgICAgICAgICAgICAgYm9vbCBf X2ZwKSBjb25zdDsKCgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0 ZXI+CiAgICBfSW5JdGVyCiAgICBudW1fZ2V0PF9DaGFyVCwgX0luSXRlcj46OgogICAgZG9fZ2V0 KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKICAgICAg ICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9fdikgY29uc3QKICAgIHsKCiAg ICAgIGlmICghKF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjpib29sYWxwaGEpKQogICAgICAgIHsK CgoKCgoKICAgICAgICAgIGNoYXIgX194dHJjWzMyXSA9IHsnXDAnfTsKICAgICAgICAgIGludCBf X2Jhc2U7CiAgICAgICAgICBfTV9leHRyYWN0KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9f eHRyYywgX19iYXNlLCBmYWxzZSk7CgoKICAgICAgICAgIGNoYXIqIF9fc2FuaXR5OwogICAgICAg ICAgKCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9IDA7CiAgICAgICAgICBsb25nIF9fbCA9IHN0cnRv bChfX3h0cmMsICZfX3Nhbml0eSwgX19iYXNlKTsKICAgICAgICAgIGlmICghKF9fZXJyICYgaW9z X2Jhc2U6OmZhaWxiaXQpCiAgICAgICAgICAgICAgJiYgX19sIDw9IDEKICAgICAgICAgICAgICAm JiBfX3Nhbml0eSAhPSBfX3h0cmMgJiYgKl9fc2FuaXR5ID09ICdcMCcgJiYgKCpfX2Vycm5vX2xv Y2F0aW9uICgpKSA9PSAwKQogICAgICAgICAgICBfX3YgPSBfX2w7CiAgICAgICAgICBlbHNlCiAg ICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OwogICAgICAgIH0KCgogICAgICBl bHNlCiAgICAgICAgewogICAgICAgICAgdHlwZWRlZiBfRm9ybWF0X2NhY2hlPGNoYXJfdHlwZT4g X19mY2FjaGVfdHlwZTsKICAgICAgICAgIF9fZmNhY2hlX3R5cGUqIF9fZm10ID0gX19mY2FjaGVf dHlwZTo6X1NfZ2V0KF9faW8pOwogICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX3RydWUgPSBf X2ZtdC0+X01fdHJ1ZW5hbWUuY19zdHIoKTsKICAgICAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19m YWxzZSA9IF9fZm10LT5fTV9mYWxzZW5hbWUuY19zdHIoKTsKICAgICAgICAgIGNvbnN0IHNpemVf dCBfX3RydWVsZW4gPSBfX3RyYWl0c190eXBlOjpsZW5ndGgoX190cnVlKSAtIDE7CiAgICAgICAg ICBjb25zdCBzaXplX3QgX19mYWxzZWxlbiA9IF9fdHJhaXRzX3R5cGU6Omxlbmd0aChfX2ZhbHNl KSAtIDE7CgogICAgICAgICAgZm9yIChzaXplX3QgX19wb3MgPSAwOyBfX2JlZyAhPSBfX2VuZDsg KytfX3BvcykKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2MgPSAqX19i ZWcrKzsKICAgICAgICAgICAgICBib29sIF9fdGVzdGYgPSBfX2MgPT0gX19mYWxzZVtfX3Bvc107 CiAgICAgICAgICAgICAgYm9vbCBfX3Rlc3R0ID0gX19jID09IF9fdHJ1ZVtfX3Bvc107CiAgICAg ICAgICAgICAgaWYgKCEoX190ZXN0ZiB8fCBfX3Rlc3R0KSkKICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CiAgICAgICAgICAgICAg ICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgaWYgKF9fdGVz dGYgJiYgX19wb3MgPT0gX19mYWxzZWxlbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgICAgX192ID0gMDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgZWxzZSBpZiAoX190ZXN0dCAmJiBfX3BvcyA9PSBfX3RydWVsZW4pCiAg ICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIF9fdiA9IDE7CiAgICAgICAgICAgICAg ICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBpZiAo X19iZWcgPT0gX19lbmQpCiAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CiAg ICAgICAgfQoKICAgICAgcmV0dXJuIF9fYmVnOwogICAgfQoKCgogIHRlbXBsYXRlPHR5cGVuYW1l IF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KICAgIF9Jbkl0ZXIKICAgIG51bV9nZXQ8X0NoYXJU LCBfSW5JdGVyPjo6CiAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQs IGlvc19iYXNlJiBfX2lvLAogICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc2hv cnQmIF9fdikgY29uc3QKICAgIHsKCgoKICAgICAgY2hhciBfX3h0cmNbMzJdPSB7J1wwJ307CiAg ICAgIGludCBfX2Jhc2U7CiAgICAgIF9NX2V4dHJhY3QoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2Vy ciwgX194dHJjLCBfX2Jhc2UsIGZhbHNlKTsKCgogICAgICBjaGFyKiBfX3Nhbml0eTsKICAgICAg KCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9IDA7CiAgICAgIGxvbmcgX19sID0gc3RydG9sKF9feHRy YywgJl9fc2FuaXR5LCBfX2Jhc2UpOwogICAgICBpZiAoIShfX2VyciAmIGlvc19iYXNlOjpmYWls Yml0KQogICAgICAgICAgJiYgX19zYW5pdHkgIT0gX194dHJjICYmICpfX3Nhbml0eSA9PSAnXDAn ICYmICgqX19lcnJub19sb2NhdGlvbiAoKSkgPT0gMAogICAgICAgICAgJiYgX19sID49ICgtMzI3 NjctMSkgJiYgX19sIDw9IDMyNzY3KQogICAgICAgIF9fdiA9IHN0YXRpY19jYXN0PHNob3J0Pihf X2wpOwogICAgICBlbHNlCiAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CgogICAg ICByZXR1cm4gX19iZWc7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5h bWUgX0luSXRlcj4KICAgIF9Jbkl0ZXIKICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CiAg ICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lv LAogICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgaW50JiBfX3YpIGNvbnN0CiAg ICB7CgoKCiAgICAgIGNoYXIgX194dHJjWzMyXSA9IHsnXDAnfTsKICAgICAgaW50IF9fYmFzZTsK ICAgICAgX01fZXh0cmFjdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3h0cmMsIF9fYmFz ZSwgZmFsc2UpOwoKCiAgICAgIGNoYXIqIF9fc2FuaXR5OwogICAgICAoKl9fZXJybm9fbG9jYXRp b24gKCkpID0gMDsKICAgICAgbG9uZyBfX2wgPSBzdHJ0b2woX194dHJjLCAmX19zYW5pdHksIF9f YmFzZSk7CiAgICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpCiAgICAgICAgICAm JiBfX3Nhbml0eSAhPSBfX3h0cmMgJiYgKl9fc2FuaXR5ID09ICdcMCcgJiYgKCpfX2Vycm5vX2xv Y2F0aW9uICgpKSA9PSAwCiAgICAgICAgICAmJiBfX2wgPj0gKC0yMTQ3NDgzNjQ3IC0xKSAmJiBf X2wgPD0gMjE0NzQ4MzY0NykKICAgICAgICBfX3YgPSBzdGF0aWNfY2FzdDxpbnQ+KF9fbCk7CiAg ICAgIGVsc2UKICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKCiAgICAgIHJldHVy biBfX2JlZzsKICAgIH0KCgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0lu SXRlcj4KICAgIF9Jbkl0ZXIKICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CiAgICBkb19n ZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAogICAg ICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyYgX192KSBjb25zdAogICAgewoK CgogICAgICBjaGFyIF9feHRyY1szMl09IHsnXDAnfTsKICAgICAgaW50IF9fYmFzZTsKICAgICAg X01fZXh0cmFjdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3h0cmMsIF9fYmFzZSwgZmFs c2UpOwoKCiAgICAgIGNoYXIqIF9fc2FuaXR5OwogICAgICAoKl9fZXJybm9fbG9jYXRpb24gKCkp ID0gMDsKICAgICAgbG9uZyBfX2wgPSBzdHJ0b2woX194dHJjLCAmX19zYW5pdHksIF9fYmFzZSk7 CiAgICAgIGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpCiAgICAgICAgICAmJiBfX3Nh bml0eSAhPSBfX3h0cmMgJiYgKl9fc2FuaXR5ID09ICdcMCcgJiYgKCpfX2Vycm5vX2xvY2F0aW9u ICgpKSA9PSAwKQogICAgICAgIF9fdiA9IF9fbDsKICAgICAgZWxzZQogICAgICAgIF9fZXJyIHw9 IGlvc19iYXNlOjpmYWlsYml0OwoKICAgICAgcmV0dXJuIF9fYmVnOwogICAgfQoKCiAgdGVtcGxh dGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgogICAgX0luSXRlcgogICAgbnVt X2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJf dHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUm IF9fZXJyLCBsb25nIGxvbmcmIF9fdikgY29uc3QKICAgIHsKCgoKICAgICAgY2hhciBfX3h0cmNb MzJdPSB7J1wwJ307CiAgICAgIGludCBfX2Jhc2U7CiAgICAgIF9NX2V4dHJhY3QoX19iZWcsIF9f ZW5kLCBfX2lvLCBfX2VyciwgX194dHJjLCBfX2Jhc2UsIGZhbHNlKTsKCgogICAgICBjaGFyKiBf X3Nhbml0eTsKICAgICAgKCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9IDA7CiAgICAgIGxvbmcgbG9u ZyBfX2xsID0gc3RydG9sbChfX3h0cmMsICZfX3Nhbml0eSwgX19iYXNlKTsKICAgICAgaWYgKCEo X19lcnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkKICAgICAgICAgICYmIF9fc2FuaXR5ICE9IF9feHRy YyAmJiAqX19zYW5pdHkgPT0gJ1wwJyAmJiAoKl9fZXJybm9fbG9jYXRpb24gKCkpID09IDApCiAg ICAgICAgX192ID0gX19sbDsKICAgICAgZWxzZQogICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjpm YWlsYml0OwoKICAgICAgcmV0dXJuIF9fYmVnOwogICAgfQoKCiAgdGVtcGxhdGU8dHlwZW5hbWUg X0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgogICAgX0luSXRlcgogICAgbnVtX2dldDxfQ2hhclQs IF9Jbkl0ZXI+OjoKICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwg aW9zX2Jhc2UmIF9faW8sCiAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNp Z25lZCBzaG9ydCYgX192KSBjb25zdAogICAgewoKCgogICAgICBjaGFyIF9feHRyY1szMl09IHsn XDAnfTsKICAgICAgaW50IF9fYmFzZTsKICAgICAgX01fZXh0cmFjdChfX2JlZywgX19lbmQsIF9f aW8sIF9fZXJyLCBfX3h0cmMsIF9fYmFzZSwgZmFsc2UpOwoKCiAgICAgIGNoYXIqIF9fc2FuaXR5 OwogICAgICAoKl9fZXJybm9fbG9jYXRpb24gKCkpID0gMDsKICAgICAgdW5zaWduZWQgbG9uZyBf X3VsID0gc3RydG91bChfX3h0cmMsICZfX3Nhbml0eSwgX19iYXNlKTsKICAgICAgaWYgKCEoX19l cnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkKICAgICAgICAgICYmIF9fc2FuaXR5ICE9IF9feHRyYyAm JiAqX19zYW5pdHkgPT0gJ1wwJyAmJiAoKl9fZXJybm9fbG9jYXRpb24gKCkpID09IDAKICAgICAg ICAgICYmIF9fdWwgPD0gNjU1MzUpCiAgICAgICAgX192ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQg c2hvcnQ+KF9fdWwpOwogICAgICBlbHNlCiAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxi aXQ7CgogICAgICByZXR1cm4gX19iZWc7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFy VCwgdHlwZW5hbWUgX0luSXRlcj4KICAgIF9Jbkl0ZXIKICAgIG51bV9nZXQ8X0NoYXJULCBfSW5J dGVyPjo6CiAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19i YXNlJiBfX2lvLAogICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQg aW50JiBfX3YpIGNvbnN0CiAgICB7CgoKCiAgICAgIGNoYXIgX194dHJjWzMyXT0geydcMCd9Owog ICAgICBpbnQgX19iYXNlOwogICAgICBfTV9leHRyYWN0KF9fYmVnLCBfX2VuZCwgX19pbywgX19l cnIsIF9feHRyYywgX19iYXNlLCBmYWxzZSk7CgoKICAgICAgY2hhciogX19zYW5pdHk7CiAgICAg ICgqX19lcnJub19sb2NhdGlvbiAoKSkgPSAwOwogICAgICB1bnNpZ25lZCBsb25nIF9fdWwgPSBz dHJ0b3VsKF9feHRyYywgJl9fc2FuaXR5LCBfX2Jhc2UpOwogICAgICBpZiAoIShfX2VyciAmIGlv c19iYXNlOjpmYWlsYml0KQogICAgICAgICAgJiYgX19zYW5pdHkgIT0gX194dHJjICYmICpfX3Nh bml0eSA9PSAnXDAnICYmICgqX19lcnJub19sb2NhdGlvbiAoKSkgPT0gMAogICAgICAgICAgJiYg X191bCA8PSAoMjE0NzQ4MzY0NyAqIDJVICsgMSkpCiAgICAgICAgX192ID0gc3RhdGljX2Nhc3Q8 dW5zaWduZWQgaW50PihfX3VsKTsKICAgICAgZWxzZQogICAgICAgIF9fZXJyIHw9IGlvc19iYXNl OjpmYWlsYml0OwoKICAgICAgcmV0dXJuIF9fYmVnOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CiAgICBfSW5JdGVyCiAgICBudW1fZ2V0PF9DaGFy VCwgX0luSXRlcj46OgogICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5k LCBpb3NfYmFzZSYgX19pbywKICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVu c2lnbmVkIGxvbmcmIF9fdikgY29uc3QKICAgIHsKCgoKICAgICAgY2hhciBfX3h0cmNbMzJdID0g eydcMCd9OwogICAgICBpbnQgX19iYXNlOwogICAgICBfTV9leHRyYWN0KF9fYmVnLCBfX2VuZCwg X19pbywgX19lcnIsIF9feHRyYywgX19iYXNlLCBmYWxzZSk7CgoKICAgICAgY2hhciogX19zYW5p dHk7CiAgICAgICgqX19lcnJub19sb2NhdGlvbiAoKSkgPSAwOwogICAgICB1bnNpZ25lZCBsb25n IF9fdWwgPSBzdHJ0b3VsKF9feHRyYywgJl9fc2FuaXR5LCBfX2Jhc2UpOwogICAgICBpZiAoIShf X2VyciAmIGlvc19iYXNlOjpmYWlsYml0KQogICAgICAgICAgJiYgX19zYW5pdHkgIT0gX194dHJj ICYmICpfX3Nhbml0eSA9PSAnXDAnICYmICgqX19lcnJub19sb2NhdGlvbiAoKSkgPT0gMCkKICAg ICAgICBfX3YgPSBfX3VsOwogICAgICBlbHNlCiAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZh aWxiaXQ7CgogICAgICByZXR1cm4gX19iZWc7CiAgICB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBf Q2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CiAgICBfSW5JdGVyCiAgICBudW1fZ2V0PF9DaGFyVCwg X0luSXRlcj46OgogICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBp b3NfYmFzZSYgX19pbywKICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2ln bmVkIGxvbmcgbG9uZyYgX192KSBjb25zdAogICAgewoKCgogICAgICBjaGFyIF9feHRyY1szMl09 IHsnXDAnfTsKICAgICAgaW50IF9fYmFzZTsKICAgICAgX01fZXh0cmFjdChfX2JlZywgX19lbmQs IF9faW8sIF9fZXJyLCBfX3h0cmMsIF9fYmFzZSwgZmFsc2UpOwoKCiAgICAgIGNoYXIqIF9fc2Fu aXR5OwogICAgICAoKl9fZXJybm9fbG9jYXRpb24gKCkpID0gMDsKICAgICAgdW5zaWduZWQgbG9u ZyBsb25nIF9fdWxsID0gc3RydG91bGwoX194dHJjLCAmX19zYW5pdHksIF9fYmFzZSk7CiAgICAg IGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpCiAgICAgICAgICAmJiBfX3Nhbml0eSAh PSBfX3h0cmMgJiYgKl9fc2FuaXR5ID09ICdcMCcgJiYgKCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9 PSAwKQogICAgICAgIF9fdiA9IF9fdWxsOwogICAgICBlbHNlCiAgICAgICAgX19lcnIgfD0gaW9z X2Jhc2U6OmZhaWxiaXQ7CgogICAgICByZXR1cm4gX19iZWc7CiAgICB9CgoKICB0ZW1wbGF0ZTx0 eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CiAgICBfSW5JdGVyCiAgICBudW1fZ2V0 PF9DaGFyVCwgX0luSXRlcj46OgogICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBl IF9fZW5kLCBpb3NfYmFzZSYgX19pbywKICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19l cnIsIGZsb2F0JiBfX3YpIGNvbnN0CiAgICB7CgoKCiAgICAgIGNoYXIgX194dHJjWzMyXT0geydc MCd9OwogICAgICBpbnQgX19iYXNlOwogICAgICBfTV9leHRyYWN0KF9fYmVnLCBfX2VuZCwgX19p bywgX19lcnIsIF9feHRyYywgX19iYXNlLCB0cnVlKTsKCgogICAgICBjaGFyKiBfX3Nhbml0eTsK ICAgICAgKCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9IDA7CgogICAgICBmbG9hdCBfX2YgPSBzdHJ0 b2YoX194dHJjLCAmX19zYW5pdHkpOwoKCgogICAgICBpZiAoIShfX2VyciAmIGlvc19iYXNlOjpm YWlsYml0KQogICAgICAgICAgJiYgX19zYW5pdHkgIT0gX194dHJjICYmICpfX3Nhbml0eSA9PSAn XDAnICYmICgqX19lcnJub19sb2NhdGlvbiAoKSkgPT0gMCkKICAgICAgICBfX3YgPSBfX2Y7CiAg ICAgIGVsc2UKICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKCiAgICAgIHJldHVy biBfX2JlZzsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5J dGVyPgogICAgX0luSXRlcgogICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKICAgIGRvX2dl dChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAgICAg ICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBkb3VibGUmIF9fdikgY29uc3QKICAgIHsK CgoKICAgICAgY2hhciBfX3h0cmNbMzJdPSB7J1wwJ307CiAgICAgIGludCBfX2Jhc2U7CiAgICAg IF9NX2V4dHJhY3QoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX194dHJjLCBfX2Jhc2UsIHRy dWUpOwoKCiAgICAgIGNoYXIqIF9fc2FuaXR5OwogICAgICAoKl9fZXJybm9fbG9jYXRpb24gKCkp ID0gMDsKICAgICAgZG91YmxlIF9fZCA9IHN0cnRvZChfX3h0cmMsICZfX3Nhbml0eSk7CiAgICAg IGlmICghKF9fZXJyICYgaW9zX2Jhc2U6OmZhaWxiaXQpCiAgICAgICAgICAmJiBfX3Nhbml0eSAh PSBfX3h0cmMgJiYgKl9fc2FuaXR5ID09ICdcMCcgJiYgKCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9 PSAwKQogICAgICAgIF9fdiA9IF9fZDsKICAgICAgZWxzZQogICAgICAgIF9fZXJyIHw9IGlvc19i YXNlOjpmYWlsYml0OwoKICAgICAgcmV0dXJuIF9fYmVnOwogICAgfQoKCiAgdGVtcGxhdGU8dHlw ZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgogICAgX0luSXRlcgogICAgbnVtX2dldDxf Q2hhclQsIF9Jbkl0ZXI+OjoKICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBf X2VuZCwgaW9zX2Jhc2UmIF9faW8sCiAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJy LCBsb25nIGRvdWJsZSYgX192KSBjb25zdAogICAgewoKCgogICAgICBjaGFyIF9feHRyY1szMl09 IHsnXDAnfTsKICAgICAgaW50IF9fYmFzZTsKICAgICAgX01fZXh0cmFjdChfX2JlZywgX19lbmQs IF9faW8sIF9fZXJyLCBfX3h0cmMsIF9fYmFzZSwgdHJ1ZSk7CgoKICAgICAgY2hhciogX19zYW5p dHk7CiAgICAgICgqX19lcnJub19sb2NhdGlvbiAoKSkgPSAwOwogICAgICBsb25nIGRvdWJsZSBf X2xkID0gc3RydG9sZChfX3h0cmMsICZfX3Nhbml0eSk7CiAgICAgIGlmICghKF9fZXJyICYgaW9z X2Jhc2U6OmZhaWxiaXQpCiAgICAgICAgICAmJiBfX3Nhbml0eSAhPSBfX3h0cmMgJiYgKl9fc2Fu aXR5ID09ICdcMCcgJiYgKCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9PSAwKQogICAgICAgIF9fdiA9 IF9fbGQ7CiAgICAgIGVsc2UKICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKCiAg ICAgIHJldHVybiBfX2JlZzsKICAgIH0KIyA2NzggIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRl L2crKy12My9iaXRzL2xvY2FsZV9mYWNldHMudGNjIiAzCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0No YXJULCB0eXBlbmFtZSBfSW5JdGVyPgogICAgX0luSXRlcgogICAgbnVtX2dldDxfQ2hhclQsIF9J bkl0ZXI+OjoKICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9z X2Jhc2UmIF9faW8sCiAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB2b2lkKiYg X192KSBjb25zdAogICAgewoKICAgICAgdHlwZWRlZiBpb3NfYmFzZTo6Zm10ZmxhZ3MgZm10Zmxh Z3M7CiAgICAgIGZtdGZsYWdzIF9fZm10ID0gX19pby5mbGFncygpOwogICAgICBmbXRmbGFncyBf X2ZtdG1hc2sgPSB+KGlvc19iYXNlOjpzaG93cG9zIHwgaW9zX2Jhc2U6OmJhc2VmaWVsZAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW9zX2Jhc2U6OnVwcGVyY2FzZSB8IGlvc19iYXNl OjppbnRlcm5hbCk7CiAgICAgIF9faW8uZmxhZ3MoX19mbXQgJiBfX2ZtdG1hc2sgfCAoaW9zX2Jh c2U6OmhleCB8IGlvc19iYXNlOjpzaG93YmFzZSkpOwoKCgoKICAgICAgY2hhciBfX3h0cmNbMzJd PSB7J1wwJ307CiAgICAgIGludCBfX2Jhc2U7CiAgICAgIF9NX2V4dHJhY3QoX19iZWcsIF9fZW5k LCBfX2lvLCBfX2VyciwgX194dHJjLCBfX2Jhc2UsIGZhbHNlKTsKCgogICAgICBjaGFyKiBfX3Nh bml0eTsKICAgICAgKCpfX2Vycm5vX2xvY2F0aW9uICgpKSA9IDA7CiAgICAgIHZvaWQqIF9fdnAg PSByZWludGVycHJldF9jYXN0PHZvaWQqPihzdHJ0b3VsKF9feHRyYywgJl9fc2FuaXR5LCBfX2Jh c2UpKTsKICAgICAgaWYgKCEoX19lcnIgJiBpb3NfYmFzZTo6ZmFpbGJpdCkKICAgICAgICAgICYm IF9fc2FuaXR5ICE9IF9feHRyYyAmJiAqX19zYW5pdHkgPT0gJ1wwJyAmJiAoKl9fZXJybm9fbG9j YXRpb24gKCkpID09IDApCiAgICAgICAgX192ID0gX192cDsKICAgICAgZWxzZQogICAgICAgIF9f ZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OwoKCiAgICAgIF9faW8uZmxhZ3MoX19mbXQpOwogICAg ICByZXR1cm4gX19iZWc7CiAgICB9CgoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBl bmFtZSBfT3V0SXRlcj4KICAgIGlubGluZSBfT3V0SXRlcgogICAgX19wYWQoX091dEl0ZXIgX19z LCBfQ2hhclQgX19maWxsLCBpbnQgX19wYWRkaW5nKTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIF9D aGFyVCwgdHlwZW5hbWUgX1JhSXRlcj4KICAgIF9SYUl0ZXIKICAgIF9fcGFkKF9SYUl0ZXIgX19z LCBfQ2hhclQgX19maWxsLCBpbnQgX19wYWRkaW5nLAogICAgICAgICAgcmFuZG9tX2FjY2Vzc19p dGVyYXRvcl90YWcpCiAgICB7CiAgICAgIGZpbGxfbihfX3MsIF9fZmlsbCk7CiAgICAgIHJldHVy biBfX3MgKyBfX3BhZGRpbmc7CiAgICB9CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBfQ2hhclQsIHR5 cGVuYW1lIF9PdXRJdGVyLCB0eXBlbmFtZSBfVGFnPgogICAgX091dEl0ZXIKICAgIF9fcGFkKF9P dXRJdGVyIF9fcywgX0NoYXJUIF9fZmlsbCwgaW50IF9fcGFkZGluZywgX1RhZykKICAgIHsKICAg ICAgd2hpbGUgKC0tX19wYWRkaW5nID49IDApIHsgKl9fcyA9IF9fZmlsbDsgKytfX3M7IH0KICAg ICAgcmV0dXJuIF9fczsKICAgIH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5h bWUgX091dEl0ZXI+CiAgICBpbmxpbmUgX091dEl0ZXIKICAgIF9fcGFkKF9PdXRJdGVyIF9fcywg X0NoYXJUIF9fZmlsbCwgaW50IF9fcGFkZGluZykKICAgIHsKICAgICAgcmV0dXJuIF9fcGFkKF9f cywgX19maWxsLCBfX3BhZGRpbmcsCiAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRv cl90cmFpdHM8X091dEl0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSgpKTsKICAgIH0KCiAgdGVtcGxh dGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CiAgICBfT3V0SXRlcgogICAg X19wYWRfbnVtZXJpYyhfT3V0SXRlciBfX3MsIGlvc19iYXNlOjpmbXRmbGFncyAsCiAgICAgICAg ICAgICAgICAgIF9DaGFyVCAsIGludCAsCiAgICAgICAgICAgICAgICAgIF9DaGFyVCBjb25zdCog LCBfQ2hhclQgY29uc3QqICwKICAgICAgICAgICAgICAgICAgX0NoYXJUIGNvbnN0KiApCiAgewoK ICAgICAgcmV0dXJuIF9fczsKICAgIH0KCgogIHRlbXBsYXRlIDx0eXBlbmFtZSBfQ2hhclQ+CiAg ICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4KICAgIF9fcGFkX251bWVyaWMob3N0cmVhbWJ1 Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fcywgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MsCiAgICAg ICAgICAgICAgICAgIF9DaGFyVCBfX2ZpbGwsIGludCBfX3dpZHRoLCBfQ2hhclQgY29uc3QqIF9f Zmlyc3QsCiAgICAgICAgICAgICAgICAgIF9DaGFyVCBjb25zdCogX19taWRkbGUsIF9DaGFyVCBj b25zdCogX19sYXN0KQogICAgewogICAgICB0eXBlZGVmIG9zdHJlYW1idWZfaXRlcmF0b3I8X0No YXJUPiBfX291dF9pdGVyOwogICAgICBpbnQgX19wYWRkaW5nID0gX193aWR0aCAtIChfX2xhc3Qg LSBfX2ZpcnN0KTsKICAgICAgaWYgKF9fcGFkZGluZyA8IDApCiAgICAgICAgX19wYWRkaW5nID0g MDsKICAgICAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fYWZsYWdzID0gX19mbGFncyAmIGlvc19iYXNl OjphZGp1c3RmaWVsZDsKICAgICAgYm9vbCBfX3Rlc3RmaWVsZCA9IF9fcGFkZGluZyA9PSAwIHx8 IF9fYWZsYWdzID09IGlvc19iYXNlOjpsZWZ0CiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBf X2FmbGFncyA9PSBpb3NfYmFzZTo6aW50ZXJuYWw7CgoKICAgICAgaWYgKF9fZmlyc3QgIT0gX19t aWRkbGUpCiAgICAgICAgewogICAgICAgICAgaWYgKCFfX3Rlc3RmaWVsZCkKICAgICAgICAgICAg ewogICAgICAgICAgICAgIF9fcGFkKF9fcywgX19maWxsLCBfX3BhZGRpbmcpOwogICAgICAgICAg ICAgIF9fcGFkZGluZyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNvcHkoX19maXJzdCwg X19taWRkbGUsIF9fcyk7CiAgICAgICAgfQogICAgICBfX291dF9pdGVyIF9fczIgPSBfX3M7Cgog ICAgICBpZiAoX19wYWRkaW5nICYmIF9fYWZsYWdzICE9IGlvc19iYXNlOjpsZWZ0KQogICAgICAg IHsKICAgICAgICAgIF9fcGFkKF9fczIsIF9fZmlsbCwgX19wYWRkaW5nKTsKICAgICAgICAgIF9f cGFkZGluZyA9IDA7CiAgICAgICAgfQogICAgICBfX291dF9pdGVyIF9fczMgPSBjb3B5KF9fbWlk ZGxlLCBfX2xhc3QsIF9fczIpOwogICAgICBpZiAoX19wYWRkaW5nKQogICAgICAgIF9fcGFkKF9f czMsIF9fZmlsbCwgX19wYWRkaW5nKTsKICAgICAgcmV0dXJuIF9fczM7CiAgICB9CgogIHRlbXBs YXRlIDx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgogICAgX091dEl0ZXIKICAg IG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgogICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlv c19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9fdikgY29uc3QKICAgIHsKICAg ICAgY29uc3QgX0Zvcm1hdF9jYWNoZTxfQ2hhclQ+KiBfX2ZtdCA9IF9Gb3JtYXRfY2FjaGU8X0No YXJUPjo6X1NfZ2V0KF9faW8pOwogICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9f aW8uZmxhZ3MoKTsKCiAgICAgIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjpib29sYWxwaGEpID09 IDApCiAgICAgICAgewogICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3V2ID0gX192OwogICAgICAg ICAgcmV0dXJuIF9fb3V0cHV0X2ludGVnZXIoX19zLCBfX2lvLCBfX2ZpbGwsIGZhbHNlLCBfX3V2 KTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBjb25zdCBjaGFyX3R5 cGUqIF9fZmlyc3Q7CiAgICAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fbGFzdDsKICAgICAgICAg IGlmIChfX3YpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBfX2ZpcnN0ID0gX19mbXQtPl9N X3RydWVuYW1lLmRhdGEoKTsKICAgICAgICAgICAgICBfX2xhc3QgPSBfX2ZpcnN0ICsgX19mbXQt Pl9NX3RydWVuYW1lLnNpemUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAg ICAgICB7CiAgICAgICAgICAgICAgX19maXJzdCA9IF9fZm10LT5fTV9mYWxzZW5hbWUuZGF0YSgp OwogICAgICAgICAgICAgIF9fbGFzdCA9IF9fZmlyc3QgKyBfX2ZtdC0+X01fZmFsc2VuYW1lLnNp emUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcyk7 CiAgICAgICAgfQogICAgICByZXR1cm4gX19zOwogICAgfQoKCgoKCiAgdGVtcGxhdGUgPHR5cGVu YW1lIF9DaGFyVD4KICAgIF9DaGFyVCoKICAgIF9fZ3JvdXBfZGlnaXRzKF9DaGFyVCogX19zLCBf Q2hhclQgX19ncnNlcCwgY2hhciBjb25zdCogX19ncm91cGluZywKICAgICAgICAgICAgICAgICAg ICBjaGFyIGNvbnN0KiBfX2dyZW5kLCBfQ2hhclQgY29uc3QqIF9fZmlyc3QsCiAgICAgICAgICAg ICAgICAgICAgX0NoYXJUIGNvbnN0KiBfX2xhc3QpCiAgICB7CiAgICAgIGlmIChfX2xhc3QgLSBf X2ZpcnN0ID4gKl9fZ3JvdXBpbmcpCiAgICAgICAgewogICAgICAgICAgX19zID0gX19ncm91cF9k aWdpdHMoX19zLCBfX2dyc2VwLAogICAgICAgICAgICAgIChfX2dyb3VwaW5nICsgMSA9PSBfX2dy ZW5kID8gX19ncm91cGluZyA6IF9fZ3JvdXBpbmcgKyAxKSwKICAgICAgICAgICAgICBfX2dyZW5k LCBfX2ZpcnN0LCBfX2xhc3QgLSAqX19ncm91cGluZyk7CiAgICAgICAgICBfX2ZpcnN0ID0gX19s YXN0IC0gKl9fZ3JvdXBpbmc7CiAgICAgICAgICAqX19zKysgPSBfX2dyc2VwOwogICAgICAgIH0K ICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAqX19zKysgPSAqX19maXJzdCsrOwogICAgICAg IH0KICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KTsKICAgICAgcmV0dXJuIF9fczsKICAg IH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXIsIHR5cGVu YW1lIF9WYWx1ZVQ+CiAgICBfT3V0SXRlcgogICAgX19vdXRwdXRfaW50ZWdlcihfT3V0SXRlciBf X3MsIGlvc19iYXNlJiBfX2lvLCBfQ2hhclQgX19maWxsLCBib29sIF9fbmVnLAogICAgICAgICAg ICAgIF9WYWx1ZVQgX192KQogICAgewoKICAgICAgY29uc3QgbG9uZyBfTV9yb29tID0gbnVtZXJp Y19saW1pdHM8X1ZhbHVlVD46OmRpZ2l0czEwICogMiArIDQ7CiAgICAgIF9DaGFyVCBfX2RpZ2l0 c1tfTV9yb29tXTsKICAgICAgX0NoYXJUKiBfX2Zyb250ID0gX19kaWdpdHMgKyBfTV9yb29tOwog ICAgICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faW8uZmxhZ3MoKTsKICAgICAgY29u c3QgX0Zvcm1hdF9jYWNoZTxfQ2hhclQ+KiBfX2ZtdCA9IF9Gb3JtYXRfY2FjaGU8X0NoYXJUPjo6 X1NfZ2V0KF9faW8pOwogICAgICBjaGFyIGNvbnN0KiBfX3RhYmxlID0gX19mbXQtPl9TX2xpdGVy YWxzICsgX19mbXQtPl9TX2RpZ2l0czsKCiAgICAgIGlvc19iYXNlOjpmbXRmbGFncyBfX2Jhc2Vm aWVsZCA9IChfX2ZsYWdzICYgX19pby5iYXNlZmllbGQpOwogICAgICBfQ2hhclQqIF9fc2lnbl9l bmQgPSBfX2Zyb250OwogICAgICBpZiAoX19iYXNlZmllbGQgPT0gaW9zX2Jhc2U6OmhleCkKICAg ICAgICB7CiAgICAgICAgICBpZiAoX19mbGFncyAmIGlvc19iYXNlOjp1cHBlcmNhc2UpCiAgICAg ICAgICAgIF9fdGFibGUgKz0gMTY7CiAgICAgICAgICBkbwogICAgICAgICAgICAqLS1fX2Zyb250 ID0gX190YWJsZVtfX3YgJiAxNV07CiAgICAgICAgICB3aGlsZSAoKF9fdiA+Pj0gNCkgIT0gMCk7 CiAgICAgICAgICBfX3NpZ25fZW5kID0gX19mcm9udDsKICAgICAgICAgIGlmIChfX2ZsYWdzICYg aW9zX2Jhc2U6OnNob3diYXNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgKi0tX19mcm9u dCA9IF9fZm10LT5fU19saXRlcmFsc1tfX2ZtdC0+X1NfeCArCiAgICAgICAgICAgICAgICAgICAg ICAgKChfX2ZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZSkgPyAxIDogMCldOwogICAgICAgICAg ICAgICotLV9fZnJvbnQgPSBfX3RhYmxlWzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAg ICBlbHNlIGlmIChfX2Jhc2VmaWVsZCA9PSBpb3NfYmFzZTo6b2N0KQogICAgICAgIHsKICAgICAg ICAgIGRvCiAgICAgICAgICAgICotLV9fZnJvbnQgPSBfX3RhYmxlW19fdiAmIDddOwogICAgICAg ICAgd2hpbGUgKChfX3YgPj49IDMpICE9IDApOwogICAgICAgICAgaWYgKF9fZmxhZ3MgJiBpb3Nf YmFzZTo6c2hvd2Jhc2UKICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxjaGFyPigqX19mcm9u dCkgIT0gX190YWJsZVswXSkKICAgICAgICAgICAgKi0tX19mcm9udCA9IF9fdGFibGVbMF07CiAg ICAgICAgICBfX3NpZ25fZW5kID0gX19mcm9udDsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAg ICB7CgogICAgICAgICAgZG8KICAgICAgICAgICAgKi0tX19mcm9udCA9IF9fdGFibGVbX192ICUg MTBdOwogICAgICAgICAgd2hpbGUgKChfX3YgLz0gMTApICE9IDApOwogICAgICAgICAgX19zaWdu X2VuZCA9IF9fZnJvbnQ7CgogICAgICAgICAgaWYgKF9fbmVnIHx8IChfX2ZsYWdzICYgaW9zX2Jh c2U6OnNob3dwb3MpKQogICAgICAgICAgICAqLS1fX2Zyb250ID0gX19mbXQtPl9TX2xpdGVyYWxz W19fZm10LT5fU19wbHVzIC0gX19uZWddOwogICAgICAgIH0KCgogICAgICBpZiAoIV9fZm10LT5f TV91c2VfZ3JvdXBpbmcgJiYgIV9faW8ud2lkdGgoKSkKICAgICAgICByZXR1cm4gY29weShfX2Zy b250LCBfX2RpZ2l0cyArIF9NX3Jvb20sIF9fcyk7CgogICAgICBpZiAoIV9fZm10LT5fTV91c2Vf Z3JvdXBpbmcpCiAgICAgICAgcmV0dXJuIF9fcGFkX251bWVyaWMoX19zLCBfX2ZsYWdzLCBfX2Zp bGwsIF9faW8ud2lkdGgoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mcm9udCwg X19zaWduX2VuZCwgX19kaWdpdHMgKyBfTV9yb29tKTsKCiAgICAgIF9DaGFyVCogX19wID0gX19k aWdpdHM7CiAgICAgIHdoaWxlIChfX2Zyb250IDwgX19zaWduX2VuZCkKICAgICAgICAqX19wKysg PSAqX19mcm9udCsrOwogICAgICBjb25zdCBjaGFyKiBfX2dyID0gX19mbXQtPl9NX2dyb3VwaW5n LmRhdGEoKTsKICAgICAgX19mcm9udCA9IF9fZ3JvdXBfZGlnaXRzKF9fcCwgX19mbXQtPl9NX3Ro b3VzYW5kc19zZXAsIF9fZ3IsCiAgICAgICAgX19nciArIF9fZm10LT5fTV9ncm91cGluZy5zaXpl KCksIF9fc2lnbl9lbmQsIF9fZGlnaXRzICsgX01fcm9vbSk7CiAgICAgIHJldHVybiBfX3BhZF9u dW1lcmljKF9fcywgX19mbGFncywgX19maWxsLCBfX2lvLndpZHRoKDApLAogICAgICAgICAgICAg ICAgICAgICAgICAgICBfX2RpZ2l0cywgX19wLCBfX2Zyb250KTsKICAgIH0KCiAgdGVtcGxhdGUg PHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CiAgICBfT3V0SXRlcgogICAgbnVt X3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CiAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jh c2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGxvbmcgX192KSBjb25zdAogICAgewogICAgICB1 bnNpZ25lZCBsb25nIF9fdXYgPSBfX3Y7CiAgICAgIGJvb2wgX19uZWcgPSBmYWxzZTsKICAgICAg aWYgKF9fdiA8IDApCiAgICAgICAgewogICAgICAgICAgX19uZWcgPSB0cnVlOwogICAgICAgICAg X191diA9IC1fX3V2OwogICAgICAgIH0KICAgICAgcmV0dXJuIF9fb3V0cHV0X2ludGVnZXIoX19z LCBfX2lvLCBfX2ZpbGwsIF9fbmVnLCBfX3V2KTsKICAgIH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1l IF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CiAgICBfT3V0SXRlcgogICAgbnVtX3B1dDxfQ2hh clQsIF9PdXRJdGVyPjo6CiAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8s IGNoYXJfdHlwZSBfX2ZpbGwsCiAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX3YpIGNvbnN0CiAg ICB7IHJldHVybiBfX291dHB1dF9pbnRlZ2VyKF9fcywgX19pbywgX19maWxsLCBmYWxzZSwgX192 KTsgfQoKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CiAg ICBfT3V0SXRlcgogICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CiAgICBkb19wdXQoaXRl cl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fYiwgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBsb25nIF9f dikgY29uc3QKICAgIHsKICAgICAgdW5zaWduZWQgbG9uZyBsb25nIF9fdXYgPSBfX3Y7CiAgICAg IGJvb2wgX19uZWcgPSBmYWxzZTsKICAgICAgaWYgKF9fdiA8IDApCiAgICAgICAgewogICAgICAg ICAgX19uZWcgPSB0cnVlOwogICAgICAgICAgX191diA9IC1fX3V2OwogICAgICAgIH0KICAgICAg cmV0dXJuIF9fb3V0cHV0X2ludGVnZXIoX19zLCBfX2IsIF9fZmlsbCwgX19uZWcsIF9fdXYpOwog ICAgfQoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KICAg IF9PdXRJdGVyCiAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKICAgIGRvX3B1dChpdGVy X3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKICAgICAgICAgICB1 bnNpZ25lZCBsb25nIGxvbmcgX192KSBjb25zdAogICAgeyByZXR1cm4gX19vdXRwdXRfaW50ZWdl cihfX3MsIF9faW8sIF9fZmlsbCwgZmFsc2UsIF9fdik7IH0KCgoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9PdXRJdGVyPgogICAgX091dEl0 ZXIKICAgIF9fb3V0cHV0X2Zsb2F0KF9PdXRJdGVyIF9fcywgaW9zX2Jhc2UmIF9faW8sIF9DaGFy VCBfX2ZpbGwsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19zcHRyLCBzaXplX3Qg X19zbGVuKQogICAgewoKICAgICAgcmV0dXJuIF9fczsKICAgIH0KCgogIHRlbXBsYXRlPHR5cGVu YW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0No YXJULCBfVHJhaXRzPgogICAgX19vdXRwdXRfZmxvYXQob3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hh clQsIF9UcmFpdHM+IF9fcywgaW9zX2Jhc2UmIF9faW8sCiAgICAgICAgICAgICAgICAgICBfQ2hh clQgX19maWxsLCBjb25zdCBjaGFyKiBfX3NwdHIsIHNpemVfdCBfX3NsZW4pCiAgICB7CiAgICAg IHNpemVfdCBfX3BhZGRpbmcgPSBfX2lvLndpZHRoKCkgPiBzdHJlYW1zaXplKF9fc2xlbikgPwog ICAgICAgICAgICAgICAgICAgICAgICAgX19pby53aWR0aCgpIC1fX3NsZW4gOiAwOwogICAgICBs b2NhbGUgX19sb2MgPSBfX2lvLmdldGxvYygpOwogICAgICBjdHlwZTxfQ2hhclQ+IGNvbnN0JiBf X2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CiAgICAgIGlvc19iYXNlOjpm bXRmbGFncyBfX2FkamZpZWxkID0gX19pby5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxk OwogICAgICBjb25zdCBjaGFyKiBjb25zdCBfX2VwdHIgPSBfX3NwdHIgKyBfX3NsZW47CgogICAg ICBpZiAoX19hZGpmaWVsZCA9PSBpb3NfYmFzZTo6aW50ZXJuYWwpCiAgICAgICB7CgogICAgICAg ICBpZiAoX19zcHRyIDwgX19lcHRyICYmICgqX19zcHRyID09ICcrJyB8fCAqX19zcHRyID09ICct JykpCiAgICAgICAgICAgewogICAgICAgICAgICAgX19zID0gX19jdC53aWRlbigqX19zcHRyKTsK ICAgICAgICAgICAgICsrX19zOwogICAgICAgICAgICAgKytfX3NwdHI7CiAgICAgICAgICAgfQog ICAgICAgICBfX3MgPSBfX3BhZChfX3MsIF9fZmlsbCwgX19wYWRkaW5nKTsKICAgICAgICAgX19w YWRkaW5nID0gMDsKICAgICAgIH0KICAgICAgZWxzZSBpZiAoX19hZGpmaWVsZCAhPSBpb3NfYmFz ZTo6bGVmdCkKICAgICAgICB7CiAgICAgICAgICBfX3MgPSBfX3BhZChfX3MsIF9fZmlsbCwgX19w YWRkaW5nKTsKICAgICAgICAgIF9fcGFkZGluZyA9IDA7CiAgICAgICAgfQoKICAgICAgY2hhciBf X2RlY2ltYWxfcG9pbnQgPSAqKGxvY2FsZWNvbnYoKS0+ZGVjaW1hbF9wb2ludCk7CiAgICAgIGNv bnN0IF9Gb3JtYXRfY2FjaGU8X0NoYXJUPiogX19mbXQgPSBfRm9ybWF0X2NhY2hlPF9DaGFyVD46 Ol9TX2dldChfX2lvKTsKICAgICAgZm9yICg7IF9fc3B0ciAhPSBfX2VwdHI7ICsrX19zLCArK19f c3B0cikKICAgICAgIHsKCiAgICAgICAgIGlmICgqX19zcHRyID09IF9fZGVjaW1hbF9wb2ludCkK ICAgICAgICAgICBfX3MgPSBfX2ZtdC0+X01fZGVjaW1hbF9wb2ludDsKCiAgICAgICAgIGVsc2UK ICAgICAgICAgICBfX3MgPSBfX2N0LndpZGVuKCpfX3NwdHIpOwogICAgICAgfQoKICAgICAgaWYg KF9fcGFkZGluZykKICAgICAgICBfX3BhZChfX3MsIF9fZmlsbCwgX19wYWRkaW5nKTsKICAgICAg X19pby53aWR0aCgwKTsKICAgICAgcmV0dXJuIF9fczsKICAgIH0KCiAgYm9vbAogIF9fYnVpbGRf ZmxvYXRfZm9ybWF0KGlvc19iYXNlJiBfX2lvLCBjaGFyKiBfX2ZwdHIsIGNoYXIgX19tb2RpZmll ciwKICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fcHJlYyk7CgogIHRlbXBsYXRl IDx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgogICAgX091dEl0ZXIKICAgIG51 bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgogICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19i YXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBkb3VibGUgX192KSBjb25zdAogICAgewogICAg ICBjb25zdCBzdHJlYW1zaXplIF9fbWF4X3ByZWMgPSBudW1lcmljX2xpbWl0czxkb3VibGU+Ojpk aWdpdHMxMCArIDM7CiAgICAgIHN0cmVhbXNpemUgX19wcmVjID0gX19pby5wcmVjaXNpb24oKTsK CiAgICAgIGlmIChfX3ByZWMgPiBfX21heF9wcmVjKQogICAgICAgIF9fcHJlYyA9IF9fbWF4X3By ZWM7CgogICAgICBjaGFyIF9fc2J1ZltfX21heF9wcmVjICogMl07CiAgICAgIHNpemVfdCBfX3Ns ZW47CgogICAgICBjaGFyIF9fZmJ1ZlsxNl07CiAgICAgIGlmIChfX2J1aWxkX2Zsb2F0X2Zvcm1h dChfX2lvLCBfX2ZidWYsIDAsIF9fcHJlYykpCiAgICAgICAgX19zbGVuID0gc3ByaW50ZihfX3Ni dWYsIF9fZmJ1ZiwgX19wcmVjLCBfX3YpOwogICAgICBlbHNlCiAgICAgICAgX19zbGVuID0gc3By aW50ZihfX3NidWYsIF9fZmJ1ZiwgX192KTsKCiAgICAgIHJldHVybiBfX291dHB1dF9mbG9hdChf X3MsIF9faW8sIF9fZmlsbCwgX19zYnVmLCBfX3NsZW4pOwogICAgfQoKICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KICAgIF9PdXRJdGVyCiAgICBudW1fcHV0 PF9DaGFyVCwgX091dEl0ZXI+OjoKICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYg X19pbywgY2hhcl90eXBlIF9fZmlsbCwKICAgICAgICAgICBsb25nIGRvdWJsZSBfX3YpIGNvbnN0 CiAgICB7CiAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19tYXhfcHJlYyA9IG51bWVyaWNfbGltaXRz PGxvbmcgZG91YmxlPjo6ZGlnaXRzMTAgKyAzOwogICAgICBzdHJlYW1zaXplIF9fcHJlYyA9IF9f aW8ucHJlY2lzaW9uKCk7CgogICAgICBpZiAoX19wcmVjID4gX19tYXhfcHJlYykKICAgICAgICBf X3ByZWMgPSBfX21heF9wcmVjOwoKICAgICAgY2hhciBfX3NidWZbX19tYXhfcHJlYyAqIDJdOwog ICAgICBzaXplX3QgX19zbGVuOwoKICAgICAgY2hhciBfX2ZidWZbMTZdOwoKICAgICAgaWYgKF9f YnVpbGRfZmxvYXRfZm9ybWF0KF9faW8sIF9fZmJ1ZiwgJ0wnLCBfX3ByZWMpKQogICAgICAgIF9f c2xlbiA9IHNwcmludGYoX19zYnVmLCBfX2ZidWYsIF9fcHJlYywgX192KTsKICAgICAgZWxzZQog ICAgICAgIF9fc2xlbiA9IHNwcmludGYoX19zYnVmLCBfX2ZidWYsIF9fdik7CgogICAgICByZXR1 cm4gX19vdXRwdXRfZmxvYXQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fc2J1ZiwgX19zbGVuKTsKICAg IH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CiAgICBf T3V0SXRlcgogICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CiAgICBkb19wdXQoaXRlcl90 eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCiAgICAgICAgICAgY29u c3Qgdm9pZCogX192KSBjb25zdAogICAgewogICAgICB0eXBlZGVmIGlvc19iYXNlOjpmbXRmbGFn cyBmbXRmbGFnczsKICAgICAgZm10ZmxhZ3MgX19mbXQgPSBfX2lvLmZsYWdzKCk7CiAgICAgIGZt dGZsYWdzIF9fZm10bWFzayA9IH4oaW9zX2Jhc2U6OnNob3dwb3MgfCBpb3NfYmFzZTo6YmFzZWZp ZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpb3NfYmFzZTo6dXBwZXJjYXNlIHwg aW9zX2Jhc2U6OmludGVybmFsKTsKICAgICAgX19pby5mbGFncyhfX2ZtdCAmIF9fZm10bWFzayB8 IChpb3NfYmFzZTo6aGV4IHwgaW9zX2Jhc2U6OnNob3diYXNlKSk7CiAgICAgIHRyeSB7CiAgICAg ICAgX091dEl0ZXIgX19zMiA9IF9fb3V0cHV0X2ludGVnZXIoX19zLCBfX2lvLCBfX2ZpbGwsIGZh bHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1 bnNpZ25lZCBsb25nPihfX3YpKTsKICAgICAgICBfX2lvLmZsYWdzKF9fZm10KTsKICAgICAgICBy ZXR1cm4gX19zMjsKICAgICAgfQogICAgICBjYXRjaCAoLi4uKSB7CiAgICAgICAgX19pby5mbGFn cyhfX2ZtdCk7CiAgICAgICAgdGhyb3c7CiAgICAgIH0KICAgIH0KCgoKCgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0R1bW15ID0gaW50PgogICAgc3RydWN0IF9XZWVrZGF5 bmFtZXM7CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9EdW1teT4KICAgIHN0cnVjdCBfV2Vla2RheW5h bWVzPGNoYXIsIF9EdW1teT4KICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IF9TX25hbWVz WzE0XTsgfTsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0R1bW15PgogICAgY29uc3QgY2hhciogY29u c3QKICAgIF9XZWVrZGF5bmFtZXM8Y2hhciwgX0R1bW15Pjo6X1NfbmFtZXNbMTRdID0KICAgIHsK ICAgICAgIlN1biIsICJTdW5kYXkiLAogICAgICAiTW9uIiwgIk1vbmRheSIsICJUdWUiLCAiVHVl c2RheSIsICJXZWQiLCAiV2VkbmVzZGF5IiwKICAgICAgIlRodSIsICJUaHVyc2RheSIsICJGcmki LCAiRnJpZGF5IiwgIlNhdCIsICJTYXR1cmRheSIKICAgIH07CiMgMTEzNSAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxlX2ZhY2V0cy50Y2MiIDMKICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9EdW1teSA9IGludD4KICAgIHN0cnVjdCBfTW9u dGhuYW1lczsKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0R1bW15PgogICAgc3RydWN0IF9Nb250aG5h bWVzPGNoYXIsX0R1bW15PgogICAgeyBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgX1NfbmFtZXNb MjRdOyB9OwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRHVtbXk+CiAgICBjb25zdCBjaGFyKiBjb25z dAogICAgX01vbnRobmFtZXM8Y2hhcixfRHVtbXk+OjpfU19uYW1lc1syNF0gPQogICAgewogICAg ICAiSmFuIiwgIkphbnVhcnkiLCAiRmViIiwgIkZlYnJ1YXJ5IiwgIk1hciIsICJNYXJjaCIsCiAg ICAgICJBcHIiLCAiQXByaWwiLCAiTWF5IiwgIk1heSIsICJKdW4iLCAiSnVuZSIsCiAgICAgICJK dWwiLCAiSnVseSIsICJBdWciLCAiQXVndXN0IiwgIlNlcCIsICJTZXB0ZW1iZXIiLAogICAgICAi T2N0IiwgIk9jdG9iZXIiLCAiTm92IiwgIk5vdmVtYmVyIiwgIkRlYyIsICJEZWNlbWJlciIKICAg IH07CiMgMTE2OCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvbG9jYWxl X2ZhY2V0cy50Y2MiIDMKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0 ZXI+CiAgICBfSW5JdGVyCiAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKICAgIGRvX2dl dF93ZWVrZGF5KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwKICAgICAgICAgICAgICAg ICAgIGlvc19iYXNlJiBfX2lvLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3QpIGNv bnN0CiAgICB7CiAgICAgIGlmICghX01fZGF5bmFtZXMpCiAgICAgICAgewogICAgICAgICAgX01f ZGF5bmFtZXMgPSBuZXcgYmFzaWNfc3RyaW5nPF9DaGFyVD5bMTRdOwogICAgICAgICAgZm9yIChp bnQgX19pID0gMDsgX19pIDwgMTQ7ICsrX19pKQogICAgICAgICAgICBfTV9kYXluYW1lc1tfX2ld ID0gX1dlZWtkYXluYW1lczxfQ2hhclQ+OjpfU19uYW1lc1tfX2ldOwogICAgICAgIH0KICAgICAg Ym9vbCBfX2F0X2VvZiA9IGZhbHNlOwogICAgICBpbnQgX19yZW1haW4gPSAwOwogICAgICBpbnQg X19tYXRjaGVzWzE0XTsKICAgICAgaXRlcl90eXBlIF9fb3V0ID0gX19tYXRjaF9wYXJhbGxlbChf X3MsIF9fZW5kLCAxNCwgX01fZGF5bmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX19tYXRjaGVzLCBfX3JlbWFpbiwgX19hdF9lb2YpOwogICAgICBfX2VyciA9 IGlvc19iYXNlOjppb3N0YXRlKDApOwogICAgICBpZiAoX19hdF9lb2YpIF9fZXJyIHw9IF9faW8u ZW9mYml0OwogICAgICBpZiAoX19yZW1haW4gPT0gMSB8fAogICAgICAgICAgX19yZW1haW4gPT0g MiAmJiAoX19tYXRjaGVzWzBdPj4xKSA9PSAoX19tYXRjaGVzWzFdPj4xKSkKICAgICAgICBfX3Qt PnRtX3dkYXkgPSAoX19tYXRjaGVzWzBdPj4xKTsKICAgICAgZWxzZQogICAgICAgIF9fZXJyIHw9 IF9faW8uZmFpbGJpdDsKICAgICAgcmV0dXJuIF9fb3V0OwogICAgfQoKICB0ZW1wbGF0ZTx0eXBl bmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CiAgICBfSW5JdGVyCiAgICB0aW1lX2dldDxf Q2hhclQsIF9Jbkl0ZXI+OjoKICAgIGRvX2dldF9tb250aG5hbWUoaXRlcl90eXBlIF9fcywgaXRl cl90eXBlIF9fZW5kLAogICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZSYgX19pbywgaW9zX2Jh c2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190KSBjb25zdAogICAgewogICAgICBpZiAoIV9NX21v bnRobmFtZXMpCiAgICAgICAgewogICAgICAgICAgX01fbW9udGhuYW1lcyA9IG5ldyBiYXNpY19z dHJpbmc8X0NoYXJUPlsyNF07CiAgICAgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCAyNDsg KytfX2kpCiAgICAgICAgICAgIF9NX21vbnRobmFtZXNbX19pXSA9IF9Nb250aG5hbWVzPF9DaGFy VD46Ol9TX25hbWVzW19faV07CiAgICAgICAgfQogICAgICBib29sIF9fYXRfZW9mID0gZmFsc2U7 CiAgICAgIGludCBfX3JlbWFpbiA9IDA7CiAgICAgIGludCBfX21hdGNoZXNbMjRdOwogICAgICBp dGVyX3R5cGUgX19vdXQgPSBfX21hdGNoX3BhcmFsbGVsKCBfX3MsIF9fZW5kLCAyNCwgX01fbW9u dGhuYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tYXRj aGVzLCBfX3JlbWFpbiwgX19hdF9lb2YpOwogICAgICBfX2VyciA9IGlvc19iYXNlOjppb3N0YXRl KDApOwogICAgICBpZiAoX19hdF9lb2YpIF9fZXJyIHw9IF9faW8uZW9mYml0OwogICAgICBpZiAo X19yZW1haW4gPT0gMSB8fAogICAgICAgICAgX19yZW1haW4gPT0gMiAmJiAoX19tYXRjaGVzWzBd Pj4xKSA9PSAoX19tYXRjaGVzWzFdPj4xKSkKICAgICAgICBfX3QtPnRtX21vbiA9IChfX21hdGNo ZXNbMF0+PjEpOwogICAgICBlbHNlCiAgICAgICAgX19lcnIgfD0gX19pby5mYWlsYml0OwogICAg ICByZXR1cm4gX19vdXQ7CiAgICB9Cn0KIyA0MiAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX2xvY2FsZS5oIiAyIDMKIyAzMyAiL3Vzci9sb2NhbC9nY2MtMy4wL2lu Y2x1ZGUvZysrLXYzL2JpdHMvb3N0cmVhbS50Y2MiIDIgMwoKbmFtZXNwYWNlIHN0ZAp7CiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVh bTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnk6OgogICAgc2VudHJ5KGJhc2ljX29zdHJlYW08X0No YXJULF9UcmFpdHM+JiBfX29zKQogICAgOiBfTV9vayhfX29zLmdvb2QoKSksIF9NX29zKF9fb3Mp CiAgICB7CgogICAgICBpZiAoX01fb2sgJiYgX19vcy50aWUoKSkKICAgICAgICBfX29zLnRpZSgp LT5mbHVzaCgpOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9U cmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBiYXNpY19vc3Ry ZWFtPF9DaGFyVCwgX1RyYWl0cz46OgogICAgb3BlcmF0b3I8PChfX29zdHJlYW1fdHlwZSYgKCpf X3BmKShfX29zdHJlYW1fdHlwZSYpKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsK ICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgeyBf X3BmKCp0aGlzKTsgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAg ICAgIHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwog ICAgICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkg IT0gMCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAg ICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5h bWUgX1RyYWl0cz4KICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2lj X29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBvcGVyYXRvcjw8KF9faW9zX3R5cGUmICgq X19wZikoX19pb3NfdHlwZSYpKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsKICAg ICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgeyBfX3Bm KCp0aGlzKTsgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAg IHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAg ICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0g MCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBy ZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUg X1RyYWl0cz4KICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX29z dHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBvcGVyYXRvcjw8KGlvc19iYXNlJiAoKl9fcGYp KGlvc19iYXNlJikpCiAgICB7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMpOwogICAgICBpZiAo X19jZXJiKQogICAgICAgIHsKICAgICAgICAgIHRyeQogICAgICAgICAgICB7IF9fcGYoKnRoaXMp OyB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoKCiAg ICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAg ICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAg ICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiAq dGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRz PgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfb3N0cmVhbTxf Q2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGJvb2wgX19uKQogICAgewogICAgICBzZW50cnkg X19jZXJiKCp0aGlzKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkK ICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChfTV9mbnVtcHV0 KSkKICAgICAgICAgICAgICAgIGlmIChfTV9mbnVtcHV0LT5wdXQoKnRoaXMsICp0aGlzLCB0aGlz LT5maWxsKCksIF9fbikuZmFpbGVkKCkpCiAgICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRl KGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRjaChleGNlcHRp b24mIF9fZmFpbCkKICAgICAgICAgICAgewoKCiAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUo aW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkg JiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAg ICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlw ZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQs IF9UcmFpdHM+JgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8 KGxvbmcgX19uKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsKICAgICAgaWYgKF9f Y2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAg IGNoYXJfdHlwZSBfX2MgPSB0aGlzLT5maWxsKCk7CiAgICAgICAgICAgICAgaW9zX2Jhc2U6OmZt dGZsYWdzIF9fZm10ID0gdGhpcy0+ZmxhZ3MoKSAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CiAgICAg ICAgICAgICAgaWYgKF9NX2NoZWNrX2ZhY2V0KF9NX2ZudW1wdXQpKQogICAgICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgICBib29sIF9fYiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBp ZiAoX19mbXQgJiBpb3NfYmFzZTo6b2N0IHx8IF9fZm10ICYgaW9zX2Jhc2U6OmhleCkKICAgICAg ICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIF9fbCA9 IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fbik7CiAgICAgICAgICAgICAgICAgICAgICBf X2IgPSBfTV9mbnVtcHV0LT5wdXQoKnRoaXMsICp0aGlzLCBfX2MsIF9fbCkuZmFpbGVkKCk7CiAg ICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAg ICAgICAgX19iID0gX01fZm51bXB1dC0+cHV0KCp0aGlzLCAqdGhpcywgX19jLCBfX24pLmZhaWxl ZCgpOwogICAgICAgICAgICAgICAgICBpZiAoX19iKQogICAgICAgICAgICAgICAgICAgIHRoaXMt PnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg ICB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoKCiAg ICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAg ICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAg ICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiAq dGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRz PgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfb3N0cmVhbTxf Q2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgX19uKQogICAgewogICAg ICBzZW50cnkgX19jZXJiKCp0aGlzKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAg ICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChf TV9mbnVtcHV0KSkKICAgICAgICAgICAgICAgIGlmIChfTV9mbnVtcHV0LT5wdXQoKnRoaXMsICp0 aGlzLCB0aGlzLT5maWxsKCksIF9fbikuZmFpbGVkKCkpCiAgICAgICAgICAgICAgICAgIHRoaXMt PnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRj aChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoKCiAgICAgICAgICAgICAgdGhpcy0+ c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgICAgaWYgKCh0aGlzLT5leGNl cHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3c7 CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX29zdHJl YW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6 b3BlcmF0b3I8PChsb25nIGxvbmcgX19uKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlz KTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAg ewogICAgICAgICAgICAgIGNoYXJfdHlwZSBfX2MgPSB0aGlzLT5maWxsKCk7CiAgICAgICAgICAg ICAgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZm10ID0gdGhpcy0+ZmxhZ3MoKSAmIGlvc19iYXNlOjpi YXNlZmllbGQ7CiAgICAgICAgICAgICAgaWYgKF9NX2NoZWNrX2ZhY2V0KF9NX2ZudW1wdXQpKQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBib29sIF9fYiA9IGZhbHNlOwogICAg ICAgICAgICAgICAgICBpZiAoX19mbXQgJiBpb3NfYmFzZTo6b2N0IHx8IF9fZm10ICYgaW9zX2Jh c2U6OmhleCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBsb25nIGxvbmcgX19sOwogICAgICAgICAgICAgICAgICAgICAgX19sID0gc3RhdGljX2Nh c3Q8dW5zaWduZWQgbG9uZyBsb25nPihfX24pOwogICAgICAgICAgICAgICAgICAgICAgX19iID0g X01fZm51bXB1dC0+cHV0KCp0aGlzLCAqdGhpcywgX19jLCBfX2wpLmZhaWxlZCgpOwogICAgICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAg IF9fYiA9IF9NX2ZudW1wdXQtPnB1dCgqdGhpcywgKnRoaXMsIF9fYywgX19uKS5mYWlsZWQoKTsK ICAgICAgICAgICAgICAgICAgaWYgKF9fYikKICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRz dGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQog ICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAg ICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgIGlm ICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAg ICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7 CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAg IGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX29zdHJlYW08X0NoYXJU LCBfVHJhaXRzPjo6b3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgX19uKQogICAgewogICAg ICBzZW50cnkgX19jZXJiKCp0aGlzKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAg ICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChf TV9mbnVtcHV0KSkKICAgICAgICAgICAgICAgIGlmIChfTV9mbnVtcHV0LT5wdXQoKnRoaXMsICp0 aGlzLCB0aGlzLT5maWxsKCksIF9fbikuZmFpbGVkKCkpCiAgICAgICAgICAgICAgICAgIHRoaXMt PnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRj aChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoKCiAgICAgICAgICAgICAgdGhpcy0+ c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgICAgaWYgKCh0aGlzLT5leGNl cHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3c7 CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX29zdHJl YW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6 b3BlcmF0b3I8PChkb3VibGUgX19uKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsK ICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewog ICAgICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChfTV9mbnVtcHV0KSkKICAgICAgICAgICAg ICAgIGlmIChfTV9mbnVtcHV0LT5wdXQoKnRoaXMsICp0aGlzLCB0aGlzLT5maWxsKCksIF9fbiku ZmFpbGVkKCkpCiAgICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRi aXQpOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAg ICAgICAgICAgewoKCiAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJp dCk7CiAgICAgICAgICAgICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFk Yml0KSAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9 CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0 eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAg YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpvcGVyYXRvcjw8KGxvbmcgZG91YmxlIF9f bikKICAgIHsKICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcyk7CiAgICAgIGlmIChfX2NlcmIpCiAg ICAgICAgewogICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoX01f Y2hlY2tfZmFjZXQoX01fZm51bXB1dCkpCiAgICAgICAgICAgICAgICBpZiAoX01fZm51bXB1dC0+ cHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLCBfX24pLmZhaWxlZCgpKQogICAgICAgICAg ICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgfQog ICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAg ICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgIGlm ICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAg ICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7 CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAg IGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX29zdHJlYW08X0NoYXJU LCBfVHJhaXRzPjo6b3BlcmF0b3I8PChjb25zdCB2b2lkKiBfX24pCiAgICB7CiAgICAgIHNlbnRy eSBfX2NlcmIoKnRoaXMpOwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAgICAgIHRy eQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKF9NX2NoZWNrX2ZhY2V0KF9NX2ZudW1w dXQpKQogICAgICAgICAgICAgICAgaWYgKF9NX2ZudW1wdXQtPnB1dCgqdGhpcywgKnRoaXMsIHRo aXMtPmZpbGwoKSwgX19uKS5mYWlsZWQoKSkKICAgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3Rh dGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhdGNoKGV4Y2Vw dGlvbiYgX19mYWlsKQogICAgICAgICAgICB7CgoKICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0 ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgICBpZiAoKHRoaXMtPmV4Y2VwdGlvbnMo KSAmIGlvc19iYXNlOjpiYWRiaXQpICE9IDApCiAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAg ICAgICAgfQogICAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICB0ZW1wbGF0ZTx0 eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPF9DaGFy VCwgX1RyYWl0cz4mCiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Om9wZXJhdG9y PDwoX19zdHJlYW1idWZfdHlwZSogX19zYmluKQogICAgewogICAgICBzdHJlYW1zaXplIF9feHRy Y3QgPSAwOwogICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3Nib3V0ID0gdGhpcy0+cmRidWYoKTsK ICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcyk7CiAgICAgIGlmIChfX3NiaW4gJiYgX19jZXJiKQog ICAgICAgIF9feHRyY3QgPSBfX2NvcHlfc3RyZWFtYnVmcygqdGhpcywgX19zYmluLCBfX3Nib3V0 KTsKICAgICAgaWYgKCFfX3NiaW4gfHwgIV9feHRyY3QpCiAgICAgICAgdGhpcy0+c2V0c3RhdGUo aW9zX2Jhc2U6OmZhaWxiaXQpOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRl PHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX29zdHJlYW08X0No YXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cHV0KGNo YXJfdHlwZSBfX2MpCiAgICB7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMpOwogICAgICBpZiAo X19jZXJiKQogICAgICAgIHsKICAgICAgICAgIGludF90eXBlIF9fcHV0ID0gcmRidWYoKS0+c3B1 dGMoX19jKTsKICAgICAgICAgIGlmIChfX3B1dCAhPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUo X19jKSkKICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAg ICAgfQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFy VCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYK ICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6d3JpdGUoY29uc3QgX0NoYXJUKiBf X3MsIHN0cmVhbXNpemUgX19uKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlzKTsKICAg ICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICBzdHJlYW1zaXplIF9fcHV0ID0gdGhp cy0+cmRidWYoKS0+c3B1dG4oX19zLCBfX24pOwogICAgICAgICAgaWYgKCBfX3B1dCAhPSBfX24p CiAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgIH0K ICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5 cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBi YXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmZsdXNoKCkKICAgIHsKICAgICAgc2VudHJ5 IF9fY2VyYigqdGhpcyk7CiAgICAgIGlmIChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgaWYg KHRoaXMtPnJkYnVmKCkgJiYgdGhpcy0+cmRidWYoKS0+cHVic3luYygpID09IC0xKQogICAgICAg ICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICB9CiAgICAgIHJl dHVybiAqdGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBf VHJhaXRzPgogICAgdHlwZW5hbWUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojpwb3Nf dHlwZQogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Ojp0ZWxscCgpCiAgICB7CiAg ICAgIHBvc190eXBlIF9fcmV0ID0gcG9zX3R5cGUoLTEpOwogICAgICBib29sIF9fdGVzdG9rID0g dGhpcy0+ZmFpbCgpICE9IHRydWU7CgogICAgICBpZiAoX190ZXN0b2spCiAgICAgICAgX19yZXQg PSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrb2ZmKDAsIGlvc19iYXNlOjpjdXIsIGlvc19iYXNlOjpv dXQpOwogICAgICByZXR1cm4gX19yZXQ7CiAgICB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hh clQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4m CiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnNlZWtwKHBvc190eXBlIF9fcG9z KQogICAgewogICAgICBib29sIF9fdGVzdG9rID0gdGhpcy0+ZmFpbCgpICE9IHRydWU7CgogICAg ICBpZiAoX190ZXN0b2spCiAgICAgICAgewoKCiAgICAgICAgICBwb3NfdHlwZSBfX2VyciA9IHRo aXMtPnJkYnVmKCktPnB1YnNlZWtwb3MoX19wb3MsIGlvc19iYXNlOjpvdXQpOwoKCiAgICAgICAg ICBpZiAoX19lcnIgPT0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKSkKICAgICAgICAgICAgdGhpcy0+ c2V0c3RhdGUoZmFpbGJpdCk7CgogICAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoK ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19v c3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0 cz46OgogICAgc2Vla3Aob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fZCkKICAg IHsKICAgICAgYm9vbCBfX3Rlc3RvayA9IHRoaXMtPmZhaWwoKSAhPSB0cnVlOwoKICAgICAgaWYg KF9fdGVzdG9rKQogICAgICAgIHsKCgogICAgICAgICAgcG9zX3R5cGUgX19lcnIgPSB0aGlzLT5y ZGJ1ZigpLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om91dCk7CgoKICAgICAgICAgIGlm IChfX2VyciA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQogICAgICAgICAgICB0aGlzLT5zZXRz dGF0ZShmYWlsYml0KTsKICAgICAgICB9CgogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiMgNDU3 ICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9vc3RyZWFtLnRjYyIgMwog IHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIHZvaWQKICAg IF9fcGFkX2NoYXIoYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4mIF9faW9zLAogICAgICAgICAg ICAgICBfQ2hhclQqIF9fbmV3cywgY29uc3QgX0NoYXJUKiBfX29sZHMsCiAgICAgICAgICAgICAg IGNvbnN0IHN0cmVhbXNpemUgX19uZXdsZW4sIGNvbnN0IHN0cmVhbXNpemUgX19vbGRsZW4pCiAg ICB7CiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKICAgICAgdHlwZWRlZiBfVHJhaXRz IHRyYWl0c190eXBlOwogICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlw ZSBpbnRfdHlwZTsKCiAgICAgIGludF90eXBlIF9fcGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4o X19uZXdsZW4gLSBfX29sZGxlbik7CiAgICAgIGNoYXJfdHlwZSogX19wYWRzID0gc3RhdGljX2Nh c3Q8Y2hhcl90eXBlKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoY2hhcl90eXBlKSAqIF9fcGxl bikpOwogICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fcGFkcywgX19wbGVuLCBfX2lvcy5maWxs KCkpOwoKICAgICAgY2hhcl90eXBlKiBfX2JlZzsKICAgICAgY2hhcl90eXBlKiBfX2VuZDsKICAg ICAgc2l6ZV90IF9fbW9kID0gMDsKICAgICAgc2l6ZV90IF9fYmVnbGVuOwogICAgICBpb3NfYmFz ZTo6Zm10ZmxhZ3MgX19mbXQgPSBfX2lvcy5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxk OwoKICAgICAgaWYgKF9fZm10ID09IGlvc19iYXNlOjpsZWZ0KQogICAgICAgIHsKCiAgICAgICAg ICBfX2JlZyA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19vbGRzKTsKICAgICAgICAgIF9fYmVn bGVuID0gX19vbGRsZW47CiAgICAgICAgICBfX2VuZCA9IF9fcGFkczsKICAgICAgICB9CiAgICAg IGVsc2UgaWYgKF9fZm10ID09IGlvc19iYXNlOjppbnRlcm5hbCkKICAgICAgICB7CgoKCiAgICAg ICAgICB0eXBlZGVmIF9Gb3JtYXRfY2FjaGU8X0NoYXJUPiBfX2NhY2hlX3R5cGU7CiAgICAgICAg ICBfX2NhY2hlX3R5cGUgY29uc3QqIF9fZm10ID0gX19jYWNoZV90eXBlOjpfU19nZXQoX19pb3Mp OwogICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX21pbnVzID0gdHJhaXRzX3R5cGU6OmZpbmQo X19vbGRzLCBfX29sZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9fZm10LT5fU19taW51cyk7CiAgICAgICAgICBjb25zdCBjaGFyX3R5 cGUqIF9fcGx1cyA9IHRyYWl0c190eXBlOjpmaW5kKF9fb2xkcywgX19vbGRsZW4sCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZm10LT5fU19w bHVzKTsKICAgICAgICAgIGJvb2wgX190ZXN0c2lnbiA9IF9fbWludXMgfHwgX19wbHVzOwogICAg ICAgICAgYm9vbCBfX3Rlc3RoZXggPSBfX29sZHNbMF0gPT0gJzAnCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICYmIChfX29sZHNbMV0gPT0gJ3gnIHx8IF9fb2xkc1sxXSA9PSAnWCcpOwoKICAg ICAgICAgIGlmIChfX3Rlc3RoZXgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBfX25ld3Nb MF0gPSBfX29sZHNbMF07CiAgICAgICAgICAgICAgX19uZXdzWzFdID0gX19vbGRzWzFdOwogICAg ICAgICAgICAgIF9fbW9kICs9IDI7CiAgICAgICAgICAgICAgX19iZWcgPSBjb25zdF9jYXN0PGNo YXJfdHlwZSo+KF9fb2xkcyArIF9fbW9kKTsKICAgICAgICAgICAgICBfX2JlZ2xlbiA9IF9fb2xk bGVuIC0gX19tb2Q7CiAgICAgICAgICAgICAgX19lbmQgPSBfX3BhZHM7CiAgICAgICAgICAgIH0K ICAgICAgICAgIGVsc2UgaWYgKF9fdGVzdHNpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICBfX21vZCArPSBfX3BsZW47CiAgICAgICAgICAgICAgY29uc3QgY2hhcl90eXBlKiBfX3NpZ24g PSBfX21pbnVzID8gX19taW51cyArIDE6IF9fcGx1cyArIDE7CiAgICAgICAgICAgICAgX19iZWcg PSBjb25zdF9jYXN0PGNoYXJfdHlwZSo+KF9fb2xkcyk7CiAgICAgICAgICAgICAgX19iZWdsZW4g PSBfX3NpZ24gLSBfX29sZHM7CiAgICAgICAgICAgICAgX19lbmQgPSBjb25zdF9jYXN0PGNoYXJf dHlwZSo+KF9fc2lnbiArIF9fcGxlbik7CiAgICAgICAgICAgICAgdHJhaXRzX3R5cGU6OmNvcHko X19uZXdzICsgX19iZWdsZW4sIF9fcGFkcywgX19wbGVuKTsKICAgICAgICAgICAgfQogICAgICAg ICAgZWxzZQogICAgICAgICAgICB7CgogICAgICAgICAgICAgIF9fYmVnID0gX19wYWRzOwogICAg ICAgICAgICAgIF9fYmVnbGVuID0gX19wbGVuOwogICAgICAgICAgICAgIF9fZW5kID0gY29uc3Rf Y2FzdDxjaGFyX3R5cGUqPihfX29sZHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBl bHNlCiAgICAgICAgewoKICAgICAgICAgIF9fYmVnID0gX19wYWRzOwogICAgICAgICAgX19iZWds ZW4gPSBfX3BsZW47CiAgICAgICAgICBfX2VuZCA9IGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX19v bGRzKTsKICAgICAgICB9CgogICAgICB0cmFpdHNfdHlwZTo6Y29weShfX25ld3MsIF9fYmVnLCBf X2JlZ2xlbik7CiAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fbmV3cyArIF9fYmVnbGVuLCBfX2Vu ZCwgX19uZXdsZW4gLSBfX2JlZ2xlbiAtIF9fbW9kKTsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5h bWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9U cmFpdHM+JgogICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9f b3V0LCBfQ2hhclQgX19jKQogICAgewogICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJU LCBfVHJhaXRzPiBfX29zdHJlYW1fdHlwZTsKICAgICAgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6 OnNlbnRyeSBfX2NlcmIoX19vdXQpOwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAg ICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgc3RyZWFtc2l6ZSBfX3cgPSBfX291 dC53aWR0aCgpOwogICAgICAgICAgICAgIF9DaGFyVCogX19wYWRzID0gc3RhdGljX2Nhc3Q8X0No YXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKSAqIF9fdykpOwogICAgICAgICAg ICAgIF9fcGFkc1swXSA9IF9fYzsKICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fbGVuID0gMTsK ICAgICAgICAgICAgICBpZiAoX193ID4gX19sZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgIF9fcGFkX2NoYXIoX19vdXQsIF9fcGFkcywgJl9fYywgX193LCBfX2xlbik7CiAg ICAgICAgICAgICAgICAgIF9fbGVuID0gX193OwogICAgICAgICAgICAgICAgfQogICAgICAgICAg ICAgIF9fb3V0LndyaXRlKF9fcGFkcywgX19sZW4pOwogICAgICAgICAgICAgIF9fb3V0LndpZHRo KDApOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAg ICAgICAgICAgewoKCiAgICAgICAgICAgICAgX19vdXQuc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJp dCk7CiAgICAgICAgICAgICAgaWYgKChfX291dC5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFk Yml0KSAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9 CiAgICAgIHJldHVybiBfX291dDsKICAgIH0KCgogIHRlbXBsYXRlIDxjbGFzcyBfVHJhaXRzPgog ICAgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0 cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIGNoYXIgX19jKQogICAgewogICAgICB0eXBlZGVm IGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4gX19vc3RyZWFtX3R5cGU7CiAgICAgIHR5cGVu YW1lIF9fb3N0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9fb3V0KTsKICAgICAgaWYgKF9fY2Vy YikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIHN0 cmVhbXNpemUgX193ID0gX19vdXQud2lkdGgoKTsKICAgICAgICAgICAgICBjaGFyKiBfX3BhZHMg PSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX3cgKyAxKSk7CiAgICAgICAg ICAgICAgX19wYWRzWzBdID0gX19jOwogICAgICAgICAgICAgIHN0cmVhbXNpemUgX19sZW4gPSAx OwogICAgICAgICAgICAgIGlmIChfX3cgPiBfX2xlbikKICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgX19wYWRfY2hhcihfX291dCwgX19wYWRzLCAmX19jLCBfX3csIF9fbGVuKTsK ICAgICAgICAgICAgICAgICAgX19sZW4gPSBfX3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgX19vdXQud3JpdGUoX19wYWRzLCBfX2xlbik7CiAgICAgICAgICAgICAgX19vdXQud2lk dGgoMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKQog ICAgICAgICAgICB7CgoKICAgICAgICAgICAgICBfX291dC5zZXRzdGF0ZShpb3NfYmFzZTo6YmFk Yml0KTsKICAgICAgICAgICAgICBpZiAoKF9fb3V0LmV4Y2VwdGlvbnMoKSAmIGlvc19iYXNlOjpi YWRiaXQpICE9IDApCiAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgfQogICAgICAg IH0KICAgICAgcmV0dXJuIF9fb3V0OwogICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJU LCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgog ICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25z dCBfQ2hhclQqIF9fcykKICAgIHsKICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwg X1RyYWl0cz4gX19vc3RyZWFtX3R5cGU7CiAgICAgIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjpz ZW50cnkgX19jZXJiKF9fb3V0KTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAg ICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIHN0cmVhbXNpemUgX193ID0gX19vdXQu d2lkdGgoKTsKICAgICAgICAgICAgICBfQ2hhclQqIF9fcGFkcyA9IHN0YXRpY19jYXN0PF9DaGFy VCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkgKiBfX3cpKTsKICAgICAgICAgICAg ICBzdHJlYW1zaXplIF9fbGVuID0gc3RhdGljX2Nhc3Q8c3RyZWFtc2l6ZT4oX1RyYWl0czo6bGVu Z3RoKF9fcykpOwogICAgICAgICAgICAgIGlmIChfX3cgPiBfX2xlbikKICAgICAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgICAgX19wYWRfY2hhcihfX291dCwgX19wYWRzLCBfX3MsIF9fdywg X19sZW4pOwogICAgICAgICAgICAgICAgICBfX3MgPSBfX3BhZHM7CiAgICAgICAgICAgICAgICAg IF9fbGVuID0gX193OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF9fb3V0LndyaXRl KF9fcywgX19sZW4pOwogICAgICAgICAgICAgIF9fb3V0LndpZHRoKDApOwogICAgICAgICAgICB9 CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoKCiAgICAg ICAgICAgICAgX19vdXQuc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgICAg aWYgKChfX291dC5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAgICAg ICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiBfX291 dDsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgog ICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgb3BlcmF0b3I8PChiYXNpY19v c3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCBjaGFyKiBfX3MpCiAgICB7CiAg ICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9fb3N0cmVhbV90eXBl OwoKCiAgICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj4gX19jdHJhaXRzX3R5cGU7CgogICAg ICB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX291dCk7CiAgICAgIGlm IChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgc2l6ZV90IF9fY2xlbiA9IF9fY3RyYWl0c190 eXBlOjpsZW5ndGgoX19zKTsKICAgICAgICAgIF9DaGFyVCogX193cyA9IHN0YXRpY19jYXN0PF9D aGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkgKiAoX19jbGVuICsgMSkpKTsK ICAgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8PSBfX2NsZW47ICsrX19pKQogICAg ICAgICAgICBfX3dzW19faV0gPSBfX291dC53aWRlbihfX3NbX19pXSk7CiAgICAgICAgICBfQ2hh clQqIF9fc3RyID0gX193czsKCiAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAg ICAgIHN0cmVhbXNpemUgX19sZW4gPSBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2NsZW4pOwog ICAgICAgICAgICAgIHN0cmVhbXNpemUgX193ID0gX19vdXQud2lkdGgoKTsKICAgICAgICAgICAg ICBfQ2hhclQqIF9fcGFkcyA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eo c2l6ZW9mKF9DaGFyVCkgKiBfX3cpKTsKCiAgICAgICAgICAgICAgaWYgKF9fdyA+IF9fbGVuKQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBfX3BhZF9jaGFyKF9fb3V0LCBfX3Bh ZHMsIF9fd3MsIF9fdywgX19sZW4pOwogICAgICAgICAgICAgICAgICBfX3N0ciA9IF9fcGFkczsK ICAgICAgICAgICAgICAgICAgX19sZW4gPSBfX3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgX19vdXQud3JpdGUoX19zdHIsIF9fbGVuKTsKICAgICAgICAgICAgICBfX291dC53aWR0 aCgwKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAg ICAgICAgICAgIHsKCgogICAgICAgICAgICAgIF9fb3V0LnNldHN0YXRlKGlvc19iYXNlOjpiYWRi aXQpOwogICAgICAgICAgICAgIGlmICgoX19vdXQuZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJh ZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAg fQogICAgICByZXR1cm4gX19vdXQ7CiAgICB9CgoKICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgog ICAgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0 cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19vdXQsIGNvbnN0IGNoYXIqIF9fcykKICAgIHsKICAgICAg dHlwZWRlZiBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+IF9fb3N0cmVhbV90eXBlOwogICAg ICB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX291dCk7CiAgICAgIGlm IChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICBzdHJlYW1zaXplIF9fdyA9IF9fb3V0LndpZHRoKCk7CiAgICAgICAgICAgICAgY2hhciog X19wYWRzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KF9fYnVpbHRpbl9hbGxvY2EoX193KSk7CiAgICAg ICAgICAgICAgc3RyZWFtc2l6ZSBfX2xlbiA9IHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9UcmFp dHM6Omxlbmd0aChfX3MpKTsKICAgICAgICAgICAgICBpZiAoX193ID4gX19sZW4pCiAgICAgICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICAgIF9fcGFkX2NoYXIoX19vdXQsIF9fcGFkcywgX19z LCBfX3csIF9fbGVuKTsKICAgICAgICAgICAgICAgICAgX19zID0gX19wYWRzOwogICAgICAgICAg ICAgICAgICBfX2xlbiA9IF9fdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfX291 dC53cml0ZShfX3MsIF9fbGVuKTsKICAgICAgICAgICAgICBfX291dC53aWR0aCgwKTsKICAgICAg ICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsK CgogICAgICAgICAgICAgIF9fb3V0LnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAg ICAgICAgIGlmICgoX19vdXQuZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkK ICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1 cm4gX19vdXQ7CiAgICB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9U cmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRz PiYKICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwK ICAgICAgICAgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9j PiYgX19zdHIpCiAgICB7CiAgICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFp dHM+IF9fb3N0cmVhbV90eXBlOwogICAgICB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6c2VudHJ5 IF9fY2VyYihfX291dCk7CiAgICAgIGlmIChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgY29u c3QgX0NoYXJUKiBfX3MgPSBfX3N0ci5kYXRhKCk7CiAgICAgICAgICBzdHJlYW1zaXplIF9fdyA9 IF9fb3V0LndpZHRoKCk7CiAgICAgICAgICBfQ2hhclQqIF9fcGFkcyA9IHN0YXRpY19jYXN0PF9D aGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkgKiBfX3cpKTsKICAgICAgICAg IHN0cmVhbXNpemUgX19sZW4gPSBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX3N0ci5zaXplKCkp OwoKCgogICAgICAgICAgaWYgKF9fdyA+IF9fbGVuKQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgX19wYWRfY2hhcihfX291dCwgX19wYWRzLCBfX3MsIF9fdywgX19sZW4pOwogICAgICAgICAg ICAgIF9fcyA9IF9fcGFkczsKICAgICAgICAgICAgICBfX2xlbiA9IF9fdzsKICAgICAgICAgICAg fQogICAgICAgICAgc3RyZWFtc2l6ZSBfX3JlcyA9IF9fb3V0LnJkYnVmKCktPnNwdXRuKF9fcywg X19sZW4pOwogICAgICAgICAgX19vdXQud2lkdGgoMCk7CiAgICAgICAgICBpZiAoX19yZXMgIT0g X19sZW4pCiAgICAgICAgICAgIF9fb3V0LnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKICAg ICAgICB9CiAgICAgIHJldHVybiBfX291dDsKICAgIH0KfQojIDI3OSAiL3Vzci9sb2NhbC9nY2Mt My4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX29zdHJlYW0uaCIgMiAzCiMgNDEgIi91c3IvbG9j YWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pb3N0cmVhbS5oIiAyIDMKIyAxICIv dXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaXN0cmVhbS5oIiAxIDMK IyAzOCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2lzdHJlYW0u aCIgMwoKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9z LmgiIDEgMwojIDQwICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRf aXN0cmVhbS5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvaTY4 Ni1wYy1saW51eC1nbnUvYml0cy9zdGRfbGltaXRzLmgiIDEgMwojIDQxICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaXN0cmVhbS5oIiAyIDMKCm5hbWVzcGFjZSBz dGQKewoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBj bGFzcyBiYXNpY19pc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1Ry YWl0cz4KICAgIHsKICAgIHB1YmxpYzoKCiAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsK ICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlwZTsKICAgICAg dHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSBwb3NfdHlwZTsKICAgICAgdHlwZWRl ZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKICAgICAgdHlwZWRlZiBfVHJh aXRzIHRyYWl0c190eXBlOwoKCiAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwg X1RyYWl0cz4gX19zdHJlYW1idWZfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19pb3M8X0NoYXJU LCBfVHJhaXRzPiBfX2lvc190eXBlOwogICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJU LCBfVHJhaXRzPiBfX2lzdHJlYW1fdHlwZTsKICAgICAgdHlwZWRlZiBpc3RyZWFtYnVmX2l0ZXJh dG9yPF9DaGFyVCwgX1RyYWl0cz4gX19pc3RyZWFtYnVmX2l0ZXI7CiAgICAgIHR5cGVkZWYgbnVt X2dldDxfQ2hhclQsIF9faXN0cmVhbWJ1Zl9pdGVyPiBfX251bWdldF90eXBlOwogICAgICB0eXBl ZGVmIGN0eXBlPF9DaGFyVD4gX19jdHlwZV90eXBlOwoKICAgIHByb3RlY3RlZDoKCiAgICAgIHN0 cmVhbXNpemUgX01fZ2NvdW50OwoKICAgIHB1YmxpYzoKCiAgICAgIGV4cGxpY2l0CiAgICAgIGJh c2ljX2lzdHJlYW0oX19zdHJlYW1idWZfdHlwZSogX19zYikKICAgICAgewogICAgICAgIHRoaXMt PmluaXQoX19zYik7CiAgICAgICAgX01fZ2NvdW50ID0gc3RyZWFtc2l6ZSgwKTsKICAgICAgfQoK ICAgICAgdmlydHVhbAogICAgICB+YmFzaWNfaXN0cmVhbSgpCiAgICAgIHsgX01fZ2NvdW50ID0g c3RyZWFtc2l6ZSgwKTsgfQoKCiAgICAgIGNsYXNzIHNlbnRyeTsKICAgICAgZnJpZW5kIGNsYXNz IHNlbnRyeTsKCgoKICAgICAgX19pc3RyZWFtX3R5cGUmCiAgICAgIG9wZXJhdG9yPj4oX19pc3Ry ZWFtX3R5cGUmICgqX19wZikoX19pc3RyZWFtX3R5cGUmKSk7CgogICAgICBfX2lzdHJlYW1fdHlw ZSYKICAgICAgb3BlcmF0b3I+PihfX2lvc190eXBlJiAoKl9fcGYpKF9faW9zX3R5cGUmKSk7Cgog ICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I+Pihpb3NfYmFzZSYgKCpfX3BmKShp b3NfYmFzZSYpKTsKCgogICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I+Pihib29s JiBfX24pOwoKICAgICAgX19pc3RyZWFtX3R5cGUmCiAgICAgIG9wZXJhdG9yPj4oc2hvcnQmIF9f bik7CgogICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBzaG9y dCYgX19uKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcj4+KGludCYgX19u KTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcj4+KHVuc2lnbmVkIGludCYg X19uKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcj4+KGxvbmcmIF9fbik7 CgogICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJiBf X24pOwoKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcj4+KGxvbmcgbG9uZyYg X19uKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcj4+KHVuc2lnbmVkIGxv bmcgbG9uZyYgX19uKTsKCgogICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I+Pihm bG9hdCYgX19mKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcj4+KGRvdWJs ZSYgX19mKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBvcGVyYXRvcj4+KGxvbmcgZG91 YmxlJiBfX2YpOwoKICAgICAgX19pc3RyZWFtX3R5cGUmCiAgICAgIG9wZXJhdG9yPj4odm9pZCom IF9fcCk7CgogICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgb3BlcmF0b3I+PihfX3N0cmVhbWJ1 Zl90eXBlKiBfX3NiKTsKCgogICAgICBpbmxpbmUgc3RyZWFtc2l6ZQogICAgICBnY291bnQodm9p ZCkgY29uc3QKICAgICAgeyByZXR1cm4gX01fZ2NvdW50OyB9CgogICAgICBpbnRfdHlwZQogICAg ICBnZXQodm9pZCk7CgogICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgZ2V0KGNoYXJfdHlwZSYg X19jKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBnZXQoY2hhcl90eXBlKiBfX3MsIHN0 cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kZWxpbSk7CgogICAgICBpbmxpbmUgX19pc3RyZWFt X3R5cGUmCiAgICAgIGdldChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCiAgICAgIHsg cmV0dXJuIGdldChfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CgogICAgICBfX2lzdHJl YW1fdHlwZSYKICAgICAgZ2V0KF9fc3RyZWFtYnVmX3R5cGUmIF9fc2IsIGNoYXJfdHlwZSBfX2Rl bGltKTsKCiAgICAgIGlubGluZSBfX2lzdHJlYW1fdHlwZSYKICAgICAgZ2V0KF9fc3RyZWFtYnVm X3R5cGUmIF9fc2IpCiAgICAgIHsgcmV0dXJuIGdldChfX3NiLCB0aGlzLT53aWRlbignXG4nKSk7 IH0KCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBz dHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOwoKICAgICAgaW5saW5lIF9faXN0cmVh bV90eXBlJgogICAgICBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKICAg ICAgeyByZXR1cm4gZ2V0bGluZShfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CgogICAg ICBfX2lzdHJlYW1fdHlwZSYKICAgICAgaWdub3JlKHN0cmVhbXNpemUgX19uID0gMSwgaW50X3R5 cGUgX19kZWxpbSA9IHRyYWl0c190eXBlOjplb2YoKSk7CgogICAgICBpbnRfdHlwZQogICAgICBw ZWVrKHZvaWQpOwoKICAgICAgX19pc3RyZWFtX3R5cGUmCiAgICAgIHJlYWQoY2hhcl90eXBlKiBf X3MsIHN0cmVhbXNpemUgX19uKTsKCiAgICAgIHN0cmVhbXNpemUKICAgICAgcmVhZHNvbWUoY2hh cl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAg ICBwdXRiYWNrKGNoYXJfdHlwZSBfX2MpOwoKICAgICAgX19pc3RyZWFtX3R5cGUmCiAgICAgIHVu Z2V0KHZvaWQpOwoKICAgICAgaW50CiAgICAgIHN5bmModm9pZCk7CgogICAgICBwb3NfdHlwZQog ICAgICB0ZWxsZyh2b2lkKTsKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAgICBzZWVrZyhwb3Nf dHlwZSk7CgogICAgICBfX2lzdHJlYW1fdHlwZSYKICAgICAgc2Vla2cob2ZmX3R5cGUsIGlvc19i YXNlOjpzZWVrZGlyKTsKCiAgICBwcml2YXRlOgoKCiAgICAgIF9faXN0cmVhbV90eXBlJgogICAg ICBvcGVyYXRvcj0oY29uc3QgX19pc3RyZWFtX3R5cGUmKTsKCiAgICAgIGJhc2ljX2lzdHJlYW0o Y29uc3QgX19pc3RyZWFtX3R5cGUmKTsKCiAgICB9OwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hh clQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBjbGFzcyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1Ry YWl0cz46OnNlbnRyeQogICAgewogICAgcHVibGljOgogICAgICB0eXBlZGVmIF9UcmFpdHMgdHJh aXRzX3R5cGU7CiAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4g X19zdHJlYW1idWZfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1Ry YWl0cz4gX19pc3RyZWFtX3R5cGU7CiAgICAgIHR5cGVkZWYgX19pc3RyZWFtX3R5cGU6Ol9fY3R5 cGVfdHlwZSBfX2N0eXBlX3R5cGU7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50 X3R5cGUgX19pbnRfdHlwZTsKCiAgICAgIGV4cGxpY2l0CiAgICAgIHNlbnRyeShiYXNpY19pc3Ry ZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGJvb2wgX19ub3NraXB3cyA9IGZhbHNlKTsKCiAg ICAgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiBfTV9vazsgfQoKICAgIHByaXZhdGU6CiAgICAg IGJvb2wgX01fb2s7CiAgICB9OwoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFt ZSBfVHJhaXRzPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgb3BlcmF0 b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sIF9DaGFyVCYgX19jKTsK CiAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0 cz4mCiAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW4sIHVu c2lnbmVkIGNoYXImIF9fYykKICAgIHsgcmV0dXJuIChfX2luID4+IHJlaW50ZXJwcmV0X2Nhc3Q8 Y2hhciY+KF9fYykpOyB9CgogIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CiAgICBiYXNpY19pc3Ry ZWFtPGNoYXIsIF9UcmFpdHM+JgogICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9U cmFpdHM+JiBfX2luLCBzaWduZWQgY2hhciYgX19jKQogICAgeyByZXR1cm4gKF9faW4gPj4gcmVp bnRlcnByZXRfY2FzdDxjaGFyJj4oX19jKSk7IH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJU LCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+Jgog ICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sIF9DaGFy VCogX19zKTsKCiAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08Y2hh cixfVHJhaXRzPiYKICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLF9UcmFpdHM+JiBf X2luLCB1bnNpZ25lZCBjaGFyKiBfX3MpCiAgICB7IHJldHVybiAoX19pbiA+PiByZWludGVycHJl dF9jYXN0PGNoYXIqPihfX3MpKTsgfQoKICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgogICAgYmFz aWNfaXN0cmVhbTxjaGFyLF9UcmFpdHM+JgogICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNo YXIsX1RyYWl0cz4mIF9faW4sIHNpZ25lZCBjaGFyKiBfX3MpCiAgICB7IHJldHVybiAoX19pbiA+ PiByZWludGVycHJldF9jYXN0PGNoYXIqPihfX3MpKTsgfQoKCiAgdGVtcGxhdGU8dHlwZW5hbWUg X0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgY2xhc3MgYmFzaWNfaW9zdHJlYW0KICAgIDog cHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiwKICAgICAgcHVibGljIGJhc2lj X29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgogICAgewogICAgcHVibGljOgoKICAgICAgdHlwZWRl ZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX19pc3RyZWFtX3R5cGU7CiAgICAgIHR5 cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IF9fb3N0cmVhbV90eXBlOwoKICAg ICAgZXhwbGljaXQKICAgICAgYmFzaWNfaW9zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwg X1RyYWl0cz4qIF9fc2IpCiAgICAgIDogX19pc3RyZWFtX3R5cGUoX19zYiksIF9fb3N0cmVhbV90 eXBlKF9fc2IpCiAgICAgIHsgfQoKICAgICAgdmlydHVhbAogICAgICB+YmFzaWNfaW9zdHJlYW0o KSB7IH0KICAgIH07CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFp dHM+CiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICB3cyhiYXNpY19pc3Ry ZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMpOwp9CgoKCgojIDEgIi91c3IvbG9jYWwvZ2NjLTMu MC9pbmNsdWRlL2crKy12My9iaXRzL2lzdHJlYW0udGNjIiAxIDMKIyAzMiAiL3Vzci9sb2NhbC9n Y2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvaXN0cmVhbS50Y2MiIDMKIyAxICIvdXNyL2xvY2Fs L2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfbG9jYWxlLmgiIDEgMwojIDMzICIvdXNy L2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9pc3RyZWFtLnRjYyIgMiAzCiMgMSAi L3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX29zdHJlYW0uaCIgMSAz CiMgMzQgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL2lzdHJlYW0udGNj IiAyIDMKCm5hbWVzcGFjZSBzdGQKewogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5h bWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5OjoK ICAgIHNlbnRyeShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sIGJvb2wgX19u b3NraXB3cykKICAgIHsKICAgICAgaWYgKF9faW4uZ29vZCgpKQogICAgICAgIHsKICAgICAgICAg IGlmIChfX2luLnRpZSgpKQogICAgICAgICAgICBfX2luLnRpZSgpLT5mbHVzaCgpOwogICAgICAg ICAgaWYgKCFfX25vc2tpcHdzICYmIChfX2luLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2tpcHdzKSkK ICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSB0cmFp dHNfdHlwZTo6ZW9mKCk7CiAgICAgICAgICAgICAgY29uc3QgX19jdHlwZV90eXBlKiBfX2N0eXBl ID0gX19pbi5fTV9nZXRfZmN0eXBlX2lvcygpOwogICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5 cGUqIF9fc2IgPSBfX2luLnJkYnVmKCk7CiAgICAgICAgICAgICAgX19pbnRfdHlwZSBfX2MgPSBf X3NiLT5zZ2V0YygpOwoKICAgICAgICAgICAgICB3aGlsZSAoX19jICE9IF9fZW9mICYmIF9fY3R5 cGUtPmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpKQogICAgICAgICAgICAgICAgX19jID0gX19z Yi0+c25leHRjKCk7CgoKCiAgICAgICAgICAgICAgaWYgKF9fYyA9PSBfX2VvZikKICAgICAgICAg ICAgICAgIF9faW4uc2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7CgogICAgICAgICAgICB9CiAg ICAgICAgfQoKICAgICAgaWYgKF9faW4uZ29vZCgpKQogICAgICAgIF9NX29rID0gdHJ1ZTsKICAg ICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIF9NX29rID0gZmFsc2U7CiAgICAgICAgICBfX2lu LnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKICAgICAgICB9CiAgICB9CgogIHRlbXBsYXRl PHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0No YXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBv cGVyYXRvcj4+KF9faXN0cmVhbV90eXBlJiAoKl9fcGYpKF9faXN0cmVhbV90eXBlJikpCiAgICB7 CiAgICAgIF9fcGYoKnRoaXMpOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRl PHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0No YXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBv cGVyYXRvcj4+KF9faW9zX3R5cGUmICgqX19wZikoX19pb3NfdHlwZSYpKQogICAgewogICAgICBf X3BmKCp0aGlzKTsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1Ry YWl0cz4mCiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgogICAgb3BlcmF0b3I+ Pihpb3NfYmFzZSYgKCpfX3BmKShpb3NfYmFzZSYpKQogICAgewogICAgICBfX3BmKCp0aGlzKTsK ICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5 cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBi YXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgogICAgb3BlcmF0b3I+Pihib29sJiBfX24p CiAgICB7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIGZhbHNlKTsKICAgICAgaWYgKF9fY2Vy YikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlv c19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omlvc3RhdGUoaW9zX2Jhc2U6Omdvb2Ri aXQpOwogICAgICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChfTV9mbnVtZ2V0KSkKICAgICAg ICAgICAgICAgIF9NX2ZudW1nZXQtPmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX24pOwog ICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKICAgICAgICAgICAgfQogICAgICAg ICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAgICAgICAg IHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgIGlmICgodGhp cy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAg IHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9 CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2lj X2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJh aXRzPjo6CiAgICBvcGVyYXRvcj4+KHNob3J0JiBfX24pCiAgICB7CiAgICAgIHNlbnRyeSBfX2Nl cmIoKnRoaXMsIGZhbHNlKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0 cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0g aW9zX2Jhc2U6Omlvc3RhdGUoaW9zX2Jhc2U6Omdvb2RiaXQpOwogICAgICAgICAgICAgIGlmIChf TV9jaGVja19mYWNldChfTV9mbnVtZ2V0KSkKICAgICAgICAgICAgICAgIF9NX2ZudW1nZXQtPmdl dCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX24pOwogICAgICAgICAgICAgIHRoaXMtPnNldHN0 YXRlKF9fZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2Zh aWwpCiAgICAgICAgICAgIHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNl OjpiYWRiaXQpOwogICAgICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jh c2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAg ICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9D aGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRz PiYKICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBvcGVyYXRvcj4+KHVu c2lnbmVkIHNob3J0JiBfX24pCiAgICB7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIGZhbHNl KTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAg ewogICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omlvc3Rh dGUoaW9zX2Jhc2U6Omdvb2RiaXQpOwogICAgICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChf TV9mbnVtZ2V0KSkKICAgICAgICAgICAgICAgIF9NX2ZudW1nZXQtPmdldCgqdGhpcywgMCwgKnRo aXMsIF9fZXJyLCBfX24pOwogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKICAg ICAgICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAg IHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAg ICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0g MCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBy ZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUg X1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lz dHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBvcGVyYXRvcj4+KGludCYgX19uKQogICAgewog ICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCBmYWxzZSk7CiAgICAgIGlmIChfX2NlcmIpCiAgICAg ICAgewogICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpb3NfYmFzZTo6 aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjppb3N0YXRlKGlvc19iYXNlOjpnb29kYml0KTsKICAg ICAgICAgICAgICBpZiAoX01fY2hlY2tfZmFjZXQoX01fZm51bWdldCkpCiAgICAgICAgICAgICAg ICBfTV9mbnVtZ2V0LT5nZXQoKnRoaXMsIDAsICp0aGlzLCBfX2VyciwgX19uKTsKICAgICAgICAg ICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhdGNo KGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAgICB7CgoKICAgICAgICAgICAgICB0aGlzLT5z ZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgICBpZiAoKHRoaXMtPmV4Y2Vw dGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQpICE9IDApCiAgICAgICAgICAgICAgICB0aHJvdzsK ICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICB0ZW1w bGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19pc3RyZWFt PF9DaGFyVCwgX1RyYWl0cz4mCiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ogog ICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBpbnQmIF9fbikKICAgIHsKICAgICAgc2VudHJ5IF9fY2Vy YigqdGhpcywgZmFsc2UpOwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAgICAgIHRy eQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBp b3NfYmFzZTo6aW9zdGF0ZShpb3NfYmFzZTo6Z29vZGJpdCk7CiAgICAgICAgICAgICAgaWYgKF9N X2NoZWNrX2ZhY2V0KF9NX2ZudW1nZXQpKQogICAgICAgICAgICAgICAgX01fZm51bWdldC0+Z2V0 KCp0aGlzLCAwLCAqdGhpcywgX19lcnIsIF9fbik7CiAgICAgICAgICAgICAgdGhpcy0+c2V0c3Rh dGUoX19lcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFp bCkKICAgICAgICAgICAgewoKCiAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6 OmJhZGJpdCk7CiAgICAgICAgICAgICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkgJiBpb3NfYmFz ZTo6YmFkYml0KSAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0No YXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ JgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKICAgIG9wZXJhdG9yPj4obG9u ZyYgX19uKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCBmYWxzZSk7CiAgICAgIGlm IChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjppb3N0YXRlKGlvc19iYXNl Ojpnb29kYml0KTsKICAgICAgICAgICAgICBpZiAoX01fY2hlY2tfZmFjZXQoX01fZm51bWdldCkp CiAgICAgICAgICAgICAgICBfTV9mbnVtZ2V0LT5nZXQoKnRoaXMsIDAsICp0aGlzLCBfX2Vyciwg X19uKTsKICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CiAgICAgICAgICAgIH0K ICAgICAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAgICB7CgoKICAgICAg ICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgICBp ZiAoKHRoaXMtPmV4Y2VwdGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQpICE9IDApCiAgICAgICAg ICAgICAgICB0aHJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgcmV0dXJuICp0aGlz OwogICAgfQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAg ICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBiYXNpY19pc3RyZWFtPF9DaGFy VCwgX1RyYWl0cz46OgogICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJiBfX24pCiAgICB7CiAg ICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIGZhbHNlKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAg ICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlvc19iYXNlOjpp b3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omlvc3RhdGUoaW9zX2Jhc2U6Omdvb2RiaXQpOwogICAg ICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChfTV9mbnVtZ2V0KSkKICAgICAgICAgICAgICAg IF9NX2ZudW1nZXQtPmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX24pOwogICAgICAgICAg ICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0Y2go ZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAgICAgICAgIHRoaXMtPnNl dHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0 aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93Owog ICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgoKICB0ZW1w bGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19pc3RyZWFt PF9DaGFyVCwgX1RyYWl0cz4mCiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46Ogog ICAgb3BlcmF0b3I+Pihsb25nIGxvbmcmIF9fbikKICAgIHsKICAgICAgc2VudHJ5IF9fY2VyYigq dGhpcywgZmFsc2UpOwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAgICAgIHRyeQog ICAgICAgICAgICB7CiAgICAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3Nf YmFzZTo6aW9zdGF0ZShpb3NfYmFzZTo6Z29vZGJpdCk7CiAgICAgICAgICAgICAgaWYgKF9NX2No ZWNrX2ZhY2V0KF9NX2ZudW1nZXQpKQogICAgICAgICAgICAgICAgX01fZm51bWdldC0+Z2V0KCp0 aGlzLCAwLCAqdGhpcywgX19lcnIsIF9fbik7CiAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUo X19lcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkK ICAgICAgICAgICAgewoKCiAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJh ZGJpdCk7CiAgICAgICAgICAgICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6 YmFkYml0KSAhPSAwKQogICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAg fQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwg dHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAg IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBvcGVyYXRvcj4+KHVuc2lnbmVk IGxvbmcgbG9uZyYgX19uKQogICAgewogICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCBmYWxzZSk7 CiAgICAgIGlmIChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsK ICAgICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjppb3N0YXRl KGlvc19iYXNlOjpnb29kYml0KTsKICAgICAgICAgICAgICBpZiAoX01fY2hlY2tfZmFjZXQoX01f Zm51bWdldCkpCiAgICAgICAgICAgICAgICBfTV9mbnVtZ2V0LT5nZXQoKnRoaXMsIDAsICp0aGlz LCBfX2VyciwgX19uKTsKICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CiAgICAg ICAgICAgIH0KICAgICAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAgICB7 CgoKICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAg ICAgICAgICBpZiAoKHRoaXMtPmV4Y2VwdGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQpICE9IDAp CiAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgcmV0 dXJuICp0aGlzOwogICAgfQoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBf VHJhaXRzPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfaXN0 cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKICAgIG9wZXJhdG9yPj4oZmxvYXQmIF9fbikKICAgIHsK ICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOwogICAgICBpZiAoX19jZXJiKQogICAg ICAgIHsKICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaW9zX2Jhc2U6 Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6aW9zdGF0ZShpb3NfYmFzZTo6Z29vZGJpdCk7CiAg ICAgICAgICAgICAgaWYgKF9NX2NoZWNrX2ZhY2V0KF9NX2ZudW1nZXQpKQogICAgICAgICAgICAg ICAgX01fZm51bWdldC0+Z2V0KCp0aGlzLCAwLCAqdGhpcywgX19lcnIsIF9fbik7CiAgICAgICAg ICAgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXRj aChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoKCiAgICAgICAgICAgICAgdGhpcy0+ c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgICAgaWYgKCh0aGlzLT5leGNl cHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAgICAgICAgICAgICAgdGhyb3c7 CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgdGVt cGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfaXN0cmVh bTxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoK ICAgIG9wZXJhdG9yPj4oZG91YmxlJiBfX24pCiAgICB7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRo aXMsIGZhbHNlKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAg ICAgICAgICAgewogICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jh c2U6Omlvc3RhdGUoaW9zX2Jhc2U6Omdvb2RiaXQpOwogICAgICAgICAgICAgIGlmIChfTV9jaGVj a19mYWNldChfTV9mbnVtZ2V0KSkKICAgICAgICAgICAgICAgIF9NX2ZudW1nZXQtPmdldCgqdGhp cywgMCwgKnRoaXMsIF9fZXJyLCBfX24pOwogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9f ZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAg ICAgICAgICAgIHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRi aXQpOwogICAgICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJh ZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAg fQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwg dHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAg IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBvcGVyYXRvcj4+KGxvbmcgZG91 YmxlJiBfX24pCiAgICB7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIGZhbHNlKTsKICAgICAg aWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAg ICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omlvc3RhdGUoaW9zX2Jh c2U6Omdvb2RiaXQpOwogICAgICAgICAgICAgIGlmIChfTV9jaGVja19mYWNldChfTV9mbnVtZ2V0 KSkKICAgICAgICAgICAgICAgIF9NX2ZudW1nZXQtPmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJy LCBfX24pOwogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKICAgICAgICAgICAg fQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAg ICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAg IGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAg ICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gKnRo aXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4K ICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJlYW08X0No YXJULCBfVHJhaXRzPjo6CiAgICBvcGVyYXRvcj4+KHZvaWQqJiBfX24pCiAgICB7CiAgICAgIHNl bnRyeSBfX2NlcmIoKnRoaXMsIGZhbHNlKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAg ICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRl IF9fZXJyID0gaW9zX2Jhc2U6Omlvc3RhdGUoaW9zX2Jhc2U6Omdvb2RiaXQpOwogICAgICAgICAg ICAgIGlmIChfTV9jaGVja19mYWNldChfTV9mbnVtZ2V0KSkKICAgICAgICAgICAgICAgIF9NX2Zu dW1nZXQtPmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX24pOwogICAgICAgICAgICAgIHRo aXMtPnNldHN0YXRlKF9fZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0 aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRl KGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygp ICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAg ICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5 cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJU LCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBvcGVy YXRvcj4+KF9fc3RyZWFtYnVmX3R5cGUqIF9fc2JvdXQpCiAgICB7CiAgICAgIHN0cmVhbXNpemUg X194dHJjdCA9IDA7CiAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2JpbiA9IHRoaXMtPnJkYnVm KCk7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIGZhbHNlKTsKICAgICAgaWYgKF9fc2JvdXQg JiYgX19jZXJiKQogICAgICAgIF9feHRyY3QgPSBfX2NvcHlfc3RyZWFtYnVmcygqdGhpcywgX19z YmluLCBfX3Nib3V0KTsKICAgICAgaWYgKCFfX3Nib3V0IHx8ICFfX3h0cmN0KQogICAgICAgIHRo aXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKICAgICAgcmV0dXJuICp0aGlzOwogICAg fQoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNp Y19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OmludF90eXBlCiAgICBiYXNpY19pc3RyZWFtPF9D aGFyVCwgX1RyYWl0cz46OgogICAgZ2V0KHZvaWQpCiAgICB7CiAgICAgIGNvbnN0IGludF90eXBl IF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOwogICAgICBpbnRfdHlwZSBfX2MgPSBfX2VvZjsK ICAgICAgX01fZ2NvdW50ID0gMDsKICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CiAg ICAgIGlmIChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAg ICAgICAgICAgICBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKCiAgICAgICAgICAgICAg aWYgKF9fYyAhPSBfX2VvZikKICAgICAgICAgICAgICAgIF9NX2djb3VudCA9IDE7CiAgICAgICAg ICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJp dCB8IGlvc19iYXNlOjpmYWlsYml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0Y2goZXhj ZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0 YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9u cygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93OwogICAg ICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gX19jOwogICAgfQoKICB0ZW1wbGF0ZTx0 eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNpY19pc3RyZWFtPF9DaGFy VCwgX1RyYWl0cz4mCiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgogICAgZ2V0 KGNoYXJfdHlwZSYgX19jKQogICAgewogICAgICBfTV9nY291bnQgPSAwOwogICAgICBzZW50cnkg X19jZXJiKCp0aGlzLCB0cnVlKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAg ICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0g dHJhaXRzX3R5cGU6OmVvZigpOwogICAgICAgICAgICAgIGludF90eXBlIF9fYnVmdmFsID0gdGhp cy0+cmRidWYoKS0+c2J1bXBjKCk7CgogICAgICAgICAgICAgIGlmIChfX2J1ZnZhbCAhPSBfX2Vv ZikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgX01fZ2NvdW50ID0gMTsKICAg ICAgICAgICAgICAgICAgX19jID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2J1ZnZhbCk7 CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhp cy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKICAgICAg ICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsK CgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAg ICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkK ICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1 cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1Ry YWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJl YW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBnZXQoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUg X19uLCBjaGFyX3R5cGUgX19kZWxpbSkKICAgIHsKICAgICAgX01fZ2NvdW50ID0gMDsKICAgICAg c2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CiAgICAgIGlmIChfX2NlcmIgJiYgX19uID4gMSkK ICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0 IGludF90eXBlIF9faWRlbGltID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fZGVsaW0pOwog ICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOwog ICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOwogICAg ICAgICAgICAgIGludF90eXBlIF9fYyA9IF9fc2ItPnNidW1wYygpOwogICAgICAgICAgICAgIGJv b2wgX190ZXN0ZGVsaW0gPSBfX2MgPT0gX19pZGVsaW07CiAgICAgICAgICAgICAgYm9vbCBfX3Rl c3Rlb2YgPSBfX2MgPT0gX19lb2Y7CgogICAgICAgICAgICAgIHdoaWxlIChfTV9nY291bnQgPCBf X24gLSAxICYmICFfX3Rlc3Rlb2YgJiYgIV9fdGVzdGRlbGltKQogICAgICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgICAqX19zKysgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7 CiAgICAgICAgICAgICAgICAgICsrX01fZ2NvdW50OwogICAgICAgICAgICAgICAgICBfX2MgPSBf X3NiLT5zYnVtcGMoKTsKICAgICAgICAgICAgICAgICAgX190ZXN0ZW9mID0gX19jID09IF9fZW9m OwogICAgICAgICAgICAgICAgICBfX3Rlc3RkZWxpbSA9IF9fYyA9PSBfX2lkZWxpbTsKICAgICAg ICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoX190ZXN0ZGVsaW0gfHwgX01fZ2NvdW50ID09 IF9fbiAtIDEpCiAgICAgICAgICAgICAgICBfX3NiLT5zcHV0YmFja2MoX19jKTsKICAgICAgICAg ICAgICBpZiAoX190ZXN0ZW9mKQogICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jh c2U6OmVvZmJpdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19m YWlsKQogICAgICAgICAgICB7CgoKICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFz ZTo6YmFkYml0KTsKICAgICAgICAgICAgICBpZiAoKHRoaXMtPmV4Y2VwdGlvbnMoKSAmIGlvc19i YXNlOjpiYWRiaXQpICE9IDApCiAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgfQog ICAgICAgIH0KICAgICAgKl9fcyA9IGNoYXJfdHlwZSgpOwogICAgICBpZiAoIV9NX2djb3VudCkK ICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CiAgICAgIHJldHVybiAq dGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRz PgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfaXN0cmVhbTxf Q2hhclQsIF9UcmFpdHM+OjoKICAgIGdldChfX3N0cmVhbWJ1Zl90eXBlJiBfX3NiLCBjaGFyX3R5 cGUgX19kZWxpbSkKICAgIHsKICAgICAgX01fZ2NvdW50ID0gMDsKICAgICAgc2VudHJ5IF9fY2Vy YigqdGhpcywgdHJ1ZSk7CiAgICAgIGlmIChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgaW50 X3R5cGUgX19jOwogICAgICAgICAgX19zdHJlYW1idWZfdHlwZSogX190aGlzX3NiID0gdGhpcy0+ cmRidWYoKTsKICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgY29uc3Qg aW50X3R5cGUgX19pZGVsaW0gPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19kZWxpbSk7CiAg ICAgICAgICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CiAg ICAgICAgICAgICAgX19jID0gX190aGlzX3NiLT5zYnVtcGMoKTsKICAgICAgICAgICAgICBib29s IF9fdGVzdGRlbGltID0gX19jID09IF9faWRlbGltOwogICAgICAgICAgICAgIGJvb2wgX190ZXN0 ZW9mID0gX19jID09IF9fZW9mOwogICAgICAgICAgICAgIGJvb2wgX190ZXN0cHV0ID0gdHJ1ZTsK CiAgICAgICAgICAgICAgd2hpbGUgKCFfX3Rlc3Rlb2YgJiYgIV9fdGVzdGRlbGltCiAgICAgICAg ICAgICAgICAgICAgJiYgKF9fdGVzdHB1dCA9IF9fc2Iuc3B1dGModHJhaXRzX3R5cGU6OnRvX2No YXJfdHlwZShfX2MpKQogICAgICAgICAgICAgICAgICAgICAgICAgIT0gX19lb2YpKQogICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICArK19NX2djb3VudDsKICAgICAgICAgICAgICAg ICAgX19jID0gX190aGlzX3NiLT5zYnVtcGMoKTsKICAgICAgICAgICAgICAgICAgX190ZXN0ZW9m ID0gX19jID09IF9fZW9mOwogICAgICAgICAgICAgICAgICBfX3Rlc3RkZWxpbSA9IF9fYyA9PSBf X2lkZWxpbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoX190ZXN0ZGVsaW0g fHwgIV9fdGVzdHB1dCkKICAgICAgICAgICAgICAgIF9fdGhpc19zYi0+c3B1dGJhY2tjKHRyYWl0 c190eXBlOjp0b19jaGFyX3R5cGUoX19jKSk7CiAgICAgICAgICAgICAgaWYgKF9fdGVzdGVvZikK ICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQpOwogICAgICAg ICAgICB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoK ICAgICAgICAgICAgICBfX3RoaXNfc2ItPnNwdXRiYWNrYyh0cmFpdHNfdHlwZTo6dG9fY2hhcl90 eXBlKF9fYykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBpZiAoIV9NX2djb3VudCkK ICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CiAgICAgIHJldHVybiAq dGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRz PgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfaXN0cmVhbTxf Q2hhclQsIF9UcmFpdHM+OjoKICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUg X19uLCBjaGFyX3R5cGUgX19kZWxpbSkKICAgIHsKICAgICAgX01fZ2NvdW50ID0gMDsKICAgICAg c2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CiAgICAgIGlmIChfX2NlcmIpCiAgICAgICAgewog ICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBfX3N0cmVhbWJ1Zl90eXBl KiBfX3NiID0gdGhpcy0+cmRidWYoKTsKICAgICAgICAgICAgICBpbnRfdHlwZSBfX2MgPSBfX3Ni LT5zYnVtcGMoKTsKICAgICAgICAgICAgICArK19NX2djb3VudDsKICAgICAgICAgICAgICBjb25z dCBpbnRfdHlwZSBfX2lkZWxpbSA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2RlbGltKTsK ICAgICAgICAgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsK ICAgICAgICAgICAgICBib29sIF9fdGVzdGRlbGltID0gX19jID09IF9faWRlbGltOwogICAgICAg ICAgICAgIGJvb2wgX190ZXN0ZW9mID0gX19jID09IF9fZW9mOwoKICAgICAgICAgICAgICB3aGls ZSAoX01fZ2NvdW50IDwgX19uICYmICFfX3Rlc3Rlb2YgJiYgIV9fdGVzdGRlbGltKQogICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICAqX19zKysgPSB0cmFpdHNfdHlwZTo6dG9fY2hh cl90eXBlKF9fYyk7CiAgICAgICAgICAgICAgICAgIF9fYyA9IF9fc2ItPnNidW1wYygpOwogICAg ICAgICAgICAgICAgICArK19NX2djb3VudDsKICAgICAgICAgICAgICAgICAgX190ZXN0ZW9mID0g X19jID09IF9fZW9mOwogICAgICAgICAgICAgICAgICBfX3Rlc3RkZWxpbSA9IF9fYyA9PSBfX2lk ZWxpbTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKF9fdGVzdGVvZikKICAg ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgLS1fTV9nY291bnQ7CiAgICAgICAgICAg ICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQpOwogICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgIGVsc2UgaWYgKCFfX3Rlc3RkZWxpbSkKICAgICAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgICAgLS1fTV9nY291bnQ7CiAgICAgICAgICAgICAgICAgIF9fc2ItPnNw dXRiYWNrYyh0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYykpOwogICAgICAgICAgICAgICAg ICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgIH0KICAgICAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAg ICB7CgoKICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAg ICAgICAgICAgICBpZiAoKHRoaXMtPmV4Y2VwdGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQpICE9 IDApCiAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAg Kl9fcyA9IGNoYXJfdHlwZSgpOwogICAgICBpZiAoIV9NX2djb3VudCkKICAgICAgICB0aGlzLT5z ZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAg dGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfaXN0 cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ OjoKICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSkKICAgIHsKICAg ICAgX01fZ2NvdW50ID0gMDsKICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CiAgICAg IGlmIChfX2NlcmIgJiYgX19uID4gMCkKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAg ICAgewogICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9faWRlbGltID0gdHJhaXRzX3R5cGU6 OnRvX2ludF90eXBlKF9fZGVsaW0pOwogICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9fZW9m ID0gdHJhaXRzX3R5cGU6OmVvZigpOwogICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9f c2IgPSB0aGlzLT5yZGJ1ZigpOwogICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IF9fc2ItPnNi dW1wYygpOwogICAgICAgICAgICAgIGJvb2wgX190ZXN0ZGVsaW0gPSBfX2MgPT0gX19pZGVsaW07 CiAgICAgICAgICAgICAgYm9vbCBfX3Rlc3Rlb2YgPSBfX2MgPT0gX19lb2Y7CgogICAgICAgICAg ICAgIF9fbiA9IG1pbihfX24sIG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgoKSk7CiAg ICAgICAgICAgICAgd2hpbGUgKF9NX2djb3VudCA8IF9fbiAtIDEgJiYgIV9fdGVzdGVvZiAmJiAh X190ZXN0ZGVsaW0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICsrX01fZ2Nv dW50OwogICAgICAgICAgICAgICAgICBfX2MgPSBfX3NiLT5zYnVtcGMoKTsKICAgICAgICAgICAg ICAgICAgX190ZXN0ZW9mID0gX19jID09IF9fZW9mOwogICAgICAgICAgICAgICAgICBfX3Rlc3Rk ZWxpbSA9IF9fYyA9PSBfX2lkZWxpbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBp ZiAoKF9NX2djb3VudCA9PSBfX24gLSAxICYmICFfX3Rlc3Rlb2YpIHx8IF9fdGVzdGRlbGltKQog ICAgICAgICAgICAgICAgKytfTV9nY291bnQ7CiAgICAgICAgICAgICAgaWYgKF9fdGVzdGVvZikK ICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjplb2ZiaXQpOwogICAgICAg ICAgICB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoK CiAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAg ICAgICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQog ICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVy biAqdGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJh aXRzPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQogICAgYmFz aWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKICAgIHBlZWsodm9pZCkKICAgIHsKICAgICAg aW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpOwogICAgICBfTV9nY291bnQgPSAwOwog ICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAg ICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgeyBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0 YygpOyB9CiAgICAgICAgICBjYXRjaChleGNlcHRpb24mIF9fZmFpbCkKICAgICAgICAgICAgewoK CiAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAg ICAgICAgaWYgKCh0aGlzLT5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQog ICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIHJldHVy biBfX2M7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0 cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJlYW08 X0NoYXJULCBfVHJhaXRzPjo6CiAgICByZWFkKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9f bikKICAgIHsKICAgICAgX01fZ2NvdW50ID0gMDsKICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywg dHJ1ZSk7CiAgICAgIGlmIChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgaWYgKF9fbiA+IDAp CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CiAg ICAgICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOwog ICAgICAgICAgICAgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zYnVtcGMoKTsKICAgICAgICAg ICAgICAgICAgYm9vbCBfX3Rlc3Rlb2YgPSBfX2MgPT0gX19lb2Y7CgogICAgICAgICAgICAgICAg ICB3aGlsZSAoX01fZ2NvdW50IDwgX19uIC0gMSAmJiAhX190ZXN0ZW9mKQogICAgICAgICAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICpfX3MrKyA9IHRyYWl0c190eXBlOjp0b19j aGFyX3R5cGUoX19jKTsKICAgICAgICAgICAgICAgICAgICAgICsrX01fZ2NvdW50OwogICAgICAg ICAgICAgICAgICAgICAgX19jID0gX19zYi0+c2J1bXBjKCk7CiAgICAgICAgICAgICAgICAgICAg ICBfX3Rlc3Rlb2YgPSBfX2MgPT0gX19lb2Y7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg ICAgICAgICAgICBpZiAoX190ZXN0ZW9mKQogICAgICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0 YXRlKGlvc19iYXNlOjplb2ZiaXQgfCBpb3NfYmFzZTo6ZmFpbGJpdCk7CiAgICAgICAgICAgICAg ICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgKl9f cysrID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOwogICAgICAgICAgICAgICAgICAg ICAgKytfTV9nY291bnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQog ICAgICAgICAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAgICAgICAgewoK CiAgICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAg ICAgICAgICAgICAgICBpZiAoKHRoaXMtPmV4Y2VwdGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQp ICE9IDApCiAgICAgICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgICAgICB9CiAgICAg ICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3Nf YmFzZTo6ZmFpbGJpdCk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgdGVtcGxhdGU8dHlw ZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgc3RyZWFtc2l6ZQogICAgYmFzaWNf aXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKICAgIHJlYWRzb21lKGNoYXJfdHlwZSogX19zLCBz dHJlYW1zaXplIF9fbikKICAgIHsKICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNf dHlwZTo6ZW9mKCk7CiAgICAgIF9NX2djb3VudCA9IDA7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRo aXMsIHRydWUpOwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAgICAgIGlmIChfX24g PiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICAgIHN0cmVhbXNpemUgX19udW0gPSB0aGlzLT5yZGJ1ZigpLT5pbl9hdmFp bCgpOwogICAgICAgICAgICAgICAgICBpZiAoX19udW0gIT0gc3RhdGljX2Nhc3Q8c3RyZWFtc2l6 ZT4oX19lb2YpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIF9f bnVtID0gbWluKF9fbnVtLCBfX24pOwogICAgICAgICAgICAgICAgICAgICAgX01fZ2NvdW50ID0g dGhpcy0+cmRidWYoKS0+c2dldG4oX19zLCBfX251bSk7CiAgICAgICAgICAgICAgICAgICAgfQog ICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2V0c3RhdGUo aW9zX2Jhc2U6OmVvZmJpdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2F0Y2go ZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgICAgICB7CgoKICAgICAgICAgICAgICAgICAg dGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgICAgICAgIGlmICgo dGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAgICAg ICAgICAgICB0aHJvdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0K ICAgICAgZWxzZQogICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKICAg ICAgcmV0dXJuIF9NX2djb3VudDsKICAgIH0KCiAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0 eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAg YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKICAgIHB1dGJhY2soY2hhcl90eXBlIF9f YykKICAgIHsKICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CiAgICAgIGlmIChfX2Nl cmIpCiAgICAgICAgewogICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBj b25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKICAgICAgICAgICAgICBf X3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKICAgICAgICAgICAgICBpZiAo IV9fc2IgfHwgX19zYi0+c3B1dGJhY2tjKF9fYykgPT0gX19lb2YpCiAgICAgICAgICAgICAgICB0 aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgfQogICAgICAgICAg Y2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAgICAgICAgIHRo aXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAgIGlmICgodGhpcy0+ ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRo cm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgdGhpcy0+c2V0 c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwogICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRl bXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJhc2ljX2lzdHJl YW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6 CiAgICB1bmdldCh2b2lkKQogICAgewogICAgICBfTV9nY291bnQgPSAwOwogICAgICBzZW50cnkg X19jZXJiKCp0aGlzLCB0cnVlKTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAg ICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0g dHJhaXRzX3R5cGU6OmVvZigpOwogICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2Ig PSB0aGlzLT5yZGJ1ZigpOwogICAgICAgICAgICAgIGlmICghX19zYiB8fCBfX2VvZiA9PSBfX3Ni LT5zdW5nZXRjKCkpCiAgICAgICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFk Yml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAg ICAgICAgICAgIHsKCgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRi aXQpOwogICAgICAgICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJh ZGJpdCkgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAg fQogICAgICBlbHNlCiAgICAgICAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOwog ICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlw ZW5hbWUgX1RyYWl0cz4KICAgIGludAogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ OjoKICAgIHN5bmModm9pZCkKICAgIHsKICAgICAgaW50IF9fcmV0ID0gdHJhaXRzX3R5cGU6OmVv ZigpOwogICAgICBfTV9nY291bnQgPSAwOwogICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVl KTsKICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAg ewogICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOwog ICAgICAgICAgICAgIGlmICghX19zYiB8fCBfX3JldCA9PSBfX3NiLT5wdWJzeW5jKCkpCiAgICAg ICAgICAgICAgICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAg ICBlbHNlCiAgICAgICAgICAgICAgICBfX3JldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAg IGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAgICB7CgoKICAgICAgICAgICAgICB0 aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgICBpZiAoKHRoaXMt PmV4Y2VwdGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQpICE9IDApCiAgICAgICAgICAgICAgICB0 aHJvdzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgcmV0dXJuIF9fcmV0OwogICAgfQoK ICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICB0eXBlbmFt ZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OnBvc190eXBlCiAgICBiYXNpY19pc3Ry ZWFtPF9DaGFyVCwgX1RyYWl0cz46OgogICAgdGVsbGcodm9pZCkKICAgIHsKICAgICAgcG9zX3R5 cGUgX19yZXQgPSBwb3NfdHlwZSgtMSk7CiAgICAgIF9NX2djb3VudCA9IDA7CiAgICAgIHNlbnRy eSBfX2NlcmIoKnRoaXMsIHRydWUpOwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAg ICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICBfX3JldCA9IHRoaXMtPnJkYnVmKCkt PnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1ciwgaW9zX2Jhc2U6OmluKTsKICAgICAgICAgICAg fQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAg ICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAg IGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkKICAgICAg ICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gX19y ZXQ7CiAgICB9CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+ CiAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCiAgICBiYXNpY19pc3RyZWFtPF9D aGFyVCwgX1RyYWl0cz46OgogICAgc2Vla2cocG9zX3R5cGUgX19wb3MpCiAgICB7CiAgICAgIF9N X2djb3VudCA9IDA7CiAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOwogICAgICBpZiAo X19jZXJiKQogICAgICAgIHsKICAgICAgICAgIHRyeQogICAgICAgICAgICB7CgoKICAgICAgICAg ICAgICBwb3NfdHlwZSBfX2VyciA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtwb3MoX19wb3MsIGlv c19iYXNlOjppbik7CgoKICAgICAgICAgICAgICBpZiAoX19lcnIgPT0gcG9zX3R5cGUob2ZmX3R5 cGUoLTEpKSkKICAgICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGZhaWxiaXQpOwoKICAgICAg ICAgICAgfQogICAgICAgICAgY2F0Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsK CgogICAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAg ICAgICAgIGlmICgodGhpcy0+ZXhjZXB0aW9ucygpICYgaW9zX2Jhc2U6OmJhZGJpdCkgIT0gMCkK ICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1 cm4gKnRoaXM7CiAgICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1Ry YWl0cz4KICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIGJhc2ljX2lzdHJl YW08X0NoYXJULCBfVHJhaXRzPjo6CiAgICBzZWVrZyhvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6 OnNlZWtkaXIgX19kaXIpCiAgICB7CiAgICAgIF9NX2djb3VudCA9IDA7CiAgICAgIHNlbnRyeSBf X2NlcmIoKnRoaXMsIHRydWUpOwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAgICAg IHRyeQogICAgICAgICAgICB7CgoKICAgICAgICAgICAgICBwb3NfdHlwZSBfX2VyciA9IHRoaXMt PnJkYnVmKCktPnB1YnNlZWtvZmYoX19vZmYsIF9fZGlyLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6aW4pOwoKCiAgICAg ICAgICAgICAgaWYgKF9fZXJyID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCiAgICAgICAgICAg ICAgICB0aGlzLT5zZXRzdGF0ZShmYWlsYml0KTsKCiAgICAgICAgICAgIH0KICAgICAgICAgIGNh dGNoKGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAgICB7CgoKICAgICAgICAgICAgICB0aGlz LT5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKICAgICAgICAgICAgICBpZiAoKHRoaXMtPmV4 Y2VwdGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQpICE9IDApCiAgICAgICAgICAgICAgICB0aHJv dzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKCiAg dGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgogICAgYmFzaWNfaXN0 cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFy VCwgX1RyYWl0cz4mIF9faW4sIF9DaGFyVCYgX19jKQogICAgewogICAgICB0eXBlZGVmIGJhc2lj X2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiBfX2lzdHJlYW1fdHlwZTsKICAgICAgdHlwZW5hbWUg X19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgZmFsc2UpOwogICAgICBpZiAoX19j ZXJiKQogICAgICAgIHsKICAgICAgICAgIHRyeQogICAgICAgICAgICB7IF9faW4uZ2V0KF9fYyk7 IH0KICAgICAgICAgIGNhdGNoKGV4Y2VwdGlvbiYgX19mYWlsKQogICAgICAgICAgICB7CgoKICAg ICAgICAgICAgICBfX2luLnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwogICAgICAgICAgICAg IGlmICgoX19pbi5leGNlcHRpb25zKCkgJiBpb3NfYmFzZTo6YmFkYml0KSAhPSAwKQogICAgICAg ICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGVsc2UKICAgICAg ICBfX2luLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKICAgICAgcmV0dXJuIF9faW47CiAg ICB9CgogIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KICAgIGJh c2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVh bTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQqIF9fcykKICAgIHsKICAgICAgdHlwZWRl ZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX19pc3RyZWFtX3R5cGU7CiAgICAgIHR5 cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Ol9fc3RyZWFtYnVmX3R5cGUgX19zdHJlYW1i dWZfdHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBpbnRfdHlw ZTsKICAgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOwogICAgICB0eXBlZGVmIGN0eXBlPF9D aGFyVD4gX19jdHlwZV90eXBlOwogICAgICBzdHJlYW1zaXplIF9fZXh0cmFjdGVkID0gMDsKCiAg ICAgIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9faW4sIGZhbHNlKTsK ICAgICAgaWYgKF9fY2VyYikKICAgICAgICB7CiAgICAgICAgICB0cnkKICAgICAgICAgICAgewoK ICAgICAgICAgICAgICBzdHJlYW1zaXplIF9fbnVtID0gX19pbi53aWR0aCgpOwogICAgICAgICAg ICAgIGlmIChfX251bSA9PSAwKQogICAgICAgICAgICAgICAgX19udW0gPSBudW1lcmljX2xpbWl0 czxzdHJlYW1zaXplPjo6bWF4KCk7CgogICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9f c2IgPSBfX2luLnJkYnVmKCk7CiAgICAgICAgICAgICAgY29uc3QgX19jdHlwZV90eXBlKiBfX2N0 eXBlID0gX19pbi5fTV9nZXRfZmN0eXBlX2lvcygpOwogICAgICAgICAgICAgIGludF90eXBlIF9f YyA9IF9fc2ItPnNidW1wYygpOwogICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0g X1RyYWl0czo6ZW9mKCk7CiAgICAgICAgICAgICAgYm9vbCBfX3Rlc3RzcCA9IF9fY3R5cGUtPmlz KGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOwogICAgICAgICAgICAgIGJvb2wgX190ZXN0ZW9mID0g X19jID09IF9fZW9mOwoKICAgICAgICAgICAgICB3aGlsZSAoX19leHRyYWN0ZWQgPCBfX251bSAt IDEgJiYgIV9fdGVzdGVvZiAmJiAhX190ZXN0c3ApCiAgICAgICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICAgICpfX3MrKyA9IF9fYzsKICAgICAgICAgICAgICAgICAgKytfX2V4dHJhY3RlZDsK ICAgICAgICAgICAgICAgICAgX19jID0gX19zYi0+c2J1bXBjKCk7CiAgICAgICAgICAgICAgICAg IF9fdGVzdGVvZiA9IF9fYyA9PSBfX2VvZjsKICAgICAgICAgICAgICAgICAgX190ZXN0c3AgPSBf X2N0eXBlLT5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgX19jKTsKICAgICAgICAgICAgICAgIH0KCiAg ICAgICAgICAgICAgaWYgKCFfX3Rlc3Rlb2YpCiAgICAgICAgICAgICAgICBfX3NiLT5zcHV0YmFj a2MoX19jKTsKICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBfX2luLnNldHN0YXRl KGlvc19iYXNlOjplb2ZiaXQpOwoKCgogICAgICAgICAgICAgICpfX3MgPSBjaGFyX3R5cGUoKTsK CiAgICAgICAgICAgICAgX19pbi53aWR0aCgwKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2F0 Y2goZXhjZXB0aW9uJiBfX2ZhaWwpCiAgICAgICAgICAgIHsKCgogICAgICAgICAgICAgIF9faW4u c2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CiAgICAgICAgICAgICAgaWYgKChfX2luLmV4Y2Vw dGlvbnMoKSAmIGlvc19iYXNlOjpiYWRiaXQpICE9IDApCiAgICAgICAgICAgICAgICB0aHJvdzsK ICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgaWYgKCFfX2V4dHJhY3RlZCkKICAgICAgICBf X2luLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKICAgICAgcmV0dXJuIF9faW47CiAgICB9 CgoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CiAgICBiYXNp Y19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYKICAgIHdzKGJhc2ljX2lzdHJlYW08X0NoYXJULF9U cmFpdHM+JiBfX2luKQogICAgewogICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBf VHJhaXRzPiBfX2lzdHJlYW1fdHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1f dHlwZTo6X19zdHJlYW1idWZfdHlwZSBfX3N0cmVhbWJ1Zl90eXBlOwogICAgICB0eXBlZGVmIHR5 cGVuYW1lIF9faXN0cmVhbV90eXBlOjpfX2N0eXBlX3R5cGUgX19jdHlwZV90eXBlOwogICAgICB0 eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZSBfX2ludF90eXBlOwogICAg ICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpjaGFyX3R5cGUgX19jaGFyX3R5cGU7 CgogICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gX19pbi5yZGJ1ZigpOwogICAgICBjb25z dCBfX2N0eXBlX3R5cGUqIF9fY3R5cGUgPSBfX2luLl9NX2dldF9mY3R5cGVfaW9zKCk7CiAgICAg IGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKICAgICAgX19pbnRfdHlw ZSBfX2M7CiAgICAgIGJvb2wgX190ZXN0ZW9mOwogICAgICBib29sIF9fdGVzdHNwOwoKICAgICAg ZG8KICAgICAgICB7CiAgICAgICAgICBfX2MgPSBfX3NiLT5zYnVtcGMoKTsKICAgICAgICAgIF9f dGVzdGVvZiA9IF9fYyA9PSBfX2VvZjsKICAgICAgICAgIF9fdGVzdHNwID0gX19jdHlwZS0+aXMo Y3R5cGVfYmFzZTo6c3BhY2UsIF9fYyk7CiAgICAgICAgfQogICAgICB3aGlsZSAoIV9fdGVzdGVv ZiAmJiBfX3Rlc3RzcCk7CgogICAgICBpZiAoIV9fdGVzdGVvZiAmJiAhX190ZXN0c3ApCiAgICAg ICAgX19zYi0+c3B1dGJhY2tjKF9fYyk7CiAgICAgIGVsc2UKICAgICAgICBfX2luLnNldHN0YXRl KGlvc19iYXNlOjplb2ZiaXQpOwoKICAgICAgcmV0dXJuIF9faW47CiAgICB9CgoKICB0ZW1wbGF0 ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KICAg IGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0 cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLAogICAgICAgICAgICAgICBiYXNpY19zdHJpbmc8 X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0cikKICAgIHsKICAgICAgdHlwZWRlZiBiYXNp Y19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX19pc3RyZWFtX3R5cGU7CiAgICAgIHR5cGVkZWYg dHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlIF9faW50X3R5cGU7CiAgICAgIHR5cGVk ZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Ol9fc3RyZWFtYnVmX3R5cGUgX19zdHJlYW1idWZf dHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6X19jdHlwZV90eXBl IF9fY3R5cGVfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRz LCBfQWxsb2M+IF9fc3RyaW5nX3R5cGU7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdf dHlwZTo6c2l6ZV90eXBlIF9fc2l6ZV90eXBlOwogICAgICBfX3NpemVfdHlwZSBfX2V4dHJhY3Rl ZCA9IDA7CgogICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2lu LCBmYWxzZSk7CiAgICAgIGlmIChfX2NlcmIpCiAgICAgICAgewogICAgICAgICAgX19zdHIuZXJh c2UoKTsKICAgICAgICAgIHN0cmVhbXNpemUgX193ID0gX19pbi53aWR0aCgpOwogICAgICAgICAg X19zaXplX3R5cGUgX19uOwogICAgICAgICAgX19uID0gX193ID4gMCA/IHN0YXRpY19jYXN0PF9f c2l6ZV90eXBlPihfX3cpIDogX19zdHIubWF4X3NpemUoKTsKCiAgICAgICAgICBfX3N0cmVhbWJ1 Zl90eXBlKiBfX3NiID0gX19pbi5yZGJ1ZigpOwogICAgICAgICAgY29uc3QgX19jdHlwZV90eXBl KiBfX2N0eXBlID0gX19pbi5fTV9nZXRfZmN0eXBlX2lvcygpOwogICAgICAgICAgX19pbnRfdHlw ZSBfX2MgPSBfX3NiLT5zYnVtcGMoKTsKICAgICAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2Yg PSBfVHJhaXRzOjplb2YoKTsKICAgICAgICAgIGJvb2wgX190ZXN0c3AgPSBfX2N0eXBlLT5pcyhj dHlwZV9iYXNlOjpzcGFjZSwgX19jKTsKICAgICAgICAgIGJvb2wgX190ZXN0ZW9mID0gX19jID09 IF9fZW9mOwoKICAgICAgICAgIHdoaWxlIChfX2V4dHJhY3RlZCA8IF9fbiAmJiAhX190ZXN0ZW9m ICYmICFfX3Rlc3RzcCkKICAgICAgICAgICAgewogICAgICAgICAgICAgIF9fc3RyICs9IF9UcmFp dHM6OnRvX2NoYXJfdHlwZShfX2MpOwogICAgICAgICAgICAgICsrX19leHRyYWN0ZWQ7CiAgICAg ICAgICAgICAgX19jID0gX19zYi0+c2J1bXBjKCk7CiAgICAgICAgICAgICAgX190ZXN0ZW9mID0g X19jID09IF9fZW9mOwogICAgICAgICAgICAgIF9fdGVzdHNwID0gX19jdHlwZS0+aXMoY3R5cGVf YmFzZTo6c3BhY2UsIF9fYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIGlmICghX190ZXN0ZW9m KQogICAgICAgICAgICBfX3NiLT5zcHV0YmFja2MoX19jKTsKICAgICAgICAgIGVsc2UKICAgICAg ICAgICAgX19pbi5zZXRzdGF0ZShpb3NfYmFzZTo6ZW9mYml0KTsKICAgICAgICAgIF9faW4ud2lk dGgoMCk7CiAgICAgICAgfQoKCiAgICAgIGlmICghX19leHRyYWN0ZWQpCiAgICAgICAgX19pbi5z ZXRzdGF0ZSAoaW9zX2Jhc2U6OmZhaWxiaXQpOwoKICAgICAgcmV0dXJuIF9faW47CiAgICB9Cgog IHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0Fs bG9jPgogICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgogICAgZ2V0bGluZShiYXNp Y19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCiAgICAgICAgICAgIGJhc2ljX3N0cmlu ZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLCBfQ2hhclQgX19kZWxpbSkKICAgIHsK ICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX19pc3RyZWFtX3R5 cGU7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlIF9faW50 X3R5cGU7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Ol9fc3RyZWFtYnVm X3R5cGUgX19zdHJlYW1idWZfdHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1f dHlwZTo6X19jdHlwZV90eXBlIF9fY3R5cGVfdHlwZTsKICAgICAgdHlwZWRlZiBiYXNpY19zdHJp bmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fc3RyaW5nX3R5cGU7CiAgICAgIHR5cGVkZWYg dHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlIF9fc2l6ZV90eXBlOwoKICAgICAgX19z aXplX3R5cGUgX19leHRyYWN0ZWQgPSAwOwogICAgICBib29sIF9fdGVzdGRlbGltID0gZmFsc2U7 CiAgICAgIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9faW4sIHRydWUp OwogICAgICBpZiAoX19jZXJiKQogICAgICAgIHsKICAgICAgICAgIF9fc3RyLmVyYXNlKCk7CiAg ICAgICAgICBfX3NpemVfdHlwZSBfX24gPSBfX3N0ci5tYXhfc2l6ZSgpOwoKICAgICAgICAgIF9f aW50X3R5cGUgX19pZGVsaW0gPSBfVHJhaXRzOjp0b19pbnRfdHlwZShfX2RlbGltKTsKICAgICAg ICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSBfX2luLnJkYnVmKCk7CiAgICAgICAgICBfX2lu dF90eXBlIF9fYyA9IF9fc2ItPnNidW1wYygpOwogICAgICAgICAgY29uc3QgX19pbnRfdHlwZSBf X2VvZiA9IF9UcmFpdHM6OmVvZigpOwogICAgICAgICAgX190ZXN0ZGVsaW0gPSBfX2MgPT0gX19p ZGVsaW07CiAgICAgICAgICBib29sIF9fdGVzdGVvZiA9IF9fYyA9PSBfX2VvZjsKCiAgICAgICAg ICB3aGlsZSAoX19leHRyYWN0ZWQgPD0gX19uICYmICFfX3Rlc3Rlb2YgJiYgIV9fdGVzdGRlbGlt KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgX19zdHIgKz0gX1RyYWl0czo6dG9fY2hhcl90 eXBlKF9fYyk7CiAgICAgICAgICAgICAgKytfX2V4dHJhY3RlZDsKICAgICAgICAgICAgICBfX2Mg PSBfX3NiLT5zYnVtcGMoKTsKICAgICAgICAgICAgICBfX3Rlc3Rlb2YgPSBfX2MgPT0gX19lb2Y7 CiAgICAgICAgICAgICAgX190ZXN0ZGVsaW0gPSBfX2MgPT0gX19pZGVsaW07CiAgICAgICAgICAg IH0KICAgICAgICAgIGlmIChfX3Rlc3Rlb2YpCiAgICAgICAgICAgIF9faW4uc2V0c3RhdGUoaW9z X2Jhc2U6OmVvZmJpdCk7CiAgICAgICAgfQogICAgICBpZiAoIV9fZXh0cmFjdGVkICYmICFfX3Rl c3RkZWxpbSkKICAgICAgICBfX2luLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKICAgICAg cmV0dXJuIF9faW47CiAgICB9CgogIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0 cywgY2xhc3MgX0FsbG9jPgogICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+ JgogICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCiAgICAg ICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+JiBfX3N0cikKICAgIHsg cmV0dXJuIGdldGxpbmUoX19pbiwgX19zdHIsIF9faW4ud2lkZW4oJ1xuJykpOyB9Cn0KIyAyOTEg Ii91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pc3RyZWFtLmgiIDIg MwojIDQyICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYml0cy9zdGRfaW9zdHJl YW0uaCIgMiAzCgpuYW1lc3BhY2Ugc3RkCnsKICBleHRlcm4gaXN0cmVhbSBjaW47CiAgZXh0ZXJu IG9zdHJlYW0gY291dDsKICBleHRlcm4gb3N0cmVhbSBjZXJyOwogIGV4dGVybiBvc3RyZWFtIGNs b2c7CiMgNTcgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0ZF9pb3N0 cmVhbS5oIiAzCiAgc3RhdGljIGlvc19iYXNlOjpJbml0IF9faW9pbml0Owp9CiMgMzIgIi91c3Iv bG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9pb3N0cmVhbSIgMiAzCiMgMjggIi9ob21lL3N0 ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9UaW1lLmhoIiAyCgpuYW1lc3Bh Y2UgUHJhZ3VlCnsKCmNsYXNzIFRpbWUgOiBwdWJsaWMgdGltZXZhbAp7CnB1YmxpYzoKICBzdGF0 aWMgY29uc3QgVGltZSB6ZXJvOwogIFRpbWUoKSB7IHR2X3NlYyA9IHR2X3VzZWMgPSAwO30KICBU aW1lKGNvbnN0IHRpbWV2YWwgJnQpIDogdGltZXZhbCh0KSB7IG5vcm1hbGl6ZSgpO30KICBUaW1l KGNvbnN0IHRpbWVzcGVjICZ0KSB7IHR2X3NlYyA9IHQudHZfc2VjLCB0dl91c2VjID0gdC50dl9u c2VjLzEwMDA7IG5vcm1hbGl6ZSgpO30KICBUaW1lKGxvbmcgbCkgeyB0dl9zZWMgPSBsLzEwMDAs IHR2X3VzZWMgPSAobCAtIHR2X3NlYyoxMDAwKSoxMDAwO30KICBUaW1lKGludCwgaW50LCBpbnQs IGludCwgaW50LCBpbnQsIGludCk7CiAgVGltZShpbnQsIGludCwgaW50LCBpbnQpOwogIH5UaW1l KCkge30KICBib29sIG9wZXJhdG9yID09IChjb25zdCBUaW1lICZUKSBjb25zdCB7IHJldHVybiB0 dl9zZWMgPT0gVC50dl9zZWMgJiYgdHZfdXNlYyA9PSBULnR2X3VzZWM7fQogIGJvb2wgb3BlcmF0 b3IgIT0gKGNvbnN0IFRpbWUgJlQpIGNvbnN0IHsgcmV0dXJuIHR2X3NlYyAhPSBULnR2X3NlYyB8 fCB0dl91c2VjICE9IFQudHZfdXNlYzt9CiAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBUaW1lICZU KSBjb25zdCB7IHJldHVybiB0dl9zZWMgPiBULnR2X3NlYyB8fCAodHZfc2VjID09IFQudHZfc2Vj ICYmIHR2X3VzZWMgPiBULnR2X3VzZWMpO30KICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IFRpbWUg JlQpIGNvbnN0IHsgcmV0dXJuIHR2X3NlYyA8IFQudHZfc2VjIHx8ICh0dl9zZWMgPT0gVC50dl9z ZWMgJiYgdHZfdXNlYyA8IFQudHZfdXNlYyk7fQogIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IFRp bWUgJlQpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yID4gKFQpIHx8IG9wZXJhdG9yID09IChUKTt9 CiAgYm9vbCBvcGVyYXRvciA8PSAoY29uc3QgVGltZSAmVCkgY29uc3QgeyByZXR1cm4gb3BlcmF0 b3IgPCAoVCkgfHwgb3BlcmF0b3IgPT0gKFQpO30KICBUaW1lICZvcGVyYXRvciArPSAoY29uc3Qg VGltZSAmVCkgeyB0dl9zZWMgKz0gVC50dl9zZWMsIHR2X3VzZWMgKz0gVC50dl91c2VjOyBub3Jt YWxpemUoKTsgcmV0dXJuICp0aGlzO30KICBUaW1lICZvcGVyYXRvciAtPSAoY29uc3QgVGltZSAm VCkgeyB0dl9zZWMgLT0gVC50dl9zZWMsIHR2X3VzZWMgLT0gVC50dl91c2VjOyBub3JtYWxpemUo KTsgcmV0dXJuICp0aGlzO30KICBUaW1lIG9wZXJhdG9yICsgKGNvbnN0IFRpbWUgJlQpIGNvbnN0 IHsgVGltZSB0ID0gKnRoaXM7IHQgKz0gVDsgcmV0dXJuIHQ7fQogIFRpbWUgb3BlcmF0b3IgLSAo Y29uc3QgVGltZSAmVCkgY29uc3QgeyBUaW1lIHQgPSAqdGhpczsgdCAtPSBUOyByZXR1cm4gdDt9 CiAgb3BlcmF0b3IgYm9vbCAoKSBjb25zdCB7IHJldHVybiB0dl9zZWMgIT0gMCB8fCB0dl91c2Vj ICE9IDA7fQogIG9wZXJhdG9yIHRpbWVzcGVjICgpIGNvbnN0IHsgdGltZXNwZWMgdDsgdC50dl9z ZWMgPSB0dl9zZWMsIHQudHZfbnNlYyA9IHR2X3VzZWMgKiAxMDAwOyByZXR1cm4gdDt9CiAgb3Bl cmF0b3IgZG91YmxlICgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4odHZfc2Vj KSArIHN0YXRpY19jYXN0PGRvdWJsZT4odHZfdXNlYykvMTAwMDAwMC47fQogIG9wZXJhdG9yIGNv bnN0IGNoYXIgKigpIGNvbnN0IHsgcmV0dXJuIGN0aW1lKCZ0dl9zZWMpO30KICBzdGF0aWMgVGlt ZSBjdXJyZW50VGltZSgpOwogIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yIDw8IChzdGQ6 Om9zdHJlYW0gJm9zLCBjb25zdCBUaW1lICZUKSB7IHJldHVybiBvcyA8PCBULnR2X3NlYyA8PCAi IHMsICIgPDwgVC50dl91c2VjIDw8ICIgdXMiO30KcHJvdGVjdGVkOgogIGlubGluZSB2b2lkIG5v cm1hbGl6ZSgpOwpwcml2YXRlOgp9OwoKaW5saW5lIHZvaWQgVGltZTo6bm9ybWFsaXplKCkKewog IHdoaWxlICh0dl91c2VjID49IDEwMDAwMDApIHR2X3VzZWMgLT0gMTAwMDAwMCwgdHZfc2VjKys7 CiAgd2hpbGUgKHR2X3VzZWMgPCAwKQogICAgewogICAgICBpZiAodHZfc2VjID4gMCkgdHZfdXNl YyArPSAxMDAwMDAwLCB0dl9zZWMtLTsKICAgICAgZWxzZSB7IHR2X3VzZWMgPSAwOyBicmVhazt9 CiAgICB9Cn0KCn0KIyAyNyAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9QcmFn dWUvU3lzL1RocmVhZC5oaCIgMgojIDEgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDEgMwojIDI4 ICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9pbmNsdWRlL1ByYWd1ZS9TeXMvVGhyZWFkLmho IiAyCiMgMSAiL3Vzci9pbmNsdWRlL3NlbWFwaG9yZS5oIiAxIDMKIyAxOCAiL3Vzci9pbmNsdWRl L3NlbWFwaG9yZS5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMwojIDE5ICIv dXNyL2luY2x1ZGUvc2VtYXBob3JlLmgiIDIgMwojIDEgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMu aCIgMSAzCiMgMjAgIi91c3IvaW5jbHVkZS9zZW1hcGhvcmUuaCIgMiAzCiMgMjggIi91c3IvaW5j bHVkZS9zZW1hcGhvcmUuaCIgMwp0eXBlZGVmIHN0cnVjdAp7CiAgc3RydWN0CiAgewogICAgbG9u ZyBpbnQgc3RhdHVzOwogICAgaW50IHNwaW5sb2NrOwogIH0gX19zZW1fbG9jazsKICBpbnQgX19z ZW1fdmFsdWU7CiAgX3B0aHJlYWRfZGVzY3IgX19zZW1fd2FpdGluZzsKfSBzZW1fdDsKIyA0OCAi L3Vzci9pbmNsdWRlL3NlbWFwaG9yZS5oIiAzCmV4dGVybiAiQyIgewoKCgpleHRlcm4gaW50IHNl bV9pbml0IChzZW1fdCAqX19zZW0sIGludCBfX3BzaGFyZWQsIHVuc2lnbmVkIGludCBfX3ZhbHVl KSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHNlbV9kZXN0cm95IChzZW1fdCAqX19zZW0pIHRocm93 ICgpOwoKCmV4dGVybiBzZW1fdCAqc2VtX29wZW4gKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQg X19vZmxhZywgLi4uKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHNlbV9jbG9zZSAoc2VtX3QgKl9f c2VtKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHNlbV91bmxpbmsgKF9fY29uc3QgY2hhciAqX19u YW1lKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50IHNlbV93YWl0IChzZW1fdCAqX19zZW0pIHRocm93 ICgpOwoKCmV4dGVybiBpbnQgc2VtX3RyeXdhaXQgKHNlbV90ICpfX3NlbSkgdGhyb3cgKCk7CgoK ZXh0ZXJuIGludCBzZW1fcG9zdCAoc2VtX3QgKl9fc2VtKSB0aHJvdyAoKTsKCgpleHRlcm4gaW50 IHNlbV9nZXR2YWx1ZSAoc2VtX3QgKl9fc2VtLCBpbnQgKl9fc3ZhbCkgdGhyb3cgKCk7Cgp9CiMg MjkgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9UaHJlYWQu aGgiIDIKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvY2Vycm5vIiAxIDMK IyAzMCAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9QcmFndWUvU3lzL1RocmVh ZC5oaCIgMgojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My92ZWN0b3IiIDEg MwojIDMxICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9pbmNsdWRlL1ByYWd1ZS9TeXMvVGhy ZWFkLmhoIiAyCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL3N0cmluZyIg MSAzCiMgMzIgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9U aHJlYWQuaGgiIDIKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYmFja3dh cmQvcGFpci5oIiAxIDMKIyAzMCAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2Jh Y2t3YXJkL3BhaXIuaCIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9i YWNrd2FyZC9iYWNrd2FyZF93YXJuaW5nLmgiIDEgMwojIDMxICIvdXNyL2xvY2FsL2djYy0zLjAv aW5jbHVkZS9nKystdjMvYmFja3dhcmQvcGFpci5oIiAyIDMKIyAxICIvdXNyL2xvY2FsL2djYy0z LjAvaW5jbHVkZS9nKystdjMvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25maWcuaCIgMSAz CiMgMzIgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iYWNrd2FyZC9wYWlyLmgi IDIgMwojIDEgIi91c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9iaXRzL3N0bF9wYWly LmgiIDEgMwojIDMzICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvYmFja3dhcmQv cGFpci5oIiAyIDMKCnVzaW5nIHN0ZDo6cGFpcjsKdXNpbmcgc3RkOjptYWtlX3BhaXI7CiMgMzMg Ii9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9UaHJlYWQuaGgi IDIKCm5hbWVzcGFjZSBQcmFndWUKewoKY2xhc3MgTXV0ZXgKewpwdWJsaWM6CiAgY2xhc3MgQXR0 cmlidXRlCiAgewogIHB1YmxpYzoKICAgIEF0dHJpYnV0ZSgpIHsgcHRocmVhZF9tdXRleGF0dHJf aW5pdCAoJmltcGwpO30KICAgIH5BdHRyaWJ1dGUoKSB7IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ry b3koJmltcGwpO30KICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgaW1wbDsKICB9OwoKCiAgTXV0ZXgo KSB7IHB0aHJlYWRfbXV0ZXhfaW5pdCgmaW1wbCwgMCk7fQoKICB+TXV0ZXgoKSB7IHB0aHJlYWRf bXV0ZXhfZGVzdHJveSgmaW1wbCk7fQogIHZvaWQgbG9jaygpIHsgcHRocmVhZF9tdXRleF9sb2Nr KCZpbXBsKTt9CiAgdm9pZCB1bmxvY2soKSB7IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpbXBsKTt9 CiAgYm9vbCB0cnlsb2NrKCkgeyByZXR1cm4gcHRocmVhZF9tdXRleF90cnlsb2NrKCZpbXBsKTt9 CiAgcHRocmVhZF9tdXRleF90IGltcGw7Cn07CgoKY2xhc3MgU2VtYXBob3JlCnsKcHVibGljOgog IFNlbWFwaG9yZSh1bnNpZ25lZCBpbnQgdiA9IDApIHsgc2VtX2luaXQoJmltcGwsIDAsIHYpO30K ICB+U2VtYXBob3JlKCkgeyBzZW1fZGVzdHJveSgmaW1wbCk7fQogIHZvaWQgd2FpdCgpIHsgc2Vt X3dhaXQoJmltcGwpO30KICBib29sIHRyeXdhaXQoKSB7IHJldHVybiBzZW1fdHJ5d2FpdCgmaW1w bCk7fQogIHZvaWQgcG9zdCgpIHsgc2VtX3Bvc3QoJmltcGwpO30KICBpbnQgdmFsdWUoKSB7IGlu dCB2OyBzZW1fZ2V0dmFsdWUoJmltcGwsICZ2KTsgcmV0dXJuIHY7fQogIHNlbV90IGltcGw7CnBy aXZhdGU6CiAgU2VtYXBob3JlKGNvbnN0IFNlbWFwaG9yZSAmKTsKICBTZW1hcGhvcmUgJm9wZXJh dG9yID0gKGNvbnN0IFNlbWFwaG9yZSAmKTsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIExv Y2tfVHJhaXQKewpwdWJsaWM6CiAgdm9pZCBsb2NrKFQgJiB0KSB7IHQubG9jaygpO30KICB2b2lk IHVubG9jayhUICYgdCkgeyB0LnVubG9jaygpO30KfTsKCnRlbXBsYXRlPD4KY2xhc3MgTG9ja19U cmFpdDxTZW1hcGhvcmU+CnsKcHVibGljOgogIHZvaWQgbG9jayhTZW1hcGhvcmUgJiB0KSB7IHQu d2FpdCgpO30KICB2b2lkIHVubG9jayhTZW1hcGhvcmUgJiB0KSB7IHQucG9zdCgpO30KfTsKCnRl bXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFdMb2NrX1RyYWl0CnsKcHVibGljOgogIHZvaWQgbG9jayhU ICYgdCkgeyB0Lndsb2NrKCk7fQogIHZvaWQgdW5sb2NrKFQgJiB0KSB7IHQudW5sb2NrKCk7fQp9 OwoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBMX1RSQUlUID0gTG9ja19UcmFpdDxUPiA+CmNs YXNzIEd1YXJkCnsKcHVibGljOgogIEd1YXJkKFQgJiB0KSA6IHZpcCh0KSwgdHJhaXQoKSB7IHRy YWl0LmxvY2sodmlwKTt9CiAgfkd1YXJkKCkgeyB0cmFpdC51bmxvY2sodmlwKTt9CnByaXZhdGU6 CiAgR3VhcmQoY29uc3QgR3VhcmQ8VD4gJik7CiAgR3VhcmQgJiBvcGVyYXRvciA9IChjb25zdCBH dWFyZCAmKTsKICBUICYgdmlwOwogIExfVFJBSVQgdHJhaXQ7Cn07CgoKY2xhc3MgQ29uZGl0aW9u CnsKcHVibGljOgogIGNsYXNzIEF0dHJpYnV0ZQogIHsKICBwdWJsaWM6CiAgICBBdHRyaWJ1dGUo KSB7IHB0aHJlYWRfY29uZGF0dHJfaW5pdCgmaW1wbCk7fQogICAgfkF0dHJpYnV0ZSgpIHsgcHRo cmVhZF9jb25kYXR0cl9kZXN0cm95KCZpbXBsKTt9CiAgICBwdGhyZWFkX2NvbmRhdHRyX3QgaW1w bDsKICB9OwogIENvbmRpdGlvbihNdXRleCAmbSkgOiBtdXRleChtKSB7IHB0aHJlYWRfY29uZF9p bml0KCZpbXBsLCAwKTt9CiAgfkNvbmRpdGlvbigpIHsgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmlt cGwpO30KICB2b2lkIGJyb2FkY2FzdCgpIHsgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmaW1wbCk7 fQogIHZvaWQgc2lnbmFsKCkgeyBwdGhyZWFkX2NvbmRfc2lnbmFsKCZpbXBsKTt9CiAgdm9pZCB3 YWl0KCkgeyBwdGhyZWFkX2NvbmRfd2FpdCgmaW1wbCwgJm11dGV4LmltcGwpO30KICB2b2lkIHdh aXQoY29uc3QgVGltZSAmdCkgeyB0aW1lc3BlYyB0cyA9IHQ7IHB0aHJlYWRfY29uZF90aW1lZHdh aXQoJmltcGwsICZtdXRleC5pbXBsLCAmdHMpO30KICBwdGhyZWFkX2NvbmRfdCBpbXBsOwpwcml2 YXRlOgogIE11dGV4ICZtdXRleDsKfTsKIyAxNTggIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGlu L2luY2x1ZGUvUHJhZ3VlL1N5cy9UaHJlYWQuaGgiCmNsYXNzIFJXTG9jawp7CnB1YmxpYzoKICBS V0xvY2soKSB7fQogIH5SV0xvY2soKSB7fQogIHZvaWQgcmxvY2soKSB7fQogIHZvaWQgd2xvY2so KSB7fQogIHZvaWQgdW5sb2NrKCkge30KICBib29sIHRyeXJsb2NrKCkgeyByZXR1cm4gZmFsc2U7 fQogIGJvb2wgdHJ5d2xvY2soKSB7IHJldHVybiBmYWxzZTt9CnByaXZhdGU6CiAgTXV0ZXggbXV0 ZXg7CiAgU2VtYXBob3JlIHJlYWRlcnM7CiAgU2VtYXBob3JlIHdyaXRlcnM7Cn07CgoKCnRlbXBs YXRlIDw+IGNsYXNzIExvY2tfVHJhaXQ8UldMb2NrPgp7CnB1YmxpYzoKICB2b2lkIGxvY2soUldM b2NrICYgbCkgeyBsLnJsb2NrKCk7fQogIHZvaWQgdW5sb2NrKFJXTG9jayAmIGwpIHsgbC51bmxv Y2soKTt9Cn07CgoKY2xhc3MgVGhyZWFkCnsKICBzdHJ1Y3QgR3VhcmQKICB7CiAgICBHdWFyZCgp OwogICAgfkd1YXJkKCk7CiAgfTsKICBmcmllbmQgc3RydWN0IEd1YXJkOwpwdWJsaWM6CiAgZW51 bSBwcmlvcml0eV90IHtsb3csIG5vcm1hbCwgaGlnaH07CiAgZW51bSBzdGF0ZV90IHtyZWFkeSwg cnVubmluZywgdGVybWluYXRlZCwgY2FuY2VsZWQsIGpvaW5lZH07CiAgdGVtcGxhdGUgPGNsYXNz IFQ+IGNsYXNzIERhdGE7CiAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFF1ZXVlOwogIHR5cGVk ZWYgdm9pZCAqKCpwcm9jKSh2b2lkICopOwogIGNsYXNzIEF0dHJpYnV0ZQogIHsKICBwdWJsaWM6 CiAgICBBdHRyaWJ1dGUoKSB7IHB0aHJlYWRfYXR0cl9pbml0KCZpbXBsKTt9CiAgICB+QXR0cmli dXRlKCkgeyBwdGhyZWFkX2F0dHJfZGVzdHJveSgmaW1wbCk7fQogICAgcHRocmVhZF9hdHRyX3Qg aW1wbDsKICB9OwogIGNsYXNzIEV4Y2VwdGlvbgogIHsKICBwdWJsaWM6CiAgICBFeGNlcHRpb24o Y29uc3Qgc3RkOjpzdHJpbmcgJm0pIDogX21zZyhtKSB7fQogICAgY29uc3Qgc3RkOjpzdHJpbmcg JndoYXQoKSBjb25zdCB7IHJldHVybiBfbXNnO30KICBwcml2YXRlOgogICAgc3RkOjpzdHJpbmcg X21zZzsKICB9OwogIFRocmVhZChwcm9jLCB2b2lkICosIHByaW9yaXR5X3QgPSBub3JtYWwpOwog IH5UaHJlYWQoKTsKCiAgcHJpb3JpdHlfdCBwcmlvcml0eSgpIHsgUHJhZ3VlOjpHdWFyZDxNdXRl eD4gZyhtdXRleCk7IHJldHVybiBfcHJpb3JpdHk7fQoKICBzdGF0ZV90IHN0YXRlKCkgeyBQcmFn dWU6Okd1YXJkPE11dGV4PiBnKG11dGV4KTsgcmV0dXJuIF9zdGF0ZTt9CgogIHZvaWQgc3RhcnQo KSB0aHJvdyAoRXhjZXB0aW9uKTsKCiAgdm9pZCBqb2luKHZvaWQgKiopIHRocm93IChFeGNlcHRp b24pOwoKICB2b2lkIGNhbmNlbCgpOwoKICB2b2lkIGRldGFjaCgpOwoKICBzdGF0aWMgdm9pZCBl eGl0KHZvaWQgKnIpOwoKICBzdGF0aWMgYm9vbCBkZWxheShjb25zdCBUaW1lICYpOwoKICBzdGF0 aWMgdm9pZCB0ZXN0Y2FuY2VsKCkgeyBwdGhyZWFkX3Rlc3RjYW5jZWwoKTt9CgogIHN0YXRpYyBU aHJlYWQgKnNlbGYoKTsKCiAgc3RhdGljIHVuc2lnbmVkIGxvbmcgaWQoKTsKcHJpdmF0ZToKICBU aHJlYWQocHRocmVhZF90IHB0KSA6IHAoMCksIGFyZygwKSwgdGhyZWFkKHB0KSwgX3ByaW9yaXR5 KG5vcm1hbCksIF9zdGF0ZShydW5uaW5nKSwgZGV0YWNoZWQoZmFsc2UpIHt9CiAgc3RhdGljIHZv aWQgKnN0YXJ0KHZvaWQgKik7CiAgcHJvYyBwOwogIHZvaWQgKmFyZzsKICBwdGhyZWFkX3QgdGhy ZWFkOwogIHByaW9yaXR5X3QgX3ByaW9yaXR5OwogIHN0YXRlX3QgX3N0YXRlOwogIGJvb2wgZGV0 YWNoZWQ7CiAgTXV0ZXggbXV0ZXg7CiAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRlcjsKICBz dGF0aWMgVGhyZWFkICptYWluOwogIHN0YXRpYyBHdWFyZCBndWFyZDsKICBzdGF0aWMgcHRocmVh ZF9rZXlfdCBzZWxmX2tleTsKICBzdGF0aWMgcHRocmVhZF9rZXlfdCBpZF9rZXk7CiAgc3RhdGlj IE11dGV4IGlkX211dGV4Owp9OwoKaW5saW5lIFRocmVhZCAqVGhyZWFkOjpzZWxmKCkKewogIHJl dHVybiByZWludGVycHJldF9jYXN0PFRocmVhZCAqPihwdGhyZWFkX2dldHNwZWNpZmljKHNlbGZf a2V5KSk7Cn0KCmlubGluZSB1bnNpZ25lZCBsb25nIFRocmVhZDo6aWQoKQp7CiAgdW5zaWduZWQg bG9uZyAqX2lkID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nICo+KHB0aHJlYWRfZ2V0 c3BlY2lmaWMoaWRfa2V5KSk7CiAgaWYgKCFfaWQpCiAgICB7CiAgICAgIFByYWd1ZTo6R3VhcmQ8 TXV0ZXg+IGd1YXJkKGlkX211dGV4KTsKICAgICAgaWYgKCFfaWQpCiAgICAgICAgewogICAgICAg ICAgX2lkID0gbmV3IHVuc2lnbmVkIGxvbmcgKGNvdW50ZXIrKyk7CiAgICAgICAgICBwdGhyZWFk X3NldHNwZWNpZmljKGlkX2tleSwgX2lkKTsKICAgICAgICB9CiAgICB9CiAgcmV0dXJuICpfaWQ7 Cn0KCn0KIyAyOSAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9CZXJsaW4vU3Vi amVjdEltcGwuaGgiIDIKIyAxICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9pbmNsdWRlL0Jl cmxpbi9SZWZDb3VudEJhc2VJbXBsLmhoIiAxCiMgMjUgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVy bGluL2luY2x1ZGUvQmVybGluL1JlZkNvdW50QmFzZUltcGwuaGgiCiMgMSAiLi4vLi4vaW5jbHVk ZS9XYXJzYXcvY29uZmlnLmhoIiAxCiMgMjYgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2lu Y2x1ZGUvQmVybGluL1JlZkNvdW50QmFzZUltcGwuaGgiIDIKIyAxICIuLi8uLi9pbmNsdWRlL1dh cnNhdy9SZWZDb3VudEJhc2UuaGgiIDEKIyAyNyAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4v aW5jbHVkZS9CZXJsaW4vUmVmQ291bnRCYXNlSW1wbC5oaCIgMgojIDEgIi9ob21lL3N0ZWZhbi9C ZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9UcmFjZXIuaGgiIDEKIyAyNSAiL2hvbWUv c3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9QcmFndWUvU3lzL1RyYWNlci5oaCIKIyAxICIu Li8uLi9pbmNsdWRlL1ByYWd1ZS9jb25maWcuaGgiIDEKIyAyNiAiL2hvbWUvc3RlZmFuL0Jlcmxp bi9CZXJsaW4vaW5jbHVkZS9QcmFndWUvU3lzL1RyYWNlci5oaCIgMgojIDEgIi9ob21lL3N0ZWZh bi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9UaHJlYWQuaGgiIDEKIyAyNyAiL2hv bWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9QcmFndWUvU3lzL1RyYWNlci5oaCIgMgoj IDEgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9UaHJlYWRE YXRhLmhoIiAxCiMgMjUgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3Vl L1N5cy9UaHJlYWREYXRhLmhoIgojIDEgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1 ZGUvUHJhZ3VlL1N5cy9UaHJlYWQuaGgiIDEKIyAyNiAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJs aW4vaW5jbHVkZS9QcmFndWUvU3lzL1RocmVhZERhdGEuaGgiIDIKCm5hbWVzcGFjZSBQcmFndWUK ewoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFRocmVhZDo6RGF0YQp7CnB1YmxpYzoKICBjbGFz cyBUb29NdWNoVFNEcyA6IHB1YmxpYyBFeGNlcHRpb24geyBwdWJsaWM6IFRvb011Y2hUU0RzKCkg OiBFeGNlcHRpb24oInRvbyBtdWNoIFRTRHMgZGVmaW5lZCIpIHt9fTsKICBjbGFzcyBJbnZhbGlk S2V5IDogcHVibGljIEV4Y2VwdGlvbiB7IHB1YmxpYzogSW52YWxpZEtleSgpIDogRXhjZXB0aW9u KCJpbGxlZ2FsIGtleSIpIHt9fTsKCiAgRGF0YShUIHYpIHRocm93IChUb29NdWNoVFNEcywgSW52 YWxpZEtleSkgOiBpbml0aWFsaXplcih2KQogICAgewogICAgICBpZihwdGhyZWFkX2tleV9jcmVh dGUoJmtleSwgZGVzdHJ1Y3RvcikpIHRocm93IFRvb011Y2hUU0RzKCk7CiAgICAgIGlmKHB0aHJl YWRfc2V0c3BlY2lmaWMoa2V5LCBuZXcgVChpbml0aWFsaXplcikpKSB0aHJvdyBJbnZhbGlkS2V5 KCk7CiAgICB9CiAgRGF0YSgpIHRocm93IChUb29NdWNoVFNEcywgSW52YWxpZEtleSkKICAgIHsK ICAgICAgaWYocHRocmVhZF9rZXlfY3JlYXRlKCZrZXksIGRlc3RydWN0b3IpKSB0aHJvdyBUb29N dWNoVFNEcygpOwogICAgICBpZihwdGhyZWFkX3NldHNwZWNpZmljKGtleSwgbmV3IFQpKSB0aHJv dyBJbnZhbGlkS2V5KCk7CiAgICB9CiAgfkRhdGEoKQogICAgewogICAgICBkZWxldGUgcmVpbnRl cnByZXRfY2FzdDxUICo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5KSk7CiAgICAgIHB0aHJlYWRf a2V5X2RlbGV0ZShrZXkpOwogICAgfQogIGNvbnN0IFQgJnZhcih2b2lkKSBjb25zdCB0aHJvdyAo SW52YWxpZEtleSkKICAgIHsKICAgICAgVCAqZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihw dGhyZWFkX2dldHNwZWNpZmljKGtleSkpOwogICAgICBpZiAoIWRhdGEpCiAgICAgICAgewogICAg ICAgICAgaWYgKHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCBuZXcgVChpbml0aWFsaXplcikpKSB0 aHJvdyBJbnZhbGlkS2V5KCk7CiAgICAgICAgICBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxUICo+ KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5KSk7CiAgICAgICAgfQogICAgICByZXR1cm4gKmRhdGE7 CiAgICB9CiAgVCAmdmFyKHZvaWQpIHRocm93IChJbnZhbGlkS2V5KQogICAgewogICAgICBUICpk YXRhID0gcmVpbnRlcnByZXRfY2FzdDxUICo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5KSk7CiAg ICAgIGlmICghZGF0YSkKICAgICAgICB7CiAgICAgICAgICBpZiAocHRocmVhZF9zZXRzcGVjaWZp YyhrZXksIG5ldyBUKGluaXRpYWxpemVyKSkpIHRocm93IEludmFsaWRLZXkoKTsKICAgICAgICAg IGRhdGEgPSByZWludGVycHJldF9jYXN0PFQgKj4ocHRocmVhZF9nZXRzcGVjaWZpYyhrZXkpKTsK ICAgICAgICB9CiAgICAgIHJldHVybiAqZGF0YTsKICAgIH0KICBEYXRhPFQ+ICZvcGVyYXRvciA9 IChjb25zdCBUICZ0KSB0aHJvdyAoSW52YWxpZEtleSkKICAgIHsKICAgICAgVCAqZGF0YSA9IHJl aW50ZXJwcmV0X2Nhc3Q8VCAqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleSkpOwogICAgICBpZiAo ZGF0YSkgKmRhdGEgPSB0OwogICAgICBlbHNlIGlmIChwdGhyZWFkX3NldHNwZWNpZmljKGtleSwg bmV3IFQodCkpKSB0aHJvdyBJbnZhbGlkS2V5KCk7CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0K ICBEYXRhPFQ+ICZvcGVyYXRvciA9IChjb25zdCBEYXRhPFQ+ICZ0KSB0aHJvdyAoSW52YWxpZEtl eSkKICAgIHsKICAgICAgVCAqZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihwdGhyZWFkX2dl dHNwZWNpZmljKGtleSkpOwogICAgICBpZiAoZGF0YSkgKmRhdGEgPSAqdDsKICAgICAgZWxzZSBp ZiAocHRocmVhZF9zZXRzcGVjaWZpYyhrZXksIG5ldyBUKCp0KSkpIHRocm93IEludmFsaWRLZXko KTsKICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogIGNvbnN0IFQgKm9wZXJhdG9yLT4oKSBjb25z dCB0aHJvdyAoSW52YWxpZEtleSkKICAgIHsKICAgICAgVCAqZGF0YSA9IHJlaW50ZXJwcmV0X2Nh c3Q8VCAqPihwdGhyZWFkX2dldHNwZWNpZmljKGtleSkpOwogICAgICBpZiAoIWRhdGEpCiAgICAg ICAgewogICAgICAgICAgaWYgKHB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCBuZXcgVChpbml0aWFs aXplcikpKSB0aHJvdyBJbnZhbGlkS2V5KCk7CiAgICAgICAgICBkYXRhID0gcmVpbnRlcnByZXRf Y2FzdDxUICo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5KSk7CiAgICAgICAgfQogICAgICByZXR1 cm4gZGF0YTsKICAgIH0KICBUICpvcGVyYXRvci0+KCkgdGhyb3cgKEludmFsaWRLZXkpCiAgICB7 CiAgICAgIFQgKmRhdGEgPSByZWludGVycHJldF9jYXN0PFQgKj4ocHRocmVhZF9nZXRzcGVjaWZp YyhrZXkpKTsKICAgICAgaWYgKCFkYXRhKQogICAgICAgIHsKICAgICAgICAgIGlmIChwdGhyZWFk X3NldHNwZWNpZmljKGtleSwgbmV3IFQoaW5pdGlhbGl6ZXIpKSkgdGhyb3cgSW52YWxpZEtleSgp OwogICAgICAgICAgZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihwdGhyZWFkX2dldHNwZWNp ZmljKGtleSkpOwogICAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgY29uc3QgVCAm b3BlcmF0b3IgKigpIGNvbnN0IHsgcmV0dXJuIHZhcigpO30KICAgICAgICBUICZvcGVyYXRvciAq KCkgeyByZXR1cm4gdmFyKCk7fQpwcml2YXRlOgogIHN0YXRpYyB2b2lkIGRlc3RydWN0b3Iodm9p ZCAqZGF0YSkgeyBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxUICo+KGRhdGEpO30KICBEYXRhKGNv bnN0IERhdGE8VD4gJik7CiAgcHRocmVhZF9rZXlfdCBrZXk7CiAgVCBpbml0aWFsaXplcjsKfTsK Cn07CiMgMjggIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9U cmFjZXIuaGgiIDIKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9nKystdjMvdmVjdG9y IiAxIDMKIyAyOSAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9QcmFndWUvU3lz L1RyYWNlci5oaCIgMgoKbmFtZXNwYWNlIFByYWd1ZQp7CgpjbGFzcyBUcmFjZTsKCgoKCmNsYXNz IFRyYWNlcgp7CiAgc3RydWN0IEV2ZW50CiAgewogICAgZG91YmxlIHRpbWU7CiAgICB1bnNpZ25l ZCBsb25nIHRocmVhZDsKICAgIGNvbnN0IGNoYXIgKnR5cGU7CiAgICBjb25zdCBjaGFyICpzcGVj aWZpY3M7CiAgICBmcmllbmQgc3RkOjpvc3RyZWFtICZvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFt ICZvcywgY29uc3QgRXZlbnQgJmUpCiAgICB7IHJldHVybiBvcyA8PCBlLnRpbWUgPDwgJzonIDw8 IGUudGhyZWFkIDw8ICdcdCcgPDwgZS50eXBlIDw8ICcgJyA8PCBlLnNwZWNpZmljczt9CiAgfTsK ICBmcmllbmQgY2xhc3MgVHJhY2U7CnB1YmxpYzoKICBzdGF0aWMgdm9pZCByZXNpemUoc2l6ZV90 IHMpIHsgUHJhZ3VlOjpHdWFyZDxNdXRleD4gZ3VhcmQoX211dGV4KTsgX2V2ZW50cy5yZXNpemUo cyk7IGlmIChfbmV4dCA+PSBzKSBfbmV4dCA9IDA7fQogIHN0YXRpYyB2b2lkIGxvZ2dpbmcoYm9v bCBsKSB7IF9sb2cgPSBsO30KICBzdGF0aWMgdm9pZCBhZGQoY29uc3QgY2hhciAqbiwgY29uc3Qg Y2hhciAqdHkgPSAiIikKICB7CiAgICB7CiAgICAgIFByYWd1ZTo6R3VhcmQ8TXV0ZXg+IGd1YXJk KF9tdXRleCk7CiAgICAgIGlmIChfbmV4dCA9PSBfZXZlbnRzLnNpemUoKSkgcmV0dXJuOwogICAg ICBfZXZlbnRzW19uZXh0XS50aW1lID0gVGltZTo6Y3VycmVudFRpbWUoKSAtIF9zdGFydDsKICAg ICAgX2V2ZW50c1tfbmV4dF0udGhyZWFkID0gVGhyZWFkOjpzZWxmKCktPmlkKCk7CiAgICAgIF9l dmVudHNbX25leHRdLnR5cGUgPSB0eTsKICAgICAgX2V2ZW50c1tfbmV4dF0uc3BlY2lmaWNzID0g bjsKICAgICAgaWYgKF9sb2cpCiAgICAgICAgewogICAgICAgICAgZm9yICh1bnNpZ25lZCBzaG9y dCBpID0gMDsgaSAhPSAqX2luZGVudDsgaSsrKSBzdGQ6OmNlcnIucHV0KCcgJyk7CiAgICAgICAg ICBzdGQ6OmNlcnIgPDwgX2V2ZW50c1tfbmV4dF0gPDwgc3RkOjplbmRsOwogICAgICAgIH0KICAg ICAgX25leHQrKzsKICAgICAgaWYgKF9uZXh0ID09IF9ldmVudHMuc2l6ZSgpKQogICAgICAgIHsK ICAgICAgICAgIF9uZXh0ID0gMDsKICAgICAgICAgIF93cmFwcGVkID0gdHJ1ZTsKICAgICAgICB9 CiAgICB9CiAgfQogIHN0YXRpYyB2b2lkIGNsZWFyKCkgeyBfbmV4dCA9IDA7IF93cmFwcGVkID0g ZmFsc2U7fQogIHN0YXRpYyB2b2lkIGR1bXAoc3RkOjpvc3RyZWFtICZvcykKICB7CiAgICBzdGQ6 OnZlY3RvcjxFdmVudD46Oml0ZXJhdG9yIGU7CiAgICBvcyA8PCAiKiBUcmFjZXI6OmR1bXAgPVxu IjsKICAgIGlmIChfd3JhcHBlZCkgZm9yIChlID0gX2V2ZW50cy5iZWdpbigpICsgX25leHQ7IGUg IT0gX2V2ZW50cy5lbmQoKTsgZSsrKSBvcyA8PCAqZSA8PCAnXG4nOwogICAgZm9yIChlID0gX2V2 ZW50cy5iZWdpbigpOyBlICE9IF9ldmVudHMuYmVnaW4oKSArIF9uZXh0OyBlKyspIG9zIDw8ICpl IDw8ICdcbic7CiAgICBvcyA8PCAiKiBlbmQgb2YgVHJhY2VyOjpkdW1wIiA8PCBzdGQ6OmVuZGw7 CiAgfQpwcml2YXRlOgogIHN0YXRpYyBzdGQ6OnZlY3RvcjxFdmVudD4gX2V2ZW50czsKICBzdGF0 aWMgVGltZSBfc3RhcnQ7CiAgc3RhdGljIFRocmVhZDo6RGF0YTx1bnNpZ25lZCBzaG9ydD4gX2lu ZGVudDsKICBzdGF0aWMgTXV0ZXggX211dGV4OwogIHN0YXRpYyB1bnNpZ25lZCBpbnQgX25leHQ7 CiAgc3RhdGljIGJvb2wgX3dyYXBwZWQ7CiAgc3RhdGljIGJvb2wgX2xvZzsKfTsKIyAxMDQgIi9o b21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvUHJhZ3VlL1N5cy9UcmFjZXIuaGgiCmNs YXNzIFRyYWNlCnsKcHVibGljOgogIFRyYWNlKGNvbnN0IGNoYXIgKikge30KICB+VHJhY2UoKSB7 fQp9OwoKCn07CiMgMjggIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGlu L1JlZkNvdW50QmFzZUltcGwuaGgiIDIKIyAxICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9p bmNsdWRlL0Jlcmxpbi9TZXJ2YW50QmFzZS5oaCIgMQojIDI1ICIvaG9tZS9zdGVmYW4vQmVybGlu L0Jlcmxpbi9pbmNsdWRlL0Jlcmxpbi9TZXJ2YW50QmFzZS5oaCIKIyAxICIvaG9tZS9zdGVmYW4v QmVybGluL0Jlcmxpbi9pbmNsdWRlL1ByYWd1ZS9TeXMvVHJhY2VyLmhoIiAxCiMgMjYgIi9ob21l L3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGluL1NlcnZhbnRCYXNlLmhoIiAyCiMg MSAiLi4vLi4vaW5jbHVkZS9XYXJzYXcvY29uZmlnLmhoIiAxCiMgMjcgIi9ob21lL3N0ZWZhbi9C ZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGluL1NlcnZhbnRCYXNlLmhoIiAyCiMgMSAiLi4vLi4v aW5jbHVkZS9XYXJzYXcvVHlwZXMuaGgiIDEKIyAyOCAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJs aW4vaW5jbHVkZS9CZXJsaW4vU2VydmFudEJhc2UuaGgiIDIKIyAxICIvdXNyL2xvY2FsL2djYy0z LjAvaW5jbHVkZS9nKystdjMvY2Fzc2VydCIgMSAzCiMgMzEgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9jYXNzZXJ0IiAzCiMgMSAiL3Vzci9sb2NhbC9nY2MtMy4wL2luY2x1ZGUv ZysrLXYzL2JpdHMvc3RkX2Nhc3NlcnQuaCIgMSAzCiMgMzcgIi91c3IvbG9jYWwvZ2NjLTMuMC9p bmNsdWRlL2crKy12My9iaXRzL3N0ZF9jYXNzZXJ0LmgiIDMKIyAxICIvdXNyL2luY2x1ZGUvYXNz ZXJ0LmgiIDEgMwojIDM1ICIvdXNyL2luY2x1ZGUvYXNzZXJ0LmgiIDMKIyAxICIvdXNyL2luY2x1 ZGUvZmVhdHVyZXMuaCIgMSAzCiMgMzYgIi91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMiAzCiMgNTgg Ii91c3IvaW5jbHVkZS9hc3NlcnQuaCIgMwpleHRlcm4gIkMiIHsKCgpleHRlcm4gdm9pZCBfX2Fz c2VydF9mYWlsIChfX2NvbnN0IGNoYXIgKl9fYXNzZXJ0aW9uLCBfX2NvbnN0IGNoYXIgKl9fZmls ZSwgdW5zaWduZWQgaW50IF9fbGluZSwgX19jb25zdCBjaGFyICpfX2Z1bmN0aW9uKSB0aHJvdyAo KQoKCgogICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCgpleHRlcm4gdm9pZCBf X2Fzc2VydF9wZXJyb3JfZmFpbCAoaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwg dW5zaWduZWQgaW50IF9fbGluZSwgX19jb25zdCBjaGFyICpfX2Z1bmN0aW9uKSB0aHJvdyAoKQoK CgogICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCn0KIyAzOCAiL3Vzci9sb2Nh bC9nY2MtMy4wL2luY2x1ZGUvZysrLXYzL2JpdHMvc3RkX2Nhc3NlcnQuaCIgMiAzCiMgMzIgIi91 c3IvbG9jYWwvZ2NjLTMuMC9pbmNsdWRlL2crKy12My9jYXNzZXJ0IiAyIDMKIyAyOSAiL2hvbWUv c3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9CZXJsaW4vU2VydmFudEJhc2UuaGgiIDIKCmNs YXNzIFNlcnZhbnRCYXNlIDogcHVibGljIHZpcnR1YWwgUG9ydGFibGVTZXJ2ZXI6OlJlZkNvdW50 U2VydmFudEJhc2UKewogIGZyaWVuZCBjbGFzcyBLaXRJbXBsOwogIGZyaWVuZCBjbGFzcyBJZGVu dGlmaWFibGVJbXBsOwpwdWJsaWM6CiAgU2VydmFudEJhc2UoKSA6IHBvYShQb3J0YWJsZVNlcnZl cjo6UE9BOjpfbmlsKCkpIHt9CiAgdmlydHVhbCB+U2VydmFudEJhc2UoKSB7fQogIHZpcnR1YWwg dm9pZCBkZWFjdGl2YXRlKCk7CnByb3RlY3RlZDoKICBzdGF0aWMgdm9pZCBkZWFjdGl2YXRlKFNl cnZhbnRCYXNlICopOwoKCgogIHZvaWQgYWN0aXZhdGUoU2VydmFudEJhc2UgKik7CgoKICB2aXJ0 dWFsIHZvaWQgYWN0aXZhdGVfY29tcG9zaXRlKCkge30KcHJpdmF0ZToKICBQb3J0YWJsZVNlcnZl cjo6UE9BX3ZhciBwb2E7Cn07CiMgMjkgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1 ZGUvQmVybGluL1JlZkNvdW50QmFzZUltcGwuaGgiIDIKCgpjbGFzcyBSZWZDb3VudEJhc2VJbXBs IDogcHVibGljIHZpcnR1YWwgUE9BX1dhcnNhdzo6UmVmQ291bnRCYXNlLAogICAgICAgICAgICAg ICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgU2VydmFudEJhc2UKewpwdWJsaWM6CiAgUmVmQ291 bnRCYXNlSW1wbCgpOwogIHZpcnR1YWwgflJlZkNvdW50QmFzZUltcGwoKTsKICB2aXJ0dWFsIHZv aWQgaW5jcmVtZW50KCk7CiAgdmlydHVhbCB2b2lkIGRlY3JlbWVudCgpOwpwcml2YXRlOgogIGlu dCByZWZjb3VudDsKfTsKIyAzMCAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVkZS9C ZXJsaW4vU3ViamVjdEltcGwuaGgiIDIKIyAxICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9p bmNsdWRlL0Jlcmxpbi9JZGVudGlmaWFibGVJbXBsLmhoIiAxCiMgMjUgIi9ob21lL3N0ZWZhbi9C ZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGluL0lkZW50aWZpYWJsZUltcGwuaGgiCiMgMSAiLi4v Li4vaW5jbHVkZS9XYXJzYXcvY29uZmlnLmhoIiAxCiMgMjYgIi9ob21lL3N0ZWZhbi9CZXJsaW4v QmVybGluL2luY2x1ZGUvQmVybGluL0lkZW50aWZpYWJsZUltcGwuaGgiIDIKIyAxICIuLi8uLi9p bmNsdWRlL1dhcnNhdy9JZGVudGlmaWFibGUuaGgiIDEKIyAyNyAiL2hvbWUvc3RlZmFuL0Jlcmxp bi9CZXJsaW4vaW5jbHVkZS9CZXJsaW4vSWRlbnRpZmlhYmxlSW1wbC5oaCIgMgojIDEgIi9ob21l L3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGluL1NlcnZhbnRCYXNlLmhoIiAxCiMg MjggIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQmVybGluL0lkZW50aWZpYWJs ZUltcGwuaGgiIDIKCmNsYXNzIElkZW50aWZpYWJsZUltcGwgOiBwdWJsaWMgdmlydHVhbCBQT0Ff V2Fyc2F3OjpJZGVudGlmaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmly dHVhbCBTZXJ2YW50QmFzZQp7CnB1YmxpYzoKICBDT1JCQTo6Qm9vbGVhbiBpc19pZGVudGljYWwo V2Fyc2F3OjpJZGVudGlmaWFibGVfcHRyKTsKfTsKIyAzMSAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9C ZXJsaW4vaW5jbHVkZS9CZXJsaW4vU3ViamVjdEltcGwuaGgiIDIKIyAxICIvdXNyL2xvY2FsL2dj Yy0zLjAvaW5jbHVkZS9nKystdjMvdmVjdG9yIiAxIDMKIyAzMiAiL2hvbWUvc3RlZmFuL0Jlcmxp bi9CZXJsaW4vaW5jbHVkZS9CZXJsaW4vU3ViamVjdEltcGwuaGgiIDIKCmNsYXNzIFN1YmplY3RJ bXBsIDogcHVibGljIHZpcnR1YWwgUE9BX1dhcnNhdzo6U3ViamVjdCwKICAgICAgICAgICAgICAg ICAgICBwdWJsaWMgdmlydHVhbCBSZWZDb3VudEJhc2VJbXBsLAogICAgICAgICAgICAgICAgICAg IHB1YmxpYyB2aXJ0dWFsIElkZW50aWZpYWJsZUltcGwKewogIHR5cGVkZWYgc3RkOjp2ZWN0b3I8 V2Fyc2F3OjpPYnNlcnZlcl92YXI+IG9saXN0X3Q7CnB1YmxpYzoKICBTdWJqZWN0SW1wbCgpOwog IHZvaWQgYXR0YWNoKFdhcnNhdzo6T2JzZXJ2ZXJfcHRyKTsKICB2b2lkIGRldGFjaChXYXJzYXc6 Ok9ic2VydmVyX3B0cik7CiAgdm9pZCBub3RpZnkoY29uc3QgQ09SQkE6OkFueSAmKTsKICB2aXJ0 dWFsIHZvaWQgbm90aWZ5KCk7CiAgdm9pZCBibG9jayhDT1JCQTo6Qm9vbGVhbik7CnByaXZhdGU6 CiAgb2xpc3RfdCBfb2JzZXJ2ZXJzOwogIENPUkJBOjpCb29sZWFuIF9ibG9ja2VkOwogIFByYWd1 ZTo6TXV0ZXggX211dGV4OwogIFByYWd1ZTo6TXV0ZXggX29ic2VydmVyTXV0ZXg7Cn07CiMgMjkg Ii9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQ29tbWFuZC9UZWxsdGFsZUltcGwu aGgiIDIKIyAxICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9pbmNsdWRlL1ByYWd1ZS9TeXMv VGhyZWFkLmhoIiAxCiMgMzAgIi9ob21lL3N0ZWZhbi9CZXJsaW4vQmVybGluL2luY2x1ZGUvQ29t bWFuZC9UZWxsdGFsZUltcGwuaGgiIDIKIyAxICIvdXNyL2xvY2FsL2djYy0zLjAvaW5jbHVkZS9n KystdjMvdmVjdG9yIiAxIDMKIyAzMSAiL2hvbWUvc3RlZmFuL0Jlcmxpbi9CZXJsaW4vaW5jbHVk ZS9Db21tYW5kL1RlbGx0YWxlSW1wbC5oaCIgMgoKY2xhc3MgVGVsbHRhbGVJbXBsIDogcHVibGlj IHZpcnR1YWwgUE9BX1dhcnNhdzo6VGVsbHRhbGUsCiAgICAgICAgICAgICAgICAgICAgIHB1Ymxp YyBTdWJqZWN0SW1wbAp7CiBwdWJsaWM6CiAgVGVsbHRhbGVJbXBsKFdhcnNhdzo6VGVsbHRhbGVD b25zdHJhaW50X3B0ciwgQ09SQkE6OlVMb25nIG0gPSAwKTsKICB2aXJ0dWFsIH5UZWxsdGFsZUlt cGwoKTsKICB2aXJ0dWFsIHZvaWQgc2V0KFdhcnNhdzo6VGVsbHRhbGU6Ok1hc2spOwogIHZpcnR1 YWwgdm9pZCBjbGVhcihXYXJzYXc6OlRlbGx0YWxlOjpNYXNrKTsKICB2aXJ0dWFsIENPUkJBOjpC b29sZWFuIHRlc3QoV2Fyc2F3OjpUZWxsdGFsZTo6TWFzayk7CiAgdmlydHVhbCB2b2lkIG1vZGlm eShXYXJzYXc6OlRlbGx0YWxlOjpNYXNrLCBDT1JCQTo6Qm9vbGVhbik7CiAgQ09SQkE6OlVMb25n IHN0YXRlKCkgeyByZXR1cm4gX21hc2s7fQoKICB2aXJ0dWFsIHZvaWQgY29uc3RyYWludChXYXJz YXc6OlRlbGx0YWxlQ29uc3RyYWludF9wdHIpOwogIHZpcnR1YWwgV2Fyc2F3OjpUZWxsdGFsZUNv bnN0cmFpbnRfcHRyIGNvbnN0cmFpbnQoKTsKCiBwcm90ZWN0ZWQ6CiAgUHJhZ3VlOjpNdXRleCBf bXV0ZXg7CiAgQ09SQkE6OlVMb25nIF9tYXNrOwogIFdhcnNhdzo6VGVsbHRhbGVDb25zdHJhaW50 X3ZhciBfY29uc3RyYWludDsKfTsKCmNsYXNzIFRlbGx0YWxlQ29uc3RyYWludEltcGwgOiBwdWJs aWMgdmlydHVhbCBQT0FfV2Fyc2F3OjpUZWxsdGFsZUNvbnN0cmFpbnQsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBQb3J0YWJsZVNlcnZlcjo6UmVmQ291bnRT ZXJ2YW50QmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFs IFJlZkNvdW50QmFzZUltcGwKewogIHR5cGVkZWYgc3RkOjp2ZWN0b3I8V2Fyc2F3OjpUZWxsdGFs ZV92YXI+IHRsaXN0X3Q7CiBwdWJsaWM6CiAgVGVsbHRhbGVDb25zdHJhaW50SW1wbCgpIHt9CiAg dmlydHVhbCB+VGVsbHRhbGVDb25zdHJhaW50SW1wbCgpIHt9CiAgdm9pZCBhZGQoV2Fyc2F3OjpU ZWxsdGFsZV9wdHIpOwogIHZvaWQgcmVtb3ZlKFdhcnNhdzo6VGVsbHRhbGVfcHRyKTsKICB2aXJ0 dWFsIHZvaWQgdHJ5bW9kaWZ5KFdhcnNhdzo6VGVsbHRhbGVfcHRyLCBXYXJzYXc6OlRlbGx0YWxl OjpNYXNrLCBDT1JCQTo6Qm9vbGVhbikgPSAwOwogcHJvdGVjdGVkOgogIFByYWd1ZTo6TXV0ZXgg X211dGV4OwogIHRsaXN0X3QgX3RlbGx0YWxlczsKfTsKCmNsYXNzIEV4Y2x1c2l2ZUNob2ljZSA6 IHB1YmxpYyBUZWxsdGFsZUNvbnN0cmFpbnRJbXBsCnsKcHVibGljOgogIEV4Y2x1c2l2ZUNob2lj ZShXYXJzYXc6OlRlbGx0YWxlOjpNYXNrKTsKICB2aXJ0dWFsIHZvaWQgdHJ5bW9kaWZ5KFdhcnNh dzo6VGVsbHRhbGVfcHRyLCBXYXJzYXc6OlRlbGx0YWxlOjpNYXNrLCBDT1JCQTo6Qm9vbGVhbik7 CnByaXZhdGU6CiAgV2Fyc2F3OjpUZWxsdGFsZTo6TWFzayBfbWFzazsKfTsKCmNsYXNzIFNlbGVj dGlvblJlcXVpcmVkIDogcHVibGljIFRlbGx0YWxlQ29uc3RyYWludEltcGwKewpwdWJsaWM6CiAg U2VsZWN0aW9uUmVxdWlyZWQoV2Fyc2F3OjpUZWxsdGFsZTo6TWFzayk7CiAgdmlydHVhbCB2b2lk IHRyeW1vZGlmeShXYXJzYXc6OlRlbGx0YWxlX3B0ciwgV2Fyc2F3OjpUZWxsdGFsZTo6TWFzaywg Q09SQkE6OkJvb2xlYW4pOwpwcml2YXRlOgogIFdhcnNhdzo6VGVsbHRhbGU6Ok1hc2sgX21hc2s7 Cn07CgpjbGFzcyBFeGNsdXNpdmVSZXF1aXJlZCA6IHB1YmxpYyBUZWxsdGFsZUNvbnN0cmFpbnRJ bXBsCnsKcHVibGljOgogIEV4Y2x1c2l2ZVJlcXVpcmVkKFdhcnNhdzo6VGVsbHRhbGU6Ok1hc2sp OwogIHZpcnR1YWwgdm9pZCB0cnltb2RpZnkoV2Fyc2F3OjpUZWxsdGFsZV9wdHIsIFdhcnNhdzo6 VGVsbHRhbGU6Ok1hc2ssIENPUkJBOjpCb29sZWFuKTsKcHJpdmF0ZToKICBXYXJzYXc6OlRlbGx0 YWxlOjpNYXNrIF9tYXNrOwp9OwojIDIzICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxpbi9zcmMv Q29tbWFuZC9UZWxsdGFsZUltcGwuY2MiIDIKIyAxICIvaG9tZS9zdGVmYW4vQmVybGluL0Jlcmxp bi9pbmNsdWRlL1ByYWd1ZS9TeXMvVHJhY2VyLmhoIiAxCiMgMjQgIi9ob21lL3N0ZWZhbi9CZXJs aW4vQmVybGluL3NyYy9Db21tYW5kL1RlbGx0YWxlSW1wbC5jYyIgMgoKdXNpbmcgbmFtZXNwYWNl IFByYWd1ZTsKdXNpbmcgbmFtZXNwYWNlIFdhcnNhdzsKClRlbGx0YWxlSW1wbDo6VGVsbHRhbGVJ bXBsKFRlbGx0YWxlQ29uc3RyYWludF9wdHIgYywgdW5zaWduZWQgbG9uZyBtKQogIDogX21hc2so bSksIF9jb25zdHJhaW50KGMpCnt9CgpUZWxsdGFsZUltcGw6On5UZWxsdGFsZUltcGwoKQp7fQoK dm9pZCBUZWxsdGFsZUltcGw6OnNldChXYXJzYXc6OlRlbGx0YWxlOjpNYXNrIG0pCnsKICBUcmFj ZSB0cmFjZSgiVGVsbHRhbGVJbXBsOjpzZXQiKTsKICBpZiAoIUNPUkJBOjppc19uaWwoX2NvbnN0 cmFpbnQpKSBfY29uc3RyYWludC0+dHJ5bW9kaWZ5KFRlbGx0YWxlX3ZhcihfdGhpcygpKSwgbSwg dHJ1ZSk7CiAgZWxzZSBtb2RpZnkobSwgdHJ1ZSk7Cn0KCnZvaWQgVGVsbHRhbGVJbXBsOjpjbGVh cihXYXJzYXc6OlRlbGx0YWxlOjpNYXNrIG0pCnsKICBUcmFjZSB0cmFjZSgiVGVsbHRhbGVJbXBs OjpjbGVhciIpOwogIGlmICghQ09SQkE6OmlzX25pbChfY29uc3RyYWludCkpIF9jb25zdHJhaW50 LT50cnltb2RpZnkoVGVsbHRhbGVfdmFyKF90aGlzKCkpLCBtLCBmYWxzZSk7CiAgZWxzZSBtb2Rp ZnkobSwgZmFsc2UpOwp9CgpDT1JCQTo6Qm9vbGVhbiBUZWxsdGFsZUltcGw6OnRlc3QoV2Fyc2F3 OjpUZWxsdGFsZTo6TWFzayBtKQp7CiAgUHJhZ3VlOjpHdWFyZDxNdXRleD4gZ3VhcmQoX211dGV4 KTsKICByZXR1cm4gKF9tYXNrICYgbSkgPT0gbTsKfQoKdm9pZCBUZWxsdGFsZUltcGw6Om1vZGlm eShXYXJzYXc6OlRlbGx0YWxlOjpNYXNrIG0sIENPUkJBOjpCb29sZWFuIG9uKQp7CiAgdW5zaWdu ZWQgbG9uZyBuZiA9IG9uID8gX21hc2sgfCBtIDogX21hc2sgJiB+bTsKICB7CiAgICBQcmFndWU6 Okd1YXJkPE11dGV4PiBndWFyZChfbXV0ZXgpOwogICAgaWYgKG5mID09IF9tYXNrKSByZXR1cm47 CiAgICBlbHNlIF9tYXNrID0gbmY7CiAgfQogIENPUkJBOjpBbnkgYW55OwogIGFueSA8PD0gbmY7 CiAgbm90aWZ5KGFueSk7Cn0KCnZvaWQgVGVsbHRhbGVJbXBsOjpjb25zdHJhaW50KFRlbGx0YWxl Q29uc3RyYWludF9wdHIgY29uc3RyYWludCkKewogIFByYWd1ZTo6R3VhcmQ8TXV0ZXg+IGd1YXJk KF9tdXRleCk7CiAgX2NvbnN0cmFpbnQgPSBjb25zdHJhaW50Owp9CgoKVGVsbHRhbGVDb25zdHJh aW50X3B0ciBUZWxsdGFsZUltcGw6OmNvbnN0cmFpbnQoKQp7CiAgUHJhZ3VlOjpHdWFyZDxNdXRl eD4gZ3VhcmQoX211dGV4KTsKICByZXR1cm4gVGVsbHRhbGVDb25zdHJhaW50OjpfZHVwbGljYXRl KF9jb25zdHJhaW50KTsKfQoKdm9pZCBUZWxsdGFsZUNvbnN0cmFpbnRJbXBsOjphZGQoVGVsbHRh bGVfcHRyIHQpCnsKICBQcmFndWU6Okd1YXJkPE11dGV4PiBndWFyZChfbXV0ZXgpOwogIF90ZWxs dGFsZXMucHVzaF9iYWNrKFRlbGx0YWxlOjpfZHVwbGljYXRlKHQpKTsKICB0LT5jb25zdHJhaW50 KFRlbGx0YWxlQ29uc3RyYWludF92YXIoX3RoaXMoKSkpOwp9Cgp2b2lkIFRlbGx0YWxlQ29uc3Ry YWludEltcGw6OnJlbW92ZShUZWxsdGFsZV9wdHIgdCkKewogIFByYWd1ZTo6R3VhcmQ8TXV0ZXg+ IGd1YXJkKF9tdXRleCk7CiAgZm9yICh0bGlzdF90OjppdGVyYXRvciBpID0gX3RlbGx0YWxlcy5i ZWdpbigpOyBpICE9IF90ZWxsdGFsZXMuZW5kKCk7ICsraSkKICAgIGlmICgoKmkpID09IHQpCiAg ICAgIHsKICAgICAgICBfdGVsbHRhbGVzLmVyYXNlKGkpOwogICAgICAgIGJyZWFrOwogICAgICB9 Cn0KCkV4Y2x1c2l2ZUNob2ljZTo6RXhjbHVzaXZlQ2hvaWNlKFdhcnNhdzo6VGVsbHRhbGU6Ok1h c2sgbSkKICA6IF9tYXNrKG0pCnt9Cgp2b2lkIEV4Y2x1c2l2ZUNob2ljZTo6dHJ5bW9kaWZ5KFRl bGx0YWxlX3B0ciB0LCBXYXJzYXc6OlRlbGx0YWxlOjpNYXNrIG0sIENPUkJBOjpCb29sZWFuIGIp CnsKICBQcmFndWU6Okd1YXJkPE11dGV4PiBndWFyZChfbXV0ZXgpOwogIGlmIChiKQogICAgZm9y ICh0bGlzdF90OjppdGVyYXRvciBpID0gX3RlbGx0YWxlcy5iZWdpbigpOyBpICE9IF90ZWxsdGFs ZXMuZW5kKCk7ICsraSkKICAgICAgaWYgKCgqaSktPnRlc3QobSkpICgqaSktPm1vZGlmeShtLCBm YWxzZSk7CiAgdC0+bW9kaWZ5KG0sIGIpOwp9CgpTZWxlY3Rpb25SZXF1aXJlZDo6U2VsZWN0aW9u UmVxdWlyZWQoV2Fyc2F3OjpUZWxsdGFsZTo6TWFzayBtKQogIDogX21hc2sobSkKewp9Cgp2b2lk IFNlbGVjdGlvblJlcXVpcmVkOjp0cnltb2RpZnkoVGVsbHRhbGVfcHRyIHQsIFdhcnNhdzo6VGVs bHRhbGU6Ok1hc2sgbSwgQ09SQkE6OkJvb2xlYW4gYikKewogIFByYWd1ZTo6R3VhcmQ8TXV0ZXg+ IGd1YXJkKF9tdXRleCk7CiAgc2l6ZV90IHNlbGVjdGVkID0gMDsKICBpZiAoIWIpCiAgICBmb3Ig KHRsaXN0X3Q6Oml0ZXJhdG9yIGkgPSBfdGVsbHRhbGVzLmJlZ2luKCk7IGkgIT0gX3RlbGx0YWxl cy5lbmQoKTsgKytpKQogICAgICBpZiAoKCppKS0+dGVzdChtKSkgc2VsZWN0ZWQrKzsKICBpZiAo YiB8fCBzZWxlY3RlZCA+IDEpIHQtPm1vZGlmeShtLCBiKTsKfQoKRXhjbHVzaXZlUmVxdWlyZWQ6 OkV4Y2x1c2l2ZVJlcXVpcmVkKFdhcnNhdzo6VGVsbHRhbGU6Ok1hc2sgbSkKICA6IF9tYXNrKG0p Cnt9Cgp2b2lkIEV4Y2x1c2l2ZVJlcXVpcmVkOjp0cnltb2RpZnkoVGVsbHRhbGVfcHRyIHQsIFdh cnNhdzo6VGVsbHRhbGU6Ok1hc2sgbSwgQ09SQkE6OkJvb2xlYW4gYikKewogIFByYWd1ZTo6R3Vh cmQ8TXV0ZXg+IGd1YXJkKF9tdXRleCk7CiAgaWYgKGIpCiAgICB7CiAgICAgIGZvciAodGxpc3Rf dDo6aXRlcmF0b3IgaSA9IF90ZWxsdGFsZXMuYmVnaW4oKTsgaSAhPSBfdGVsbHRhbGVzLmVuZCgp OyArK2kpCiAgICAgICAgaWYgKCgqaSktPnRlc3QobSkpICgqaSktPm1vZGlmeShtLCBmYWxzZSk7 CiAgICAgIHQtPm1vZGlmeShtLCB0cnVlKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHNpemVf dCBzZWxlY3RlZCA9IDA7CiAgICAgIGZvciAodGxpc3RfdDo6aXRlcmF0b3IgaSA9IF90ZWxsdGFs ZXMuYmVnaW4oKTsgaSAhPSBfdGVsbHRhbGVzLmVuZCgpOyArK2kpCiAgICAgICAgaWYgKCgqaSkt PnRlc3QobSkpIHNlbGVjdGVkKys7CiAgICAgIGlmIChzZWxlY3RlZCA+IDEpIHQtPm1vZGlmeSht LCBmYWxzZSk7CiAgICB9Cn0K