From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15071 invoked by alias); 5 Apr 2003 13:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 15040 invoked by uid 71); 5 Apr 2003 13:56:00 -0000 Resent-Date: 5 Apr 2003 13:56:00 -0000 Resent-Message-ID: <20030405135600.15037.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, kunert@physik.tu-dresden.de Received: (qmail 8980 invoked by uid 48); 5 Apr 2003 13:51:11 -0000 Message-Id: <20030405135111.8979.qmail@sources.redhat.com> Date: Sat, 05 Apr 2003 13:56:00 -0000 From: kunert@physik.tu-dresden.de Reply-To: kunert@physik.tu-dresden.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/10316: long compile time when exceptions enabled X-SW-Source: 2003-04/txt/msg00168.txt.bz2 List-Id: >Number: 10316 >Category: c++ >Synopsis: long compile time when exceptions enabled >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Sat Apr 05 13:56:00 UTC 2003 >Closed-Date: >Last-Modified: >Originator: kunert@physik.tu-dresden.de >Release: 3.4 >Organization: >Environment: Reading specs from /opt/lib/gcc-lib/i686-pc-linux-gnu/3.4/specs Configured with: ../configure --enable-shared --program-suffix=-34 --prefix=/opt --enable-languages=c,c++,f77 --enable-__cxa_atexit Thread model: posix gcc version 3.4 20030315 (experimental) >Description: Enabling exceptions increases compile time by a factor of 20. $ time /opt/bin/g++-34 -c x2.ii -O -fno-exceptions 2.47user 0.10system 0:02.71elapsed 94%CPU $ time /opt/bin/g++-34 -c x2.ii -O 70.89user 0.88system 1:12.06elapsed 99%CPU >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="x2.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="x2.ii" IyAxICJ4Mi5jYyIKIyAxICI8YnVpbHQtaW4+IgojIDEgIjxjb21tYW5kIGxpbmU+IgojIDEgIngy LmNjIgojIDEgIi9vcHQvaW5jbHVkZS9jKysvMy40L2Z1bmN0aW9uYWwiIDEgMwojIDUzICIvb3B0 L2luY2x1ZGUvYysrLzMuNC9mdW5jdGlvbmFsIiAzCiMgMSAiL29wdC9pbmNsdWRlL2MrKy8zLjQv aTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25maWcuaCIgMSAzCiMgMzUgIi9vcHQvaW5jbHVk ZS9jKysvMy40L2k2ODYtcGMtbGludXgtZ251L2JpdHMvYysrY29uZmlnLmgiIDMKIyAxICIvb3B0 L2luY2x1ZGUvYysrLzMuNC9pNjg2LXBjLWxpbnV4LWdudS9iaXRzL29zX2RlZmluZXMuaCIgMSAz CiMgMzkgIi9vcHQvaW5jbHVkZS9jKysvMy40L2k2ODYtcGMtbGludXgtZ251L2JpdHMvb3NfZGVm aW5lcy5oIiAzCiMgMSAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDEgMyA0CiMgMjgzICIvdXNy L2luY2x1ZGUvZmVhdHVyZXMuaCIgMyA0CiMgMSAiL3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oIiAx IDMgNAojIDI4NCAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDIgMyA0CiMgMzEyICIvdXNyL2lu Y2x1ZGUvZmVhdHVyZXMuaCIgMyA0CiMgMSAiL3Vzci9pbmNsdWRlL2dudS9zdHVicy5oIiAxIDMg NAojIDMxMyAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDIgMyA0CiMgNDAgIi9vcHQvaW5jbHVk ZS9jKysvMy40L2k2ODYtcGMtbGludXgtZ251L2JpdHMvb3NfZGVmaW5lcy5oIiAyIDMKIyAzNiAi L29wdC9pbmNsdWRlL2MrKy8zLjQvaTY4Ni1wYy1saW51eC1nbnUvYml0cy9jKytjb25maWcuaCIg MiAzCiMgNTQgIi9vcHQvaW5jbHVkZS9jKysvMy40L2Z1bmN0aW9uYWwiIDIgMwojIDEgIi9vcHQv aW5jbHVkZS9jKysvMy40L2NzdGRkZWYiIDEgMwojIDQ3ICIvb3B0L2luY2x1ZGUvYysrLzMuNC9j c3RkZGVmIiAzCgojIDEgIi9vcHQvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy40L2lu Y2x1ZGUvc3RkZGVmLmgiIDEgMyA0CiMgMTUxICIvb3B0L2xpYi9nY2MtbGliL2k2ODYtcGMtbGlu dXgtZ251LzMuNC9pbmNsdWRlL3N0ZGRlZi5oIiAzIDQKdHlwZWRlZiBpbnQgcHRyZGlmZl90Owoj IDIxMyAiL29wdC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjQvaW5jbHVkZS9zdGRk ZWYuaCIgMyA0CnR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKIyA0OSAiL29wdC9pbmNsdWRl L2MrKy8zLjQvY3N0ZGRlZiIgMiAzCgpuYW1lc3BhY2Ugc3RkCnsKICB1c2luZyA6OnB0cmRpZmZf dDsKICB1c2luZyA6OnNpemVfdDsKfQojIDU1ICIvb3B0L2luY2x1ZGUvYysrLzMuNC9mdW5jdGlv bmFsIiAyIDMKIyAxICIvb3B0L2luY2x1ZGUvYysrLzMuNC9iaXRzL3N0bF9mdW5jdGlvbi5oIiAx IDMKIyA2NCAiL29wdC9pbmNsdWRlL2MrKy8zLjQvYml0cy9zdGxfZnVuY3Rpb24uaCIgMwpuYW1l c3BhY2Ugc3RkCnsKIyAxMDEgIi9vcHQvaW5jbHVkZS9jKysvMy40L2JpdHMvc3RsX2Z1bmN0aW9u LmgiIDMKdGVtcGxhdGUgPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+CnN0cnVjdCB1bmFyeV9m dW5jdGlvbiB7CiAgdHlwZWRlZiBfQXJnIGFyZ3VtZW50X3R5cGU7CiAgdHlwZWRlZiBfUmVzdWx0 IHJlc3VsdF90eXBlOwp9OwoKCgoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwg Y2xhc3MgX1Jlc3VsdD4Kc3RydWN0IGJpbmFyeV9mdW5jdGlvbiB7CiAgdHlwZWRlZiBfQXJnMSBm aXJzdF9hcmd1bWVudF90eXBlOwogIHR5cGVkZWYgX0FyZzIgc2Vjb25kX2FyZ3VtZW50X3R5cGU7 CiAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOwp9OwojIDEyNyAiL29wdC9pbmNsdWRlL2Mr Ky8zLjQvYml0cy9zdGxfZnVuY3Rpb24uaCIgMwp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3Qg cGx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IHsKICBfVHAgb3BlcmF0 b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAr IF9feTsgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBtaW51cyA6IHB1YmxpYyBi aW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IHsKICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAm IF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAtIF9feTsgfQp9OwoKCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBtdWx0aXBsaWVzIDogcHVibGljIGJpbmFyeV9mdW5j dGlvbjxfVHAsX1RwLF9UcD4gewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25z dCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICogX195OyB9Cn07CgoKdGVtcGxhdGUgPGNs YXNzIF9UcD4Kc3RydWN0IGRpdmlkZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAs X1RwPiB7CiAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBj b25zdCB7IHJldHVybiBfX3ggLyBfX3k7IH0KfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1 Y3QgbW9kdWx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+CnsKICBfVHAg b3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJu IF9feCAlIF9feTsgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBuZWdhdGUgOiBw dWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9UcD4KewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9U cCYgX194KSBjb25zdCB7IHJldHVybiAtX194OyB9Cn07CiMgMTczICIvb3B0L2luY2x1ZGUvYysr LzMuNC9iaXRzL3N0bF9mdW5jdGlvbi5oIiAzCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBl cXVhbF90byA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxib29sPgp7CiAgYm9vbCBv cGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4g X194ID09IF9feTsgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBub3RfZXF1YWxf dG8gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4KewogIGJvb2wgb3BlcmF0 b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAh PSBfX3k7IH0KfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgZ3JlYXRlciA6IHB1Ymxp YyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxib29sPgp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0 IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID4gX195OyB9Cn07 CgoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGxlc3MgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0 aW9uPF9UcCxfVHAsYm9vbD4KewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29u c3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCA8IF9feTsgfQp9OwoKCnRlbXBsYXRlIDxj bGFzcyBfVHA+CnN0cnVjdCBncmVhdGVyX2VxdWFsIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxf VHAsX1RwLGJvb2w+CnsKICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9U cCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPj0gX195OyB9Cn07CgoKdGVtcGxhdGUgPGNsYXNz IF9UcD4Kc3RydWN0IGxlc3NfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAs Ym9vbD4KewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kp IGNvbnN0IHsgcmV0dXJuIF9feCA8PSBfX3k7IH0KfTsKIyAyMjIgIi9vcHQvaW5jbHVkZS9jKysv My40L2JpdHMvc3RsX2Z1bmN0aW9uLmgiIDMKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGxv Z2ljYWxfYW5kIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+CnsKICBib29s IG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVy biBfX3ggJiYgX195OyB9Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGxvZ2ljYWxf b3IgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4KewogIGJvb2wgb3BlcmF0 b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCB8 fCBfX3k7IH0KfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbG9naWNhbF9ub3QgOiBw dWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLGJvb2w+CnsKICBib29sIG9wZXJhdG9yKCkoY29uc3Qg X1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuICFfX3g7IH0KfTsKIyAyNzEgIi9vcHQvaW5jbHVkZS9j KysvMy40L2JpdHMvc3RsX2Z1bmN0aW9uLmgiIDMKdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+ CmNsYXNzIHVuYXJ5X25lZ2F0ZQogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9Q cmVkaWNhdGU6OmFyZ3VtZW50X3R5cGUsIGJvb2w+IHsKcHJvdGVjdGVkOgogIF9QcmVkaWNhdGUg X01fcHJlZDsKcHVibGljOgogIGV4cGxpY2l0IHVuYXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRl JiBfX3gpIDogX01fcHJlZChfX3gpIHt9CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1l IF9QcmVkaWNhdGU6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuICFfTV9w cmVkKF9feCk7CiAgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgppbmxpbmUgdW5h cnlfbmVnYXRlPF9QcmVkaWNhdGU+Cm5vdDEoY29uc3QgX1ByZWRpY2F0ZSYgX19wcmVkKQp7CiAg cmV0dXJuIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPihfX3ByZWQpOwp9CgoKdGVtcGxhdGUgPGNs YXNzIF9QcmVkaWNhdGU+CmNsYXNzIGJpbmFyeV9uZWdhdGUKICA6IHB1YmxpYyBiaW5hcnlfZnVu Y3Rpb248dHlwZW5hbWUgX1ByZWRpY2F0ZTo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5 cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+IHsKcHJvdGVjdGVkOgogIF9QcmVk aWNhdGUgX01fcHJlZDsKcHVibGljOgogIGV4cGxpY2l0IGJpbmFyeV9uZWdhdGUoY29uc3QgX1By ZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7fQogIGJvb2wgb3BlcmF0b3IoKShjb25zdCB0 eXBlbmFtZSBfUHJlZGljYXRlOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3gsCiAgICAgICAgICAg ICAgICAgIGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OnNlY29uZF9hcmd1bWVudF90eXBlJiBf X3kpIGNvbnN0CiAgewogICAgcmV0dXJuICFfTV9wcmVkKF9feCwgX195KTsKICB9Cn07CgoKdGVt cGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CmlubGluZSBiaW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+ Cm5vdDIoY29uc3QgX1ByZWRpY2F0ZSYgX19wcmVkKQp7CiAgcmV0dXJuIGJpbmFyeV9uZWdhdGU8 X1ByZWRpY2F0ZT4oX19wcmVkKTsKfQojIDM0OSAiL29wdC9pbmNsdWRlL2MrKy8zLjQvYml0cy9z dGxfZnVuY3Rpb24uaCIgMwp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbj4KY2xhc3MgYmluZGVy MXN0CiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25k X2FyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX09wZXJh dGlvbjo6cmVzdWx0X3R5cGU+IHsKcHJvdGVjdGVkOgogIF9PcGVyYXRpb24gb3A7CiAgdHlwZW5h bWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSB2YWx1ZTsKcHVibGljOgogIGJpbmRl cjFzdChjb25zdCBfT3BlcmF0aW9uJiBfX3gsCiAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIF9P cGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feSkKICAgICAgOiBvcChfX3gpLCB2YWx1 ZShfX3kpIHt9CiAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUKICBvcGVyYXRvcigp KGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3gpIGNv bnN0IHsKICAgIHJldHVybiBvcCh2YWx1ZSwgX194KTsKICB9CgoKICB0eXBlbmFtZSBfT3BlcmF0 aW9uOjpyZXN1bHRfdHlwZQogIG9wZXJhdG9yKCkodHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25k X2FyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIG9wKHZhbHVlLCBfX3gpOwog IH0KCn07CgoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24sIGNsYXNzIF9UcD4KaW5saW5lIGJp bmRlcjFzdDxfT3BlcmF0aW9uPgpiaW5kMXN0KGNvbnN0IF9PcGVyYXRpb24mIF9fZm4sIGNvbnN0 IF9UcCYgX194KQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVu dF90eXBlIF9BcmcxX3R5cGU7CiAgcmV0dXJuIGJpbmRlcjFzdDxfT3BlcmF0aW9uPihfX2ZuLCBf QXJnMV90eXBlKF9feCkpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+CmNsYXNzIGJp bmRlcjJuZAogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRpb246OmZp cnN0X2FyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX09w ZXJhdGlvbjo6cmVzdWx0X3R5cGU+IHsKcHJvdGVjdGVkOgogIF9PcGVyYXRpb24gb3A7CiAgdHlw ZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgdmFsdWU7CnB1YmxpYzoKICBi aW5kZXIybmQoY29uc3QgX09wZXJhdGlvbiYgX194LAogICAgICAgICAgICBjb25zdCB0eXBlbmFt ZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgX195KQogICAgICA6IG9wKF9feCks IHZhbHVlKF9feSkge30KICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZQogIG9wZXJh dG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSYgX194 KSBjb25zdCB7CiAgICByZXR1cm4gb3AoX194LCB2YWx1ZSk7CiAgfQoKCiAgdHlwZW5hbWUgX09w ZXJhdGlvbjo6cmVzdWx0X3R5cGUKICBvcGVyYXRvcigpKHR5cGVuYW1lIF9PcGVyYXRpb246OmZp cnN0X2FyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIG9wKF9feCwgdmFsdWUp OwogIH0KCn07CgoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24sIGNsYXNzIF9UcD4KaW5saW5l IGJpbmRlcjJuZDxfT3BlcmF0aW9uPgpiaW5kMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9fZm4sIGNv bnN0IF9UcCYgX194KQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJn dW1lbnRfdHlwZSBfQXJnMl90eXBlOwogIHJldHVybiBiaW5kZXIybmQ8X09wZXJhdGlvbj4oX19m biwgX0FyZzJfdHlwZShfX3gpKTsKfQojIDQzOCAiL29wdC9pbmNsdWRlL2MrKy8zLjQvYml0cy9z dGxfZnVuY3Rpb24uaCIgMwp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KY2xh c3MgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJn LCBfUmVzdWx0PiB7CnByb3RlY3RlZDoKICBfUmVzdWx0ICgqX01fcHRyKShfQXJnKTsKcHVibGlj OgogIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24oKSB7fQogIGV4cGxpY2l0IHBvaW50ZXJfdG9f dW5hcnlfZnVuY3Rpb24oX1Jlc3VsdCAoKl9feCkoX0FyZykpIDogX01fcHRyKF9feCkge30KICBf UmVzdWx0IG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3B0cihfX3gpOyB9 Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9BcmcsIGNsYXNzIF9SZXN1bHQ+CmlubGluZSBwb2ludGVy X3RvX3VuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+IHB0cl9mdW4oX1Jlc3VsdCAoKl9feCko X0FyZykpCnsKICByZXR1cm4gcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0 PihfX3gpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jl c3VsdD4KY2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gOgogIHB1YmxpYyBiaW5hcnlf ZnVuY3Rpb248X0FyZzEsX0FyZzIsX1Jlc3VsdD4gewpwcm90ZWN0ZWQ6CiAgICBfUmVzdWx0ICgq X01fcHRyKShfQXJnMSwgX0FyZzIpOwpwdWJsaWM6CiAgICBwb2ludGVyX3RvX2JpbmFyeV9mdW5j dGlvbigpIHt9CiAgICBleHBsaWNpdCBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbihfUmVzdWx0 ICgqX194KShfQXJnMSwgX0FyZzIpKQogICAgICA6IF9NX3B0cihfX3gpIHt9CiAgICBfUmVzdWx0 IG9wZXJhdG9yKCkoX0FyZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0IHsKICAgICAgcmV0dXJuIF9N X3B0cihfX3gsIF9feSk7CiAgICB9Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBf QXJnMiwgY2xhc3MgX1Jlc3VsdD4KaW5saW5lIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9B cmcxLF9BcmcyLF9SZXN1bHQ+CnB0cl9mdW4oX1Jlc3VsdCAoKl9feCkoX0FyZzEsIF9BcmcyKSkg ewogIHJldHVybiBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0 PihfX3gpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9JZGVudGl0eSA6IHB1Ymxp YyB1bmFyeV9mdW5jdGlvbjxfVHAsX1RwPiB7CiAgX1RwJiBvcGVyYXRvcigpKF9UcCYgX194KSBj b25zdCB7IHJldHVybiBfX3g7IH0KICBjb25zdCBfVHAmIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBf X3gpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9QYWlyPgpzdHJ1 Y3QgX1NlbGVjdDFzdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfUGFpciwgdHlwZW5hbWUgX1Bh aXI6OmZpcnN0X3R5cGU+IHsKICB0eXBlbmFtZSBfUGFpcjo6Zmlyc3RfdHlwZSYgb3BlcmF0b3Io KShfUGFpciYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX194LmZpcnN0OwogIH0KICBjb25zdCB0 eXBlbmFtZSBfUGFpcjo6Zmlyc3RfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBj b25zdCB7CiAgICByZXR1cm4gX194LmZpcnN0OwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfUGFp cj4Kc3RydWN0IF9TZWxlY3QybmQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVu YW1lIF9QYWlyOjpzZWNvbmRfdHlwZT4KewogIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSYg b3BlcmF0b3IoKShfUGFpciYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX194LnNlY29uZDsKICB9 CiAgY29uc3QgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlJiBvcGVyYXRvcigpKGNvbnN0IF9Q YWlyJiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfX3guc2Vjb25kOwogIH0KfTsKIyA1MjggIi9v cHQvaW5jbHVkZS9jKysvMy40L2JpdHMvc3RsX2Z1bmN0aW9uLmgiIDMKdGVtcGxhdGUgPGNsYXNz IF9SZXQsIGNsYXNzIF9UcD4KY2xhc3MgbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9u PF9UcCosX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgbWVtX2Z1bl90KF9SZXQgKF9UcDo6Kl9f cGYpKCkpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3Qg eyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KcHJpdmF0ZToKICBfUmV0IChfVHA6OipfTV9mKSgp Owp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmNsYXNzIGNvbnN0X21lbV9m dW5fdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLF9SZXQ+IHsKcHVibGljOgog IGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdChfUmV0IChfVHA6OipfX3BmKSgpIGNvbnN0KSA6IF9N X2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3ApIGNvbnN0IHsgcmV0 dXJuIChfX3AtPipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01fZikoKSBjb25z dDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgpjbGFzcyBtZW1fZnVuX3Jl Zl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCxfUmV0PiB7CnB1YmxpYzoKICBleHBsaWNp dCBtZW1fZnVuX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkpIDogX01fZihfX3BmKSB7fQogIF9S ZXQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZikoKTsgfQpw cml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKCk7Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9SZXQs IGNsYXNzIF9UcD4KY2xhc3MgY29uc3RfbWVtX2Z1bl9yZWZfdCA6IHB1YmxpYyB1bmFyeV9mdW5j dGlvbjxfVHAsX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl9yZWZfdChf UmV0IChfVHA6OipfX3BmKSgpIGNvbnN0KSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9y KCkoY29uc3QgX1RwJiBfX3IpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKCk7IH0KcHJpdmF0 ZToKICBfUmV0IChfVHA6OipfTV9mKSgpIGNvbnN0Owp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfUmV0 LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4xX3QgOiBwdWJsaWMgYmluYXJ5 X2Z1bmN0aW9uPF9UcCosX0FyZyxfUmV0PiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVuMV90 KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9y KCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAoX19wLT4qX01fZikoX194KTsg fQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpOwp9OwoKCnRlbXBsYXRlIDxjbGFz cyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIGNvbnN0X21lbV9mdW4xX3QgOiBw dWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyxfUmV0PiB7CnB1YmxpYzoKICBl eHBsaWNpdCBjb25zdF9tZW1fZnVuMV90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpIGNvbnN0KSA6 IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3AsIF9BcmcgX194 KSBjb25zdAogICAgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKF9feCk7IH0KcHJpdmF0ZToKICBfUmV0 IChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xh c3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlf ZnVuY3Rpb248X1RwLF9BcmcsX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgbWVtX2Z1bjFfcmVm X3QoX1JldCAoX1RwOjoqX19wZikoX0FyZykpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0 b3IoKShfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7 IH0KcHJpdmF0ZToKICBfUmV0IChfVHA6OipfTV9mKShfQXJnKTsKfTsKCgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZf dCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9BcmcsX1JldD4gewpwdWJsaWM6CiAgZXhw bGljaXQgY29uc3RfbWVtX2Z1bjFfcmVmX3QoX1JldCAoX1RwOjoqX19wZikoX0FyZykgY29uc3Qp IDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fciwgX0FyZyBf X3gpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7IH0KcHJpdmF0ZToKICBfUmV0IChf VHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpjbGFzcyBt ZW1fZnVuX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAqLHZvaWQ+IHsK cHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW5fdCh2b2lkIChfVHA6OipfX3BmKSgpKSA6IF9NX2Yo X19wZikge30KICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2Yp KCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKSgpOwp9OwoKCnRlbXBsYXRlIDxjbGFz cyBfVHA+CmNsYXNzIGNvbnN0X21lbV9mdW5fdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1 bmN0aW9uPGNvbnN0IF9UcCosdm9pZD4gewpwdWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1 bl90KHZvaWQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3Bl cmF0b3IoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01fZikoKTsgfQpwcml2YXRl OgogIHZvaWQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UcD4K Y2xhc3MgbWVtX2Z1bl9yZWZfdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9U cCx2b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KHZvaWQgKF9UcDo6Kl9f cGYpKCkpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3Qg eyAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoKTsKfTsKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpjbGFzcyBjb25zdF9tZW1fZnVuX3JlZl90PHZvaWQsIF9UcD4g OiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNv bnN0X21lbV9mdW5fcmVmX3Qodm9pZCAoX1RwOjoqX19wZikoKSBjb25zdCkgOiBfTV9mKF9fcGYp IHt9CiAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yKSBjb25zdCB7IChfX3IuKl9NX2Yp KCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKSgpIGNvbnN0Owp9OwoKCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4xX3Q8dm9pZCwgX1RwLCBfQXJn PiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwKixfQXJnLHZvaWQ+IHsKcHVibGljOgogIGV4 cGxpY2l0IG1lbV9mdW4xX3Qodm9pZCAoX1RwOjoqX19wZikoX0FyZykpIDogX01fZihfX3BmKSB7 fQogIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9N X2YpKF9feCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKShfQXJnKTsKfTsKCgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBjb25zdF9tZW1fZnVuMV90PHZvaWQs IF9UcCwgX0FyZz4KICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfQXJnLHZv aWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3Qodm9pZCAoX1RwOjoqX19w ZikoX0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBf VHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KcHJpdmF0ZToK ICB2b2lkIChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV9yZWZfdDx2b2lkLCBfVHAsIF9Bcmc+CiAgOiBw dWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0 IG1lbV9mdW4xX3JlZl90KHZvaWQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikge30K ICB2b2lkIG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7IChfX3IuKl9NX2Yp KF9feCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKShfQXJnKTsKfTsKCgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBjb25zdF9tZW1fZnVuMV9yZWZfdDx2b2lk LCBfVHAsIF9Bcmc+CiAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLHZvaWQ+IHsK cHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90KHZvaWQgKF9UcDo6Kl9fcGYp KF9BcmcpIGNvbnN0KSA6IF9NX2YoX19wZikge30KICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgX1Rw JiBfX3IsIF9BcmcgX194KSBjb25zdCB7IChfX3IuKl9NX2YpKF9feCk7IH0KcHJpdmF0ZToKICB2 b2lkIChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jl dCwgY2xhc3MgX1RwPgppbmxpbmUgbWVtX2Z1bl90PF9SZXQsX1RwPiBtZW1fZnVuKF9SZXQgKF9U cDo6Kl9fZikoKSkKICB7IHJldHVybiBtZW1fZnVuX3Q8X1JldCxfVHA+KF9fZik7IH0KCnRlbXBs YXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmlubGluZSBjb25zdF9tZW1fZnVuX3Q8X1JldCxf VHA+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKSgpIGNvbnN0KQogIHsgcmV0dXJuIGNvbnN0X21l bV9mdW5fdDxfUmV0LF9UcD4oX19mKTsgfQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9U cD4KaW5saW5lIG1lbV9mdW5fcmVmX3Q8X1JldCxfVHA+IG1lbV9mdW5fcmVmKF9SZXQgKF9UcDo6 Kl9fZikoKSkKICB7IHJldHVybiBtZW1fZnVuX3JlZl90PF9SZXQsX1RwPihfX2YpOyB9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgppbmxpbmUgY29uc3RfbWVtX2Z1bl9yZWZfdDxf UmV0LF9UcD4gbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKSgpIGNvbnN0KQogIHsgcmV0dXJu IGNvbnN0X21lbV9mdW5fcmVmX3Q8X1JldCxfVHA+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBf UmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1fZnVuMV90PF9SZXQsX1RwLF9B cmc+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKShfQXJnKSkKICB7IHJldHVybiBtZW1fZnVuMV90 PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAs IGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9tZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+IG1lbV9m dW4oX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKICB7IHJldHVybiBjb25zdF9tZW1fZnVu MV90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBf VHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPiBtZW1f ZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpKQogIHsgcmV0dXJuIG1lbV9mdW4xX3JlZl90 PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAs IGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPgpt ZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpIGNvbnN0KQogIHsgcmV0dXJuIGNvbnN0 X21lbV9mdW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCgoKfQojIDU2ICIvb3B0L2lu Y2x1ZGUvYysrLzMuNC9mdW5jdGlvbmFsIiAyIDMKIyAyICJ4Mi5jYyIgMgoKdXNpbmcgbmFtZXNw YWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCByZXNfcHJvbW90ZSB7IHR5cGVkZWYg VCB0OyB9Owp0ZW1wbGF0ZTw+IHN0cnVjdCByZXNfcHJvbW90ZTxzaG9ydD4geyB0eXBlZGVmIGlu dCB0OyB9Owp0ZW1wbGF0ZTw+IHN0cnVjdCByZXNfcHJvbW90ZTx1bnNpZ25lZCBzaG9ydD4geyB0 eXBlZGVmIGludCB0OyB9Owp0ZW1wbGF0ZTw+IHN0cnVjdCByZXNfcHJvbW90ZTxjaGFyPiB7IHR5 cGVkZWYgaW50IHQ7IH07CnRlbXBsYXRlPD4gc3RydWN0IHJlc19wcm9tb3RlPHNpZ25lZCBjaGFy PiB7IHR5cGVkZWYgaW50IHQ7IH07CnRlbXBsYXRlPD4gc3RydWN0IHJlc19wcm9tb3RlPHVuc2ln bmVkIGNoYXI+IHsgdHlwZWRlZiBpbnQgdDsgfTsKdGVtcGxhdGU8PiBzdHJ1Y3QgcmVzX3Byb21v dGU8Ym9vbD4geyB0eXBlZGVmIGludCB0OyB9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBy ZXNfbnVtIHsgc3RhdGljIGNvbnN0IGludCBuID0gMTAwK3NpemVvZihUKTsgfSA7CnRlbXBsYXRl IDw+IHN0cnVjdCByZXNfbnVtPGNoYXI+IHsgc3RhdGljIGNvbnN0IGludCBuID0gMDsgfSA7CnRl bXBsYXRlIDw+IHN0cnVjdCByZXNfbnVtPHVuc2lnbmVkIGNoYXI+IHsgc3RhdGljIGNvbnN0IGlu dCBuID0gMTsgfSA7CnRlbXBsYXRlIDw+IHN0cnVjdCByZXNfbnVtPHNpZ25lZCBjaGFyPiB7IHN0 YXRpYyBjb25zdCBpbnQgbiA9IDI7IH0gOwp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzX251bTxzaG9y dD4geyBzdGF0aWMgY29uc3QgaW50IG4gPSAzOyB9IDsKdGVtcGxhdGUgPD4gc3RydWN0IHJlc19u dW08dW5zaWduZWQgc2hvcnQ+IHsgc3RhdGljIGNvbnN0IGludCBuID0gNDsgfSA7CnRlbXBsYXRl IDw+IHN0cnVjdCByZXNfbnVtPGludD4geyBzdGF0aWMgY29uc3QgaW50IG4gPSA1OyB9IDsKdGVt cGxhdGUgPD4gc3RydWN0IHJlc19udW08dW5zaWduZWQgaW50PiB7IHN0YXRpYyBjb25zdCBpbnQg biA9IDY7IH0gOwp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzX251bTxsb25nPiB7IHN0YXRpYyBjb25z dCBpbnQgbiA9IDY7IH0gOwp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzX251bTx1bnNpZ25lZCBsb25n PiB7IHN0YXRpYyBjb25zdCBpbnQgbiA9IDg7IH0gOwp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzX251 bTxmbG9hdD4geyBzdGF0aWMgY29uc3QgaW50IG4gPSA5OyB9IDsKdGVtcGxhdGUgPD4gc3RydWN0 IHJlc19udW08ZG91YmxlPiB7IHN0YXRpYyBjb25zdCBpbnQgbiA9IDEwOyB9IDsKdGVtcGxhdGUg PD4gc3RydWN0IHJlc19udW08bG9uZyBkb3VibGU+IHsgc3RhdGljIGNvbnN0IGludCBuID0gMTE7 IH0gOwoKdGVtcGxhdGUgPGNsYXNzIFMsIGNsYXNzIFQsIGludCBOPiBzdHJ1Y3QgcmVzdHlwZV9v cmRlcl9hdXg7CnRlbXBsYXRlIDxjbGFzcyBTLCBjbGFzcyBUPiBzdHJ1Y3QgcmVzdHlwZV9vcmRl cl9hdXg8UywgVCwgMT57IHR5cGVkZWYgUyB0OyB9Owp0ZW1wbGF0ZSA8Y2xhc3MgUywgY2xhc3Mg VD5zdHJ1Y3QgcmVzdHlwZV9vcmRlcl9hdXg8UywgVCwgLTE+eyB0eXBlZGVmIFQgdDsgfTsKdGVt cGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZXN0eXBlX29yZGVyX2F1eDxULCBULCAwPnsgdHlwZWRl ZiBUIHQ7IH07Cgp0ZW1wbGF0ZTw+IHN0cnVjdCByZXN0eXBlX29yZGVyX2F1eDx1bnNpZ25lZCBp bnQsIGxvbmcsIDA+eyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdDsgfTsKdGVtcGxhdGU8PiBzdHJ1 Y3QgcmVzdHlwZV9vcmRlcl9hdXg8bG9uZywgdW5zaWduZWQgaW50LCAwPnsgdHlwZWRlZiB1bnNp Z25lZCBsb25nIHQ7IH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgUywgY2xhc3MgVD4Kc3RydWN0IHJlc3R5 cGVfb3JkZXIgewogICAgc3RhdGljIGNvbnN0IGludCBzMCA9IHJlc19udW08Uz46Om47CiAgICBz dGF0aWMgY29uc3QgaW50IHQwID0gcmVzX251bTxUPjo6bjsKICAgIHR5cGVkZWYgdHlwZW5hbWUg cmVzdHlwZV9vcmRlcl9hdXg8IFMsIFQsICggczAgPiB0MCApLSggczAgPCB0MCApID46OnQgdDsK fTsKCnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+CnN0cnVjdCByZXN0eXBlIHsKcHJpdmF0ZToK ICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVzX3Byb21vdGU8Uz46OnQgUzA7CiAgICB0eXBlZGVmIHR5 cGVuYW1lIHJlc19wcm9tb3RlPFQ+Ojp0IFQwOwpwdWJsaWM6CiAgICB0eXBlZGVmIHR5cGVuYW1l IHJlc3R5cGVfb3JkZXI8UzAsIFQwPjo6dCB0Owp9OwoKdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3Mg VD4Kc3RydWN0IHJlc3R5cGU7Cgp0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQj4Kc3RydWN0IHhw bHVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbiA8QSwgQiwgdHlwZW5hbWUgcmVzdHlwZTxBLCBC Pjo6dD4KewogICAgdHlwZWRlZiB0eXBlbmFtZSByZXN0eXBlPEEsIEI+Ojp0IHQ7CiAgICBzdGF0 aWMgdm9pZCBhc3Nfb3AoIEEmIGEsIGNvbnN0IEImIGIgKSB7IGEgKz0gYjsgfQogICAgdCBvcGVy YXRvcigpKCBjb25zdCBBJiBhLCBjb25zdCBCJiBiICkgY29uc3QgeyByZXR1cm4gYSArIGI7IH0K fTsKCnRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCPgpzdHJ1Y3QgeG11bHRpcGxpZXMgOiBwdWJs aWMgYmluYXJ5X2Z1bmN0aW9uIDxBLCBCLCB0eXBlbmFtZSByZXN0eXBlPEEsIEI+Ojp0Pgp7CiAg ICB0eXBlZGVmIHR5cGVuYW1lIHJlc3R5cGU8QSwgQj46OnQgdDsKICAgIHN0YXRpYyB2b2lkIGFz c19vcCggQSYgYSwgY29uc3QgQiYgYiApIHsgYSAqPSBiOyB9CiAgICB0IG9wZXJhdG9yKCkoIGNv bnN0IEEmIGEsIGNvbnN0IEImIGIgKSBjb25zdCB7IHJldHVybiBhICogYjsgfQp9OwoKdGVtcGxh dGUgPGNsYXNzIEEsIGNsYXNzIEI+CnN0cnVjdCB4bWludXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0 aW9uIDxBLCBCLCB0eXBlbmFtZSByZXN0eXBlPEEsIEI+Ojp0Pgp7CiAgICB0eXBlZGVmIHR5cGVu YW1lIHJlc3R5cGU8QSwgQj46OnQgdDsKICAgIHN0YXRpYyB2b2lkIGFzc19vcCggQSYgYSwgY29u c3QgQiYgYiApIHsgYSAtPSBiOyB9CiAgICB0IG9wZXJhdG9yKCkoIGNvbnN0IEEmIGEsIGNvbnN0 IEImIGIgKSBjb25zdCB7IHJldHVybiBhIC0gYjsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIEEsIGNs YXNzIEI+CnN0cnVjdCB4ZGl2aWRlcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb24gPEEsIEIsIHR5 cGVuYW1lIHJlc3R5cGU8QSwgQj46OnQ+CnsKICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVzdHlwZTxB LCBCPjo6dCB0OwogICAgc3RhdGljIHZvaWQgYXNzX29wKCBBJiBhLCBjb25zdCBCJiBiICkgeyBh IC89IGI7IH0KICAgIHQgb3BlcmF0b3IoKSggY29uc3QgQSYgYSwgY29uc3QgQiYgYiApIGNvbnN0 IHsgcmV0dXJuIGEgLyBiOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQj4Kc3RydWN0 IHhtb2R1bHVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbiA8QSwgQiwgdHlwZW5hbWUgcmVzdHlw ZTxBLCBCPjo6dD4KewogICAgdHlwZWRlZiB0eXBlbmFtZSByZXN0eXBlPEEsIEI+Ojp0IHQ7CiAg ICBzdGF0aWMgdm9pZCBhc3Nfb3AoIEEmIGEsIGNvbnN0IEImIGIgKSB7IGEgJT0gYjsgfQogICAg dCBvcGVyYXRvcigpKCBjb25zdCBBJiBhLCBjb25zdCBCJiBiICkgY29uc3QgeyByZXR1cm4gYSAl IGI7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCPgpzdHJ1Y3QgeHBvd2VyIDogcHVi bGljIGJpbmFyeV9mdW5jdGlvbiA8QSwgQiwgdHlwZW5hbWUgcmVzdHlwZTxBLCBCPjo6dD4Kewog ICAgdHlwZWRlZiB0eXBlbmFtZSByZXN0eXBlPEEsIEI+Ojp0IHQ7CiAgICB0IG9wZXJhdG9yKCko IGNvbnN0IEEmIGEsIGNvbnN0IEImIGIgKSBjb25zdCB7IHJldHVybiBwb3coIGEsIGIgKTsgfQp9 OwoKdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEI+CnN0cnVjdCB4X2VxIDogcHVibGljIGJpbmFy eV9mdW5jdGlvbiA8QSwgQiwgYm9vbD4KewogICAgdHlwZWRlZiBib29sIHQ7CiAgICB0IG9wZXJh dG9yKCkoIGNvbnN0IEEmIGEsIGNvbnN0IEImIGIgKSBjb25zdCB7IHJldHVybiBhID09IGI7IH0K fTsKCnRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCPgpzdHJ1Y3QgeF9uZXEgOiBwdWJsaWMgYmlu YXJ5X2Z1bmN0aW9uIDxBLCBCLCBib29sPgp7CiAgICB0eXBlZGVmIGJvb2wgdDsKICAgIHQgb3Bl cmF0b3IoKSggY29uc3QgQSYgYSwgY29uc3QgQiYgYiApIGNvbnN0IHsgcmV0dXJuIGEgIT0gYjsg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEI+CnN0cnVjdCB4X2d0IDogcHVibGljIGJp bmFyeV9mdW5jdGlvbiA8QSwgQiwgYm9vbD4KewogICAgdHlwZWRlZiBib29sIHQ7CiAgICB0IG9w ZXJhdG9yKCkoIGNvbnN0IEEmIGEsIGNvbnN0IEImIGIgKSBjb25zdCB7IHJldHVybiBhID4gYjsg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEI+CnN0cnVjdCB4X2x0IDogcHVibGljIGJp bmFyeV9mdW5jdGlvbiA8QSwgQiwgYm9vbD4KewogICAgdHlwZWRlZiBib29sIHQ7CiAgICB0IG9w ZXJhdG9yKCkoIGNvbnN0IEEmIGEsIGNvbnN0IEImIGIgKSBjb25zdCB7IHJldHVybiBhIDwgYjsg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEI+CnN0cnVjdCB4X2x0ZSA6IHB1YmxpYyBi aW5hcnlfZnVuY3Rpb24gPEEsIEIsIGJvb2w+CnsKICAgIHR5cGVkZWYgYm9vbCB0OwogICAgdCBv cGVyYXRvcigpKCBjb25zdCBBJiBhLCBjb25zdCBCJiBiICkgY29uc3QgeyByZXR1cm4gYSA8PSBi OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQj4Kc3RydWN0IHhfZ3RlIDogcHVibGlj IGJpbmFyeV9mdW5jdGlvbiA8QSwgQiwgYm9vbD4KewogICAgdHlwZWRlZiBib29sIHQ7CiAgICB0 IG9wZXJhdG9yKCkoIGNvbnN0IEEmIGEsIGNvbnN0IEImIGIgKSBjb25zdCB7IHJldHVybiBhID49 IGI7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCPgpzdHJ1Y3QgeF9taW4gOiBwdWJs aWMgYmluYXJ5X2Z1bmN0aW9uIDxBLCBCLCB0eXBlbmFtZSByZXN0eXBlPEEsIEI+Ojp0Pgp7CiAg ICB0eXBlZGVmIHR5cGVuYW1lIHJlc3R5cGU8QSwgQj46OnQgdDsKICAgIHN0YXRpYyB2b2lkIGFz c19vcCggQSYgYSwgY29uc3QgQiYgYiApIHsgaWYoIGI8YSApIGEgPSBiOyB9CiAgICB0IG9wZXJh dG9yKCkoIGNvbnN0IEEmIGEsIGNvbnN0IEImIGIgKSBjb25zdCB7IHJldHVybiBhIDwgYiA/IGEg OiBiOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQj4Kc3RydWN0IHhfbWF4IDogcHVi bGljIGJpbmFyeV9mdW5jdGlvbiA8QSwgQiwgdHlwZW5hbWUgcmVzdHlwZTxBLCBCPjo6dD4Kewog ICAgdHlwZWRlZiB0eXBlbmFtZSByZXN0eXBlPEEsIEI+Ojp0IHQ7CiAgICBzdGF0aWMgdm9pZCBh c3Nfb3AoIEEmIGEsIGNvbnN0IEImIGIgKSB7IGlmKCBiPmEgKSBhID0gYjsgfQogICAgdCBvcGVy YXRvcigpKCBjb25zdCBBJiBhLCBjb25zdCBCJiBiICkgY29uc3QgeyByZXR1cm4gYSA+IGIgPyBh IDogYjsgfQp9OwoKCgp0ZW1wbGF0ZSA8Y2xhc3MgQT4KaW5saW5lIHR5cGVuYW1lIHhtdWx0aXBs aWVzPEEsQT46OnQKc3FyKCBjb25zdCBBJiBhICl7IHJldHVybiBhKmE7fQoKdGVtcGxhdGUgPGNs YXNzIEE+CmlubGluZSBpbnQgc2lnbiggQSBhICl7IHJldHVybiBhIDwgMCA/IC0xIDogYSA+IDAg PyAxIDogMDsgfQoKCgoKdGVtcGxhdGUgPGNsYXNzIEE+CmlubGluZSB0eXBlbmFtZSByZXN0eXBl PEEsIEE+Ojp0CnBvdzMoIEEgYSApeyByZXR1cm4gYSphKmE7IH0KIyAxODMgIngyLmNjIgp2b2lk IGRvX3ZhbGlkX2NvdW50X2NoZWNrKCk7Cgp2b2lkIGludmFsaWQodW5zaWduZWQgaW50IGksIGNv bnN0IGNoYXIqIG5hbWUgKTsKCgoKY2xhc3MgVmFsaWRDb3VudGVyIHsKcHVibGljOgogICAgVmFs aWRDb3VudGVyKCBjb25zdCBjaGFyKiBoICkgOiBuYW1lXyhoKSwgbl8oMCl7fQogICAgdm9pZCBv cGVyYXRvcisrKCl7ICsrIG5fOyB9CiAgICB2b2lkIG9wZXJhdG9yLS0oKXsgLS0gbl87IH0KICAg IH5WYWxpZENvdW50ZXIoKTsKcHJpdmF0ZToKICAgIGNvbnN0IGNoYXIqIG5hbWVfOwogICAgdW5z aWduZWQgaW50IG5fOwp9OwoKCgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBWYWxpZGF0b3Igewpw dWJsaWM6CgogICAgdm9pZCB2YWxpZCgpIGNvbnN0IHt9Owpwcm90ZWN0ZWQ6CiAgICBWYWxpZGF0 b3IoKQogICAgewogICAgICAgIHZhbGlkXz0weGRlYWRiZWVmOwogICAgICAgICsrY291bnRfOwog ICAgfQoKICAgIFZhbGlkYXRvciggY29uc3QgVmFsaWRhdG9yJiBhICkKICAgIHsKICAgICAgICBh LnZhbGlkKCk7CiAgICAgICAgdmFsaWRfPTB4ZGVhZGJlZWY7CiAgICAgICAgKytjb3VudF87CiAg ICB9CgogICAgflZhbGlkYXRvcigpCiAgICB7CiAgICAgICAgdmFsaWQoKTsKICAgICAgICB2YWxp ZF89MHgxMjM0NTY3ODsKICAgICAgICAtLWNvdW50XzsKICAgIH0KCiAgICBjb25zdCBWYWxpZGF0 b3ImIG9wZXJhdG9yPSggY29uc3QgVmFsaWRhdG9yJiBhICkKICAgIHsKICAgICAgICB2YWxpZCgp OwogICAgICAgIGEudmFsaWQoKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CnByaXZhdGU6 CiAgICB1bnNpZ25lZCBpbnQgdmFsaWRfOwogICAgc3RhdGljIFZhbGlkQ291bnRlciBjb3VudF87 Cn07CgoKCgoKCgp2b2lkIHRlbnNvcl9jaGVja19mYWlsZWQoIGNvbnN0IGNoYXIqIG1lc3NhZ2Ug KTsKCgoKdm9pZCogdGVuc29yX2FsbG9jKCB1bnNpZ25lZCBsb25nIG0gKTsKdm9pZCB0ZW5zb3Jf ZnJlZSggdm9pZCogcCwgdW5zaWduZWQgbG9uZyBtICk7CgoKdm9pZCBhZGRfdGVuc29yX21lbW9y eSggdW5zaWduZWQgbG9uZyBhdG0gKTsKdm9pZCBzdWJ0cmFjdF90ZW5zb3JfbWVtb3J5KCB1bnNp Z25lZCBsb25nIGF0bSApOwoKCnVuc2lnbmVkIGxvbmcgcXVlcnlfdGVuc29yX21lbW9yeSgpOwoK CnVuc2lnbmVkIGxvbmcgcXVlcnlfbWF4X3RlbnNvcl9tZW1vcnkoKTsKCgoKdm9pZCBzZXRfdGVu c29yX21lbW9yeV9saW1pdCggdW5zaWduZWQgbG9uZyBtICk7CgpjbGFzcyBlbXB0eV90ZW5zb3J7 fTsKIyAyNzYgIngyLmNjIgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgUkMgOiBwdWJsaWMgVmFs aWRhdG9yPFJDPFQ+ID57CnB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmNf c2l6ZTsKCgogICAgc3RhdGljIFQqIGNyZWF0ZV96ZXJvKCBpbnQgbiApOwogICAgc3RhdGljIFQq IGNyZWF0ZV9lbXB0eSggaW50IG4gKTsKCiAgICBzdGF0aWMgVCogY3JlYXRlX2NvcHkoIGludCBu LCBjb25zdCBUKiBhICk7CiAgICBzdGF0aWMgVCogcmMyZGF0YSggUkMqIHAgKXsgcC0+dmFsaWQo KTsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBwICkgKyByY19zaXplOyB9CiAgICBzdGF0 aWMgUkMqIGRhdGEycmMoIFQqIHAgKXsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UkMqPiggcC1y Y19zaXplICk7IH0KCiAgICBib29sIHNoYXJlZCgpIGNvbnN0IHsgdmFsaWQoKTsgcmV0dXJuIHJj Xz4xOyB9CiAgICB2b2lkIHN1YnJlZiAoKSB7IHZhbGlkKCk7IHJjXy0tOyBpZiggcmNfID09IDAg KSBkZXN0cm95KCk7IH0KICAgIHZvaWQgYWRkcmVmKCkgeyB2YWxpZCgpOyByY18rKzsgfQpwcml2 YXRlOgogICAgaW50IHNpemUoKSBjb25zdCB7IHZhbGlkKCk7IHJldHVybiBzaXplXzsgfQogICAg c3RhdGljIFQqIGNyZWF0ZV91bmluaXQoIGludCBuICk7CiAgICBSQyggaW50IHNpemUgKSA6IHNp emVfKCBzaXplICksIHJjXygxKXt9CiAgICBSQyggY29uc3QgUkMmIGEgKTsKICAgIHZvaWQgZGVz dHJveSAoKTsKcHJpdmF0ZToKCiAgICBjb25zdCBpbnQgc2l6ZV87CgogICAgaW50IHJjXzsKfTsK CgoKdGVtcGxhdGU8Y2xhc3MgVD4KY29uc3QgdW5zaWduZWQgaW50IFJDPFQ+OjpyY19zaXplID0g KCBzaXplb2YoUkM8VD4pLTEgKSAvICggc2l6ZW9mKFQpICkgKyAxOwoKCgoKCnRlbXBsYXRlPGNs YXNzIFQ+CmNsYXNzIFRSY0Jhc2UgOiBwdWJsaWMgVmFsaWRhdG9yPFRSY0Jhc2U8VD4gPgp7CnB1 YmxpYzoKICAgIHN0YXRpYyBjb25zdCBib29sIGxpbmVhciA9IHRydWU7CiAgICB0eXBlZGVmIFQg dmFsdWVfdHlwZTsKICAgIHR5cGVkZWYgVCogaXRlcmF0b3I7CnByb3RlY3RlZDoKICAgIFRSY0Jh c2UoIGludCBuPTAgKTogc2l6ZV8obiksIGRhdGFfICggUkM8VD46OmNyZWF0ZV96ZXJvKCBuICkg KSB7fQogICAgVFJjQmFzZSggaW50IG4sIGVtcHR5X3RlbnNvciApOiBzaXplXyhuKSwgZGF0YV8g KCBSQzxUPjo6Y3JlYXRlX2VtcHR5KCBuICkgKSB7fQogICAgVFJjQmFzZSggaW50IG4sIGNvbnN0 IFQqIHAgKSA6IHNpemVfKG4pLCBkYXRhXyggUkM8VD46OmNyZWF0ZV9jb3B5KCBuLCBwICkgKXt9 CiAgICBUUmNCYXNlKCBjb25zdCBUUmNCYXNlJiBhICkgOiBWYWxpZGF0b3I8VFJjQmFzZTxUPiA+ KCBhICksIHNpemVfKCBhLnNpemUoKSApLCBkYXRhXyggYS5kYXRhKCkgKQogICAgICAgICB7IGdl dHJjKCktPmFkZHJlZigpOyB9CiAgICB+VFJjQmFzZSgpeyBnZXRyYygpLT5zdWJyZWYoKTsgfQpw dWJsaWM6CgoKCiAgICB2b2lkIGludmFsaWRhdGUoKXsgaWYoIGdldHJjKCktPnNoYXJlZCgpICkg dW5zaGFyZSgpOyB9CgoKICAgIHZvaWQgaW52YWxpZGF0ZV9ub2NvcHkoKXsgaWYoIGdldHJjKCkt PnNoYXJlZCgpICkgdW5zaGFyZV9ub2NvcHkoKTsgfQoKCgogICAgaW50IHNpemUoKSBjb25zdCB7 IHJldHVybiBzaXplXzsgfQogICAgdW5zaWduZWQgbG9uZyBtZW1vcnkoKSBjb25zdCB7IHJldHVy biBzaXplKCkgKiAodW5zaWduZWQgbG9uZykgc2l6ZW9mKFQpOyB9CiMgMzUxICJ4Mi5jYyIKICAg IFQmIHVnZXQoIGludCBpICkgeyAoKHZvaWQpMCk7IHJldHVybiBkYXRhX1tpXTsgfQoKICAgIGNv bnN0IFQmIHVnZXQoIGludCBpICkgY29uc3QgeyAoKHZvaWQpMCk7IHJldHVybiBkYXRhX1tpXTsg fQoKCgoKCgogICAgY29uc3QgVCogYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhKCk7IH0KCiAg ICBUKiBiZWdpbigpeyBpbnZhbGlkYXRlKCk7IHJldHVybiBkYXRhKCk7IH0KICAgIGNvbnN0IFQq IGVuZCgpIGNvbnN0IHsgcmV0dXJuIGRhdGEoKSArIHNpemUoKTsgfQogICAgVCogZW5kKCl7IGlu dmFsaWRhdGUoKTsgcmV0dXJuIGRhdGEoKSArIHNpemUoKTsgfQoKICAgIGNvbnN0IFQmIGJhY2so KSBjb25zdCB7IHJldHVybiAqKCBkYXRhKCkgKyBzaXplKCkgLSAxKTsgfQogICAgVCYgYmFjaygp IHsgaW52YWxpZGF0ZSgpOyByZXR1cm4gKiggZGF0YSgpICsgc2l6ZSgpIC0gMSk7IH0KCgpwcm90 ZWN0ZWQ6CiAgICB2b2lkIG9wZXJhdG9yPSggY29uc3QgVFJjQmFzZSAmIGIgKTsKcHJpdmF0ZToK ICAgIFQqIGRhdGEoKSBjb25zdCB7IHZhbGlkKCk7IHJldHVybiBkYXRhXzsgfQogICAgdm9pZCB1 bnNoYXJlKCk7CiAgICB2b2lkIHVuc2hhcmVfbm9jb3B5KCk7CiAgICBSQzxUPiogZ2V0cmMoKSBj b25zdCB7IHZhbGlkKCk7IHJldHVybiBSQzxUPjo6ZGF0YTJyYyggZGF0YV8gKTsgfQpwcml2YXRl OgogICAgaW50IHNpemVfOwogICAgVCogX19yZXN0cmljdF9fIGRhdGFfOwp9OwojIDM5NSAieDIu Y2MiCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIE0+CmNsYXNzIFRlbnNvcnsKcHJpdmF0ZToKCgoK CiAgICBUZW5zb3IoKTsKcHVibGljOgojIDQxMiAieDIuY2MiCiAgICB2b2lkIGludmFsaWRhdGUo KTsKCgoKCgoKCiAgICBzdGF0aWMgY29uc3QgaW50IHJhbms7CiMgNDI5ICJ4Mi5jYyIKICAgIHN0 YXRpYyBjb25zdCBib29sIGxpbmVhcjsKCgoKCgogICAgaW50IHNpemUoKSBjb25zdDsKIyA0NDUg IngyLmNjIgogICAgaW50IGRpbTEoKSBjb25zdDsKCgoKCgogICAgaW50IGRpbTIoKSBjb25zdDsK CgoKCgogICAgaW50IGRpbTMoKSBjb25zdDsKCgoKCgogICAgaW50IGRpbTQoKSBjb25zdDsKCn07 CgoKCnRlbXBsYXRlPGNsYXNzIE0xLCBjbGFzcyBNMj4gc3RydWN0IEluZGV4VHlwZTI7CnRlbXBs YXRlPGNsYXNzIE0xLCBjbGFzcyBNMiwgY2xhc3MgTTM+IHN0cnVjdCBJbmRleFR5cGUzOwp0ZW1w bGF0ZTxjbGFzcyBNMSwgY2xhc3MgTTIsIGNsYXNzIE0zLCBjbGFzcyBNND4gc3RydWN0IEluZGV4 VHlwZTQ7CiMgNDg0ICJ4Mi5jYyIKc3RydWN0IFRaZXJvU2l6ZUJhc2UgOiBwdWJsaWMgVmFsaWRh dG9yPFRaZXJvU2l6ZUJhc2U+IHsKICAgIHZvaWQgaW52YWxpZGF0ZSgpe30KICAgIHN0YXRpYyBj b25zdCBpbnQgcmFuaz0tMTsKICAgIHN0YXRpYyBjb25zdCBib29sIGxpbmVhcj1mYWxzZTsKICAg IGludCBkaW0xKCkgY29uc3QgeyByZXR1cm4gLTE7IH0KICAgIGludCBkaW0yKCkgY29uc3QgeyBy ZXR1cm4gLTE7IH0KICAgIGludCBkaW0zKCkgY29uc3QgeyByZXR1cm4gLTE7IH0KICAgIGludCBk aW00KCkgY29uc3QgeyByZXR1cm4gLTE7IH0KfTsKCgoKdGVtcGxhdGU8Ym9vbCBiPgpjbGFzcyBy YW5rX2RvZXNfbm90X21hdGNoOwoKdGVtcGxhdGUgPGJvb2wgYj4KaW5saW5lIHZvaWQgUmFua0Nv bXBhcmUoKSB7IHJldHVybiByYW5rX2RvZXNfbm90X21hdGNoPGI+KCk7IH0KCnRlbXBsYXRlIDw+ CmlubGluZSB2b2lkIFJhbmtDb21wYXJlPHRydWU+KCkgeyB9CgoKCgp0ZW1wbGF0ZTxjbGFzcyBU PgpjbGFzcyBUZW5zb3JDb21tYQp7CnB1YmxpYzoKICAgIFRlbnNvckNvbW1hKCBUKiBhLCBUKiBi LCBUIHQgKTsKICAgIFRlbnNvckNvbW1hKCBUZW5zb3JDb21tYSYgdCApOwogICAgdm9pZCBwdXNo KCBjb25zdCBUJiB0ICkgeyBpZiggIShwXzxlbmRfKSApIHRlbnNvcl9jaGVja19mYWlsZWQoICJU b28gbWFueSBpbml0aWFsaXplcnMgaW4gY29tbWEgc2VwYXJhdGVkIGxpc3QiICk7OyAqcF8rKyA9 IHQ7IH0KICAgIH5UZW5zb3JDb21tYSgpeyBpZiggIShwXz09ZW5kXykgKSB0ZW5zb3JfY2hlY2tf ZmFpbGVkKCAiVG9vIGZldyBpbml0aWFsaXplcnMgaW4gY29tbWEgc2VwYXJhdGVkIGxpc3QiICk7 OyB9CiAgICBUZW5zb3JDb21tYSYgb3BlcmF0b3IsKCBjb25zdCBUJiBiICl7IHB1c2goYik7IHJl dHVybiAqdGhpczsgfQoKCiAgICBUKiBwXzsKICAgIFQqIGNvbnN0IGVuZF87Cn07Cgp0ZW1wbGF0 ZTxjbGFzcyBUPgpUZW5zb3JDb21tYTwgVCA+OjpUZW5zb3JDb21tYSggVCogYSwgVCogYiwgVCB0 ICkKICAgIDogcF8oIGEgKSwKICAgICAgZW5kXyggYiApCnsKICAgIHB1c2goIHQgKTsKfQoKdGVt cGxhdGU8Y2xhc3MgVD4KVGVuc29yQ29tbWE8IFQgPjo6VGVuc29yQ29tbWEoIFRlbnNvckNvbW1h PFQ+JiB0ICkKICAgIDogcF8oIHQucF8gKSwKICAgICAgZW5kXyggdC5lbmRfICkKewogICAgdC5w XyA9IHQuZW5kXzsKfQojIDU1OSAieDIuY2MiCnRlbXBsYXRlPGNsYXNzIEEsIGNsYXNzIEI+CkEm IHRhc3NpZ24oIEEmIGEsIGNvbnN0IEImIGIgKTsKCnRlbXBsYXRlPGNsYXNzIEEsIGNsYXNzIEI+ CkEmIHRhc3NpZ25fd2l0aF9zaXplX2FkanVzdG1lbnQoIEEmIGEsIGNvbnN0IEImIGIgKQp7CiAg ICBpZiggYS5zaXplKCkgPT0gMCAmJiBCOjpyYW5rID4gMCApIHJldHVybiBhPUEoYik7CiAgICBl bHNlIHJldHVybiB0YXNzaWduKCBhLCBiICk7Cn0KCgoKCgoKCnRlbXBsYXRlPCBjbGFzcyBGLCBj bGFzcyBBLCBjbGFzcyBCPgpBJiB0YXNzaWduX29wKCBBJiBhLCBjb25zdCBCJiBiICk7CgoKCgp0 ZW1wbGF0ZSA8aW50IE4+IGNsYXNzIFRJbmRleHt9OwojIDU5MiAieDIuY2MiCnRlbXBsYXRlIDw+ IGNsYXNzIFRlbnNvcjwgaW50LCBUSW5kZXg8MT4gPiA6IHB1YmxpYyBUWmVyb1NpemVCYXNlCnsK cHVibGljOgogICAgc3RhdGljIGNvbnN0IGludCByYW5rPTE7CiAgICBleHBsaWNpdCBUZW5zb3Io IGludCBuID0gLTEgKSA6IGRfKG4pe30KICAgIGludCBvcGVyYXRvcltdKCBpbnQgaSApIGNvbnN0 IHsgcmV0dXJuIGk7IH0KICAgIGludCBvcGVyYXRvcigpKCBpbnQgaSwgaW50ICwgaW50ID0wLCBp bnQ9MCApIGNvbnN0IHsgcmV0dXJuIGk7IH0KICAgIGludCBpbmRleF9zaXplKCkgY29uc3QgeyBy ZXR1cm4gZF87IH0KICAgIGludCBkaW0xKCkgY29uc3QgeyByZXR1cm4gZF87IH0KcHJpdmF0ZToK ICAgIGNvbnN0IGludCBkXzsKfTsKCgoKdGVtcGxhdGUgPD4gY2xhc3MgVGVuc29yPCBpbnQsIFRJ bmRleDwyPiA+IDogcHVibGljIFRaZXJvU2l6ZUJhc2UKewpwdWJsaWM6CiAgICBzdGF0aWMgY29u c3QgaW50IHJhbms9MjsKICAgIGV4cGxpY2l0IFRlbnNvciggaW50IG4gPSAtMSApIDogZF8obil7 fQogICAgaW50IG9wZXJhdG9yKCkoIGludCAsIGludCBqLCBpbnQgPTAsIGludCA9MCApIGNvbnN0 IHsgcmV0dXJuIGo7IH0KICAgIGludCBpbmRleF9zaXplKCkgY29uc3QgeyByZXR1cm4gZF87IH0K ICAgIGludCBkaW0yKCkgY29uc3QgeyByZXR1cm4gZF87IH0KcHJpdmF0ZToKICAgIGNvbnN0IGlu dCBkXzsKfTsKCgoKdGVtcGxhdGUgPD4gY2xhc3MgVGVuc29yPCBpbnQsIFRJbmRleDwzPiA+IDog cHVibGljIFRaZXJvU2l6ZUJhc2UKewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IHJhbms9 MzsKICAgIGV4cGxpY2l0IFRlbnNvciggaW50IG4gPSAtMSApIDogZF8obil7fQogICAgaW50IG9w ZXJhdG9yKCkoIGludCAsIGludCAsIGludCBrLCBpbnQ9MCApIGNvbnN0IHsgcmV0dXJuIGs7IH0K ICAgIGludCBpbmRleF9zaXplKCkgY29uc3QgeyByZXR1cm4gZF87IH0KICAgIGludCBkaW0zKCkg Y29uc3QgeyByZXR1cm4gZF87IH0KcHJpdmF0ZToKICAgIGNvbnN0IGludCBkXzsKfTsKCgoKdGVt cGxhdGUgPD4gY2xhc3MgVGVuc29yPCBpbnQsIFRJbmRleDw0PiA+IDogcHVibGljIFRaZXJvU2l6 ZUJhc2UKewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IHJhbms9NDsKICAgIGV4cGxpY2l0 IFRlbnNvciggaW50IG4gPSAtMSApIDogZF8obil7fQogICAgaW50IG9wZXJhdG9yKCkoIGludCAs IGludCAsIGludCAsIGludCBsICkgY29uc3QgeyByZXR1cm4gbDsgfQogICAgaW50IGluZGV4X3Np emUoKSBjb25zdCB7IHJldHVybiBkXzsgfQogICAgaW50IGRpbTQoKSBjb25zdCB7IHJldHVybiBk XzsgfQpwcml2YXRlOgogICAgY29uc3QgaW50IGRfOwp9OwoKdHlwZWRlZiBUZW5zb3I8aW50LCBU SW5kZXg8MT4gPiBJbmRleDE7CnR5cGVkZWYgVGVuc29yPGludCwgVEluZGV4PDI+ID4gSW5kZXgy Owp0eXBlZGVmIFRlbnNvcjxpbnQsIFRJbmRleDwzPiA+IEluZGV4MzsKdHlwZWRlZiBUZW5zb3I8 aW50LCBUSW5kZXg8ND4gPiBJbmRleDQ7CgpleHRlcm4gY29uc3QgSW5kZXgxIGluZGV4MTsKZXh0 ZXJuIGNvbnN0IEluZGV4MiBpbmRleDI7CmV4dGVybiBjb25zdCBJbmRleDMgaW5kZXgzOwpleHRl cm4gY29uc3QgSW5kZXg0IGluZGV4NDsKCgoKCnRlbXBsYXRlPCBjbGFzcyBTLCBjbGFzcyBJID4g Y2xhc3MgSW5kZXhlZDsKIyA2NzAgIngyLmNjIgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgUywg Y2xhc3MgST4KY2xhc3MgVGVuc29yPFQsIEluZGV4ZWQ8IFMsIEkgPiA+IDogcHVibGljIFRaZXJv U2l6ZUJhc2UKewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IHJhbms9STo6cmFuazsKICAg IFRlbnNvciggUyYgcywgY29uc3QgSSAmIGluZCApIDogc18ocyksIGluZF8oaW5kKSB7fQogICAg Y29uc3QgVCYgb3BlcmF0b3JbXSggaW50IG4gKSBjb25zdCB7IHJldHVybiBzXy51Z2V0KCBpbmRf W25dICkgOyB9CiAgICBjb25zdCBUJiBvcGVyYXRvcigpKCBpbnQgcCwgaW50IHEgKSBjb25zdCB7 IHJldHVybiBzXy51Z2V0KCBpbmRfKHAsIHEpICkgOyB9CiAgICBjb25zdCBUJiBvcGVyYXRvcigp KCBpbnQgcCwgaW50IHEsIGludCByICkgY29uc3QgeyByZXR1cm4gc18udWdldCggaW5kXyhwLCBx LCByKSApIDsgfQogICAgY29uc3QgVCYgb3BlcmF0b3IoKSggaW50IHAsIGludCBxLCBpbnQgciwg aW50IHMgKSBjb25zdCB7IHJldHVybiBzXy51Z2V0KCBpbmRfKHAsIHEsIHIsIHMpICkgOyB9CiAg ICBUJiBnZXQoIGludCBuICkgeyByZXR1cm4gc18udWdldCggaW5kX1tuXSApIDsgfQogICAgVCYg Z2V0KCBpbnQgcCwgaW50IHEgKSB7IHJldHVybiBzXy51Z2V0KCBpbmRfKHAsIHEpICkgOyB9CiAg ICBUJiBnZXQoIGludCBwLCBpbnQgcSwgaW50IHIgKSB7IHJldHVybiBzXy51Z2V0KCBpbmRfKHAs IHEsIHIpICkgOyB9CiAgICBUJiBnZXQoIGludCBwLCBpbnQgcSwgaW50IHIsIGludCBzICkgeyBy ZXR1cm4gc18udWdldCggaW5kXyhwLCBxLCByLCBzKSApIDsgfQoKCiAgICBpbnQgZGltMSgpIGNv bnN0IHsgcmV0dXJuIGluZF8uZGltMSgpOyB9CiAgICBpbnQgZGltMigpIGNvbnN0IHsgcmV0dXJu IGluZF8uZGltMigpOyB9CiAgICBpbnQgZGltMygpIGNvbnN0IHsgcmV0dXJuIGluZF8uZGltMygp OyB9CiAgICBpbnQgZGltNCgpIGNvbnN0IHsgcmV0dXJuIGluZF8uZGltNCgpOyB9CiAgICB0ZW1w bGF0ZTxjbGFzcyBUMSwgY2xhc3MgTTE+CiAgICBUZW5zb3ImIG9wZXJhdG9yPSggY29uc3QgVGVu c29yPFQxLCBNMT4mIGEgKXsgc18uaW52YWxpZGF0ZSgpOyByZXR1cm4gdGFzc2lnbiggKnRoaXMs IGEgKTsgfQogICAgVGVuc29yJiBvcGVyYXRvcj0oIGNvbnN0IFRlbnNvciYgYSApeyBpZiggdGhp cz09JmEgKSByZXR1cm4gKnRoaXM7IHNfLmludmFsaWRhdGUoKTsgcmV0dXJuIHRhc3NpZ24oICp0 aGlzLCBhICk7IH0KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUMiwgY2xhc3MgTTI+CiAgICBpbmxpbmUg Y29uc3QgVGVuc29yJiBvcGVyYXRvciArPSAoIGNvbnN0IFRlbnNvcjxUMiwgTTI+JiBiICl7IHJl dHVybiB0YXNzaWduX29wPHhwbHVzPFQsIFQyPiA+KCAqdGhpcywgYiApOyB9CgogICAgdGVtcGxh dGU8Y2xhc3MgVDIsIGNsYXNzIE0yPgogICAgaW5saW5lIGNvbnN0IFRlbnNvciYgb3BlcmF0b3Ig LT0gKCBjb25zdCBUZW5zb3I8VDIsIE0yPiYgYiApeyByZXR1cm4gdGFzc2lnbl9vcDx4bWludXM8 VCwgVDI+ID4oICp0aGlzLCBiICk7IH0KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUMiwgY2xhc3MgTTI+ CiAgICBpbmxpbmUgY29uc3QgVGVuc29yJiBvcGVyYXRvciAqPSAoIGNvbnN0IFRlbnNvcjxUMiwg TTI+JiBiICl7IHJldHVybiB0YXNzaWduX29wPHhtdWx0aXBsaWVzPFQsIFQyPiA+KCAqdGhpcywg YiApOyB9CgogICAgdGVtcGxhdGU8Y2xhc3MgVDIsIGNsYXNzIE0yPgogICAgaW5saW5lIGNvbnN0 IFRlbnNvciYgb3BlcmF0b3IgLz0gKCBjb25zdCBUZW5zb3I8VDIsIE0yPiYgYiApeyByZXR1cm4g dGFzc2lnbl9vcDx4ZGl2aWRlczxULCBUMj4gPiggKnRoaXMsIGIgKTsgfQoKcHJpdmF0ZToKICAg IFMmIHNfOwogICAgY29uc3QgSSBpbmRfOwp9OwoKCgoKCnRlbXBsYXRlPGludCBOPiBzdHJ1Y3Qg VGVuc29yUmFua3t9OwoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIE0+CmlubGluZSBpbnQgbWF4 ZGltX2F1eCggVGVuc29yUmFuazwxPiwgY29uc3QgVGVuc29yPFQsIE0+JiBhICkKewogICAgcmV0 dXJuIGEuZGltMSgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgTT4KaW5saW5lIGludCBt YXhkaW1fYXV4KCBUZW5zb3JSYW5rPDI+LCBjb25zdCBUZW5zb3I8VCwgTT4mIGEgKQp7CiAgICBy ZXR1cm4gYS5kaW0yKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBNPgppbmxpbmUgaW50 IG1heGRpbV9hdXgoIFRlbnNvclJhbms8Mz4sIGNvbnN0IFRlbnNvcjxULCBNPiYgYSApCnsKICAg IHJldHVybiBhLmRpbTMoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIE0+CmlubGluZSBp bnQgbWF4ZGltX2F1eCggVGVuc29yUmFuazw0PiwgY29uc3QgVGVuc29yPFQsIE0+JiBhICkKewog ICAgcmV0dXJuIGEuZGltNCgpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBNPgppbmxp bmUgaW50IG1heGRpbSggY29uc3QgVGVuc29yPFQsIE0+JiBhICkKewogICAgcmV0dXJuIG1heGRp bV9hdXgoIFRlbnNvclJhbms8IFRlbnNvcjxULCBNPjo6cmFuayA+KCksIGEgKTsKfQoKaW5saW5l IHZvaWQgY2hlY2tfZGltZW5zaW9ucyggaW50IGEsIGludCBiICkKewogICAgKCh2b2lkKTApOwog ICAgKCh2b2lkKTApOwp9CiMgNzYyICJ4Mi5jYyIKdGVtcGxhdGU8Y2xhc3MgVD4KaW5saW5lIGNv bnN0IFQmIGluZGV4ZGltKCBjb25zdCBUJiB0LCBpbnQgKXsgcmV0dXJuIHQ7IH0KCnRlbXBsYXRl PGludCBOPgppbmxpbmUgVGVuc29yPGludCwgVEluZGV4PE4+ID4gaW5kZXhkaW0oIGNvbnN0IFRl bnNvcjxpbnQsIFRJbmRleDxOPiA+JiB0LCBpbnQgZCApCnsKICAgIGlmKCB0LmluZGV4X3NpemUo KSA+PTAgKSByZXR1cm4gdDsKICAgIGVsc2UgcmV0dXJuIFRlbnNvcjxpbnQsIFRJbmRleDxOPiA+ KGQpOwp9CgoKCgp0ZW1wbGF0ZTxpbnQgTj4gY2xhc3MgVG5kIHt9OwoKdHlwZWRlZiBUbmQ8MT4g VDFkOwp0eXBlZGVmIFRuZDwyPiBUMmQ7CnR5cGVkZWYgVG5kPDM+IFQzZDsKdHlwZWRlZiBUbmQ8 ND4gVDRkOwoKCgoKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFRlbnNvcjxULCBUMWQgPiA6IHB1 YmxpYyBUUmNCYXNlPFQ+CnsKcHVibGljOgogICAgdHlwZWRlZiBUUmNCYXNlPFQ+IEJhc2U7CiAg ICBzdGF0aWMgY29uc3QgaW50IHJhbmsgPSAxOwoKICAgIFRlbnNvcigpe30KICAgIGV4cGxpY2l0 IFRlbnNvciggaW50IG4gKSA6IEJhc2Uobil7fQogICAgZXhwbGljaXQgVGVuc29yKCBpbnQgbiwg ZW1wdHlfdGVuc29yIGUgKSA6IEJhc2UobiwgZSl7fQoKICAgIFRlbnNvciggaW50IG4sIGNvbnN0 IFQqIHAgKSA6IEJhc2UobiwgcCl7fQoKCgogICAgdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIE0x PgogICAgVGVuc29yKCBjb25zdCBUZW5zb3I8VDEsIE0xPiYgYSApIDogQmFzZSggYS5kaW0xKCks IGVtcHR5X3RlbnNvcigpICl7IHRhc3NpZ24oICp0aGlzLCBhICk7IH0KCiAgICB0ZW1wbGF0ZTxj bGFzcyBNMSwgY2xhc3MgVDE+CiAgICBUZW5zb3ImIG9wZXJhdG9yPSggY29uc3QgVGVuc29yPFQx LCBNMT4mIGEgKXsgcmV0dXJuIHRhc3NpZ25fd2l0aF9zaXplX2FkanVzdG1lbnQoICp0aGlzLCBh ICk7IH0KCiAgICBUZW5zb3JDb21tYTxUPiBvcGVyYXRvcj0oIGNvbnN0IFQmIHQgKXsgaW52YWxp ZGF0ZSgpOyBUZW5zb3JDb21tYTxUPiB4KCBiZWdpbigpLCBlbmQoKSwgdCApOyByZXR1cm4geDsg fQoKICAgIGNvbnN0IFQmIGdldCggaW50IGkgKSBjb25zdCB7IHJldHVybiB1Z2V0KCBpICk7IH0K ICAgIFQmIGdldCggaW50IGkgKSB7IHJldHVybiB1Z2V0KCBpKTsgfQogICAgY29uc3QgVCYgb3Bl cmF0b3JbXSggaW50IGEgKSBjb25zdCB7ICgodm9pZCkwKTsgcmV0dXJuIGdldChhKTsgfQogICAg VCYgb3BlcmF0b3JbXSggaW50IGEgKXsgKCh2b2lkKTApOyBpbnZhbGlkYXRlKCk7IHJldHVybiBn ZXQoYSk7IH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgTTE+CiAgICBUZW5zb3I8VCwgSW5kZXhlZDxj b25zdCBCYXNlLCBUZW5zb3I8aW50LE0xPiA+ID4gb3BlcmF0b3JbXSggY29uc3QgVGVuc29yPGlu dCwgTTE+JiBpICkgY29uc3QKICAgICAgICB7IHJldHVybiBUZW5zb3I8VCwgSW5kZXhlZDxjb25z dCBCYXNlLCBUZW5zb3I8aW50LCBNMT4gPiA+KCAqdGhpcywgaW5kZXhkaW0oIGksIHNpemUoKSAp ICk7IH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgTTE+CiAgICBUZW5zb3I8VCwgSW5kZXhlZDxCYXNl LCBUZW5zb3I8aW50LCBNMT4gPiA+IG9wZXJhdG9yW10oIGNvbnN0IFRlbnNvcjxpbnQsIE0xPiYg aSApCiAgICAgICAgeyByZXR1cm4gVGVuc29yPFQsIEluZGV4ZWQ8QmFzZSwgVGVuc29yPGludCwg TTE+ID4gPiggKnRoaXMsIGluZGV4ZGltKGksIHNpemUoKSApICk7IH0KCiAgICB2b2lkIHJlc2l6 ZSggaW50IGkgKXsgaWYoIHNpemUoKSAhPSBpICkgKCp0aGlzKSA9IFRlbnNvcihpKTsgZWxzZSAo KnRoaXMpID0gc2NhbGFyKCBUKCkgKTsgfQogICAgdm9pZCByZXNpemUoIGludCBpLCBlbXB0eV90 ZW5zb3IgZSApeyBpZiggc2l6ZSgpICE9IGkgKSAoKnRoaXMpID0gVGVuc29yKGksIGUpOyB9CiAg ICBpbnQgZGltMSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKTsgfQpwcml2YXRlOgogICAgaW50IHNp emVfOwp9OwoKCgoKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFRlbnNvcjxULCBUMmQgPiA6IHB1 YmxpYyBUUmNCYXNlPFQ+CnsKcHVibGljOgogICAgdHlwZWRlZiBUUmNCYXNlPFQ+IEJhc2U7CiAg ICBzdGF0aWMgY29uc3QgaW50IHJhbmsgPSAyOwoKICAgIFRlbnNvcigpIDogQmFzZSgwKSwgZGlt MV8oMCksIGRpbTJfKDApe30KICAgIGV4cGxpY2l0IFRlbnNvciggaW50IG4gKSA6IEJhc2Uobipu KSwgZGltMV8obiksIGRpbTJfKG4pe30KICAgIFRlbnNvciggaW50IG4sIGNvbnN0IFQqIHAgKSA6 IEJhc2UobipuLCBwKSwgZGltMV8obiksIGRpbTJfKG4pe30KICAgIFRlbnNvciggaW50IGEsIGlu dCBiICkgOiBCYXNlKGEqYiksIGRpbTFfKGEpLCBkaW0yXyhiKXt9CiAgICBUZW5zb3IoIGludCBh LCBpbnQgYiAsIGVtcHR5X3RlbnNvciBlICkgOiBCYXNlKGEqYiwgZSApLCBkaW0xXyhhKSwgZGlt Ml8oYil7fQogICAgVGVuc29yKCBpbnQgYSwgaW50IGIsIGNvbnN0IFQqIHAgKSA6IEJhc2UoYSpi LCBwKSwgZGltMV8oYSksIGRpbTJfKGIpe30KCgoKCiAgICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xh c3MgTTE+CiAgICBUZW5zb3IoIGNvbnN0IFRlbnNvcjxUMSwgTTE+JiBhICk7CgogICAgdGVtcGxh dGU8Y2xhc3MgTTEsIGNsYXNzIFQxPgogICAgVGVuc29yJiBvcGVyYXRvcj0oIGNvbnN0IFRlbnNv cjxUMSwgTTE+JiBhICl7IHJldHVybiB0YXNzaWduX3dpdGhfc2l6ZV9hZGp1c3RtZW50KCAqdGhp cywgYSApOyB9CgogICAgVGVuc29yQ29tbWE8VD4gb3BlcmF0b3I9KCBjb25zdCBUJiB0ICl7IGlu dmFsaWRhdGUoKTsgVGVuc29yQ29tbWE8VD4geCggYmVnaW4oKSwgZW5kKCksIHQgKTsgcmV0dXJu IHg7IH0KCiAgICBUJiBnZXQoIGludCBhLCBpbnQgYiApeyByZXR1cm4gdWdldCggdG9saW4oYSwg YikpOyB9CiAgICBjb25zdCBUJiBvcGVyYXRvcigpKCBpbnQgYSwgaW50IGIgKSBjb25zdCB7IHJl dHVybiB1Z2V0KCB0b2xpbihhLCBiICkpOyB9CiAgICBUJiBvcGVyYXRvcigpKCBpbnQgYSwgaW50 IGIgKXsgaW52YWxpZGF0ZSgpOyByZXR1cm4gdWdldCggdG9saW4oIGEsIGIgKSk7IH0KCgoKCiAg ICB0ZW1wbGF0ZSA8Y2xhc3MgTTEsIGNsYXNzIE0yPgogICAgVGVuc29yPFQsIEluZGV4ZWQ8Y29u c3QgQmFzZSwgdHlwZW5hbWUgSW5kZXhUeXBlMjxNMSwgTTI+Ojp0ID4gPgogICAgb3BlcmF0b3Io KSggY29uc3QgTTEmIGksIGNvbnN0IE0yJiBqICkgY29uc3QKICAgIHsgcmV0dXJuIFRlbnNvcjxU LCBJbmRleGVkPGNvbnN0IEJhc2UsIHR5cGVuYW1lIEluZGV4VHlwZTI8TTEsIE0yPjo6dCA+ID4o ICp0aGlzLCB0b2xpbihpLGopICk7IH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgTTEsIGNsYXNzIE0y PgogICAgVGVuc29yPFQsIEluZGV4ZWQ8QmFzZSwgdHlwZW5hbWUgSW5kZXhUeXBlMjxNMSwgTTI+ Ojp0ID4gPgogICAgb3BlcmF0b3IoKSggY29uc3QgTTEmIGksIGNvbnN0IE0yJiBqICkKICAgIHsg cmV0dXJuIFRlbnNvcjxULCBJbmRleGVkPEJhc2UsIHR5cGVuYW1lIEluZGV4VHlwZTI8TTEsIE0y Pjo6dCA+ID4oICp0aGlzLCB0b2xpbihpLGopICk7IH0KCgogICAgdm9pZCByZXNpemUoIGludCBp LCBpbnQgaiApeyBpZiggZGltMSgpICE9IGkgfHwgZGltMigpICE9IGogKSAoKnRoaXMpID0gVGVu c29yKGksIGopOyBlbHNlICgqdGhpcykgPSBzY2FsYXIoIFQoKSApOyB9CiAgICB2b2lkIHJlc2l6 ZSggaW50IGksIGludCBqLCBlbXB0eV90ZW5zb3IgZSApeyBpZiggZGltMSgpICE9IGkgfHwgZGlt MigpICE9IGogKSAoKnRoaXMpID0gVGVuc29yKGksIGosIGUpOyB9CiAgICBpbnQgdG9saW4oIGlu dCBhLCBpbnQgYiApIGNvbnN0IHsgcmV0dXJuIGErYipkaW0xXzsgfQoKICAgIHRlbXBsYXRlPGNs YXNzIE0xLCBjbGFzcyBNMj4KICAgIHR5cGVuYW1lIEluZGV4VHlwZTI8TTEsIE0yPjo6dAogICAg dG9saW4oIGNvbnN0IE0xJiBhLCBjb25zdCBNMiYgYiApIGNvbnN0OwoKCiAgICBpbnQgZGltMSgp IGNvbnN0IHsgcmV0dXJuIGRpbTFfOyB9CiAgICBpbnQgZGltMigpIGNvbnN0IHsgcmV0dXJuIGRp bTJfOyB9CiAgICBpbnQgZGltKCkgY29uc3QgeyByZXR1cm4gZGltMV87IH0KcHJpdmF0ZToKICAg IGludCBkaW0xXzsKICAgIGludCBkaW0yXzsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgp0ZW1wbGF0 ZTxjbGFzcyBNMSwgY2xhc3MgTTI+CnR5cGVuYW1lIEluZGV4VHlwZTI8TTEsIE0yPjo6dApUZW5z b3I8VCwgVDJkPiA6OiB0b2xpbiggY29uc3QgTTEmIGEsIGNvbnN0IE0yJiBiICkgY29uc3QKewog ICAgcmV0dXJuIGluZGV4ZGltKGEsIGRpbTFfKSArIGluZGV4ZGltKGIsIGRpbTJfKSAqIGRpbTFf Owp9CgoKdGVtcGxhdGU8Y2xhc3MgVD4KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIE0xPgpUZW5z b3I8VCwgVDJkPiA6OiBUZW5zb3IoIGNvbnN0IFRlbnNvcjxUMSwgTTE+JiBhICkKICAgIDogQmFz ZSggYS5kaW0xKCkqYS5kaW0yKCksIGVtcHR5X3RlbnNvcigpICksCiAgICAgIGRpbTFfKCBhLmRp bTEoKSApLCBkaW0yXyggYS5kaW0yKCkgKQp7CiAgICAoKHZvaWQpMCk7CiAgICAoKHZvaWQpMCk7 CiAgICB0YXNzaWduKCAqdGhpcywgYSApOwp9CgoKCgoKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNz IFRlbnNvcjxULCBUM2QgPiA6IHB1YmxpYyBUUmNCYXNlPFQ+CnsKcHVibGljOgogICAgdHlwZWRl ZiBUUmNCYXNlPFQ+IEJhc2U7CiAgICBzdGF0aWMgY29uc3QgaW50IHJhbmsgPSAzOwoKICAgIFRl bnNvcigpIDogQmFzZSgwKSwgZGltMV8oMCksIGRpbTJfKDApLCBkaW0zXygwKXt9CiAgICBUZW5z b3IoIGludCBhLCBpbnQgYiwgaW50IGMgKSA6IEJhc2UoYSpiKmMpLCBkaW0xXyhhKSwgZGltMl8o YiksIGRpbTNfKGMpe30KICAgIFRlbnNvciggaW50IGEsIGludCBiLCBpbnQgYywgZW1wdHlfdGVu c29yIGUgKSA6IEJhc2UoYSpiKmMsIGUpLCBkaW0xXyhhKSwgZGltMl8oYiksIGRpbTNfKGMpe30K ICAgIFRlbnNvciggaW50IGEsIGludCBiLCBpbnQgYywgY29uc3QgVCogcCApIDogQmFzZShhKmIq YywgcCksIGRpbTFfKGEpLCBkaW0yXyhiKSwgZGltM18oYyl7fQoKCgogICAgdGVtcGxhdGU8Y2xh c3MgVDEsIGNsYXNzIE0xPgogICAgVGVuc29yKCBjb25zdCBUZW5zb3I8VDEsIE0xPiYgYSApOwoK ICAgIHRlbXBsYXRlPGNsYXNzIE0xLCBjbGFzcyBUMT4KICAgIFRlbnNvciYgb3BlcmF0b3I9KCBj b25zdCBUZW5zb3I8VDEsIE0xPiYgYSApeyByZXR1cm4gdGFzc2lnbl93aXRoX3NpemVfYWRqdXN0 bWVudCggKnRoaXMsIGEgKTsgfQoKICAgIFRlbnNvckNvbW1hPFQ+IG9wZXJhdG9yPSggY29uc3Qg VCYgdCApeyBpbnZhbGlkYXRlKCk7IFRlbnNvckNvbW1hPFQ+IHgoIGJlZ2luKCksIGVuZCgpLCB0 ICk7IHJldHVybiB4OyB9CgogICAgVCYgZ2V0KCBpbnQgYSwgaW50IGIsIGludCBjICl7IHJldHVy biB1Z2V0KCB0b2xpbihhLCBiLCBjKSk7IH0KICAgIGNvbnN0IFQmIG9wZXJhdG9yKCkoIGludCBh LCBpbnQgYiwgaW50IGMgKSBjb25zdCB7IHJldHVybiB1Z2V0KHRvbGluKGEsIGIsIGMpKTsgfQog ICAgVCYgb3BlcmF0b3IoKSggaW50IGEsIGludCBiLCBpbnQgYyApeyBpbnZhbGlkYXRlKCk7IHJl dHVybiB1Z2V0KHRvbGluKGEsIGIsIGMpKTsgfQoKCgogICAgdGVtcGxhdGUgPGNsYXNzIE0xLCBj bGFzcyBNMiwgY2xhc3MgTTM+CiAgICBUZW5zb3I8VCwgSW5kZXhlZDxjb25zdCBCYXNlLCB0eXBl bmFtZSBJbmRleFR5cGUzPE0xLCBNMiwgTTM+Ojp0ID4gPgogICAgb3BlcmF0b3IoKSggY29uc3Qg TTEmIGksIGNvbnN0IE0yJiBqLCBjb25zdCBNMyYgayApIGNvbnN0CiAgICB7IHJldHVybiBUZW5z b3I8VCwgSW5kZXhlZDxjb25zdCBCYXNlLCB0eXBlbmFtZSBJbmRleFR5cGUzPE0xLCBNMiwgTTM+ Ojp0ID4gPiggKnRoaXMsIHRvbGluKGksaixrKSApOyB9CgogICAgdGVtcGxhdGUgPGNsYXNzIE0x LCBjbGFzcyBNMiwgY2xhc3MgTTM+CiAgICBUZW5zb3I8VCwgSW5kZXhlZDxCYXNlLCB0eXBlbmFt ZSBJbmRleFR5cGUzPE0xLCBNMiwgTTM+Ojp0ID4gPgogICAgb3BlcmF0b3IoKSggY29uc3QgTTEm IGksIGNvbnN0IE0yJiBqLCBjb25zdCBNMyYgayApCiAgICB7IHJldHVybiBUZW5zb3I8VCwgSW5k ZXhlZDxCYXNlLCB0eXBlbmFtZSBJbmRleFR5cGUzPE0xLCBNMiwgTTM+Ojp0ID4gPiggKnRoaXMs IHRvbGluKGksaixrKSApOyB9CgogICAgaW50IHRvbGluKCBpbnQgYSwgaW50IGIsIGludCBjICkg Y29uc3QgeyByZXR1cm4gYStkaW0xXyooYitkaW0yXypjKTsgfQoKICAgIHRlbXBsYXRlPGNsYXNz IE0xLCBjbGFzcyBNMiwgY2xhc3MgTTM+CiAgICB0eXBlbmFtZSBJbmRleFR5cGUzPE0xLCBNMiwg TTM+Ojp0CiAgICB0b2xpbiggY29uc3QgTTEmIGEsIGNvbnN0IE0yJiBiLCBjb25zdCBNMyYgYyAp IGNvbnN0OwoKCgogICAgdm9pZCByZXNpemUoIGludCBpLCBpbnQgaiwgaW50IGsgKQogICAgeyBp ZiggZGltMSgpICE9IGkgfHwgZGltMigpICE9IGogfHwgZGltMygpICE9IGsgKSAoKnRoaXMpID0g VGVuc29yKGksIGosIGspOyBlbHNlICgqdGhpcykgPSBzY2FsYXIoIFQoKSApOyB9CiAgICB2b2lk IHJlc2l6ZSggaW50IGksIGludCBqLCBpbnQgaywgZW1wdHlfdGVuc29yIGUgKQogICAgeyBpZigg ZGltMSgpICE9IGkgfHwgZGltMigpICE9IGogfHwgZGltMygpICE9IGsgKSAoKnRoaXMpID0gVGVu c29yKGksIGosIGssIGUpOyB9CiAgICBpbnQgZGltMSgpIGNvbnN0IHsgcmV0dXJuIGRpbTFfOyB9 CiAgICBpbnQgZGltMigpIGNvbnN0IHsgcmV0dXJuIGRpbTJfOyB9CiAgICBpbnQgZGltMygpIGNv bnN0IHsgcmV0dXJuIGRpbTNfOyB9CnByaXZhdGU6CiAgICBpbnQgZGltMV87CiAgICBpbnQgZGlt Ml87CiAgICBpbnQgZGltM187Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KdGVtcGxhdGU8Y2xhc3Mg VDEsIGNsYXNzIE0xPgpUZW5zb3I8VCwgVDNkPjo6VGVuc29yKCBjb25zdCBUZW5zb3I8VDEsIE0x PiYgYSApCiAgICA6IEJhc2UoIGEuZGltMSgpKmEuZGltMigpKmEuZGltMygpLCBlbXB0eV90ZW5z b3IoKSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0xXyggYS5kaW0x KCkgKSwgZGltMl8oIGEuZGltMigpICksIGRpbTNfKCBhLmRpbTMoKSApCnsKICAgICgodm9pZCkw KTsKICAgICgodm9pZCkwKTsKICAgICgodm9pZCkwKTsKICAgIHRhc3NpZ24oICp0aGlzLCBhICk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgp0ZW1wbGF0ZTxjbGFzcyBNMSwgY2xhc3MgTTIsIGNsYXNz IE0zPgp0eXBlbmFtZSBJbmRleFR5cGUzPE0xLCBNMiwgTTM+Ojp0ClRlbnNvcjxULCBUM2Q+Ojp0 b2xpbiggY29uc3QgTTEmIGEsIGNvbnN0IE0yJiBiLCBjb25zdCBNMyYgYyApIGNvbnN0CnsKICAg IHJldHVybiBpbmRleGRpbShhLCBkaW0xXykgKyBpbmRleGRpbShiLCBkaW0yXykgKiBkaW0xXyAr IGluZGV4ZGltKGMsIGRpbTNfKSAqIChkaW0xXypkaW0yXyk7Cn0KCgoKCgoKdGVtcGxhdGU8Y2xh c3MgVD4KY2xhc3MgVGVuc29yPFQsIFQ0ZCA+IDogcHVibGljIFRSY0Jhc2U8VD4KewpwdWJsaWM6 CiAgICB0eXBlZGVmIFRSY0Jhc2U8VD4gQmFzZTsKICAgIHN0YXRpYyBjb25zdCBpbnQgcmFuayA9 IDQ7CgogICAgVGVuc29yKCkgOiBCYXNlKDApLCBkaW0xXygwKSwgZGltMl8oMCksIGRpbTNfKDAp LCBkaW00XygwKSB7fQogICAgVGVuc29yKCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCApIDog QmFzZShhKmIqYypkKSwgZGltMV8oYSksIGRpbTJfKGIpLCBkaW0zXyhjKSwgZGltNF8oZCl7fQog ICAgVGVuc29yKCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgY29uc3QgVCogcCApIDogQmFz ZShhKmIqYypkLCBwKSwgZGltMV8oYSksIGRpbTJfKGIpLCBkaW0zXyhjKSwgZGltNF8oZCl7fQoK CgogICAgdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIE0xPgogICAgVGVuc29yKCBjb25zdCBUZW5z b3I8VDEsIE0xPiYgYSApOwoKICAgIHRlbXBsYXRlPGNsYXNzIE0xLCBjbGFzcyBUMT4KICAgIFRl bnNvciYgb3BlcmF0b3I9KCBjb25zdCBUZW5zb3I8VDEsIE0xPiYgYSApeyByZXR1cm4gdGFzc2ln bl93aXRoX3NpemVfYWRqdXN0bWVudCggKnRoaXMsIGEgKTsgfQoKICAgIFRlbnNvckNvbW1hPFQ+ IG9wZXJhdG9yPSggY29uc3QgVCYgdCApeyBpbnZhbGlkYXRlKCk7IFRlbnNvckNvbW1hPFQ+IHgo IGJlZ2luKCksIGVuZCgpLCB0ICk7IHJldHVybiB4OyB9CgogICAgVCYgZ2V0KCBpbnQgYSwgaW50 IGIsIGludCBjLCBpbnQgZCApeyByZXR1cm4gdWdldCggdG9saW4oYSwgYiwgYywgZCkpOyB9CiAg ICBjb25zdCBUJiBvcGVyYXRvcigpKCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCApIGNvbnN0 IHsgcmV0dXJuIHVnZXQodG9saW4oYSwgYiwgYywgZCkpOyB9CiAgICBUJiBvcGVyYXRvcigpKCBp bnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCApeyBpbnZhbGlkYXRlKCk7IHJldHVybiB1Z2V0KHRv bGluKGEsIGIsIGMsIGQpKTsgfQoKCgogICAgdGVtcGxhdGUgPGNsYXNzIE0xLCBjbGFzcyBNMiwg Y2xhc3MgTTMsIGNsYXNzIE00PgogICAgVGVuc29yPFQsIEluZGV4ZWQ8Y29uc3QgQmFzZSwgdHlw ZW5hbWUgSW5kZXhUeXBlNDxNMSwgTTIsIE0zLCBNND46OnQgPiA+CiAgICBvcGVyYXRvcigpKCBj b25zdCBNMSYgaSwgY29uc3QgTTImIGosIGNvbnN0IE0zJiBrLCBjb25zdCBNNCYgbCApIGNvbnN0 CiAgICB7IHJldHVybiBUZW5zb3I8VCwgSW5kZXhlZDxjb25zdCBCYXNlLCB0eXBlbmFtZSBJbmRl eFR5cGU0PE0xLCBNMiwgTTMsIE00Pjo6dCA+ID4oICp0aGlzLCB0b2xpbihpLCBqLCBrLCBsKSAp OyB9CgogICAgdGVtcGxhdGUgPGNsYXNzIE0xLCBjbGFzcyBNMiwgY2xhc3MgTTMsIGNsYXNzIE00 PgogICAgVGVuc29yPFQsIEluZGV4ZWQ8QmFzZSwgdHlwZW5hbWUgSW5kZXhUeXBlNDxNMSwgTTIs IE0zLCBNND46OnQgPiA+CiAgICBvcGVyYXRvcigpKCBjb25zdCBNMSYgaSwgY29uc3QgTTImIGos IGNvbnN0IE0zJiBrLCBjb25zdCBNNCYgbCApCiAgICB7IHJldHVybiBUZW5zb3I8VCwgSW5kZXhl ZDxCYXNlLCB0eXBlbmFtZSBJbmRleFR5cGU0PE0xLCBNMiwgTTMsIE00Pjo6dCA+ID4oICp0aGlz LCB0b2xpbihpLCBqLCBrLCBsKSApOyB9CgogICAgaW50IHRvbGluKCBpbnQgYSwgaW50IGIsIGlu dCBjLCBpbnQgZCApIGNvbnN0IHsgcmV0dXJuIGEgKyBkaW0xXyAqIChiICsgZGltMl8gKiAoYyAr IGRpbTNfICogZCkpOyB9CgogICAgdGVtcGxhdGU8Y2xhc3MgTTEsIGNsYXNzIE0yLCBjbGFzcyBN MywgY2xhc3MgTTQ+CiAgICB0eXBlbmFtZSBJbmRleFR5cGU0PE0xLCBNMiwgTTMsIE00Pjo6dAog ICAgdG9saW4oIGNvbnN0IE0xJiBhLCBjb25zdCBNMiYgYiwgY29uc3QgTTMmIGMsIGNvbnN0IE00 JiBkICkgY29uc3Q7CgoKCiAgICB2b2lkIHJlc2l6ZSggaW50IGksIGludCBqLCBpbnQgaywgaW50 IGwgKXsgKCp0aGlzKSA9IFRlbnNvcihpLCBqLCBrLCBsKTsgfQogICAgaW50IGRpbTEoKSBjb25z dCB7IHJldHVybiBkaW0xXzsgfQogICAgaW50IGRpbTIoKSBjb25zdCB7IHJldHVybiBkaW0yXzsg fQogICAgaW50IGRpbTMoKSBjb25zdCB7IHJldHVybiBkaW0zXzsgfQogICAgaW50IGRpbTQoKSBj b25zdCB7IHJldHVybiBkaW00XzsgfQpwcml2YXRlOgogICAgaW50IGRpbTFfOwogICAgaW50IGRp bTJfOwogICAgaW50IGRpbTNfOwogICAgaW50IGRpbTRfOwp9OwoKdGVtcGxhdGUgPGNsYXNzIFQ+ CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBNMT4KVGVuc29yPFQsIFQ0ZD46OlRlbnNvciggY29u c3QgVGVuc29yPFQxLCBNMT4mIGEgKQogICAgOiBCYXNlKCBhLmRpbTEoKSphLmRpbTIoKSphLmRp bTMoKSphLmRpbTQoKSApLAogICAgICBkaW0xXyggYS5kaW0xKCkgKSwgZGltMl8oIGEuZGltMigp ICksIGRpbTNfKCBhLmRpbTMoKSApLCBkaW00XyggYS5kaW00KCkgKQp7CiAgICAoKHZvaWQpMCk7 CiAgICAoKHZvaWQpMCk7CiAgICAoKHZvaWQpMCk7CiAgICAoKHZvaWQpMCk7CiAgICB0YXNzaWdu KCAqdGhpcywgYSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KdGVtcGxhdGU8Y2xhc3MgTTEsIGNs YXNzIE0yLCBjbGFzcyBNMywgY2xhc3MgTTQ+CnR5cGVuYW1lIEluZGV4VHlwZTQ8TTEsIE0yLCBN MywgTTQ+Ojp0ClRlbnNvcjxULCBUNGQ+Ojp0b2xpbiggY29uc3QgTTEmIGEsIGNvbnN0IE0yJiBi LCBjb25zdCBNMyYgYywgY29uc3QgTTQmIGQgKSBjb25zdAp7CiAgICByZXR1cm4gaW5kZXhkaW0o YSwgZGltMV8pCiAgICAgICAgKyBpbmRleGRpbShiLCBkaW0yXykgKiBkaW0xXwogICAgICAgICsg aW5kZXhkaW0oYywgZGltM18pICogKGRpbTFfICogZGltMl8pCiAgICAgICAgKyBpbmRleGRpbShk LCBkaW00XykgKiAoZGltMV8gKiBkaW0yXyAqIGRpbTNfICk7Cn0KCgoKCnRlbXBsYXRlPGNsYXNz IFQxLCBpbnQgTiwgY2xhc3MgVDIsIGNsYXNzIE0yPgppbmxpbmUgVGVuc29yPFQxLCBUbmQ8Tj4g PiYgb3BlcmF0b3IgKz0gKCBUZW5zb3I8VDEsIFRuZDxOPiA+ICYgYSwgY29uc3QgVGVuc29yPFQy LCBNMj4mIGIgKQp7CiAgICByZXR1cm4gdGFzc2lnbl9vcDx4cGx1czxUMSwgVDI+ID4oIGEsIGIg KTsKfQoKdGVtcGxhdGU8Y2xhc3MgVDEsIGludCBOLCBjbGFzcyBUMiwgY2xhc3MgTTI+CmlubGlu ZSBUZW5zb3I8VDEsIFRuZDxOPiA+JiBvcGVyYXRvciAqPSAoIFRlbnNvcjxUMSwgVG5kPE4+ID4g JiBhLCBjb25zdCBUZW5zb3I8VDIsIE0yPiYgYiApCnsKICAgIHJldHVybiB0YXNzaWduX29wPHht dWx0aXBsaWVzPFQxLCBUMj4gPiggYSwgYiApOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUMSwgaW50IE4s IGNsYXNzIFQyLCBjbGFzcyBNMj4KaW5saW5lIFRlbnNvcjxUMSwgVG5kPE4+ID4mIG9wZXJhdG9y IC09ICggVGVuc29yPFQxLCBUbmQ8Tj4gPiAmIGEsIGNvbnN0IFRlbnNvcjxUMiwgTTI+JiBiICkK ewogICAgcmV0dXJuIHRhc3NpZ25fb3A8eG1pbnVzPFQxLCBUMj4gPiggYSwgYiApOwp9Cgp0ZW1w bGF0ZTxjbGFzcyBUMSwgaW50IE4sIGNsYXNzIFQyLCBjbGFzcyBNMj4KaW5saW5lIFRlbnNvcjxU MSwgVG5kPE4+ID4mIG9wZXJhdG9yIC89ICggVGVuc29yPFQxLCBUbmQ8Tj4gPiAmIGEsIGNvbnN0 IFRlbnNvcjxUMiwgTTI+JiBiICkKewogICAgcmV0dXJuIHRhc3NpZ25fb3A8eGRpdmlkZXM8VDEs IFQyPiA+KCBhLCBiICk7Cn0KCgoKCmNsYXNzIFNjYWxhclRlbnNvcnt9OwoKCgp0ZW1wbGF0ZTxj bGFzcyBUPgpjbGFzcyBUZW5zb3I8VCwgU2NhbGFyVGVuc29yPiA6IHB1YmxpYyBUWmVyb1NpemVC YXNlCnsKcHVibGljOgogICAgc3RhdGljIGNvbnN0IGJvb2wgbGluZWFyPXRydWU7CiAgICBleHBs aWNpdCBUZW5zb3IoIGNvbnN0IFQmIGEgKSA6IHRfKGEpe307CiAgICBUIG9wZXJhdG9yW10oIGlu dCApIGNvbnN0IHsgcmV0dXJuIHRfOyB9CiAgICBUIG9wZXJhdG9yKCkoIGludCwgaW50ICkgY29u c3QgeyByZXR1cm4gdF87IH0KICAgIFQgb3BlcmF0b3IoKSggaW50LCBpbnQsIGludCApIGNvbnN0 IHsgcmV0dXJuIHRfOyB9CiAgICBUIG9wZXJhdG9yKCkoIGludCwgaW50LCBpbnQsIGludCApIGNv bnN0IHsgcmV0dXJuIHRfOyB9CiAgICBUIHVnZXQoIGludCApIGNvbnN0IHsgcmV0dXJuIHRfOyB9 CiAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIC0xOyB9CnByaXZhdGU6CiAgICBjb25zdCBU IHRfOwp9OwoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lIFRlbnNvcjxULCBTY2FsYXJUZW5z b3I+CnNjYWxhciggY29uc3QgVCYgdCApCnsKICAgIHJldHVybiBUZW5zb3I8VCwgU2NhbGFyVGVu c29yPiggdCApOwp9CgoKCgoKCgppbmxpbmUgaW50IHRlbnNvcl9tYXh0ZXN0KCBpbnQgYSwgaW50 IGIgKQp7CiAgICAoKHZvaWQpMCk7CiAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKfQoKCgoKCnRl bXBsYXRlIDxjbGFzcyBTPgpzdHJ1Y3QgVFJlZlR5cGUKewogICAgdHlwZWRlZiBjb25zdCBTIHQ7 Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgaW50IE4+CnN0cnVjdCBUUmVmVHlwZTxUZW5zb3I8VCwg VG5kPE4+ID4gPgp7CiAgICB0eXBlZGVmIGNvbnN0IFRlbnNvcjxULCBUbmQ8Tj4gPiYgdDsKfTsK IyAxMTc3ICJ4Mi5jYyIKdGVtcGxhdGU8Y2xhc3MgUzEsIGNsYXNzIFMyLCBjbGFzcyBPUD4KY2xh c3MgVEJpbk9wOwoKCgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFMxLCBjbGFzcyBTMiwg Y2xhc3MgT1A+CmNsYXNzIFRlbnNvcjxULCBUQmluT3A8T1AsUzEsIFMyPiA+IDogcHVibGljIFRa ZXJvU2l6ZUJhc2UKewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IHJhbms9IFMxOjpyYW5r ID4gUzI6OnJhbmsgPyBTMTo6cmFuayA6IFMyOjpyYW5rOwogICAgc3RhdGljIGNvbnN0IGJvb2wg bGluZWFyPVMxOjpsaW5lYXIgJiYgUzI6OmxpbmVhcjsKICAgIFRlbnNvciggY29uc3QgUzEmIGEs IGNvbnN0IFMyJiBiLCBjb25zdCBPUCYgb3A9T1AoKSApIDogYV8oYSksIGJfKGIpLCBvcF8ob3Ap e30KICAgIFQgb3BlcmF0b3JbXSggaW50IGkgKSBjb25zdCB7IHJldHVybiBvcF8oIGFfW2ldLCBi X1tpXSApOyB9CiAgICBUIG9wZXJhdG9yKCkoIGludCBpLCBpbnQgaiApIGNvbnN0IHsgcmV0dXJu IG9wXyggYV8oaSxqKSwgYl8oaSxqKSApOyB9CiAgICBUIG9wZXJhdG9yKCkoIGludCBpLCBpbnQg aiwgaW50IGsgKSBjb25zdCB7IHJldHVybiBvcF8oIGFfKGksaixrKSwgYl8oaSxqLGspICk7IH0K ICAgIFQgb3BlcmF0b3IoKSggaW50IGksIGludCBqLCBpbnQgaywgaW50IGwgKSBjb25zdCB7IHJl dHVybiBvcF8oIGFfKGksaixrLGwpLCBiXyhpLGosayxsKSApOyB9CiAgICBUIHVnZXQoIGludCBp ICkgY29uc3QgeyByZXR1cm4gb3BfKCBhXy51Z2V0KGkpLCBiXy51Z2V0KGkpICk7IH0KICAgIGlu dCBzaXplKCkgY29uc3QgeyByZXR1cm4gdGVuc29yX21heHRlc3QoIGFfLnNpemUoKSwgYl8uc2l6 ZSgpICk7IH0KICAgIGludCBkaW0xKCkgY29uc3QgeyByZXR1cm4gdGVuc29yX21heHRlc3QoIGFf LmRpbTEoKSwgYl8uZGltMSgpICk7IH0KICAgIGludCBkaW0yKCkgY29uc3QgeyByZXR1cm4gdGVu c29yX21heHRlc3QoIGFfLmRpbTIoKSwgYl8uZGltMigpICk7IH0KICAgIGludCBkaW0zKCkgY29u c3QgeyByZXR1cm4gdGVuc29yX21heHRlc3QoIGFfLmRpbTMoKSwgYl8uZGltMygpICk7IH0KICAg IGludCBkaW00KCkgY29uc3QgeyByZXR1cm4gdGVuc29yX21heHRlc3QoIGFfLmRpbTQoKSwgYl8u ZGltNCgpICk7IH0KcHJpdmF0ZToKICAgIHR5cGVuYW1lIFRSZWZUeXBlPFMxPjo6dCBhXzsKICAg IHR5cGVuYW1lIFRSZWZUeXBlPFMyPjo6dCBiXzsKICAgIGNvbnN0IE9QIG9wXzsKfTsKIyAxMjQz ICJ4Mi5jYyIKdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIE0xLCBjbGFzcyBUMiwgY2xhc3MgTTI+ IGlubGluZSBUZW5zb3I8dHlwZW5hbWUgeHBsdXM8VDEsIFQyPjo6dCwgVEJpbk9wPCB4cGx1czxU MSwgVDI+LCBUZW5zb3I8VDEsIE0xPiwgVGVuc29yPFQyLCBNMj4gPiA+IG9wZXJhdG9yKyAoIGNv bnN0IFRlbnNvcjxUMSwgTTE+JiBhLCBjb25zdCBUZW5zb3I8VDIsIE0yPiYgYiApIHsgcmV0dXJu IFRlbnNvcjx0eXBlbmFtZSB4cGx1czxUMSwgVDI+OjpyZXN1bHRfdHlwZSwgVEJpbk9wPCB4cGx1 czxUMSwgVDI+LCBUZW5zb3I8VDEsIE0xPiwgVGVuc29yPFQyLCBNMj4gPiA+ICggYSwgYiwgeHBs dXM8VDEsVDI+KCkgKTsgfSB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBNPiBpbmxpbmUgVGVuc29y PHR5cGVuYW1lIHhwbHVzPFQsIFQ+OjpyZXN1bHRfdHlwZSwgVEJpbk9wPCB4cGx1czxULFQ+LCBU ZW5zb3I8VCwgTT4sIFRlbnNvcjxULCBNPiA+ID4gb3BlcmF0b3IrICggY29uc3QgVGVuc29yPFQs IE0+JiBhLCBjb25zdCBUZW5zb3I8VCwgTT4mIGIgKSB7IHJldHVybiBUZW5zb3I8dHlwZW5hbWUg eHBsdXM8VCwgVD46OnJlc3VsdF90eXBlLCBUQmluT3A8IHhwbHVzPFQsVD4sIFRlbnNvcjxULCBN PiwgVGVuc29yPFQsIE0+ID4gPiAoIGEsIGIsIHhwbHVzPFQsVD4oKSApOyB9IHRlbXBsYXRlPGNs YXNzIFQsIGNsYXNzIE0+IGlubGluZSBUZW5zb3I8IHR5cGVuYW1lIHhwbHVzPFQsIFQ+OjpyZXN1 bHRfdHlwZSwgVEJpbk9wPCB4cGx1czxULFQ+LCBUZW5zb3I8VCxNPiwgVGVuc29yPFQsIFNjYWxh clRlbnNvcj4gPiA+IG9wZXJhdG9yKyAoIGNvbnN0IFRlbnNvcjxULE0+JiBhLCBjb25zdCBUJiBi ICkgeyByZXR1cm4gVGVuc29yPCB0eXBlbmFtZSB4cGx1czxULCBUPjo6cmVzdWx0X3R5cGUsIFRC aW5PcDwgeHBsdXM8VCxUPiwgVGVuc29yPFQsTT4sIFRlbnNvcjxULCBTY2FsYXJUZW5zb3I+ID4g PiAoIGEsIFRlbnNvcjxULCBTY2FsYXJUZW5zb3I+KCBiICksIHhwbHVzPFQsVD4oKSApOyB9IHRl bXBsYXRlPGNsYXNzIFQsIGNsYXNzIE0+IGlubGluZSBUZW5zb3I8IHR5cGVuYW1lIHhwbHVzPFQs IFQ+OjpyZXN1bHRfdHlwZSwgVEJpbk9wPCB4cGx1czxULFQ+LCBUZW5zb3I8VCwgU2NhbGFyVGVu c29yPiwgVGVuc29yPFQsTT4gPiA+IG9wZXJhdG9yKyAoIGNvbnN0IFQmIGIsIGNvbnN0IFRlbnNv cjxULE0+JiBhICkgeyByZXR1cm4gVGVuc29yPCBULCBUQmluT3A8IHhwbHVzPFQsVD4sIFRlbnNv cjxULCBTY2FsYXJUZW5zb3I+LCBUZW5zb3I8VCxNPiA+ID4gKCBUZW5zb3I8VCwgU2NhbGFyVGVu c29yPiggYiApLCBhLCB4cGx1czxULFQ+KCkgKTsgfQp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3Mg TTEsIGNsYXNzIFQyLCBjbGFzcyBNMj4gaW5saW5lIFRlbnNvcjx0eXBlbmFtZSB4bXVsdGlwbGll czxUMSwgVDI+Ojp0LCBUQmluT3A8IHhtdWx0aXBsaWVzPFQxLCBUMj4sIFRlbnNvcjxUMSwgTTE+ LCBUZW5zb3I8VDIsIE0yPiA+ID4gb3BlcmF0b3IqICggY29uc3QgVGVuc29yPFQxLCBNMT4mIGEs IGNvbnN0IFRlbnNvcjxUMiwgTTI+JiBiICkgeyByZXR1cm4gVGVuc29yPHR5cGVuYW1lIHhtdWx0 aXBsaWVzPFQxLCBUMj46OnJlc3VsdF90eXBlLCBUQmluT3A8IHhtdWx0aXBsaWVzPFQxLCBUMj4s IFRlbnNvcjxUMSwgTTE+LCBUZW5zb3I8VDIsIE0yPiA+ID4gKCBhLCBiLCB4bXVsdGlwbGllczxU MSxUMj4oKSApOyB9IHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIE0+IGlubGluZSBUZW5zb3I8dHlw ZW5hbWUgeG11bHRpcGxpZXM8VCwgVD46OnJlc3VsdF90eXBlLCBUQmluT3A8IHhtdWx0aXBsaWVz PFQsVD4sIFRlbnNvcjxULCBNPiwgVGVuc29yPFQsIE0+ID4gPiBvcGVyYXRvciogKCBjb25zdCBU ZW5zb3I8VCwgTT4mIGEsIGNvbnN0IFRlbnNvcjxULCBNPiYgYiApIHsgcmV0dXJuIFRlbnNvcjx0 eXBlbmFtZSB4bXVsdGlwbGllczxULCBUPjo6cmVzdWx0X3R5cGUsIFRCaW5PcDwgeG11bHRpcGxp ZXM8VCxUPiwgVGVuc29yPFQsIE0+LCBUZW5zb3I8VCwgTT4gPiA+ICggYSwgYiwgeG11bHRpcGxp ZXM8VCxUPigpICk7IH0gdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgTT4gaW5saW5lIFRlbnNvcjwg dHlwZW5hbWUgeG11bHRpcGxpZXM8VCwgVD46OnJlc3VsdF90eXBlLCBUQmluT3A8IHhtdWx0aXBs aWVzPFQsVD4sIFRlbnNvcjxULE0+LCBUZW5zb3I8VCwgU2NhbGFyVGVuc29yPiA+ID4gb3BlcmF0 b3IqICggY29uc3QgVGVuc29yPFQsTT4mIGEsIGNvbnN0IFQmIGIgKSB7IHJldHVybiBUZW5zb3I8 IHR5cGVuYW1lIHhtdWx0aXBsaWVzPFQsIFQ+OjpyZXN1bHRfdHlwZSwgVEJpbk9wPCB4bXVsdGlw bGllczxULFQ+LCBUZW5zb3I8VCxNPiwgVGVuc29yPFQsIFNjYWxhclRlbnNvcj4gPiA+ICggYSwg VGVuc29yPFQsIFNjYWxhclRlbnNvcj4oIGIgKSwgeG11bHRpcGxpZXM8VCxUPigpICk7IH0gdGVt cGxhdGU8Y2xhc3MgVCwgY2xhc3MgTT4gaW5saW5lIFRlbnNvcjwgdHlwZW5hbWUgeG11bHRpcGxp ZXM8VCwgVD46OnJlc3VsdF90eXBlLCBUQmluT3A8IHhtdWx0aXBsaWVzPFQsVD4sIFRlbnNvcjxU LCBTY2FsYXJUZW5zb3I+LCBUZW5zb3I8VCxNPiA+ID4gb3BlcmF0b3IqICggY29uc3QgVCYgYiwg Y29uc3QgVGVuc29yPFQsTT4mIGEgKSB7IHJldHVybiBUZW5zb3I8IFQsIFRCaW5PcDwgeG11bHRp cGxpZXM8VCxUPiwgVGVuc29yPFQsIFNjYWxhclRlbnNvcj4sIFRlbnNvcjxULE0+ID4gPiAoIFRl bnNvcjxULCBTY2FsYXJUZW5zb3I+KCBiICksIGEsIHhtdWx0aXBsaWVzPFQsVD4oKSApOyB9Cgp0 ZW1wbGF0ZTxjbGFzcyBPUCwgY2xhc3MgTT4KY2xhc3MgVFVuT3Age307CgoKdGVtcGxhdGUgPGNs YXNzIFQsIGNsYXNzIFMsIGNsYXNzIE9QPgpjbGFzcyBUZW5zb3I8VCwgVFVuT3A8T1AsIFMgPiA+ IDogcHVibGljIFRaZXJvU2l6ZUJhc2UKewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IHJh bms9Uzo6cmFuazsKICAgIHN0YXRpYyBjb25zdCBib29sIGxpbmVhciA9IFM6OmxpbmVhcjsKICAg IFRlbnNvciggY29uc3QgUyYgdCAsIGNvbnN0IE9QJiBvcCApIDogdF8odCksIG9wXyhvcCkge30K ICAgIFQgb3BlcmF0b3JbXSggaW50IGspIGNvbnN0IHsgcmV0dXJuIG9wXyh0X1trXSk7IH0KICAg IFQgb3BlcmF0b3IoKSggaW50IGssIGludCBsICkgY29uc3QgeyByZXR1cm4gb3BfKHRfKGssIGwp KTsgfQogICAgVCBvcGVyYXRvcigpKCBpbnQgaywgaW50IGwsIGludCBtICkgY29uc3QgeyByZXR1 cm4gb3BfKHRfKGssIGwsIG0pKTsgfQogICAgVCBvcGVyYXRvcigpKCBpbnQgaywgaW50IGwsIGlu dCBtLCBpbnQgbiApIGNvbnN0IHsgcmV0dXJuIG9wXyh0XyhrLCBsLCBtLCBuKSk7IH0KICAgIFQg dWdldCggaW50IGspIGNvbnN0IHsgcmV0dXJuIG9wXyh0Xy51Z2V0KGspKTsgfQogICAgaW50IGRp bTEoKSBjb25zdCB7IHJldHVybiB0Xy5kaW0xKCk7IH0KICAgIGludCBkaW0yKCkgY29uc3QgeyBy ZXR1cm4gdF8uZGltMigpOyB9CiAgICBpbnQgZGltMygpIGNvbnN0IHsgcmV0dXJuIHRfLmRpbTMo KTsgfQogICAgaW50IGRpbTQoKSBjb25zdCB7IHJldHVybiB0Xy5kaW00KCk7IH0KICAgIGludCBz aXplKCkgY29uc3QgeyByZXR1cm4gdF8uc2l6ZSgpOyB9CnByaXZhdGU6CiAgICB0eXBlbmFtZSBU UmVmVHlwZTxTPjo6dCB0XzsKICAgIGNvbnN0IE9QIG9wXzsKfTsKCgoKCgp0ZW1wbGF0ZTxjbGFz cyBURU5TLCBjbGFzcyBPUD4KY2xhc3MgVFJlZHVjdGlvbnt9OwoKCgoKCnRlbXBsYXRlPCBjbGFz cyBULCBjbGFzcyBURU5TLCBjbGFzcyBPUD4KY2xhc3MgVGVuc29yPFQsIFRSZWR1Y3Rpb248VEVO UyxPUD4gPiA6IHB1YmxpYyBUWmVyb1NpemVCYXNlCnsKcHVibGljOgogICAgc3RhdGljIGNvbnN0 IGludCByYW5rID0gVEVOUzo6cmFuay0xOwogICAgZXhwbGljaXQgVGVuc29yKCBjb25zdCBURU5T JiB0ICkgOiB0Xyh0KSwgZGltXzFfKCBtYXhkaW0oIHQgKS0xICkKICAgICAgICAgICAgICB7ICgo dm9pZCkwKTt9CiAgICBUIG9wZXJhdG9yW10oIGludCBrICkgY29uc3QKICAgIHsKICAgICAgICBS YW5rQ29tcGFyZTxyYW5rID09IDE+KCk7CiAgICAgICAgaWYoIGRpbV8xXyA8IDAgKSByZXR1cm4g VCgpOwogICAgICAgIFQgZCA9IHRfKCBrLCBkaW1fMV8gKTsKICAgICAgICBmb3IoIGludCBpPWRp bV8xXyAtIDEgOyBpPj0wOyAtLWkgKSBPUDo6YXNzX29wKCBkLCB0XyggaywgaSApICk7CiAgICAg ICAgcmV0dXJuIGQ7CiAgICB9CgogICAgVCBvcGVyYXRvcigpKCBpbnQgaywgaW50IGwgKSBjb25z dAogICAgewogICAgICAgIFJhbmtDb21wYXJlPHJhbmsgPT0gMj4oKTsKICAgICAgICBpZiggZGlt XzFfIDwgMCApIHJldHVybiBUKDApOwogICAgICAgIFQgZCA9IHRfKCBrLCBsLCBkaW1fMV8gKTsK ICAgICAgICBmb3IoIGludCBpPWRpbV8xXy0xOyBpPj0wOyAtLWkgKSBPUDo6YXNzX29wKCBkLCB0 XyggaywgbCwgaSApICk7CiAgICAgICAgcmV0dXJuIGQ7CiAgICB9CgogICAgVCBvcGVyYXRvcigp KCBpbnQgaywgaW50IGwsIGludCBtICkgY29uc3QKICAgIHsKICAgICAgICBSYW5rQ29tcGFyZSA8 IHJhbmsgPT0gMyA+KCk7CiAgICAgICAgaWYoIGRpbV8xXyA8IDAgKSByZXR1cm4gVCgwKTsKICAg ICAgICBUIGQgPSB0XyggaywgbCwgbSwgZGltXzFfICk7CiAgICAgICAgZm9yKCBpbnQgaT1kaW1f MV8gLSAxOyBpPj0wOyAtLWkgKSBPUDo6YXNzX29wKCBkLCB0XyggaywgbCwgbSwgaSApICk7CiAg ICAgICAgcmV0dXJuIGQ7CiAgICB9CgoKICAgIGludCBkaW0xKCkgY29uc3QgeyByZXR1cm4gdF8u ZGltMSgpOyB9CiAgICBpbnQgZGltMigpIGNvbnN0IHsgcmV0dXJuIHRfLmRpbTIoKTsgfQogICAg aW50IGRpbTMoKSBjb25zdCB7IHJldHVybiB0Xy5kaW0zKCk7IH0KcHJpdmF0ZToKICAgIHR5cGVu YW1lIFRSZWZUeXBlPFRFTlM+Ojp0IHRfOwogICAgY29uc3QgaW50IGRpbV8xXzsKfTsKCgoKCgoK CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIE0+ClRlbnNvcjxULCBUUmVkdWN0aW9uPFRlbnNvcjxU LCBNPiwgeHBsdXM8VCxUPiA+ID4KdHN1bSggY29uc3QgVGVuc29yPFQsIE0+JiB0ICkKewogICAg cmV0dXJuIFRlbnNvcjxULCBUUmVkdWN0aW9uPFRlbnNvcjxULCBNPiwgeHBsdXM8VCxUPiA+ID4o dCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIE0+ClRlbnNvcjxULCBUUmVkdWN0aW9uPFRl bnNvcjxULCBNPiwgeG11bHRpcGxpZXM8VCxUPiA+ID4KdHByb2R1Y3QoIGNvbnN0IFRlbnNvcjxU LCBNPiYgdCApCnsKICAgIHJldHVybiBUZW5zb3I8VCwgVFJlZHVjdGlvbjxUZW5zb3I8VCwgTT4s IHhtdWx0aXBsaWVzPFQsVD4gPiA+KHQpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBNPgpU ZW5zb3I8VCwgVFJlZHVjdGlvbjxUZW5zb3I8VCwgTT4sIHhfbWF4PFQsVD4gPiA+CnRtYXgoIGNv bnN0IFRlbnNvcjxULCBNPiYgdCApCnsKICAgIHJldHVybiBUZW5zb3I8VCwgVFJlZHVjdGlvbjxU ZW5zb3I8VCwgTT4sIHhfbWF4PFQsVD4gPiA+KHQpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFz cyBNPgpUZW5zb3I8VCwgVFJlZHVjdGlvbjxUZW5zb3I8VCwgTT4sIHhfbWluPFQsVD4gPiA+CnRt aW4oIGNvbnN0IFRlbnNvcjxULCBNPiYgdCApCnsKICAgIHJldHVybiBUZW5zb3I8VCwgVFJlZHVj dGlvbjxUZW5zb3I8VCwgTT4sIHhfbWluPFQsVD4gPiA+KHQpOwp9CgoKCnRlbXBsYXRlIDxjbGFz cyBURU5TPgpjbGFzcyBVbnJvbGxTdW0ge307Cgp0ZW1wbGF0ZTwgY2xhc3MgVCwgY2xhc3MgVEVO Uz4KY2xhc3MgVGVuc29yPFQsIFVucm9sbFN1bTxURU5TPiA+IDogcHVibGljIFRaZXJvU2l6ZUJh c2UKewpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IHJhbmsgPSBURU5TOjpyYW5rLTE7CiAg ICBleHBsaWNpdCBUZW5zb3IoIGNvbnN0IFRFTlMmIHQgKSA6IHRfKHQpLCBkaW1fMV8oIG1heGRp bSggdCApLTEgKQogICAgICAgICAgICAgIHsgKCh2b2lkKTApO30KICAgIFQgb3BlcmF0b3JbXSgg aW50IGsgKSBjb25zdAogICAgewoKICAgICAgICBSYW5rQ29tcGFyZTxyYW5rID09IDE+KCk7CiAg ICAgICAgVCBkID0gdF8oIGssIDAgKTsKICAgICAgICBzd2l0Y2goICh1bnNpZ25lZCkgZGltXzFf ICl7CiAgICAgICAgY2FzZSA0OiBkICs9IHRfKCBrLCA0ICk7CiAgICAgICAgY2FzZSAzOiBkICs9 IHRfKCBrLCAzICk7CiAgICAgICAgY2FzZSAyOiBkICs9IHRfKCBrLCAyICk7CiAgICAgICAgY2Fz ZSAxOiBkICs9IHRfKCBrLCAxICk7CiAgICAgICAgY2FzZSAwOiByZXR1cm4gZDsKICAgICAgICB9 CiAgICAgICAgYWJvcnQoKTsKCiAgICAgICAgZm9yKCBpbnQgaT1kaW1fMV8gOyBpPjA7IC0taSAp IGQgKz0gdF8oIGssIGkgKTsKICAgICAgICByZXR1cm4gZDsKICAgIH0KCiAgICBUIG9wZXJhdG9y KCkoIGludCBrLCBpbnQgbCApIGNvbnN0CiAgICB7CgogICAgICAgIFJhbmtDb21wYXJlPHJhbmsg PT0gMj4oKTsKICAgICAgICBUIGQgPSB0XyggaywgbCwgMCApOwogICAgICAgIHN3aXRjaCggKHVu c2lnbmVkKWRpbV8xXyApewogICAgICAgIGNhc2UgNDogZCArPSB0XyggaywgbCwgNCApOwogICAg ICAgIGNhc2UgMzogZCArPSB0XyggaywgbCwgMyApOwogICAgICAgIGNhc2UgMjogZCArPSB0Xygg aywgbCwgMiApOwogICAgICAgIGNhc2UgMTogZCArPSB0XyggaywgbCwgMSApOwogICAgICAgIGNh c2UgMDogcmV0dXJuIGQ7CiAgICAgICAgfQogICAgICAgIGFib3J0KCk7CiAgICAgICAgZm9yKCBp bnQgaT1kaW1fMV8gOyBpPjA7IC0taSApIGQgKz0gdF8oIGssIGwsIGkgKTsKICAgICAgICByZXR1 cm4gZDsKICAgIH0KCiAgICBUIG9wZXJhdG9yKCkoIGludCBrLCBpbnQgbCwgaW50IG0gKSBjb25z dAogICAgewoKICAgICAgICBSYW5rQ29tcGFyZTxyYW5rID09IDM+KCk7CiAgICAgICAgVCBkID0g dF8oIGssIGwsIG0sIDAgKTsKICAgICAgICBzd2l0Y2goICh1bnNpZ25lZClkaW1fMV8gKXsKICAg ICAgICBjYXNlIDQ6IGQgKz0gdF8oIGssIGwsIG0sIDQgKTsKICAgICAgICBjYXNlIDM6IGQgKz0g dF8oIGssIGwsIG0sIDMgKTsKICAgICAgICBjYXNlIDI6IGQgKz0gdF8oIGssIGwsIG0sIDIgKTsK ICAgICAgICBjYXNlIDE6IGQgKz0gdF8oIGssIGwsIG0sIDEgKTsKICAgICAgICBjYXNlIDA6IHJl dHVybiBkOwogICAgICAgIH0KICAgICAgICBhYm9ydCgpOwoKICAgICAgICBmb3IoIGludCBpPWRp bV8xXyA7IGk+MDsgLS1pICkgZCArPSB0XyggaywgbCwgbSwgaSApOwogICAgICAgIHJldHVybiBk OwogICAgfQoKCiAgICBpbnQgZGltMSgpIGNvbnN0IHsgcmV0dXJuIHRfLmRpbTEoKTsgfQogICAg aW50IGRpbTIoKSBjb25zdCB7IHJldHVybiB0Xy5kaW0yKCk7IH0KICAgIGludCBkaW0zKCkgY29u c3QgeyByZXR1cm4gdF8uZGltMygpOyB9CnByaXZhdGU6CiAgICB0eXBlbmFtZSBUUmVmVHlwZTxU RU5TPjo6dCB0XzsKICAgIGNvbnN0IGludCBkaW1fMV87Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBULCBj bGFzcyBNPgpUZW5zb3I8VCwgVW5yb2xsU3VtPFRlbnNvcjxULCBNPiA+ID4KdW5yb2xsX3RzdW0o IGNvbnN0IFRlbnNvcjxULCBNPiYgdCApCnsKICAgIHJldHVybiBUZW5zb3I8VCwgVW5yb2xsU3Vt PFRlbnNvcjxULCBNPiA+ID4odCk7Cn0KIyAxNDUwICJ4Mi5jYyIKdGVtcGxhdGU8Y2xhc3MgVD4K c3RydWN0IFByb2RBdXg7Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBQcm9kQXV4IDxpbnQ+IHsKICAgIHR5 cGVkZWYgaW50IHQ7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgTT4Kc3RydWN0IFByb2RBdXggPFRlbnNv cjxpbnQsIE0+ID4KewogICAgdHlwZWRlZiBUZW5zb3I8aW50LCBUQmluT3AgPCB4bXVsdGlwbGll czxpbnQsIGludD4sIFRlbnNvcjxpbnQsIE0+LCBUZW5zb3I8aW50LCBTY2FsYXJUZW5zb3I+ID4g PiB0Owp9OwoKdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPiBzdHJ1Y3QgU3VtQXV4OwoKdGVt cGxhdGU8PgpzdHJ1Y3QgU3VtQXV4PGludCwgaW50Pgp7CiAgICAgdHlwZWRlZiBpbnQgdDsKfTsK CnRlbXBsYXRlPGNsYXNzIE0+CnN0cnVjdCBTdW1BdXg8aW50LCBUZW5zb3I8aW50LCBNPiA+CnsK ICAgIHR5cGVkZWYgVGVuc29yPCBpbnQsIFRCaW5PcDwgeHBsdXM8aW50LCBpbnQ+LCBUZW5zb3I8 IGludCwgU2NhbGFyVGVuc29yPiwgVGVuc29yPGludCwgTT4gPiA+IHQ7Cn07Cgp0ZW1wbGF0ZTxj bGFzcyBNPgpzdHJ1Y3QgU3VtQXV4PFRlbnNvcjxpbnQsIE0+LCBpbnQgPgp7CiAgICB0eXBlZGVm IFRlbnNvcjwgaW50LCBUQmluT3A8IHhwbHVzPGludCwgaW50PiwgVGVuc29yPCBpbnQsIE0+LCBU ZW5zb3I8aW50LCBTY2FsYXJUZW5zb3I+ID4gPiB0Owp9OwoKdGVtcGxhdGU8Y2xhc3MgTTEsIGNs YXNzIE0yPgpzdHJ1Y3QgU3VtQXV4PFRlbnNvcjxpbnQsIE0xPiwgVGVuc29yPGludCwgTTI+ID4K ewogICAgdHlwZWRlZiBUZW5zb3I8IGludCwgVEJpbk9wPCB4cGx1czxpbnQsIGludD4sIFRlbnNv cjwgaW50LCBNMT4sIFRlbnNvcjxpbnQsIE0yPiA+ID4gdDsKfTsKCnRlbXBsYXRlPGNsYXNzIFgx LCBjbGFzcyBYMj4Kc3RydWN0IEluZGV4VHlwZTIgewogICAgdHlwZWRlZiB0eXBlbmFtZSBTdW1B dXg8IFgxLCB0eXBlbmFtZSBQcm9kQXV4PFgyPjo6dCA+Ojp0IHQ7Cn07Cgp0ZW1wbGF0ZTxjbGFz cyBYMSwgY2xhc3MgWDIsIGNsYXNzIFgzPgpzdHJ1Y3QgSW5kZXhUeXBlMyB7CiAgICB0eXBlZGVm IHR5cGVuYW1lIFN1bUF1eDwgdHlwZW5hbWUgSW5kZXhUeXBlMjxYMSwgWDI+Ojp0LCB0eXBlbmFt ZSBQcm9kQXV4PFgzPjo6dCA+Ojp0IHQ7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFgy LCBjbGFzcyBYMywgY2xhc3MgWDQ+CnN0cnVjdCBJbmRleFR5cGU0IHsKICAgIHR5cGVkZWYgdHlw ZW5hbWUgU3VtQXV4PCB0eXBlbmFtZSBJbmRleFR5cGUzPFgxLCBYMiwgWDM+Ojp0LCB0eXBlbmFt ZSBQcm9kQXV4PFg0Pjo6dCA+Ojp0IHQ7Cn07CgoKCnR5cGVkZWYgVGVuc29yPGRvdWJsZSwgVDFk PiBEVmVjdG9yOwp0eXBlZGVmIFRlbnNvcjxEVmVjdG9yLCBUMWQ+IEREVmVjdG9yOwp0eXBlZGVm IFRlbnNvcjxERFZlY3RvciwgVDFkPiBERERWZWN0b3I7CnR5cGVkZWYgVGVuc29yPGludCwgVDFk PiBJVmVjdG9yOwp0eXBlZGVmIFRlbnNvcjxJVmVjdG9yLCBUMWQ+IElJVmVjdG9yOwp0eXBlZGVm IFRlbnNvcjxpbnQsIFQyZD4gSU1hdHJpeDsKdHlwZWRlZiBUZW5zb3I8c2hvcnQsIFQxZD4gU1Zl Y3RvcjsKdHlwZWRlZiBUZW5zb3I8ZG91YmxlLCBUMmQ+IERNYXRyaXg7CnR5cGVkZWYgVGVuc29y PERNYXRyaXgsIFQyZD4gRERNYXRyaXg7CnR5cGVkZWYgVGVuc29yPGRvdWJsZSwgVDNkPiBEQ3Vi aWM7CnR5cGVkZWYgVGVuc29yPGRvdWJsZSwgVDRkPiBEUXVhZDsKCgpjbGFzcyBCcmVudCB7CnB1 YmxpYzoKICAgIEJyZW50KCk7CiAgICB2b2lkIHNldF90b2woIGRvdWJsZSB4ICl7IHRvbCA9IHg7 IH0KICAgIHZvaWQgc2V0X2VwcyggZG91YmxlIHggKXsgZXBzID0geDsgfQogICAgdm9pZCBzZXRf bWF4X2l0ZXIoIGludCB4ICl7IG1heF9pdGVyID0geDsgfQogICAgdmlydHVhbCBkb3VibGUgZigg ZG91YmxlICkgPSAwOwogICAgdm9pZCBydW4oKTsKICAgIHZvaWQgaW5pdCggZG91YmxlIGEwLCBk b3VibGUgeDAsIGRvdWJsZSBiMCwgZG91YmxlIGZhMCwgZG91YmxlIGZ4MCwgZG91YmxlIGZiMCAp OwogICAgdm9pZCBpbml0KCBkb3VibGUgYTAsIGRvdWJsZSB4MCwgZG91YmxlIGIwICk7CiAgICBk b3VibGUgZ2V0X3htaW4oKSBjb25zdCB7IHJldHVybiB4bWluOyB9CiAgICBkb3VibGUgZ2V0X2Z4 bWluKCkgY29uc3QgeyByZXR1cm4gZnhtaW47IH0KICAgIGludCBnZXRfaXRlcigpIGNvbnN0eyBy ZXR1cm4gaXRlcjsgfQogICAgdm9pZCBuZXh0X21vdmUoIGRvdWJsZSBmdSApOwogICAgdm9pZCBu ZXh0X3BvcygpOwogICAgYm9vbCBjaGVjaygpIGNvbnN0OwogICAgdmlydHVhbCB+QnJlbnQoKTsK cHJpdmF0ZToKICAgIGRvdWJsZSBhLCBiLCB3LCB2LCBmdywgZnYsIGUsIHgsIGZ4LCB4bWluLCBm eG1pbiwgZCwgdTsKICAgIGludCBpdGVyOwogICAgaW50IG1heF9pdGVyOwogICAgZG91YmxlIHRv bDsKICAgIGRvdWJsZSBlcHM7Cn07CgpjbGFzcyBQb2ludCB7CnB1YmxpYzoKICAgIGRvdWJsZSB4 LCB5LCB6OwogICAgUG9pbnQoIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMgKSA6IHgoYSks IHkoYiksIHooYyl7fQogICAgUG9pbnQoKSA6IHgoMCksIHkoMCksIHooMCl7fQogICAgUG9pbnQm IG9wZXJhdG9yKz0oIGNvbnN0IFBvaW50JiBhICl7IHgrPWEueDsgeSs9YS55OyB6Kz1hLno7IHJl dHVybiAqdGhpczsgfQogICAgUG9pbnQmIG9wZXJhdG9yLT0oIGNvbnN0IFBvaW50JiBhICl7IHgt PWEueDsgeS09YS55OyB6LT1hLno7IHJldHVybiAqdGhpczsgfQogICAgUG9pbnQmIG9wZXJhdG9y Kj0oIGNvbnN0IGRvdWJsZSYgYSApeyB4Kj1hOyB5Kj1hOyB6Kj1hOyByZXR1cm4gKnRoaXM7IH0K ICAgIFBvaW50JiBvcGVyYXRvci89KCBjb25zdCBkb3VibGUmIGEgKXsgeC89YTsgeS89YTsgei89 YTsgcmV0dXJuICp0aGlzOyB9CgogICAgYm9vbCBpc3plcm8oKSBjb25zdCB7IHJldHVybiB4PT0w ICYmIHk9PTAgJiYgej09MDsgfQoKICAgIH5Qb2ludCgpe30KfTsKCgoKaW5saW5lIGRvdWJsZSBx bm9ybSggY29uc3QgUG9pbnQmIGEgKXsgcmV0dXJuIGEueCphLngrYS55KmEueSthLnoqYS56OyB9 CgpjbGFzcyBCcmVudDIgOiBwdWJsaWMgQnJlbnQKewpwdWJsaWM6CiAgICBkb3VibGUgaW5pdCgg ZG91YmxlIGEwLCBkb3VibGUgYjAsIGRvdWJsZSBmYTAsIGRvdWJsZSBmYjAgKTsKfTsKCnN0cnVj dCBEZW5zOwpzdHJ1Y3QgS1NCYXNlOwpzdHJ1Y3QgS1M7CnN0cnVjdCBDS1M7CnN0cnVjdCBFbmVy Z3k7CgpjbGFzcyB0d29jZW47CmNsYXNzIEhhbWlsOwpjbGFzcyBDSGFtaWw7CmNsYXNzIEF0b21U eXBlOwpjbGFzcyBBdG9tOwpjbGFzcyBYTWF0cml4OwpjbGFzcyBPZGVCYXNlOwpjbGFzcyBNb2xl Y3VsZTsKY2xhc3MgTWF0cmljZXM7Cgp0eXBlZGVmIFRlbnNvcjxEVmVjdG9yLCBUMWQ+IEJhc2lz Owp0eXBlZGVmIFRlbnNvcjxQb2ludCwgVDFkPiBQVmVjdG9yOwp0eXBlZGVmIFRlbnNvcjxQb2lu dCwgVDJkPiBQTWF0cml4Owp0eXBlZGVmIFRlbnNvcjwgY29uc3QgQXRvbVR5cGUqLCBUMWQ+IEFU VmVjdG9yOwp0eXBlZGVmIFRlbnNvcjxBdG9tLCBUMWQ+IEFWZWN0b3I7CnR5cGVkZWYgVGVuc29y PGJvb2wsIFQxZD4gQlZlY3RvcjsKdHlwZWRlZiBUZW5zb3I8RE1hdHJpeCwgVDFkPiBUcmFmbzsK CmNsYXNzIE51bWVyaWMgewpwdWJsaWM6CiAgICB2b2lkIGluaXQoIGNvbnN0IEFUVmVjdG9yJiBh diwgaW50IHJzLCBjb25zdCBQVmVjdG9yJiBwb3MsIGNvbnN0IE1hdHJpY2VzJiBtYXQgKTsKICAg IERWZWN0b3IgcmhvMm51bSggY29uc3QgRFZlY3RvciYgcmhvICkgY29uc3Q7CiAgICBEVmVjdG9y IG51bTJ2KCBjb25zdCBEVmVjdG9yJiBudW0gKSBjb25zdDsKICAgIERWZWN0b3IgbnVtMnYwKCBj b25zdCBEVmVjdG9yJiBudW0gKSBjb25zdDsKICAgIERWZWN0b3IgYXBwbHlfeCggY29uc3QgRFZl Y3RvciYgcmhvICkgY29uc3Q7CiAgICBEVmVjdG9yIGFwcGx5X3hpKCBjb25zdCBEVmVjdG9yJiBy aG8gKSBjb25zdDsKICAgIGRvdWJsZSBub3JtKCBjb25zdCBEVmVjdG9yJiB2ICkgY29uc3Q7CiAg ICBib29sIGlzKCkgY29uc3QgeyByZXR1cm4gcG1fLmRpbTIoKSAhPSAwOyB9CiAgICB1bnNpZ25l ZCBsb25nIG1lbW9yeSgpIGNvbnN0Owpwcml2YXRlOgogICAgdm9pZCBjYWxjX2Jhc2lzX3ZhbHVl cyggY29uc3QgQVRWZWN0b3ImIGF2LCBjb25zdCBQVmVjdG9yJiBwLCBpbnQgcnMsIGNvbnN0IFBW ZWN0b3ImIHBvcyApOwpwcml2YXRlOgogICAgRE1hdHJpeCB4XzsKICAgIERNYXRyaXggeGdfOwog ICAgRE1hdHJpeCBwbV87CiAgICBUZW5zb3I8UG9pbnQsIFQyZD4gcGdfOwogICAgRFZlY3RvciB3 XzsKICAgIERNYXRyaXggd21fOwp9OwoKc3RydWN0IFhNYXRyaXg7CgpzdHJ1Y3QgTWF0cmljZXMg ewpwdWJsaWM6CiAgICBmcmllbmQgdm9pZCBmaW5pc2hfbWF0cmljZXMoIE1hdHJpY2VzJiBtICk7 CiAgICBjb25zdCBETWF0cml4JiBnZXRzaSgpIGNvbnN0OwoKICAgIE1hdHJpY2VzKCk7CgogICAg Ym9vbCBpc19hdG9taWM7CgogICAgY29uc3QgWE1hdHJpeCogeG1hdDsKICAgIFBWZWN0b3IgcDsK ICAgIE51bWVyaWMgbnVtZXJpYzsKCgogICAgRE1hdHJpeCBTOwogICAgRE1hdHJpeCBUOwogICAg RE1hdHJpeCBXOwogICAgRE1hdHJpeCBHOwogICAgRE1hdHJpeCBGUzsKICAgIERNYXRyaXggRlQ7 CiAgICBEQ3ViaWMgQjsKICAgIERDdWJpYyBMOwogICAgRE1hdHJpeCBsbWF0OwogICAgRE1hdHJp eCBkRTsKCgogICAgREN1YmljIFU7CiAgICBEQ3ViaWMgVjsKICAgIERNYXRyaXggVnQ7CiAgICBE Q3ViaWMgWTsKCiAgICBEQ3ViaWMgWjsKCgpwcml2YXRlOgoKCiAgICBtdXRhYmxlIERNYXRyaXgg U2k7CnB1YmxpYzoKICAgIERNYXRyaXggdmV4dDsKCgogICAgZG91YmxlIGVjbGFzOwoKICAgIERW ZWN0b3IgcmhvY29yZTsKCgogICAgRFZlY3RvciByaG9ub3JtOwoKCiAgICBJVmVjdG9yIHBpOwoK CgogICAgSVZlY3RvciBmcGk7CiAgICBJVmVjdG9yIHJpOwoKCgogICAgaW50IHBoaXNpemU7CiAg ICBpbnQgZnVsbHNpemU7CiAgICBpbnQgcmhvc2l6ZTsKCiAgICB1bnNpZ25lZCBsb25nIG1lbW9y eSgpIGNvbnN0Owp9OwoKZXh0ZXJuIERWZWN0b3IgdnZubjsKZXh0ZXJuIE1hdHJpY2VzIG1vbG9t YXQ7Cgp2b2lkIGNvbXBhcmVfbWF0cmljZXMoIGNvbnN0IE1hdHJpY2VzJiBhLCBjb25zdCBNYXRy aWNlcyYgYiApOwoKCkRNYXRyaXggeHl6X3JvdGF0b3IoIGNvbnN0IFBvaW50JiBwICk7ClBvaW50 IHRvcG9pbnQoIGNvbnN0IERWZWN0b3ImIHYgKTsKRE1hdHJpeCBtYWtlX21hdHJpeCggY29uc3Qg RERNYXRyaXgmIGRkICk7CnZvaWQgbWFrZV9tYXRyaXgoIERNYXRyaXgmIG0sIGNvbnN0IERETWF0 cml4JiBkZCApOwoKRFZlY3RvciBsaW5zeXMoIERNYXRyaXggbGhzLCBEVmVjdG9yIHJocyApOwpE TWF0cml4IGxpbnN5cyggRE1hdHJpeCBsaHMsIERNYXRyaXggcmhzICk7CkRDdWJpYyBsaW5zeXMo IERNYXRyaXggbGhzLCBEQ3ViaWMgcmhzICk7CkRWZWN0b3IgbGluc3lzMiggRE1hdHJpeCBsaHMs IERWZWN0b3IgcmhzLCBkb3VibGUgcHJlYyApOwpETWF0cml4IGxpbnN5czIoIERNYXRyaXggbGhz LCBETWF0cml4IHJocywgZG91YmxlIHByZWMgKTsKREN1YmljIGxpbnN5czIoIERNYXRyaXggbGhz LCBEQ3ViaWMgcmhzLCBkb3VibGUgcHJlYyApOwoKCkRWZWN0b3IgbGxzKCBjb25zdCBETWF0cml4 JiBhLCBjb25zdCBEVmVjdG9yJiBiICk7CkRWZWN0b3IgZWlnZW52ZWN0b3JzKCBETWF0cml4JiBh ICk7CkRWZWN0b3IgZWlnZW52ZWN0b3JzKCBjb25zdCBETWF0cml4JiBhLCBETWF0cml4IGIsIERN YXRyaXgmIGV2ICk7CnZvaWQgaW5zZXJ0KCBEVmVjdG9yJiBhLCBpbnQgeCwgY29uc3QgRFZlY3Rv ciYgYiApOwp2b2lkIGluc2VydCggRE1hdHJpeCYgYSwgaW50IHgsIGludCB5LCBjb25zdCBETWF0 cml4JiBiICk7CnZvaWQgaW5zZXJ0KCBEQ3ViaWMmIGEsIGludCB4LCBpbnQgeSwgaW50IHosIGNv bnN0IERDdWJpYyYgYiApOwoKRE1hdHJpeCBpbnZlcnQoIGNvbnN0IERNYXRyaXgmIGEgKTsKCgoK CkRWZWN0b3IgbXVsdCggY29uc3QgRE1hdHJpeCYgYSwgY29uc3QgRFZlY3RvciYgYiApOwpEVmVj dG9yIG11bHQoIGNvbnN0IERWZWN0b3ImLCBjb25zdCBETWF0cml4JiBhICk7CgoKRE1hdHJpeCBt dWx0KCBjb25zdCBETWF0cml4JiBhLCBjb25zdCBETWF0cml4JiBiICk7CgoKRE1hdHJpeCBtdWx0 KCBjb25zdCBETWF0cml4JiBhLCBjb25zdCBETWF0cml4JiBiLCBjb25zdCBETWF0cml4JiBjICk7 Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KVGVuc29yPFQsIFQxZD4gam9pbiggY29uc3QgVGVuc29yPFQs IFQxZD4mIGEsIGNvbnN0IFRlbnNvcjxULCBUMWQ+JiBiICk7CgoKRE1hdHJpeCB0cmFmbyggY29u c3QgRE1hdHJpeCYgYSwgY29uc3QgRE1hdHJpeCYgdCApOwpETWF0cml4IHRyYWZvMSggY29uc3Qg RE1hdHJpeCYgYSwgY29uc3QgRE1hdHJpeCYgdCApOwpETWF0cml4IHRyYWZvMSggY29uc3QgRE1h dHJpeCYgYSwgY29uc3QgRE1hdHJpeCYgdCwgY29uc3QgRE1hdHJpeCYgUyApOwoKRFZlY3RvciBz eW1tdWx0MjMoIGNvbnN0IERDdWJpYyYgYywgY29uc3QgRE1hdHJpeCYgYSApOwpETWF0cml4IHN5 bW11bHQxKCBjb25zdCBEQ3ViaWMmIGMsIGNvbnN0IERWZWN0b3ImIGEgKTsKCgoKdm9pZCBmaW5p c2hfcmFkaWFsKCk7CnZvaWQgbG9hZGVsZW0oIERWZWN0b3ImIHJ4YywgRFZlY3RvciYgcmhvICk7 CnZvaWQgaW5pdF9yYWRpYWwoIGNvbnN0IEJhc2lzJiBwYiwgY29uc3QgQmFzaXMmIHJiICk7CgoK ZG91YmxlIGVjcyggY29uc3QgS1MmIGtzICk7CnZvaWQgcmFkX2NvbXBhcmVfcmhvKCBjb25zdCBE VmVjdG9yJiByaG8gKTsKIyAxNzU0ICJ4Mi5jYyIKc3RydWN0IGFsaWcgewogICAgZXhwbGljaXQg YWxpZyggZG91YmxlIGQsIGludCBuPTAgKSA6IGRfIChkICksIGlfKCBuICl7fTsKICAgIGRvdWJs ZSBkXzsKICAgIGludCBpXzsKfTsKCgoKCgoKdm9pZCBvdXRwdXRfZWlnZW52YWx1ZXMoIGNvbnN0 IEtTJiBrLCBjb25zdCBNYXRyaWNlcyYgbSApOwoKCgoKCmludCBiYXNpc19zaXplKCBjb25zdCBC YXNpcyYgYiApOwppbnQgYmFzaXNfaW5kZXgoIGNvbnN0IEJhc2lzJiBiLCBpbnQgbiApOwoKdm9p ZCBtYWtlX2dhdXNzX2Jhc2lzKCBCYXNpcyYgcGhpLCBCYXNpcyYgcmhvICk7CgoKCgp2b2lkIGNs ZWFyX2hhbWlsKCBjb25zdCBNYXRyaWNlcyYgbSwgRE1hdHJpeCYgaCwgY29uc3QgRE1hdHJpeCYg ZXYsIGludCBuICk7CnZvaWQgZ3JvdW5kc3RhdGUoIEtTJiBncywgY29uc3QgTWF0cmljZXMmIG1h dCApOwp2b2lkIGZpeF9nc19vY2MoIEtTJiBrLCBjb25zdCBNYXRyaWNlcyYgbSApOwoKCgpEVmVj dG9yIG1hdDJsaW4oIGNvbnN0IERNYXRyaXgmIGEgKTsKRE1hdHJpeCBtYXQybGlueCggY29uc3Qg REN1YmljJiBhICk7Cgp2b2lkIHNraXBfeHkoIE1hdHJpY2VzJiBtLCBjb25zdCBJSVZlY3RvciYg cGwsIGNvbnN0IElJVmVjdG9yJiBybCwgY29uc3QgSUlWZWN0b3ImIGZwbCApOwoKdm9pZCBmaW5p c2hfbWF0cmljZXMoIE1hdHJpY2VzJiBtICk7CnZvaWQgc3RhYmxlX3ZleHQoIE1hdHJpY2VzJiBt ICk7CgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZCBzeW1tZXRyaXplKCBUZW5zb3I8VCwgVDJk PiAmIGEgKTsKdGVtcGxhdGUgPGNsYXNzIFQ+CnZvaWQgc3ltY2hlY2soIGNvbnN0IFRlbnNvcjxU LCBUMmQ+ICYgYSwgZG91YmxlIGUsIGNvbnN0IGNoYXIqIHMgKTsKdGVtcGxhdGUgPGNsYXNzIFQ+ CnZvaWQgc3ltbWV0cnkoIFRlbnNvcjxULCBUMmQ+ICYgYSwgZG91YmxlIGUsIGNvbnN0IGNoYXIq IHMgKTsKdm9pZCBzeW1tZXRyeSggREN1YmljJiBhLCBkb3VibGUgZSwgY29uc3QgY2hhciogcyAp Owp2b2lkIHN5bW1ldHJ5MyggREN1YmljJiBhLCBkb3VibGUgZSwgY29uc3QgY2hhciogcyApOwoK RFZlY3RvciBiYXNpc19jb252ZXJ0KCBjb25zdCBEVmVjdG9yJiBhLCBjb25zdCBUcmFmbyYgdDEg KTsKRE1hdHJpeCBiYXNpc19jb252ZXJ0KCBjb25zdCBETWF0cml4JiBhLCBjb25zdCBUcmFmbyYg dDEsIGNvbnN0IFRyYWZvJiB0MiApOwpETWF0cml4IGJhc2lzX2NvbnZlcnQoIGNvbnN0IERNYXRy aXgmIGEsIGNvbnN0IERNYXRyaXgmIHQxLCBjb25zdCBETWF0cml4JiB0MiApOwpEVmVjdG9yIGJh c2lzX2NvbnZlcnQoIGNvbnN0IERWZWN0b3ImIGEsIGNvbnN0IERNYXRyaXgmIHQxICk7CkRDdWJp YyBiYXNpc19jb252ZXJ0KCBjb25zdCBEQ3ViaWMmIGEsIGNvbnN0IERNYXRyaXgmIHQxLCBjb25z dCBETWF0cml4JiB0MiApOwpEQ3ViaWMgYmFzaXNfY29udmVydCggY29uc3QgREN1YmljJiBhLCBj b25zdCBETWF0cml4JiB0MSwgY29uc3QgRE1hdHJpeCYgdDIsIGNvbnN0IERNYXRyaXgmIHQzICk7 CnZvaWQgYmFzaXNfY29udmVydCggTWF0cmljZXMmIG0sIGNvbnN0IEF0b21UeXBlJiBhICk7CnZv aWQgcHJpbnRtYXQoIGNvbnN0IE1hdHJpY2VzJiApOwpEVmVjdG9yIGFhdjJyaG8oIGNvbnN0IE1h dHJpY2VzJiBtLCBjb25zdCBETWF0cml4JiBhYSApOwpEVmVjdG9yIGFhdTJyaG8oIGNvbnN0IE1h dHJpY2VzJiBtLCBjb25zdCBETWF0cml4JiBhYSApOwoKCgpETWF0cml4IHBvdF9sZGExKCBjb25z dCBNYXRyaWNlcyYgbSwgY29uc3QgRFZlY3RvciYgcmhvLCBjb25zdCBETWF0cml4JiBhYSApOwpk b3VibGUgZWxkYV9hdXgxKCBjb25zdCBNYXRyaWNlcyYgbSwgY29uc3QgRFZlY3RvciYgcmhvLCBj b25zdCBETWF0cml4JiBhYSApOwoKZG91YmxlIGVueGNfbGRhKCBjb25zdCBNYXRyaWNlcyYgbSwg Y29uc3QgS1NCYXNlJiBhICk7Cgp2b2lkIGluaXRfbGRhX3NwbGluZSgpOwpkb3VibGUgZW5fbGRh MSggZG91YmxlIHIgKTsKZG91YmxlIGVuX2xkYV9kMSggZG91YmxlIHIgKTsKCgpkb3VibGUgbGRh MiggZG91YmxlIHIgKTsKZG91YmxlIGxkYV9kMiggZG91YmxlIHIgKTsKCgoKCmRvdWJsZSBudW1s ZGFfZW4oIGNvbnN0IEtTQmFzZSYgaywgY29uc3QgTWF0cmljZXMmIG0gKTsKCmRvdWJsZSBudW1s ZGFfc2ljX2VuKCBjb25zdCBEVmVjdG9yJiByaG8sIGNvbnN0IE1hdHJpY2VzJiBtICk7CkRWZWN0 b3IgbnVtbGRhX3NpY19wb3QoIGNvbnN0IERWZWN0b3ImIHJobywgY29uc3QgTWF0cmljZXMmIG0g KTsKCgoKdm9pZCBzaWNlbiggS1MmIGtzLCBjb25zdCBNYXRyaWNlcyYgbSApOwpkb3VibGUgZWxk YV9zaWMoIGNvbnN0IE1hdHJpY2VzJiBtLCBjb25zdCBETWF0cml4JiBhICk7CmRvdWJsZSB0ZF9z aWNfZW4oIGNvbnN0IENLUyYgaywgY29uc3QgTWF0cmljZXMmIG0gKTsKdm9pZCB0ZF9zaWNfcG90 KCBDSGFtaWwmIGgsIGNvbnN0IENLUyYgaywgY29uc3QgTWF0cmljZXMmIG0gKTsKRE1hdHJpeCBz aWNwb3Rfc3ltbSggY29uc3QgRE1hdHJpeCYgYSwgY29uc3QgRE1hdHJpeCYgYWEsIGNvbnN0IERE VmVjdG9yJiByaG9zaWMsIGNvbnN0IE1hdHJpY2VzJiBtICk7CkRNYXRyaXggc2ljcG90X2Jhc2Ux KCBjb25zdCBETWF0cml4JiBhLCBjb25zdCBERFZlY3RvciYgcmhvc2ljLCBjb25zdCBNYXRyaWNl cyYgbSApOwpETWF0cml4IHNpY3BvdF90ZGdzKCBjb25zdCBETWF0cml4JiBhLCBjb25zdCBETWF0 cml4JiBhYSwgY29uc3QgRERWZWN0b3ImIHJob3NpYywgY29uc3QgTWF0cmljZXMmIG0gKTsKCgoK Cgp2b2lkIGNhbGNfeGMoIGNvbnN0IE1hdHJpY2VzJiBtLCBjb25zdCBLUyYga3MsIERNYXRyaXgm IHZ4YzEsIERNYXRyaXgmIHZ4YzIgKTsKRFZlY3RvciBwb3RrbGkyKCBjb25zdCBNYXRyaWNlcyYg bSwgY29uc3QgS1MmIGtzICk7Cgpkb3VibGUgdHdvY2VuX2VuY29yZShjb25zdCBBdG9tVHlwZSYg dDEsIGNvbnN0IEF0b21UeXBlJiB0MiwgY29uc3QgREN1YmljJiB2LCBjb25zdCB0d29jZW4mIG0x MiApOwoKCgp0ZW1wbGF0ZTwgY2xhc3MgVD4KVGVuc29yPFQsIFQzZD4gbWFrZV95bSggY29uc3Qg REN1YmljJiB5LCBjb25zdCBUZW5zb3I8VCwgVDJkPiYgYSApOwoKZG91YmxlIGVjcyggY29uc3Qg S1MmIGtzICk7CkRNYXRyaXggaGYxKCBjb25zdCBNYXRyaWNlcyYgbSwgY29uc3QgRE1hdHJpeCYg YSwgY29uc3QgRE1hdHJpeCYgYWEgKTsKCmRvdWJsZSBlbnhjX2hmKCBjb25zdCBNYXRyaWNlcyYg bSwgY29uc3QgRE1hdHJpeCAmIGEgKTsKZG91YmxlIGVueGMoIGNvbnN0IEtTJiBhLCBjb25zdCBN YXRyaWNlcyYgbSApOwpkb3VibGUgZW54YyggY29uc3QgQ0tTJiBhLCBjb25zdCBNYXRyaWNlcyYg bSApOwoKCgp2b2lkIGtsaTEoIGNvbnN0IE1hdHJpY2VzJiBtLCBjb25zdCBETWF0cml4JiBhLCBj b25zdCBETWF0cml4JiBhYSwgRE1hdHJpeCYgdnhjICk7CkRWZWN0b3Iga2xpMiggY29uc3QgTWF0 cmljZXMmIG0sIGNvbnN0IENLUyYga3MsIERNYXRyaXgmIHZ4YyApOwpEVmVjdG9yIGtsaTIoIGNv bnN0IE1hdHJpY2VzJiBtLCBjb25zdCBLUyYga3MsIERNYXRyaXgmIHZ4YyApOwpkb3VibGUga2xp YXV4MDEoIGNvbnN0IE1hdHJpY2VzJiBtLCBjb25zdCBETWF0cml4JiBhLCBjb25zdCBETWF0cml4 JiB4bWFsLCBETWF0cml4JiBsaHMxLCBEVmVjdG9yJiByaHMxICk7CgoKCnZvaWQgaGFtaWwya3Mo IGNvbnN0IEhhbWlsJiBoYW1pbCwgS1MmIGtzLCBjb25zdCBNYXRyaWNlcyYgbWF0ICk7CkRWZWN0 b3Igc3ltX3N1bTMoIGNvbnN0IERNYXRyaXgmIGFhLCBjb25zdCBEQ3ViaWMmIHkgKTsKCnZvaWQg ZmlsbF9rcyggS1MmIHgsIGNvbnN0IE1hdHJpY2VzJiBtICk7CnZvaWQgZmlsbF9rc19ub2VuZXJn eSggS1MmIHgsIGNvbnN0IE1hdHJpY2VzJiBtICk7CnZvaWQgZmlsbF9rcyggQ0tTJiB4LCBjb25z dCBNYXRyaWNlcyYgbSApOwp2b2lkIGZpbGxfcmhvKCBDS1MmIHgsIGNvbnN0IE1hdHJpY2VzJiBt ICk7CnZvaWQgZmlsbF9hYSggS1MmIHgsIGNvbnN0IE1hdHJpY2VzJiBtICk7CkRNYXRyaXggbWFr ZV9hYSggY29uc3QgRE1hdHJpeCYgYSApOwoKCgpDSGFtaWwgaGFtaWx0b24oIGNvbnN0IENLUyYg a3MsIGNvbnN0IE1hdHJpY2VzJiBtICk7CkhhbWlsIGhhbWlsdG9uKCBjb25zdCBLUyYga3MsIGNv bnN0IE1hdHJpY2VzJiBtICk7CkhhbWlsIGhhbWlsdG9uX3RkZ3MoIGNvbnN0IEtTJiBrcywgY29u c3QgTWF0cmljZXMmIG0gKTsKSGFtaWwgaGFtaWx0b25fbm9zaWMoIGNvbnN0IEtTJiBrcywgY29u c3QgTWF0cmljZXMmIG0gKTsKdm9pZCBhZGRfcmFuZG9tKCBIYW1pbCYgaCApOwp2b2lkIGFkZF9y YW5kb20oIEtTJiB4ICk7CgoKCnZvaWQgaW5pdF9tb2xvdGltZSgpOwpkb3VibGUgbW9sb3RpbWUo KTsKdm9pZCBzZXRfbW9sb3RpbWUoIGRvdWJsZSBhICk7CmJvb2wgdGltZXN0ZXAoKTsKYm9vbCB0 aW1lX2lzX3VwKCBkb3VibGUgYSApOwoKCgoKCgp2b2lkIGZpbGxfZW5lcmd5KCBLUyYga3MsIGNv bnN0IE1hdHJpY2VzJiBtICk7CgpFbmVyZ3kgZW5lcmd5KCBjb25zdCBDS1MmIGtzLCBjb25zdCBN YXRyaWNlcyYgbSApOwoKdm9pZCBvdXRwdXRfZW5lcmd5KCBjb25zdCBNYXRyaWNlcyYgbSwgY29u c3QgQ0tTJiBjLCBkb3VibGUgZWsgKTsKdm9pZCBvdXRwdXRfZW5lcmd5KCBjb25zdCBNYXRyaWNl cyYgbSwgY29uc3QgS1MmIGEsIGRvdWJsZSBlayApOwoKRE1hdHJpeCBjYWxjX3htYXQoIGNvbnN0 IE1hdHJpY2VzJiBtLCBjb25zdCBETWF0cml4JiBhYSApOwpETWF0cml4IGNhbGNfeG1hdDEoIGNv bnN0IE1hdHJpY2VzJiBtLCBjb25zdCBETWF0cml4JiBhYSApOwpETWF0cml4IGNhbGNfdm1hdCgg Y29uc3QgTWF0cmljZXMmIG0sIGNvbnN0IERWZWN0b3ImIHJobyApOwpETWF0cml4IGNhbGNfcW1h dCggY29uc3QgTWF0cmljZXMmIG0sIGNvbnN0IERWZWN0b3ImIHJobyApOwpETWF0cml4IGNhbGNf cW1hdCggY29uc3QgS1MmIGtzLCBjb25zdCBNYXRyaWNlcyYgbSApOwpETWF0cml4IGNhbGNfcW1h dCggY29uc3QgQ0tTJiBrcywgY29uc3QgTWF0cmljZXMmIG0gKTsKCgpkb3VibGUgZW5xKCBjb25z dCBNYXRyaWNlcyYgbSwgY29uc3QgRFZlY3RvciYgcmhvICk7CgoKCgoKZG91YmxlIGxhc2VyKCBk b3VibGUgdCApOwpQb2ludCBsYXNlcl92ZWMoIGRvdWJsZSB0ICk7CkRNYXRyaXggZGlwb2xtYXQo IGNvbnN0IE1hdHJpY2VzJiBtICk7ClBvaW50IGNhbGNfZGlwb2xlKCBjb25zdCBDS1MmIGtzLCBj b25zdCBNYXRyaWNlcyYgbSApOwoKCgpETWF0cml4IG1ha2VfcGhpX3RyYWZvKCBjb25zdCBETWF0 cml4JiBhLCBJVmVjdG9yJiBpbiwgY29uc3QgQmFzaXMmIHBoaSwgaW50IGNvcmUgKTsKCkRNYXRy aXggbWFrZV9yaG9fdHJhZm8oIGNvbnN0IEJhc2lzJiByYiwgTWF0cmljZXMmIG0sCiAgICAgICAg ICAgICAgICAgICAgICAgIERWZWN0b3ImIHJob251Y2wsIERWZWN0b3ImIHJob2VmZiwgRFZlY3Rv ciYgcmhvY29yZSwgY29uc3QgRE1hdHJpeCB0cCApOwoKRE1hdHJpeCBtYWtlX3RyYWZvKCBjb25z dCBCYXNpcyYgYiwgaW50IG4gKTsKCgoKClBWZWN0b3IgZm9yY2UoIGNvbnN0IENLUyYgYzAsIFhN YXRyaXgmIHhtYXQsIGNvbnN0IFBWZWN0b3ImIHBvcyApOwpQVmVjdG9yIGZvcmNlKCBjb25zdCBL UyYgYzAsIFhNYXRyaXgmIHhtYXQsIGNvbnN0IFBWZWN0b3ImIHBvcyApOwoKCgpPZGVCYXNlKiBt YWtlX3RkX29kZSggY29uc3QgQ0tTJiBhLCBjb25zdCBNb2xlY3VsZSogcCApOwpPZGVCYXNlKiBt YWtlX3RkZ3Nfb2RlKCBjb25zdCBLUyYgYSwgY29uc3QgTW9sZWN1bGUqIHAgKTsKS1MgYXBwbHlf aGFtaWwoIGNvbnN0IEhhbWlsJiBoYW0sIGNvbnN0IEtTJiBhLCBjb25zdCBNYXRyaWNlcyYgbSAp OwoKCgp2b2lkIG9ydGhvKCBETWF0cml4JiBhLCBjb25zdCBETWF0cml4JiBTICk7CnZvaWQgZml4 X25vcm0oIENLUyYgYSwgY29uc3QgTWF0cmljZXMmIG0gKTsKdm9pZCBzeW1tX3JobyggRFZlY3Rv ciYgeCwgY29uc3QgTWF0cmljZXMmIG0gKTsKdm9pZCBtYWtlX3B1cmUoIEtTJiBhLCBjb25zdCBN YXRyaWNlcyYgbSwgY29uc3QgSGFtaWwmIGggKTsKdm9pZCBmaXhfbm9ybSggS1MmIGEsIGNvbnN0 IE1hdHJpY2VzJiBtICk7CnZvaWQgZml4X25vcm1fbm9lbmVyZ3koIEtTJiBhLCBjb25zdCBNYXRy aWNlcyYgbSApOwp2b2lkIHJlbm9ybV9hYSggS1MmIGssIGNvbnN0IERNYXRyaXgmIFMgKTsKdm9p ZCBmaWxsX251bWVyaWMoIERlbnMmIHgsIGNvbnN0IE1hdHJpY2VzJiBtICk7CgoKCnZvaWQgaW5p dF92YXJpYWJsZXMoKTsKUFZlY3RvciBnZW9tZXRyeSggZG91YmxlIHQgKTsKCgoKZG91YmxlIHBh cnNlKCBjb25zdCBjaGFyKiBwICk7CgoKCgoKCmV4dGVybiBjb25zdCBjaGFyKiBtb2xvX3ZlcnNp b247CgoKCgpleHRlcm4gQVZlY3RvciBhZGRfZ3JpZCggQVZlY3RvciBhICk7CgoKc3RydWN0IEhh bWlsIHsKICAgIEhhbWlsKCl7fQogICAgZXhwbGljaXQgSGFtaWwoIGludCBwaGlzaXplICkgOiBo MSggcGhpc2l6ZSwgcGhpc2l6ZSApLCBoMiggcGhpc2l6ZSwgcGhpc2l6ZSApe30KICAgIEhhbWls KCBjb25zdCBETWF0cml4JiBhLCBjb25zdCBETWF0cml4JiBiICkgOiBoMShhKSwgaDIoYil7fQog ICAgRE1hdHJpeCBoMSwgaDI7Cn07CgpzdHJ1Y3QgQ0hhbWlsIHsKICAgIERNYXRyaXggaDEsIGgy LCBpaDEsIGloMjsKfTsKCnN0cnVjdCBFbmVyZ3kgewogICAgRW5lcmd5KCk7CiAgICBvcGVyYXRv ciBkb3VibGUoKSBjb25zdCB7IHJldHVybiB0b3Q7IH0KICAgIGRvdWJsZSB0b3Q7CiAgICBkb3Vi bGUgZWw7CiAgICBkb3VibGUga2luOwogICAgZG91YmxlIGNsYXM7CiAgICBkb3VibGUgdDsKICAg IGRvdWJsZSBleHQ7CiAgICBkb3VibGUgcTsKICAgIGRvdWJsZSB4YzsKICAgIGRvdWJsZSBzaWM7 CiAgICBkb3VibGUgbGFzZXI7CiAgICBkb3VibGUgZGU7Cn07CgpzdHJ1Y3QgRGVucyB7CiAgICBE ZW5zKCBpbnQgeG0sIGludCBlcGx1cywgaW50IGVtaW51cyApIDogeG1vZGUoIHhtICksIG5lbDEo IGVwbHVzICksIG5lbDIoIGVtaW51cyApLCBzeW1tKCAwICl7fQogICAgRFZlY3RvciByaG8xLCBy aG8yLCByaG87CiAgICBEVmVjdG9yIHJuMSwgcm4yOwogICAgUFZlY3RvciByZzEsIHJnMjsKICAg IGludCB4bW9kZTsKICAgIGludCBuZWwxLCBuZWwyOwogICAgaW50IHN5bW07Cn07CgpzdHJ1Y3Qg S1NCYXNlIDogcHVibGljIERlbnMgewogICAgS1NCYXNlKCBpbnQgeG0sIGludCBlcGx1cywgaW50 IGVtaW51cyApIDogRGVucyggeG0sIGVwbHVzLCBlbWludXMgKXt9CiAgICBETWF0cml4IGFhMSwg YWEyLCBhYTsKICAgIEREVmVjdG9yIHJob3NpYzEsIHJob3NpYzI7Cn07CgpzdHJ1Y3QgS1MgOiBw dWJsaWMgS1NCYXNlIHsKICAgIEtTKCBpbnQgeG0sIGludCBlcGx1cywgaW50IGVtaW51cyApIDog S1NCYXNlKCB4bSwgZXBsdXMsIGVtaW51cyApe30KICAgIERWZWN0b3IgZXZhbDEsIGV2YWwyOwog ICAgRE1hdHJpeCBldmVjMSwgZXZlYzI7CiAgICBETWF0cml4IGtzMSwga3MyOwogICAgRE1hdHJp eCBoZjEsIGhmMjsKICAgIGRvdWJsZSBlc2ljMSwgZXNpYzI7CiAgICBFbmVyZ3kgZW5lcmd5Owp9 OwoKCgoKSGFtaWwgcG90X2NvcnIoIGNvbnN0IE1hdHJpY2VzJiBtLCBjb25zdCBLUyYga3MgKTsK CgpIYW1pbCBtaXhfaGFtaWwoIGNvbnN0IEhhbWlsJiBhLCBjb25zdCBIYW1pbCYgYiwgZG91Ymxl IG0sIGludCB4bSApCnsKICAgIEhhbWlsIGVyZzsKICAgIGRvdWJsZSBkMSA9IDEtbTsKICAgIGRv dWJsZSBkMiA9IG07CiAgICBlcmcuaDEgPSBkMSogYS5oMSArIGQyKmIuaDE7CiAgICBpZiggeG09 PTEgKSBlcmcuaDIgPSBlcmcuaDE7CiAgICBlbHNlIGVyZy5oMiA9IGQxKiBhLmgyICsgZDIqYi5o MjsKCiAgICByZXR1cm4gZXJnOwp9CgpzdGF0aWMKS1Mga3NsaW5fYXV4KCBjb25zdCBLUyYgZ3Mw LCBjb25zdCBLUyYgZ3MxLCBjb25zdCBNYXRyaWNlcyYgLCBkb3VibGUgbjAsIGRvdWJsZSBuMSAp CnsKICAgIEtTIGdzID0gZ3MxOwoKICAgIGdzLmFhMSA9IGdzMC5hYTEgKiBuMCArIGdzMS5hYTEg KiBuMTsKICAgIGdzLmFhMiA9IGdzMC5hYTIgKiBuMCArIGdzMS5hYTIgKiBuMTsKCiAgICBncy5o ZjEgPSBnczAuaGYxICogbjAgKyBnczEuaGYxICogbjE7CiAgICBncy5oZjIgPSBnczAuaGYyICog bjAgKyBnczEuaGYyICogbjE7CgogICAgZ3MucmhvMSA9IGdzMC5yaG8xICogbjAgKyBnczEucmhv MSAqIG4xOwogICAgZ3MucmhvMiA9IGdzMC5yaG8yICogbjAgKyBnczEucmhvMiAqIG4xOwoKICAg IGdzLnJuMSA9IGdzMC5ybjEgKiBuMCArIGdzMS5ybjEgKiBuMTsKICAgIGdzLnJuMiA9IGdzMC5y bjIgKiBuMCArIGdzMS5ybjIgKiBuMTsKCiAgICBncy5hYSA9IGdzLmFhMSArIGdzLmFhMjsKICAg IGdzLnJobyA9IGdzLnJobzEgKyBncy5yaG8yOwoKICAgIGdzLmtzMS5yZXNpemUoIDAsIDAgKTsK ICAgIGdzLmtzMi5yZXNpemUoIDAsIDAgKTsKICAgIGdzLmV2ZWMxLnJlc2l6ZSggMCwgMCApOwog ICAgZ3MuZXZlYzIucmVzaXplKCAwLCAwICk7CiAgICBncy5ldmFsMS5yZXNpemUoIDAgKTsKICAg IGdzLmV2YWwyLnJlc2l6ZSggMCApOwoKICAgIGdzLnJob3NpYzEucmVzaXplKCAwICk7CiAgICBn cy5yaG9zaWMyLnJlc2l6ZSggMCApOwoKICAgIHJldHVybiBnczsKfQoKc3RhdGljCktTIGtzbGlu X25vbnB1cmUoIGNvbnN0IEtTJiBnczAsIGNvbnN0IEtTJiBnczEsIGNvbnN0IE1hdHJpY2VzJiBt LCBkb3VibGUgbjAsIGRvdWJsZSBuMSApCnsKICAgIEtTIHggPSBrc2xpbl9hdXgoIGdzMCwgZ3Mx LCBtLCBuMCwgbjEgKTsKICAgIGZpbGxfZW5lcmd5KCB4LCBtICk7CiAgICByZXR1cm4geDsKfQoK c3RhdGljCktTIGtzbGluX3B1cmUoIGNvbnN0IEtTJiBnczAsIGNvbnN0IEtTJiBnczEsIGNvbnN0 IE1hdHJpY2VzJiBtLCBkb3VibGUgbjAsIGRvdWJsZSBuMSwgY29uc3QgSGFtaWwmIGggKQp7CiAg ICBLUyB4ID0ga3NsaW5fYXV4KCBnczAsIGdzMSwgbSwgbjAsIG4xICk7CiAgICBtYWtlX3B1cmUo IHgsIG0sIGggKTsKICAgIHJldHVybiB4Owp9CgpjbGFzcyBHc0JyZW50IDogcHVibGljIEJyZW50 IHsKcHVibGljOgogICAgR3NCcmVudCggY29uc3QgTWF0cmljZXMmIG0sIGNvbnN0IEtTJiBnczAs IGNvbnN0IEtTJiBnczEsIGNvbnN0IEhhbWlsJiBoICk7CiAgICBLUyBydW4oIGRvdWJsZSB4LCBk b3VibGUgZnggKTsKICAgIGRvdWJsZSBmKCBkb3VibGUgeCApOwpwcml2YXRlOgogICAgY29uc3Qg S1MmIGdzMF87CiAgICBjb25zdCBLUyYgZ3MxXzsKICAgIEtTIGdzXzsKICAgIGNvbnN0IE1hdHJp Y2VzJiBtXzsKICAgIGNvbnN0IEhhbWlsJiBoXzsKfTsKCkdzQnJlbnQgOjogR3NCcmVudCggY29u c3QgTWF0cmljZXMmIG0sIGNvbnN0IEtTJiBnczAsIGNvbnN0IEtTJiBnczEsIGNvbnN0IEhhbWls JiBoICkKICAgIDogZ3MwXyggZ3MwICksIGdzMV8oIGdzMSApLCBnc18oIGdzMCApLCBtXyggbSAp LCBoXyggaCApCnsKICAgIHNldF90b2woIDAuMDEgKTsKICAgIHNldF9lcHMoIDAuMDAwMDEgKTsK fQoKZG91YmxlIEdzQnJlbnQ6OmYoIGRvdWJsZSB4ICkKewogICAgY29uc3QgS1MgZ3N0ZXN0ID0g a3NsaW5fbm9ucHVyZSggZ3MwXywgZ3MxXywgbV8sIDEteCwgeCApOwogICAgaWYoIGdzdGVzdC5l bmVyZ3kudG90IDwgZ3NfLmVuZXJneS50b3QgKSBnc18gPSBnc3Rlc3Q7CiAgICByZXR1cm4gZ3N0 ZXN0LmVuZXJneTsKfQoKS1MgR3NCcmVudDo6cnVuKCBkb3VibGUgeCwgZG91YmxlIGZ4ICkKewog ICAgaW5pdCggMCwgeCwgMSwgZ3MwXy5lbmVyZ3ksIGZ4LCBnczFfLmVuZXJneSApOwogICAgQnJl bnQ6OnJ1bigpOwogICAgcmV0dXJuIGdzXzsKfQoKc3RhdGljIGRvdWJsZSBnZXRlbiggY29uc3Qg SGFtaWwmIGgsIGNvbnN0IEtTJiBhICkKewogICAgcmV0dXJuIDE3LjA7Cn0KCmludCBnc2NvdW50 ID0gMDsKCktTIG5leHRfZ3Nfbm9zaWMoIEtTIHgwLCBjb25zdCBNYXRyaWNlcyYgbSApCnsKICAg IGRvdWJsZSBiMDsKCiAgICBIYW1pbCBoMCA9IGhhbWlsdG9uKCB4MCwgbSApOwogICAgS1MgeDEg PSB4MDsKICAgIGhhbWlsMmtzKCBoMCwgeDEsIG0gKTsKCgoKICAgIEtTIHggPSB4MDsKICAgIEtT IHgyID0geDA7CiAgICBpbnQgaTsKICAgIGZvciggaT0wOyBpPDE3OyArK2kgKXsKCiAgICAgICAg ZG91YmxlIGUwMCA9IGdldGVuKCBoMCwgeDAgKTsKICAgICAgICBkb3VibGUgZTAxID0gZ2V0ZW4o IGgwLCB4MSApOwogICAgICAgIGRvdWJsZSBnMGIgPSAtIChlMDEgLSBlMDApOwoKCiAgICAgICAg aWYoIGcwYiA8IDIyICl7CiAgICAgICAgICAgIGlmKCB4Mi5lbmVyZ3kgPCB4LmVuZXJneSApeyB4 ID0geDI7IGJyZWFrOyB9CiAgICAgICAgICAgIGlmKCB4LmtzMS5kaW0xKCkgPiAwICkgYnJlYWs7 CiAgICAgICAgICAgIGlmKCB4Mi5lbmVyZ3kgLSAxIDwgeC5lbmVyZ3kgKXsgeCA9IHgyOyBicmVh azsgfQogICAgICAgICAgICBpZiggZzBiIDwgMSAqIDAuMDEgKSBicmVhazsKICAgICAgICB9CiAg ICAgICAgR3NCcmVudCBiKCBtLCB4MCwgeDEsIGgwICk7CiAgICAgICAgZG91YmxlIGUwNSA9IGIu ZiggMC41ICk7CiAgICAgICAgaWYoICggZTA1ID4geDEuZW5lcmd5ICYmIHgwLmVuZXJneSA+IHgx LmVuZXJneSApICl7CiAgICAgICAgICAgIHggPSB4MTsKICAgICAgICAgICAgYjAgPSAxLjA7CiAg ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeCA9IGIucnVuKCAwLjUsIGUwNSApOwogICAgICAg ICAgICBiMCA9IGIuZ2V0X3htaW4oKTsKICAgICAgICB9CiAgICAgICAgaWYoIGIwID09IDAuMCAp ewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgoKICAgICAgICBpZiggeDAuZW5lcmd5IDwg eC5lbmVyZ3kgKXsKICAgICAgICAgICAgeCA9IHgwOwogICAgICAgICAgICBicmVhazsKICAgICAg ICB9CiAgICAgICAgaWYoIHgwLmVuZXJneSAtIDEgKiAxZS00IDwgeC5lbmVyZ3kgKXsKICAgICAg ICAgICAgKysgZ3Njb3VudDsKICAgICAgICAgICAgaWYoIGdzY291bnQ9PTMgKSB7CgogICAgICAg ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgZ3Njb3VudD0wOwoK CiAgICAgICAgSGFtaWwgaDEgPSBoYW1pbHRvbiggeCwgbSApOwoKICAgICAgICBoYW1pbDJrcygg aDEsIHgyLCBtICk7CgogICAgICAgIGRvdWJsZSBlMTAgPSBnZXRlbiggaDEsIHgwICk7CiAgICAg ICAgZG91YmxlIGUxMSA9IGdldGVuKCBoMSwgeDEgKTsKICAgICAgICBkb3VibGUgZTEyID0gZ2V0 ZW4oIGgxLCB4MiApOwoKICAgICAgICBkb3VibGUgZTAyID0gZ2V0ZW4oIGgwLCB4MiApOwogICAg ICAgIGRvdWJsZSBnMGMgPSAtIChlMDIgLSBlMDApOwoKICAgICAgICBkb3VibGUgZzFiID0gLSAo ZTExIC0gZTEwKTsKICAgICAgICBkb3VibGUgZzFjID0gLSAoZTEyIC0gZTEwKTsKCgogICAgICAg IGlmKCBnMWMgPD0gMCApewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZG91 YmxlIGcwMCA9IGcwYjsKICAgICAgICBkb3VibGUgZzExID0gKGcxYiAtIGcwYikgKiBnMWIgKyAo ZzFjIC0gZzBjKSAqIGcxYzsKCiAgICAgICAgZG91YmxlIGJldGEgPSBnMTEgLyBnMDA7CgogICAg ICAgIGRvdWJsZSBwYiA9IGcxYiArIGJldGE7CiAgICAgICAgZG91YmxlIHBjID0gZzFjOwoKICAg ICAgICBwYiAvPSBwYzsKICAgICAgICBwYyA9IDE7CgogICAgICAgIGlmKCBwYiA+IC1iMCAmJiBn MWIgLyBnMWMgPCAwLjAxICYmIGIwIDwgMC45OSApIHsKICAgICAgICAgICAgZG91YmxlIGsgPSAo MS4wLWIwKSAvICggcGIgKyBwYyk7CiAgICAgICAgICAgIHBiICo9IGs7CiAgICAgICAgICAgIHBj ICo9IGs7CiAgICAgICAgICAgIHgxID0ga3NsaW5fbm9ucHVyZSggeDEsIHgyLCBtLCBwYitiMCwg cGMgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB4MSA9IHgyOwogICAgICAgIH0KCiAg ICAgICAgeDAgPSB4OwogICAgICAgIGgwID0gaDE7CiAgICB9CiAgICBpZiggeC5rczEuZGltMSgp ID09IDAgKXsKCiAgICAgICAgbWFrZV9wdXJlKCB4LCBtLCBoMCApOwogICAgfQogICAgcmV0dXJu IHg7Cgp9CgpjbGFzcyBTaWNCcmVudCA6IHB1YmxpYyBCcmVudDIgewpwdWJsaWM6CiAgICBTaWNC cmVudCggY29uc3QgTWF0cmljZXMmIG0sIGNvbnN0IEtTJiBnczAsIGNvbnN0IEtTJiBnczEsIGRv dWJsZSBiMCApOwogICAgZG91YmxlIGYoIGRvdWJsZSB4ICk7CiAgICBLUyBydW4oKSB7IEJyZW50 Mjo6cnVuKCk7IHJldHVybiBnc187IH0KcHJpdmF0ZToKICAgIGNvbnN0IEtTJiBnczBfOwogICAg Y29uc3QgS1MmIGdzMV87CiAgICBLUyBnc187CiAgICBjb25zdCBNYXRyaWNlcyYgbV87Cn07CgpT aWNCcmVudDo6U2ljQnJlbnQoIGNvbnN0IE1hdHJpY2VzJiBtLCBjb25zdCBLUyYgZ3MwLCBjb25z dCBLUyYgZ3MxLCBkb3VibGUgYjAgKQogICAgOiBnczBfKCBnczAgKSwgZ3MxXyggZ3MxICksIGdz XyggZ3MwICksIG1fKCBtICkKewogICAgc2V0X3RvbCggMWUtMiApOwogICAgc2V0X2VwcyggMWUt MTAgKTsKICAgIGluaXQoIDAsIGIwLCBmKDApLCBmKGIwKSApOwp9CgpLUyBrbHMoIGNvbnN0IEtT JiBhLCBjb25zdCBLUyYgYiwgZG91YmxlIHgsIGNvbnN0IE1hdHJpY2VzJiBtICkKewogICAgS1Mg eSA9IGE7CiAgICB5LmtzMSArPSB4ICogYi5rczE7CiAgICB5LmtzMiArPSB4ICogYi5rczI7CiAg ICBmaXhfbm9ybSggeSwgbSApOwogICAgcmV0dXJuIHk7Cn0KCmRvdWJsZSBTaWNCcmVudDo6Zigg ZG91YmxlIHggKQp7CiAgICBLUyBnc3Rlc3QgPSBrbHMoIGdzMF8sIGdzMV8sIHgsIG1fICk7CiAg ICBpZiggZ3N0ZXN0LmVuZXJneSA8IGdzXy5lbmVyZ3kgKSBnc18gPSBnc3Rlc3Q7CiAgICByZXR1 cm4gZ3N0ZXN0LmVuZXJneTsKfQoKS1MgbWFrZV9kZXJpdiggY29uc3QgS1MmIGEsIGNvbnN0IE1h dHJpY2VzJiBtICkKewogICAgSGFtaWwgaCA9IGhhbWlsdG9uX3RkZ3MoIGEsIG0gKTsKICAgIEtT IGQwID0gYXBwbHlfaGFtaWwoIGgsIGEsIG0gKTsKICAgIHJldHVybiBkMDsKfQoKS1MgbWFrZV9n cmFkKCBjb25zdCBLUyYgYSwgY29uc3QgTWF0cmljZXMmIG0gKQp7CiAgICBIYW1pbCBoID0gaGFt aWx0b25fbm9zaWMoIGEsIG0gKTsKICAgIERNYXRyaXggeDEgPSBtdWx0KCBoLmgxLCBhLmtzMSAp OwogICAgeDEgKz0gc2ljcG90X2Jhc2UxKCBhLmtzMSwgYS5yaG9zaWMxLCBtICk7CiAgICBLUyBk MCA9IGE7CiAgICBkMC5rczEgPSB4MTsKICAgIGlmKCBhLnhtb2RlID09IDAgKXsKICAgICAgICBE TWF0cml4IHgyID0gbXVsdCggaC5oMiwgYS5rczIgKTsKICAgICAgICB4MiArPSBzaWNwb3RfYmFz ZTEoIGEua3MyLCBhLnJob3NpYzIsIG0gKTsKICAgICAgICBkMC5rczIgPSB4MjsKICAgIH0gZWxz ZSBpZiggYS54bW9kZSA9PSAxICkgewogICAgICAgIGQwLmtzMiA9IGQwLmtzMTsKICAgIH0gZWxz ZSB7CiAgICAgICAgZDAua3MyID0gZDAua3MxKCBpbmRleDEsIEluZGV4MiggYS5rczIuZGltMigp ICkgKTsKICAgIH0KICAgIHJldHVybiBkMDsKfQoKZG91YmxlIGFwcGx5X2dyYWQoIGNvbnN0IEtT JiBnLCBjb25zdCBLUyYgYSApCnsKICAgIHJldHVybiAyLjA7Cn0KCktTIG5leHRfZ3Nfc2ljX2dy YWQoIEtTIGdzMCwgY29uc3QgTWF0cmljZXMmIG0gKQp7CgogICAgZG91YmxlIGIwPSAxZS00Owog ICAgZml4X25vcm0oIGdzMCwgbSApOwoKICAgIEtTIGdzID0gZ3MwOwogICAgS1MgZDEgPSBtYWtl X2Rlcml2KCBnczAsIG0gKTsKICAgIEtTIGdyMSA9IG1ha2VfZ3JhZCggZ3MwLCBtICk7CiAgICBm b3IoIGludCBpPTA7IGk8MjsgKytpICl7CgoKCgoKICAgICAgICBkb3VibGUgZzBiID0gYXBwbHlf Z3JhZCggZ3IxLCBkMSApOwogICAgICAgIGlmKCBnMGIgPCAwICl7CiAgICAgICAgICAgIHJldHVy biBnczsKICAgICAgICB9CiAgICAgICAgaWYoIGcwYiA8IDMgKSByZXR1cm4gZ3M7CgogICAgICAg IFNpY0JyZW50IGIoIG0sIGdzMCwgZDEsIGIwICk7CiAgICAgICAgZ3MgPSBiLnJ1biggKTsKICAg ICAgICBiMCA9IGIuZ2V0X3htaW4oKTsKCiAgICAgICAgS1MgZDIgPSBtYWtlX2Rlcml2KCBncywg bSApOwogICAgICAgIEtTIGdyMiA9IG1ha2VfZ3JhZCggZ3MsIG0gKTsKCgoKCgoKCiAgICAgICAg ZG91YmxlIGcwYyA9IGFwcGx5X2dyYWQoIGdyMSwgZDIgKTsKICAgICAgICBkb3VibGUgZzFjID0g YXBwbHlfZ3JhZCggZ3IyLCBkMiApOwogICAgICAgIGRvdWJsZSBnMWIgPSAwOwoKICAgICAgICBp ZiggZzFjIDwgMCApewogICAgICAgICAgICByZXR1cm4gZ3M7CiAgICAgICAgfQoKICAgICAgICBk b3VibGUgZzAwID0gZzBiOwogICAgICAgIGRvdWJsZSBnMTEgPSAoZzFiIC0gZzBiKSAqIGcxYiAr IChnMWMgLSBnMGMpICogZzFjOwoKICAgICAgICBkb3VibGUgYmV0YSA9IGcxMSAvIGcwMDsKCgoK CiAgICAgICAgZDEua3MxID0gZzFjICogZDIua3MxICsgYmV0YSAqIGQxLmtzMTsKICAgICAgICBk MS5rczIgPSBnMWMgKiBkMi5rczIgKyBiZXRhICogZDEua3MyOwogICAgICAgIGdzMCA9IGdzOwog ICAgICAgIGdyMSA9IGdyMjsKCiAgICB9CiAgICByZXR1cm4gZ3M7Cgp9CiMgMjM4OSAieDIuY2Mi CnZvaWQga2xpc2ljKCBLUyYgeCwgY29uc3QgTWF0cmljZXMmIG1hdCApCnsKICAgIGNvbnN0IGRv dWJsZSBmID0gMjsKICAgIEtTIHgxID0geDsKICAgIEhhbWlsIGgwID0gaGFtaWx0b24oIHgsIG1h dCApOwogICAgZm9yKCBpbnQgaT0wOyBpPDM7ICsraSApIHsKICAgICAgICBIYW1pbCBoID0gaGFt aWx0b24oIHgsIG1hdCApOwogICAgICAgIGhhbWlsMmtzKCBoLCB4MSwgbWF0ICk7CgogICAgICAg IGgwLmgxID0gaDAuaDEgKiAoMS1mKSArIGguaDEgKiBmOwogICAgICAgIGgwLmgyID0gaDAuaDIg KiAoMS1mKSArIGguaDIgKiBmOwogICAgICAgIHggPSBrc2xpbl9wdXJlKCB4LCB4MSwgbWF0LCAx LWYsIGYsIGgwICk7CiAgICB9Cn0K