From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 From: Jered Floyd To: git-commits@fedoraproject.org Subject: [rpms/trafficserver] trafficserver-9.2.14-1: Update to 9.1.3, resolves CVE-2022-25763, CVE-2022-31779, CVE-2021-37150, CVE-2022-28129, CVE-2022-31780 Date: Wed, 15 Jul 2026 17:21:14 GMT Message-ID: <178413607490.1.12415469065908152602.rpms-trafficserver-2d887c1d7b1f@fedoraproject.org> List-ID: X-Git-Repo: rpms/trafficserver X-Git-Branch: trafficserver-9.2.14-1 X-Git-Rev: 2d887c1d7b1f6cb8c757e333cc756281b87e0738 ICAgICAgICAgICAgQSBuZXcgY29tbWl0IGhhcyBiZWVuIHB1c2hlZC4KCiAgICAgICAgICAgIFJl cG8gICA6IHJwbXMvdHJhZmZpY3NlcnZlcgogICAgICAgICAgICBCcmFuY2ggOiB0cmFmZmljc2Vy dmVyLTkuMi4xNC0xCiAgICAgICAgICAgIENvbW1pdCA6IDJkODg3YzFkN2IxZjZjYjhjNzU3ZTMz M2NjNzU2MjgxYjg3ZTA3MzgKICAgICAgICAgICAgQXV0aG9yIDogSmVyZWQgRmxveWQgPGplcmVk QHJlZGhhdC5jb20+CiAgICAgICAgICAgIERhdGUgICA6IDIwMjItMDgtMTFUMTg6MTQ6NDErMDA6 MDAKICAgICAgICAgICAgU3RhdHMgIDogKzU3Ly0xODA3OCBpbiA3IGZpbGUocykKICAgICAgICAg ICAgVVJMICAgIDogaHR0cHM6Ly9zcmMuZmVkb3JhcHJvamVjdC5vcmcvcnBtcy90cmFmZmljc2Vy dmVyL2MvMmQ4ODdjMWQ3YjFmNmNiOGM3NTdlMzMzY2M3NTYyODFiODdlMDczOD9icmFuY2g9dHJh ZmZpY3NlcnZlci05LjIuMTQtMQoKICAgICAgICAgICAgTG9nOgogICAgICAgICAgICBVcGRhdGUg dG8gOS4xLjMsIHJlc29sdmVzIENWRS0yMDIyLTI1NzYzLCBDVkUtMjAyMi0zMTc3OSwgQ1ZFLTIw MjEtMzcxNTAsIENWRS0yMDIyLTI4MTI5LCBDVkUtMjAyMi0zMTc4MApSZXNvbHZlIGdsaWJjIDIu MzYgKGYzNykgaGVhZGVyIGluY29tcGF0aWJpbGl0eSB0aGF0IGNhdXNlZCBGVEJGUyBSSEJaIzIx MTIyODIKCi0tLQpkaWZmIC0tZ2l0IGEvY2F0Y2guaHBwIGIvY2F0Y2guaHBwCmRlbGV0ZWQgZmls ZSBtb2RlIDEwMDY0NAppbmRleCBkYjFmZWQzLi4wMDAwMDAwCi0tLSBhL2NhdGNoLmhwcAorKysg L2Rldi9udWxsCkBAIC0xLDE3OTY2ICswLDAgQEAKLS8qCi0gKiAgQ2F0Y2ggdjIuMTMuOAotICog IEdlbmVyYXRlZDogMjAyMi0wMS0wMyAyMToyMDowOS41ODk1MDMKLSAqICAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgVGhpcyBm aWxlIGhhcyBiZWVuIG1lcmdlZCBmcm9tIG11bHRpcGxlIGhlYWRlcnMuIFBsZWFzZSBkb24ndCBl ZGl0IGl0IGRpcmVjdGx5Ci0gKiAgQ29weXJpZ2h0IChjKSAyMDIyIFR3byBCbHVlIEN1YmVzIEx0 ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJv b3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotICog IGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElD RU5TRV8xXzAudHh0KQotICovCi0jaWZuZGVmIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9D QVRDSF9IUFBfSU5DTFVERUQKLSNkZWZpbmUgVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NB VENIX0hQUF9JTkNMVURFRAotLy8gc3RhcnQgY2F0Y2guaHBwCi0KLQotI2RlZmluZSBDQVRDSF9W RVJTSU9OX01BSk9SIDIKLSNkZWZpbmUgQ0FUQ0hfVkVSU0lPTl9NSU5PUiAxMwotI2RlZmluZSBD QVRDSF9WRVJTSU9OX1BBVENIIDgKLQotI2lmZGVmIF9fY2xhbmdfXwotIyAgICBwcmFnbWEgY2xh bmcgc3lzdGVtX2hlYWRlcgotI2VsaWYgZGVmaW5lZCBfX0dOVUNfXwotIyAgICBwcmFnbWEgR0ND IHN5c3RlbV9oZWFkZXIKLSNlbmRpZgotCi0vLyBzdGFydCBjYXRjaF9zdXBwcmVzc193YXJuaW5n cy5oCi0KLSNpZmRlZiBfX2NsYW5nX18KLSMgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMg dGhlIF9fY2xhbmdfXyBtYWNybwotIyAgICAgICBwcmFnbWEgd2FybmluZyhwdXNoKQotIyAgICAg ICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiAxNjEgMTY4MikKLSMgICBlbHNlIC8vIF9fSUNDCi0j ICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSMgICAgICAgcHJhZ21hIGNsYW5n IGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCi0jICAgICAgIHByYWdtYSBjbGFuZyBkaWFn bm9zdGljIGlnbm9yZWQgIi1Xc3dpdGNoLWVudW0iCi0jICAgICAgIHByYWdtYSBjbGFuZyBkaWFn bm9zdGljIGlnbm9yZWQgIi1XY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCIKLSMgICAgZW5kaWYKLSNl bGlmIGRlZmluZWQgX19HTlVDX18KLSAgICAgLy8gQmVjYXVzZSBSRVFVSVJFcyB0cmlnZ2VyIEdD QydzIC1XcGFyZW50aGVzZXMsIGFuZCBiZWNhdXNlIHN0aWxsCi0gICAgIC8vIHN1cHBvcnRlZCB2 ZXJzaW9uIG9mIGcrKyBoYXZlIG9ubHkgYnVnZ3kgc3VwcG9ydCBmb3IgX1ByYWdtYXMsCi0gICAg IC8vIFdwYXJlbnRoZXNlcyBoYXZlIHRvIGJlIHN1cHByZXNzZWQgZ2xvYmFsbHkuCi0jICAgIHBy YWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhcmVudGhlc2VzIiAvLyBTZWUgIzY3NCBm b3IgZGV0YWlscwotCi0jICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0jICAgIHByYWdt YSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKLSMgICAgcHJhZ21h IEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgotI2VuZGlmCi0vLyBlbmQgY2F0Y2hf c3VwcHJlc3Nfd2FybmluZ3MuaAotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX01BSU4pIHx8IGRl ZmluZWQoQ0FUQ0hfQ09ORklHX1JVTk5FUikKLSMgIGRlZmluZSBDQVRDSF9JTVBMCi0jICBkZWZp bmUgQ0FUQ0hfQ09ORklHX0FMTF9QQVJUUwotI2VuZGlmCi0KLS8vIEluIHRoZSBpbXBsIGZpbGUs IHdlIHdhbnQgdG8gaGF2ZSBhY2Nlc3MgdG8gYWxsIHBhcnRzIG9mIHRoZSBoZWFkZXJzCi0vLyBD YW4gYWxzbyBiZSB1c2VkIHRvIHNhbmVseSBzdXBwb3J0IFBDSHMKLSNpZiBkZWZpbmVkKENBVENI X0NPTkZJR19BTExfUEFSVFMpCi0jICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0VYVEVSTkFMX0lOVEVS RkFDRVMKLSMgIGlmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMpCi0jICAg IHVuZGVmIENBVENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJTCi0jICBlbmRpZgotIyAgaWYgIWRl ZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9DSFJPTk9fU1RSSU5HTUFLRVIpCi0jICAgIGRlZmlu ZSBDQVRDSF9DT05GSUdfRU5BQkxFX0NIUk9OT19TVFJJTkdNQUtFUgotIyAgZW5kaWYKLSNlbmRp ZgotCi0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0lNUExfT05MWSkKLS8vIHN0YXJ0IGNhdGNo X3BsYXRmb3JtLmgKLQotLy8gU2VlIGUuZy46Ci0vLyBodHRwczovL29wZW5zb3VyY2UuYXBwbGUu Y29tL3NvdXJjZS9DYXJib25IZWFkZXJzL0NhcmJvbkhlYWRlcnMtMTguMS9UYXJnZXRDb25kaXRp b25hbHMuaC5hdXRvLmh0bWwKLSNpZmRlZiBfX0FQUExFX18KLSMgIGluY2x1ZGUgPFRhcmdldENv bmRpdGlvbmFscy5oPgotIyAgaWYgKGRlZmluZWQoVEFSR0VUX09TX09TWCkgJiYgVEFSR0VUX09T X09TWCA9PSAxKSB8fCBcCi0gICAgICAoZGVmaW5lZChUQVJHRVRfT1NfTUFDKSAmJiBUQVJHRVRf T1NfTUFDID09IDEpCi0jICAgIGRlZmluZSBDQVRDSF9QTEFURk9STV9NQUMKLSMgIGVsaWYgKGRl ZmluZWQoVEFSR0VUX09TX0lQSE9ORSkgJiYgVEFSR0VUX09TX0lQSE9ORSA9PSAxKQotIyAgICBk ZWZpbmUgQ0FUQ0hfUExBVEZPUk1fSVBIT05FCi0jICBlbmRpZgotCi0jZWxpZiBkZWZpbmVkKGxp bnV4KSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19saW51eF9fKQotIyAgZGVmaW5l IENBVENIX1BMQVRGT1JNX0xJTlVYCi0KLSNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQo X19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVm aW5lZChfX01JTkdXMzJfXykKLSMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9XSU5ET1dTCi0jZW5k aWYKLQotLy8gZW5kIGNhdGNoX3BsYXRmb3JtLmgKLQotI2lmZGVmIENBVENIX0lNUEwKLSMgIGlm bmRlZiBDTEFSQV9DT05GSUdfTUFJTgotIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU5fTk9U X0RFRklORUQKLSMgICAgZGVmaW5lIENMQVJBX0NPTkZJR19NQUlOCi0jICBlbmRpZgotI2VuZGlm Ci0KLS8vIHN0YXJ0IGNhdGNoX3VzZXJfaW50ZXJmYWNlcy5oCi0KLW5hbWVzcGFjZSBDYXRjaCB7 Ci0gICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKTsKLX0KLQotLy8gZW5kIGNhdGNoX3VzZXJfaW50 ZXJmYWNlcy5oCi0vLyBzdGFydCBjYXRjaF90YWdfYWxpYXNfYXV0b3JlZ2lzdHJhci5oCi0KLS8v IHN0YXJ0IGNhdGNoX2NvbW1vbi5oCi0KLS8vIHN0YXJ0IGNhdGNoX2NvbXBpbGVyX2NhcGFiaWxp dGllcy5oCi0KLS8vIERldGVjdCBhIG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIGJ5IGNv bXBpbGVyCi0vLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgotLy8KLS8vIENB VENIX0NPTkZJR19DT1VOVEVSIDogaXMgdGhlIF9fQ09VTlRFUl9fIG1hY3JvIHN1cHBvcnRlZD8K LS8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCA6IGlzIFdpbmRvd3MgU0VIIHN1cHBvcnRlZD8K LS8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTIDogYXJlIFBPU0lYIHNpZ25hbHMgc3VwcG9y dGVkPwotLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUyA6IEFyZSBleGNlcHRpb25z IGVuYWJsZWQ/Ci0vLyAqKioqKioqKioqKioqKioqCi0vLyBOb3RlIHRvIG1haW50YWluZXJzOiBp ZiBuZXcgdG9nZ2xlcyBhcmUgYWRkZWQgcGxlYXNlIGRvY3VtZW50IHRoZW0KLS8vIGluIGNvbmZp Z3VyYXRpb24ubWQsIHRvbwotLy8gKioqKioqKioqKioqKioqKgotCi0vLyBJbiBnZW5lcmFsIGVh Y2ggbWFjcm8gaGFzIGEgX05PXzxmZWF0dXJlIG5hbWU+IGZvcm0KLS8vIChlLmcuIENBVENIX0NP TkZJR19OT19QT1NJWF9TSUdOQUxTKSB3aGljaCBkaXNhYmxlcyB0aGUgZmVhdHVyZS4KLS8vIE1h bnkgZmVhdHVyZXMsIGF0IHBvaW50IG9mIGRldGVjdGlvbiwgZGVmaW5lIGFuIF9JTlRFUk5BTF8g bWFjcm8sIHNvIHRoZXkKLS8vIGNhbiBiZSBjb21iaW5lZCwgZW4tbWFzcywgd2l0aCB0aGUgX05P XyBmb3JtcyBsYXRlci4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSMgIGlmIChfX2NwbHVzcGx1 cyA+PSAyMDE0MDJMKSB8fCAoZGVmaW5lZChfTVNWQ19MQU5HKSAmJiBfTVNWQ19MQU5HID49IDIw MTQwMkwpCi0jICAgIGRlZmluZSBDQVRDSF9DUFAxNF9PUl9HUkVBVEVSCi0jICBlbmRpZgotCi0j ICBpZiAoX19jcGx1c3BsdXMgPj0gMjAxNzAzTCkgfHwgKGRlZmluZWQoX01TVkNfTEFORykgJiYg X01TVkNfTEFORyA+PSAyMDE3MDNMKQotIyAgICBkZWZpbmUgQ0FUQ0hfQ1BQMTdfT1JfR1JFQVRF UgotIyAgZW5kaWYKLQotI2VuZGlmCi0KLS8vIE9ubHkgR0NDIGNvbXBpbGVyIHNob3VsZCBiZSB1 c2VkIGluIHRoaXMgYmxvY2ssIHNvIG90aGVyIGNvbXBpbGVycyB0cnlpbmcgdG8KLS8vIG1hc2sg dGhlbXNlbHZlcyBhcyBHQ0Mgc2hvdWxkIGJlIGlnbm9yZWQuCi0jaWYgZGVmaW5lZChfX0dOVUNf XykgJiYgIWRlZmluZWQoX19jbGFuZ19fKSAmJiAhZGVmaW5lZChfX0lDQykgJiYgIWRlZmluZWQo X19DVURBQ0NfXykgJiYgIWRlZmluZWQoX19MQ0NfXykKLSMgICAgZGVmaW5lIENBVENIX0lOVEVS TkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIF9QcmFnbWEoICJHQ0MgZGlhZ25vc3RpYyBw dXNoIiApCi0jICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNT SU9OICBfUHJhZ21hKCAiR0NDIGRpYWdub3N0aWMgcG9wIiApCi0KLSMgICAgZGVmaW5lIENBVENI X0lOVEVSTkFMX0lHTk9SRV9CVVRfV0FSTiguLi4pICh2b2lkKV9fYnVpbHRpbl9jb25zdGFudF9w KF9fVkFfQVJHU19fKQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotCi0jICAg IGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBfUHJhZ21h KCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApCi0jICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9T VE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3Ai ICkKLQotLy8gQXMgb2YgdGhpcyB3cml0aW5nLCBJQk0gWEwncyBpbXBsZW1lbnRhdGlvbiBvZiBf X2J1aWx0aW5fY29uc3RhbnRfcCBoYXMgYSBidWcKLS8vIHdoaWNoIHJlc3VsdHMgaW4gY2FsbHMg dG8gZGVzdHJ1Y3RvcnMgYmVpbmcgZW1pdHRlZCBmb3IgZWFjaCB0ZW1wb3JhcnksCi0vLyB3aXRo b3V0IGEgbWF0Y2hpbmcgaW5pdGlhbGl6YXRpb24uIEluIHByYWN0aWNlLCB0aGlzIGNhbiByZXN1 bHQgaW4gc29tZXRoaW5nCi0vLyBsaWtlIGBzdGQ6OnN0cmluZzo6fnN0cmluZ2AgYmVpbmcgY2Fs bGVkIG9uIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuCi0vLwotLy8gRm9yIGV4YW1wbGUsIHRoaXMg Y29kZSB3aWxsIGxpa2VseSBzZWdmYXVsdCB1bmRlciBJQk0gWEw6Ci0vLyBgYGAKLS8vIFJFUVVJ UkUoc3RkOjpzdHJpbmcoIjEyIikgKyAiMzQiID09ICIxMjM0IikKLS8vIGBgYAotLy8KLS8vIFRo ZXJlZm9yZSwgYENBVENIX0lOVEVSTkFMX0lHTk9SRV9CVVRfV0FSTmAgaXMgbm90IGltcGxlbWVu dGVkLgotIyAgaWYgIWRlZmluZWQoX19pYm14bF9fKSAmJiAhZGVmaW5lZChfX0NVREFDQ19fKQot IyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfSUdOT1JFX0JVVF9XQVJOKC4uLikgKHZvaWQpX19i dWlsdGluX2NvbnN0YW50X3AoX19WQV9BUkdTX18pIC8qIE5PTElOVChjcHBjb3JlZ3VpZGVsaW5l cy1wcm8tdHlwZS12YXJhcmcsIGhpY3BwLXZhcmFyZykgKi8KLSMgIGVuZGlmCi0KLSMgICAgZGVm aW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAotICAgICAgICAg X1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZXhpdC10aW1lLWRlc3RydWN0 b3JzXCIiICkgXAotICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBc Ii1XZ2xvYmFsLWNvbnN0cnVjdG9yc1wiIikKLQotIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxf U1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAotICAgICAgICAgX1ByYWdtYSggImNsYW5n IGRpYWdub3N0aWMgaWdub3JlZCBcIi1XcGFyZW50aGVzZXNcIiIgKQotCi0jICAgIGRlZmluZSBD QVRDSF9JTlRFUk5BTF9TVVBQUkVTU19VTlVTRURfV0FSTklOR1MgXAotICAgICAgICAgX1ByYWdt YSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XdW51c2VkLXZhcmlhYmxlXCIiICkKLQot IyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfWkVST19WQVJJQURJQ19XQVJOSU5H UyBcCi0gICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdnbnUt emVyby12YXJpYWRpYy1tYWNyby1hcmd1bWVudHNcIiIgKQotCi0jICAgIGRlZmluZSBDQVRDSF9J TlRFUk5BTF9TVVBQUkVTU19VTlVTRURfVEVNUExBVEVfV0FSTklOR1MgXAotICAgICAgICAgX1By YWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XdW51c2VkLXRlbXBsYXRlXCIiICkK LQotI2VuZGlmIC8vIF9fY2xhbmdfXwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQXNz dW1lIHRoYXQgbm9uLVdpbmRvd3MgcGxhdGZvcm1zIHN1cHBvcnQgcG9zaXggc2lnbmFscyBieSBk ZWZhdWx0Ci0jaWYgIWRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fV0lORE9XUykKLSAgICAjZGVmaW5l IENBVENIX0lOVEVSTkFMX0NPTkZJR19QT1NJWF9TSUdOQUxTCi0jZW5kaWYKLQotLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8KLS8vIFdlIGtub3cgc29tZSBlbnZpcm9ubWVudHMgbm90IHRvIHN1cHBv cnQgZnVsbCBQT1NJWCBzaWduYWxzCi0jaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVk KF9fUU5YX18pIHx8IGRlZmluZWQoX19FTVNDUklQVEVOX18pIHx8IGRlZmluZWQoX19ESkdQUF9f KQotICAgICNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMKLSNl bmRpZgotCi0jaWZkZWYgX19PUzQwMF9fCi0jICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9D T05GSUdfTk9fUE9TSVhfU0lHTkFMUwotIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9V Ul9OT05FCi0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEFuZHJvaWQgc29t ZWhvdyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IHN0ZDo6dG9fc3RyaW5nCi0jaWYgZGVmaW5lZChf X0FORFJPSURfXykKLSMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19DUFAxMV9U T19TVFJJTkcKLSMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19BTkRST0lEX0xPR1dS SVRFCi0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE5vdCBhbGwgV2luZG93 cyBlbnZpcm9ubWVudHMgc3VwcG9ydCBTRUggcHJvcGVybHkKLSNpZiBkZWZpbmVkKF9fTUlOR1cz Ml9fKQotIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1dJTkRPV1NfU0VICi0j ZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFBTNAotI2lmIGRlZmluZWQoX19P UkJJU19fKQotIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX05FV19DQVBUVVJF Ci0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEN5Z3dpbgotI2lmZGVmIF9f Q1lHV0lOX18KLQotLy8gUmVxdWlyZWQgZm9yIHNvbWUgdmVyc2lvbnMgb2YgQ3lnd2luIHRvIGRl Y2xhcmUgZ2V0dGltZW9mZGF5Ci0vLyBzZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVz dGlvbnMvMzY5MDE4MDMvZ2V0dGltZW9mZGF5LW5vdC1kZWNsYXJlZC1pbi10aGlzLXNjb3BlLWN5 Z3dpbgotIyAgIGRlZmluZSBfQlNEX1NPVVJDRQotLy8gc29tZSB2ZXJzaW9ucyBvZiBjeWd3aW4g KG1vc3QpIGRvIG5vdCBzdXBwb3J0IHN0ZDo6dG9fc3RyaW5nLiBVc2UgdGhlIGxpYnN0ZCBjaGVj ay4KLS8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC44LjIvbGlic3RkYysr L2FwaS9hMDEwNTNfc291cmNlLmh0bWwgbGluZSAyODEyLTI4MTMKLSMgaWYgISgoX19jcGx1c3Bs dXMgPj0gMjAxMTAzTCkgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5KSBcCi0gICAgICAgICAg ICYmICFkZWZpbmVkKF9HTElCQ1hYX0hBVkVfQlJPS0VOX1ZTV1BSSU5URikpCi0KLSMgICAgZGVm aW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19DUFAxMV9UT19TVFJJTkcKLQotIyBlbmRpZgot I2VuZGlmIC8vIF9fQ1lHV0lOX18KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZpc3Vh bCBDKysKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotCi0vLyBVbml2ZXJzYWwgV2luZG93cyBwbGF0 Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IFNFSAotLy8gT3IgY29uc29sZSBjb2xvdXJzIChvciBjb25z b2xlIGF0IGFsbC4uLikKLSMgIGlmIGRlZmluZWQoV0lOQVBJX0ZBTUlMWSkgJiYgKFdJTkFQSV9G QU1JTFkgPT0gV0lOQVBJX0ZBTUlMWV9BUFApCi0jICAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09M T1VSX05PTkUKLSMgIGVsc2UKLSMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5E T1dTX1NFSAotIyAgZW5kaWYKLQotIyAgaWYgIWRlZmluZWQoX19jbGFuZ19fKSAvLyBIYW5kbGUg Q2xhbmcgbWFzcXVlcmFkaW5nIGZvciBtc3ZjCi0KLS8vIE1TVkMgdHJhZGl0aW9uYWwgcHJlcHJv Y2Vzc29yIG5lZWRzIHNvbWUgd29ya2Fyb3VuZCBmb3IgX19WQV9BUkdTX18KLS8vIF9NU1ZDX1RS QURJVElPTkFMID09IDAgbWVhbnMgbmV3IGNvbmZvcm1hbnQgcHJlcHJvY2Vzc29yCi0vLyBfTVNW Q19UUkFESVRJT05BTCA9PSAxIG1lYW5zIG9sZCB0cmFkaXRpb25hbCBub24tY29uZm9ybWFudCBw cmVwcm9jZXNzb3IKLSMgICAgaWYgIWRlZmluZWQoX01TVkNfVFJBRElUSU9OQUwpIHx8IChkZWZp bmVkKF9NU1ZDX1RSQURJVElPTkFMKSAmJiBfTVNWQ19UUkFESVRJT05BTCkKLSMgICAgICBkZWZp bmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09SCi0j ICAgIGVuZGlmIC8vIE1TVkNfVFJBRElUSU9OQUwKLQotLy8gT25seSBkbyB0aGlzIGlmIHdlJ3Jl IG5vdCB1c2luZyBjbGFuZyBvbiBXaW5kb3dzLCB3aGljaCB1c2VzIGBkaWFnbm9zdGljIHB1c2hg ICYgYGRpYWdub3N0aWMgcG9wYAotIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FS TklOR1NfU1VQUFJFU1NJT04gX19wcmFnbWEoIHdhcm5pbmcocHVzaCkgKQotIyAgICBkZWZpbmUg Q0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTiAgX19wcmFnbWEoIHdhcm5p bmcocG9wKSApCi0jICBlbmRpZiAvLyBfX2NsYW5nX18KLQotI2VuZGlmIC8vIF9NU0NfVkVSCi0K LSNpZiBkZWZpbmVkKF9SRUVOVFJBTlQpIHx8IGRlZmluZWQoX01TQ19WRVIpCi0vLyBFbmFibGUg YXN5bmMgcHJvY2Vzc2luZywgYXMgLXB0aHJlYWQgaXMgc3BlY2lmaWVkIG9yIG5vIGFkZGl0aW9u YWwgbGlua2luZyBpcyByZXF1aXJlZAotIyBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1VT RV9BU1lOQwotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0v LyBDaGVjayBpZiB3ZSBhcmUgY29tcGlsZWQgd2l0aCAtZm5vLWV4Y2VwdGlvbnMgb3IgZXF1aXZh bGVudAotI2lmIGRlZmluZWQoX19FWENFUFRJT05TKSB8fCBkZWZpbmVkKF9fY3BwX2V4Y2VwdGlv bnMpIHx8IGRlZmluZWQoX0NQUFVOV0lORCkKLSMgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05G SUdfRVhDRVBUSU9OU19FTkFCTEVECi0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8K LS8vIERKR1BQCi0jaWZkZWYgX19ESkdQUF9fCi0jICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09O RklHX05PX1dDSEFSCi0jZW5kaWYgLy8gX19ESkdQUF9fCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vCi0vLyBFbWJhcmNhZGVybyBDKytCdWlsZAotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQot ICAgICNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1BPTFlGSUxMX0lTTkFOCi0jZW5kaWYK LQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gVXNlIG9mIF9fQ09VTlRFUl9fIGlzIHN1 cHByZXNzZWQgZHVyaW5nIGNvZGUgYW5hbHlzaXMgaW4KLS8vIENMaW9uL0FwcENvZGUgMjAxNy4y LnggYW5kIGZvcm1lciwgYmVjYXVzZSBfX0NPVU5URVJfXyBpcyBub3QgcHJvcGVybHkKLS8vIGhh bmRsZWQgYnkgaXQuCi0vLyBPdGhlcndpc2UgYWxsIHN1cHBvcnRlZCBjb21waWxlcnMgc3VwcG9y dCBDT1VOVEVSIG1hY3JvLAotLy8gYnV0IHVzZXIgc3RpbGwgbWlnaHQgd2FudCB0byB0dXJuIGl0 IG9mZgotI2lmICggIWRlZmluZWQoX19KRVRCUkFJTlNfSURFX18pIHx8IF9fSkVUQlJBSU5TX0lE RV9fID49IDIwMTcwMzAwTCApCi0gICAgI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09V TlRFUgotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIFJUWCBpcyBhIHNw ZWNpYWwgdmVyc2lvbiBvZiBXaW5kb3dzIHRoYXQgaXMgcmVhbCB0aW1lLgotLy8gVGhpcyBtZWFu cyB0aGF0IGl0IGlzIGRldGVjdGVkIGFzIFdpbmRvd3MsIGJ1dCBkb2VzIG5vdCBwcm92aWRlCi0v LyB0aGUgc2FtZSBzZXQgb2YgY2FwYWJpbGl0aWVzIGFzIHJlYWwgV2luZG93cyBkb2VzLgotI2lm IGRlZmluZWQoVU5ERVJfUlRTUykgfHwgZGVmaW5lZChSVFg2NF9CVUlMRCkKLSAgICAjZGVmaW5l IENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19XSU5ET1dTX1NFSAotICAgICNkZWZpbmUgQ0FUQ0hf SU5URVJOQUxfQ09ORklHX05PX0FTWU5DCi0gICAgI2RlZmluZSBDQVRDSF9DT05GSUdfQ09MT1VS X05PTkUKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMSkK LSNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0dMT0JBTF9ORVhUQUZURVIKLSNlbmRpZgot Ci0vLyBWYXJpb3VzIHN0ZGxpYiBzdXBwb3J0IGNoZWNrcyB0aGF0IHJlcXVpcmUgX19oYXNfaW5j bHVkZQotI2lmIGRlZmluZWQoX19oYXNfaW5jbHVkZSkKLSAgLy8gQ2hlY2sgaWYgc3RyaW5nX3Zp ZXcgaXMgYXZhaWxhYmxlIGFuZCB1c2FibGUKLSAgI2lmIF9faGFzX2luY2x1ZGUoPHN0cmluZ192 aWV3PikgJiYgZGVmaW5lZChDQVRDSF9DUFAxN19PUl9HUkVBVEVSKQotICAjICAgIGRlZmluZSBD QVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTdfU1RSSU5HX1ZJRVcKLSAgI2VuZGlmCi0KLSAgLy8g Q2hlY2sgaWYgb3B0aW9uYWwgaXMgYXZhaWxhYmxlIGFuZCB1c2FibGUKLSAgIyAgaWYgX19oYXNf aW5jbHVkZSg8b3B0aW9uYWw+KSAmJiBkZWZpbmVkKENBVENIX0NQUDE3X09SX0dSRUFURVIpCi0g ICMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxN19PUFRJT05BTAotICAjICBl bmRpZiAvLyBfX2hhc19pbmNsdWRlKDxvcHRpb25hbD4pICYmIGRlZmluZWQoQ0FUQ0hfQ1BQMTdf T1JfR1JFQVRFUikKLQotICAvLyBDaGVjayBpZiBieXRlIGlzIGF2YWlsYWJsZSBhbmQgdXNhYmxl Ci0gICMgIGlmIF9faGFzX2luY2x1ZGUoPGNzdGRkZWY+KSAmJiBkZWZpbmVkKENBVENIX0NQUDE3 X09SX0dSRUFURVIpCi0gICMgICAgaW5jbHVkZSA8Y3N0ZGRlZj4KLSAgIyAgICBpZiBkZWZpbmVk KF9fY3BwX2xpYl9ieXRlKSAmJiAoX19jcHBfbGliX2J5dGUgPiAwKQotICAjICAgICAgZGVmaW5l IENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxN19CWVRFCi0gICMgICAgZW5kaWYKLSAgIyAgZW5k aWYgLy8gX19oYXNfaW5jbHVkZSg8Y3N0ZGRlZj4pICYmIGRlZmluZWQoQ0FUQ0hfQ1BQMTdfT1Jf R1JFQVRFUikKLQotICAvLyBDaGVjayBpZiB2YXJpYW50IGlzIGF2YWlsYWJsZSBhbmQgdXNhYmxl Ci0gICMgIGlmIF9faGFzX2luY2x1ZGUoPHZhcmlhbnQ+KSAmJiBkZWZpbmVkKENBVENIX0NQUDE3 X09SX0dSRUFURVIpCi0gICMgICAgaWYgZGVmaW5lZChfX2NsYW5nX18pICYmIChfX2NsYW5nX21h am9yX18gPCA4KQotICAgICAgICAgLy8gd29yayBhcm91bmQgY2xhbmcgYnVnIHdpdGggbGlic3Rk YysrIGh0dHBzOi8vYnVncy5sbHZtLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NTIKLSAgICAgICAg IC8vIGZpeCBzaG91bGQgYmUgaW4gY2xhbmcgOCwgd29ya2Fyb3VuZCBpbiBsaWJzdGRjKysgOC4y Ci0gICMgICAgICBpbmNsdWRlIDxjaXNvNjQ2PgotICAjICAgICAgaWYgZGVmaW5lZChfX0dMSUJD WFhfXykgJiYgZGVmaW5lZChfR0xJQkNYWF9SRUxFQVNFKSAmJiAoX0dMSUJDWFhfUkVMRUFTRSA8 IDkpCi0gICMgICAgICAgIGRlZmluZSBDQVRDSF9DT05GSUdfTk9fQ1BQMTdfVkFSSUFOVAotICAj ICAgICAgZWxzZQotICAjICAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDE3 X1ZBUklBTlQKLSAgIyAgICAgIGVuZGlmIC8vIGRlZmluZWQoX19HTElCQ1hYX18pICYmIGRlZmlu ZWQoX0dMSUJDWFhfUkVMRUFTRSkgJiYgKF9HTElCQ1hYX1JFTEVBU0UgPCA5KQotICAjICAgIGVs c2UKLSAgIyAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTdfVkFSSUFOVAot ICAjICAgIGVuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKSAmJiAoX19jbGFuZ19tYWpvcl9fIDwg OCkKLSAgIyAgZW5kaWYgLy8gX19oYXNfaW5jbHVkZSg8dmFyaWFudD4pICYmIGRlZmluZWQoQ0FU Q0hfQ1BQMTdfT1JfR1JFQVRFUikKLSNlbmRpZiAvLyBkZWZpbmVkKF9faGFzX2luY2x1ZGUpCi0K LSNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DT1VOVEVSKSAmJiAhZGVmaW5lZChD QVRDSF9DT05GSUdfTk9fQ09VTlRFUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NPVU5URVIp Ci0jICAgZGVmaW5lIENBVENIX0NPTkZJR19DT1VOVEVSCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENB VENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklH X05PX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfV0lORE9XU19TRUgpICYm ICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19OT19XSU5ET1dTX1NFSCkKLSMgICBkZWZp bmUgQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VICi0jZW5kaWYKLS8vIFRoaXMgaXMgc2V0IGJ5IGRl ZmF1bHQsIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdW5peCBjb21waWxlcnMgYXJlIHBvc2l4LXNp Z25hbC1jb21wYXRpYmxlIGJ5IGRlZmF1bHQuCi0jaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9D T05GSUdfUE9TSVhfU0lHTkFMUykgJiYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05P X1BPU0lYX1NJR05BTFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19QT1NJWF9TSUdOQUxT KSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKLSMgICBkZWZpbmUgQ0FU Q0hfQ09ORklHX1BPU0lYX1NJR05BTFMKLSNlbmRpZgotLy8gVGhpcyBpcyBzZXQgYnkgZGVmYXVs dCwgYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCBjb21waWxlcnMgd2l0aCBubyB3Y2hhcl90IHN1cHBv cnQgYXJlIGp1c3QgcmFyZSBleGNlcHRpb25zLgotI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFM X0NPTkZJR19OT19XQ0hBUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dDSEFSKSAmJiAh ZGVmaW5lZChDQVRDSF9DT05GSUdfV0NIQVIpCi0jICAgZGVmaW5lIENBVENIX0NPTkZJR19XQ0hB UgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fQ1BQMTFf VE9fU1RSSU5HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTFfVE9fU1RSSU5HKSAm JiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVE9fU1RSSU5HKQotIyAgICBkZWZpbmUgQ0FU Q0hfQ09ORklHX0NQUDExX1RPX1NUUklORwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENBVENIX0lO VEVSTkFMX0NPTkZJR19DUFAxN19PUFRJT05BTCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05P X0NQUDE3X09QVElPTkFMKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTdfT1BUSU9OQUwp Ci0jICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDE3X09QVElPTkFMCi0jZW5kaWYKLQotI2lmIGRl ZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDE3X1NUUklOR19WSUVXKSAmJiAhZGVmaW5l ZChDQVRDSF9DT05GSUdfTk9fQ1BQMTdfU1RSSU5HX1ZJRVcpICYmICFkZWZpbmVkKENBVENIX0NP TkZJR19DUFAxN19TVFJJTkdfVklFVykKLSMgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTdfU1RS SU5HX1ZJRVcKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQ MTdfVkFSSUFOVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDE3X1ZBUklBTlQpICYm ICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxN19WQVJJQU5UKQotIyAgZGVmaW5lIENBVENIX0NP TkZJR19DUFAxN19WQVJJQU5UCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxf Q09ORklHX0NQUDE3X0JZVEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxN19CWVRF KSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTdfQllURSkKLSMgIGRlZmluZSBDQVRDSF9D T05GSUdfQ1BQMTdfQllURQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FWFBF UklNRU5UQUxfUkVESVJFQ1QpCi0jICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05FV19D QVBUVVJFCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05FV19D QVBUVVJFKSAmJiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fTkVXX0NBUFRVUkUp ICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19ORVdfQ0FQVFVSRSkgJiYgIWRlZmluZWQoQ0FU Q0hfQ09ORklHX05FV19DQVBUVVJFKQotIyAgZGVmaW5lIENBVENIX0NPTkZJR19ORVdfQ0FQVFVS RQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfRVhDRVBUSU9O U19FTkFCTEVEKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TKQot IyAgZGVmaW5lIENBVENIX0NPTkZJR19ESVNBQkxFX0VYQ0VQVElPTlMKLSNlbmRpZgotCi0jaWYg ZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfUE9MWUZJTExfSVNOQU4pICYmICFkZWZpbmVk KENBVENIX0NPTkZJR19OT19QT0xZRklMTF9JU05BTikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklH X1BPTFlGSUxMX0lTTkFOKQotIyAgZGVmaW5lIENBVENIX0NPTkZJR19QT0xZRklMTF9JU05BTgot I2VuZGlmCi0KLSNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19VU0VfQVNZTkMpICAm JiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fQVNZTkMpICYmICFkZWZpbmVkKENB VENIX0NPTkZJR19OT19VU0VfQVNZTkMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19VU0VfQVNZ TkMpCi0jICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1VTRV9BU1lOQwotI2VuZGlmCi0KLSNpZiBkZWZp bmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19BTkRST0lEX0xPR1dSSVRFKSAmJiAhZGVmaW5lZChD QVRDSF9DT05GSUdfTk9fQU5EUk9JRF9MT0dXUklURSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklH X0FORFJPSURfTE9HV1JJVEUpCi0jICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0FORFJPSURfTE9HV1JJ VEUKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfR0xPQkFMX05F WFRBRlRFUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0dMT0JBTF9ORVhUQUZURVIpICYm ICFkZWZpbmVkKENBVENIX0NPTkZJR19HTE9CQUxfTkVYVEFGVEVSKQotIyAgZGVmaW5lIENBVENI X0NPTkZJR19HTE9CQUxfTkVYVEFGVEVSCi0jZW5kaWYKLQotLy8gRXZlbiBpZiB3ZSBkbyBub3Qg dGhpbmsgdGhlIGNvbXBpbGVyIGhhcyB0aGF0IHdhcm5pbmcsIHdlIHN0aWxsIGhhdmUKLS8vIHRv IHByb3ZpZGUgYSBtYWNybyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBjb2RlLgotI2lmICFkZWZp bmVkKENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OKQotIyAgIGRlZmlu ZSBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTgotI2VuZGlmCi0jaWYg IWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTikKLSMgICBk ZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTgotI2VuZGlmCi0j aWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1Mp Ci0jICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdT Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dB Uk5JTkdTKQotIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5J TkdTCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19VTlVTRURf V0FSTklOR1MpCi0jICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9XQVJO SU5HUwotI2VuZGlmCi0jaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfWkVST19W QVJJQURJQ19XQVJOSU5HUykKLSMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfWkVS T19WQVJJQURJQ19XQVJOSU5HUwotI2VuZGlmCi0KLS8vIFRoZSBnb2FsIG9mIHRoaXMgbWFjcm8g aXMgdG8gYXZvaWQgZXZhbHVhdGlvbiBvZiB0aGUgYXJndW1lbnRzLCBidXQKLS8vIHN0aWxsIGhh dmUgdGhlIGNvbXBpbGVyIHdhcm4gb24gcHJvYmxlbXMgaW5zaWRlLi4uCi0jaWYgIWRlZmluZWQo Q0FUQ0hfSU5URVJOQUxfSUdOT1JFX0JVVF9XQVJOKQotIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5B TF9JR05PUkVfQlVUX1dBUk4oLi4uKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQVBQTEVfXykg JiYgZGVmaW5lZChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXykgJiYgKF9fY2xhbmdfbWFqb3JfXyA8 IDEwKQotIyAgIHVuZGVmIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9URU1QTEFURV9X QVJOSU5HUwotI2VsaWYgZGVmaW5lZChfX2NsYW5nX18pICYmIChfX2NsYW5nX21ham9yX18gPCA1 KQotIyAgIHVuZGVmIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1VOVVNFRF9URU1QTEFURV9XQVJO SU5HUwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19VTlVT RURfVEVNUExBVEVfV0FSTklOR1MpCi0jICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNT X1VOVVNFRF9URU1QTEFURV9XQVJOSU5HUwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENBVENIX0NP TkZJR19ESVNBQkxFX0VYQ0VQVElPTlMpCi0jZGVmaW5lIENBVENIX1RSWSBpZiAoKHRydWUpKQot I2RlZmluZSBDQVRDSF9DQVRDSF9BTEwgaWYgKChmYWxzZSkpCi0jZGVmaW5lIENBVENIX0NBVENI X0FOT04odHlwZSkgaWYgKChmYWxzZSkpCi0jZWxzZQotI2RlZmluZSBDQVRDSF9UUlkgdHJ5Ci0j ZGVmaW5lIENBVENIX0NBVENIX0FMTCBjYXRjaCAoLi4uKQotI2RlZmluZSBDQVRDSF9DQVRDSF9B Tk9OKHR5cGUpIGNhdGNoICh0eXBlKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENBVENIX0lOVEVS TkFMX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUikgJiYgIWRlZmluZWQoQ0FU Q0hfQ09ORklHX05PX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09SKSAmJiAhZGVmaW5lZChD QVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IpCi0jZGVmaW5lIENBVENI X0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgotI2VuZGlmCi0KLS8vIGVuZCBj YXRjaF9jb21waWxlcl9jYXBhYmlsaXRpZXMuaAotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklR VUVfTkFNRV9MSU5FMiggbmFtZSwgbGluZSApIG5hbWUjI2xpbmUKLSNkZWZpbmUgSU5URVJOQUxf Q0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgbGluZSApIElOVEVSTkFMX0NBVENIX1VOSVFV RV9OQU1FX0xJTkUyKCBuYW1lLCBsaW5lICkKLSNpZmRlZiBDQVRDSF9DT05GSUdfQ09VTlRFUgot IyAgZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FU Q0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgX19DT1VOVEVSX18gKQotI2Vsc2UKLSMgIGRlZmlu ZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggbmFtZSApIElOVEVSTkFMX0NBVENIX1VOSVFV RV9OQU1FX0xJTkUoIG5hbWUsIF9fTElORV9fICkKLSNlbmRpZgotCi0jaW5jbHVkZSA8aW9zZndk PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0vLyBXZSBuZWVkIGEg ZHVtbXkgZ2xvYmFsIG9wZXJhdG9yPDwgc28gd2UgY2FuIGJyaW5nIGl0IGludG8gQ2F0Y2ggbmFt ZXNwYWNlIGxhdGVyCi1zdHJ1Y3QgQ2F0Y2hfZ2xvYmFsX25hbWVzcGFjZV9kdW1teSB7fTsKLXN0 ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mLCBDYXRjaF9nbG9iYWxfbmFtZXNw YWNlX2R1bW15KTsKLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBDYXNlU2Vuc2l0 aXZlIHsgZW51bSBDaG9pY2UgewotICAgICAgICBZZXMsCi0gICAgICAgIE5vCi0gICAgfTsgfTsK LQotICAgIGNsYXNzIE5vbkNvcHlhYmxlIHsKLSAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlh YmxlIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlbGV0ZTsKLSAgICAgICAgTm9uQ29weWFibGUo IE5vbkNvcHlhYmxlICYmICkgICAgICAgICAgICAgICAgICA9IGRlbGV0ZTsKLSAgICAgICAgTm9u Q29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSBjb25zdCYgKSA9IGRlbGV0ZTsKLSAg ICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSAmJiApICAgICA9IGRl bGV0ZTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgTm9uQ29weWFibGUoKTsKLSAgICAgICAg dmlydHVhbCB+Tm9uQ29weWFibGUoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IFNvdXJjZUxpbmVJ bmZvIHsKLQotICAgICAgICBTb3VyY2VMaW5lSW5mbygpID0gZGVsZXRlOwotICAgICAgICBTb3Vy Y2VMaW5lSW5mbyggY2hhciBjb25zdCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICkgbm9leGNl cHQKLSAgICAgICAgOiAgIGZpbGUoIF9maWxlICksCi0gICAgICAgICAgICBsaW5lKCBfbGluZSAp Ci0gICAgICAgIHt9Ci0KLSAgICAgICAgU291cmNlTGluZUluZm8oIFNvdXJjZUxpbmVJbmZvIGNv bnN0JiBvdGhlciApICAgICAgICAgICAgPSBkZWZhdWx0OwotICAgICAgICBTb3VyY2VMaW5lSW5m byYgb3BlcmF0b3IgPSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiApICAgICA9IGRlZmF1bHQ7Ci0g ICAgICAgIFNvdXJjZUxpbmVJbmZvKCBTb3VyY2VMaW5lSW5mbyYmICkgICAgICAgICAgICAgIG5v ZXhjZXB0ID0gZGVmYXVsdDsKLSAgICAgICAgU291cmNlTGluZUluZm8mIG9wZXJhdG9yID0gKCBT b3VyY2VMaW5lSW5mbyYmICkgbm9leGNlcHQgPSBkZWZhdWx0OwotCi0gICAgICAgIGJvb2wgZW1w dHkoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBmaWxlWzBdID09ICdcMCc7IH0KLSAgICAgICAg Ym9vbCBvcGVyYXRvciA9PSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IG5v ZXhjZXB0OwotICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYg b3RoZXIgKSBjb25zdCBub2V4Y2VwdDsKLQotICAgICAgICBjaGFyIGNvbnN0KiBmaWxlOwotICAg ICAgICBzdGQ6OnNpemVfdCBsaW5lOwotICAgIH07Ci0KLSAgICBzdGQ6Om9zdHJlYW0mIG9wZXJh dG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKTsK LQotICAgIC8vIEJyaW5nIGluIG9wZXJhdG9yPDwgZnJvbSBnbG9iYWwgbmFtZXNwYWNlIGludG8g Q2F0Y2ggbmFtZXNwYWNlCi0gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgb3Zl cmxvYWQgb2Ygb3BlcmF0b3I8PCBhYm92ZSBtYWtlcwotICAgIC8vIGxvb2t1cCBzdG9wIGF0IG5h bWVzcGFjZSBDYXRjaAotICAgIHVzaW5nIDo6b3BlcmF0b3I8PDsKLQotICAgIC8vIFVzZSB0aGlz IGluIHZhcmlhZGljIHN0cmVhbWluZyBtYWNyb3MgdG8gYWxsb3cKLSAgICAvLyAgICA+PiArU3Ry ZWFtRW5kU3RvcAotICAgIC8vIGFzIHdlbGwgYXMKLSAgICAvLyAgICA+PiBzdHVmZiArU3RyZWFt RW5kU3RvcAotICAgIHN0cnVjdCBTdHJlYW1FbmRTdG9wIHsKLSAgICAgICAgc3RkOjpzdHJpbmcg b3BlcmF0b3IrKCkgY29uc3Q7Ci0gICAgfTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAg IFQgY29uc3QmIG9wZXJhdG9yICsgKCBUIGNvbnN0JiB2YWx1ZSwgU3RyZWFtRW5kU3RvcCApIHsK LSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLX0KLQotI2RlZmluZSBDQVRDSF9JTlRFUk5B TF9MSU5FSU5GTyBcCi0gICAgOjpDYXRjaDo6U291cmNlTGluZUluZm8oIF9fRklMRV9fLCBzdGF0 aWNfY2FzdDxzdGQ6OnNpemVfdD4oIF9fTElORV9fICkgKQotCi0vLyBlbmQgY2F0Y2hfY29tbW9u LmgKLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBzdHJ1Y3QgUmVnaXN0cmFyRm9yVGFnQWxpYXNl cyB7Ci0gICAgICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBj aGFyIGNvbnN0KiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOwotICAgIH07 Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotCi0jZGVmaW5lIENBVENIX1JFR0lTVEVSX1RB R19BTElBUyggYWxpYXMsIHNwZWMgKSBcCi0gICAgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FSTklO R1NfU1VQUFJFU1NJT04gXAotICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FS TklOR1MgXAotICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgSU5U RVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIEF1dG9SZWdpc3RlclRhZ0FsaWFzICkoIGFsaWFzLCBz cGVjLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9IFwKLSAgICBDQVRDSF9JTlRFUk5BTF9T VE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OCi0KLS8vIGVuZCBjYXRjaF90YWdfYWxpYXNfYXV0b3Jl Z2lzdHJhci5oCi0vLyBzdGFydCBjYXRjaF90ZXN0X3JlZ2lzdHJ5LmgKLQotLy8gc3RhcnQgY2F0 Y2hfaW50ZXJmYWNlc190ZXN0Y2FzZS5oCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFj ZSBDYXRjaCB7Ci0KLSAgICBjbGFzcyBUZXN0U3BlYzsKLQotICAgIHN0cnVjdCBJVGVzdEludm9r ZXIgewotICAgICAgICB2aXJ0dWFsIHZvaWQgaW52b2tlICgpIGNvbnN0ID0gMDsKLSAgICAgICAg dmlydHVhbCB+SVRlc3RJbnZva2VyKCk7Ci0gICAgfTsKLQotICAgIGNsYXNzIFRlc3RDYXNlOwot ICAgIHN0cnVjdCBJQ29uZmlnOwotCi0gICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5IHsKLSAg ICAgICAgdmlydHVhbCB+SVRlc3RDYXNlUmVnaXN0cnkoKTsKLSAgICAgICAgdmlydHVhbCBzdGQ6 OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgPSAwOwotICAgICAg ICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHNTb3J0ZWQo IElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKLSAgICB9OwotCi0gICAgYm9vbCBp c1Rocm93U2FmZSggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBJQ29uZmlnIGNvbnN0JiBjb25m aWcgKTsKLSAgICBib29sIG1hdGNoVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0 U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApOwotICAgIHN0ZDo6 dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0 JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29u ZmlnICk7Ci0gICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNT b3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApOwotCi19Ci0KLS8vIGVuZCBjYXRjaF9pbnRl cmZhY2VzX3Rlc3RjYXNlLmgKLS8vIHN0YXJ0IGNhdGNoX3N0cmluZ3JlZi5oCi0KLSNpbmNsdWRl IDxjc3RkZGVmPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3Nmd2Q+Ci0jaW5jbHVk ZSA8Y2Fzc2VydD4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIC8vLyBBIG5vbi1vd25pbmcg c3RyaW5nIGNsYXNzIChzaW1pbGFyIHRvIHRoZSBmb3J0aGNvbWluZyBzdGQ6OnN0cmluZ192aWV3 KQotICAgIC8vLyBOb3RlIHRoYXQsIGJlY2F1c2UgYSBTdHJpbmdSZWYgbWF5IGJlIGEgc3Vic3Ry aW5nIG9mIGFub3RoZXIgc3RyaW5nLAotICAgIC8vLyBpdCBtYXkgbm90IGJlIG51bGwgdGVybWlu YXRlZC4KLSAgICBjbGFzcyBTdHJpbmdSZWYgewotICAgIHB1YmxpYzoKLSAgICAgICAgdXNpbmcg c2l6ZV90eXBlID0gc3RkOjpzaXplX3Q7Ci0gICAgICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0g Y29uc3QgY2hhcio7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3RleHByIGNo YXIgY29uc3QqIGNvbnN0IHNfZW1wdHkgPSAiIjsKLQotICAgICAgICBjaGFyIGNvbnN0KiBtX3N0 YXJ0ID0gc19lbXB0eTsKLSAgICAgICAgc2l6ZV90eXBlIG1fc2l6ZSA9IDA7Ci0KLSAgICBwdWJs aWM6IC8vIGNvbnN0cnVjdGlvbgotICAgICAgICBjb25zdGV4cHIgU3RyaW5nUmVmKCkgbm9leGNl cHQgPSBkZWZhdWx0OwotCi0gICAgICAgIFN0cmluZ1JlZiggY2hhciBjb25zdCogcmF3Q2hhcnMg KSBub2V4Y2VwdDsKLQotICAgICAgICBjb25zdGV4cHIgU3RyaW5nUmVmKCBjaGFyIGNvbnN0KiBy YXdDaGFycywgc2l6ZV90eXBlIHNpemUgKSBub2V4Y2VwdAotICAgICAgICA6ICAgbV9zdGFydCgg cmF3Q2hhcnMgKSwKLSAgICAgICAgICAgIG1fc2l6ZSggc2l6ZSApCi0gICAgICAgIHt9Ci0KLSAg ICAgICAgU3RyaW5nUmVmKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RkU3RyaW5nICkgbm9leGNlcHQK LSAgICAgICAgOiAgIG1fc3RhcnQoIHN0ZFN0cmluZy5jX3N0cigpICksCi0gICAgICAgICAgICBt X3NpemUoIHN0ZFN0cmluZy5zaXplKCkgKQotICAgICAgICB7fQotCi0gICAgICAgIGV4cGxpY2l0 IG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6 c3RyaW5nKG1fc3RhcnQsIG1fc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgIHB1YmxpYzogLy8gb3Bl cmF0b3JzCi0gICAgICAgIGF1dG8gb3BlcmF0b3IgPT0gKCBTdHJpbmdSZWYgY29uc3QmIG90aGVy ICkgY29uc3Qgbm9leGNlcHQgLT4gYm9vbDsKLSAgICAgICAgYXV0byBvcGVyYXRvciAhPSAoU3Ry aW5nUmVmIGNvbnN0JiBvdGhlcikgY29uc3Qgbm9leGNlcHQgLT4gYm9vbCB7Ci0gICAgICAgICAg ICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIG9w ZXJhdG9yW10gKCBzaXplX3R5cGUgaW5kZXggKSBjb25zdCBub2V4Y2VwdCAtPiBjaGFyIHsKLSAg ICAgICAgICAgIGFzc2VydChpbmRleCA8IG1fc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbV9z dGFydFtpbmRleF07Ci0gICAgICAgIH0KLQotICAgIHB1YmxpYzogLy8gbmFtZWQgcXVlcmllcwot ICAgICAgICBjb25zdGV4cHIgYXV0byBlbXB0eSgpIGNvbnN0IG5vZXhjZXB0IC0+IGJvb2wgewot ICAgICAgICAgICAgcmV0dXJuIG1fc2l6ZSA9PSAwOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0 ZXhwciBhdXRvIHNpemUoKSBjb25zdCBub2V4Y2VwdCAtPiBzaXplX3R5cGUgewotICAgICAgICAg ICAgcmV0dXJuIG1fc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHVybnMgdGhlIGN1 cnJlbnQgc3RhcnQgcG9pbnRlci4gSWYgdGhlIFN0cmluZ1JlZiBpcyBub3QKLSAgICAgICAgLy8g bnVsbC10ZXJtaW5hdGVkLCB0aHJvd3Mgc3RkOjpkb21haW5fZXhjZXB0aW9uCi0gICAgICAgIGF1 dG8gY19zdHIoKSBjb25zdCAtPiBjaGFyIGNvbnN0KjsKLQotICAgIHB1YmxpYzogLy8gc3Vic3Ry aW5ncyBhbmQgc2VhcmNoZXMKLSAgICAgICAgLy8gUmV0dXJucyBhIHN1YnN0cmluZyBvZiBbc3Rh cnQsIHN0YXJ0ICsgbGVuZ3RoKS4KLSAgICAgICAgLy8gSWYgc3RhcnQgKyBsZW5ndGggPiBzaXpl KCksIHRoZW4gdGhlIHN1YnN0cmluZyBpcyBbc3RhcnQsIHNpemUoKSkuCi0gICAgICAgIC8vIElm IHN0YXJ0ID4gc2l6ZSgpLCB0aGVuIHRoZSBzdWJzdHJpbmcgaXMgZW1wdHkuCi0gICAgICAgIGF1 dG8gc3Vic3RyKCBzaXplX3R5cGUgc3RhcnQsIHNpemVfdHlwZSBsZW5ndGggKSBjb25zdCBub2V4 Y2VwdCAtPiBTdHJpbmdSZWY7Ci0KLSAgICAgICAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBzdGFy dCBwb2ludGVyLiBNYXkgbm90IGJlIG51bGwtdGVybWluYXRlZC4KLSAgICAgICAgYXV0byBkYXRh KCkgY29uc3Qgbm9leGNlcHQgLT4gY2hhciBjb25zdCo7Ci0KLSAgICAgICAgY29uc3RleHByIGF1 dG8gaXNOdWxsVGVybWluYXRlZCgpIGNvbnN0IG5vZXhjZXB0IC0+IGJvb2wgewotICAgICAgICAg ICAgcmV0dXJuIG1fc3RhcnRbbV9zaXplXSA9PSAnXDAnOwotICAgICAgICB9Ci0KLSAgICBwdWJs aWM6IC8vIGl0ZXJhdG9ycwotICAgICAgICBjb25zdGV4cHIgY29uc3RfaXRlcmF0b3IgYmVnaW4o KSBjb25zdCB7IHJldHVybiBtX3N0YXJ0OyB9Ci0gICAgICAgIGNvbnN0ZXhwciBjb25zdF9pdGVy YXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0ICsgbV9zaXplOyB9Ci0gICAgfTsKLQot ICAgIGF1dG8gb3BlcmF0b3IgKz0gKCBzdGQ6OnN0cmluZyYgbGhzLCBTdHJpbmdSZWYgY29uc3Qm IHNyICkgLT4gc3RkOjpzdHJpbmcmOwotICAgIGF1dG8gb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJl YW0mIG9zLCBTdHJpbmdSZWYgY29uc3QmIHNyICkgLT4gc3RkOjpvc3RyZWFtJjsKLQotICAgIGNv bnN0ZXhwciBhdXRvIG9wZXJhdG9yICIiIF9zciggY2hhciBjb25zdCogcmF3Q2hhcnMsIHN0ZDo6 c2l6ZV90IHNpemUgKSBub2V4Y2VwdCAtPiBTdHJpbmdSZWYgewotICAgICAgICByZXR1cm4gU3Ry aW5nUmVmKCByYXdDaGFycywgc2l6ZSApOwotICAgIH0KLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0K LWNvbnN0ZXhwciBhdXRvIG9wZXJhdG9yICIiIF9jYXRjaF9zciggY2hhciBjb25zdCogcmF3Q2hh cnMsIHN0ZDo6c2l6ZV90IHNpemUgKSBub2V4Y2VwdCAtPiBDYXRjaDo6U3RyaW5nUmVmIHsKLSAg ICByZXR1cm4gQ2F0Y2g6OlN0cmluZ1JlZiggcmF3Q2hhcnMsIHNpemUgKTsKLX0KLQotLy8gZW5k IGNhdGNoX3N0cmluZ3JlZi5oCi0vLyBzdGFydCBjYXRjaF9wcmVwcm9jZXNzb3IuaHBwCi0KLQot I2RlZmluZSBDQVRDSF9SRUNVUlNJT05fTEVWRUwwKC4uLikgX19WQV9BUkdTX18KLSNkZWZpbmUg Q0FUQ0hfUkVDVVJTSU9OX0xFVkVMMSguLi4pIENBVENIX1JFQ1VSU0lPTl9MRVZFTDAoQ0FUQ0hf UkVDVVJTSU9OX0xFVkVMMChDQVRDSF9SRUNVUlNJT05fTEVWRUwwKF9fVkFfQVJHU19fKSkpCi0j ZGVmaW5lIENBVENIX1JFQ1VSU0lPTl9MRVZFTDIoLi4uKSBDQVRDSF9SRUNVUlNJT05fTEVWRUwx KENBVENIX1JFQ1VSU0lPTl9MRVZFTDEoQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMMShfX1ZBX0FSR1Nf XykpKQotI2RlZmluZSBDQVRDSF9SRUNVUlNJT05fTEVWRUwzKC4uLikgQ0FUQ0hfUkVDVVJTSU9O X0xFVkVMMihDQVRDSF9SRUNVUlNJT05fTEVWRUwyKENBVENIX1JFQ1VSU0lPTl9MRVZFTDIoX19W QV9BUkdTX18pKSkKLSNkZWZpbmUgQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMNCguLi4pIENBVENIX1JF Q1VSU0lPTl9MRVZFTDMoQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMMyhDQVRDSF9SRUNVUlNJT05fTEVW RUwzKF9fVkFfQVJHU19fKSkpCi0jZGVmaW5lIENBVENIX1JFQ1VSU0lPTl9MRVZFTDUoLi4uKSBD QVRDSF9SRUNVUlNJT05fTEVWRUw0KENBVENIX1JFQ1VSU0lPTl9MRVZFTDQoQ0FUQ0hfUkVDVVJT SU9OX0xFVkVMNChfX1ZBX0FSR1NfXykpKQotCi0jaWZkZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElP TkFMX01TVkNfUFJFUFJPQ0VTU09SCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJH UyguLi4pIF9fVkFfQVJHU19fCi0vLyBNU1ZDIG5lZWRzIG1vcmUgZXZhbHVhdGlvbnMKLSNkZWZp bmUgQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMNiguLi4pIENBVENIX1JFQ1VSU0lPTl9MRVZFTDUoQ0FU Q0hfUkVDVVJTSU9OX0xFVkVMNShDQVRDSF9SRUNVUlNJT05fTEVWRUw1KF9fVkFfQVJHU19fKSkp Ci0jZGVmaW5lIENBVENIX1JFQ1VSU0UoLi4uKSAgQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMNihDQVRD SF9SRUNVUlNJT05fTEVWRUw2KF9fVkFfQVJHU19fKSkKLSNlbHNlCi0jZGVmaW5lIENBVENIX1JF Q1VSU0UoLi4uKSAgQ0FUQ0hfUkVDVVJTSU9OX0xFVkVMNShfX1ZBX0FSR1NfXykKLSNlbmRpZgot Ci0jZGVmaW5lIENBVENIX1JFQ19FTkQoLi4uKQotI2RlZmluZSBDQVRDSF9SRUNfT1VUCi0KLSNk ZWZpbmUgQ0FUQ0hfRU1QVFkoKQotI2RlZmluZSBDQVRDSF9ERUZFUihpZCkgaWQgQ0FUQ0hfRU1Q VFkoKQotCi0jZGVmaW5lIENBVENIX1JFQ19HRVRfRU5EMigpIDAsIENBVENIX1JFQ19FTkQKLSNk ZWZpbmUgQ0FUQ0hfUkVDX0dFVF9FTkQxKC4uLikgQ0FUQ0hfUkVDX0dFVF9FTkQyCi0jZGVmaW5l IENBVENIX1JFQ19HRVRfRU5EKC4uLikgQ0FUQ0hfUkVDX0dFVF9FTkQxCi0jZGVmaW5lIENBVENI X1JFQ19ORVhUMCh0ZXN0LCBuZXh0LCAuLi4pIG5leHQgQ0FUQ0hfUkVDX09VVAotI2RlZmluZSBD QVRDSF9SRUNfTkVYVDEodGVzdCwgbmV4dCkgQ0FUQ0hfREVGRVIgKCBDQVRDSF9SRUNfTkVYVDAg KSAoIHRlc3QsIG5leHQsIDApCi0jZGVmaW5lIENBVENIX1JFQ19ORVhUKHRlc3QsIG5leHQpICBD QVRDSF9SRUNfTkVYVDEoQ0FUQ0hfUkVDX0dFVF9FTkQgdGVzdCwgbmV4dCkKLQotI2RlZmluZSBD QVRDSF9SRUNfTElTVDAoZiwgeCwgcGVlaywgLi4uKSAsIGYoeCkgQ0FUQ0hfREVGRVIgKCBDQVRD SF9SRUNfTkVYVChwZWVrLCBDQVRDSF9SRUNfTElTVDEpICkgKCBmLCBwZWVrLCBfX1ZBX0FSR1Nf XyApCi0jZGVmaW5lIENBVENIX1JFQ19MSVNUMShmLCB4LCBwZWVrLCAuLi4pICwgZih4KSBDQVRD SF9ERUZFUiAoIENBVENIX1JFQ19ORVhUKHBlZWssIENBVENIX1JFQ19MSVNUMCkgKSAoIGYsIHBl ZWssIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfUkVDX0xJU1QyKGYsIHgsIHBlZWssIC4u LikgICBmKHgpIENBVENIX0RFRkVSICggQ0FUQ0hfUkVDX05FWFQocGVlaywgQ0FUQ0hfUkVDX0xJ U1QxKSApICggZiwgcGVlaywgX19WQV9BUkdTX18gKQotCi0jZGVmaW5lIENBVENIX1JFQ19MSVNU MF9VRChmLCB1c2VyZGF0YSwgeCwgcGVlaywgLi4uKSAsIGYodXNlcmRhdGEsIHgpIENBVENIX0RF RkVSICggQ0FUQ0hfUkVDX05FWFQocGVlaywgQ0FUQ0hfUkVDX0xJU1QxX1VEKSApICggZiwgdXNl cmRhdGEsIHBlZWssIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfUkVDX0xJU1QxX1VEKGYs IHVzZXJkYXRhLCB4LCBwZWVrLCAuLi4pICwgZih1c2VyZGF0YSwgeCkgQ0FUQ0hfREVGRVIgKCBD QVRDSF9SRUNfTkVYVChwZWVrLCBDQVRDSF9SRUNfTElTVDBfVUQpICkgKCBmLCB1c2VyZGF0YSwg cGVlaywgX19WQV9BUkdTX18gKQotI2RlZmluZSBDQVRDSF9SRUNfTElTVDJfVUQoZiwgdXNlcmRh dGEsIHgsIHBlZWssIC4uLikgICBmKHVzZXJkYXRhLCB4KSBDQVRDSF9ERUZFUiAoIENBVENIX1JF Q19ORVhUKHBlZWssIENBVENIX1JFQ19MSVNUMV9VRCkgKSAoIGYsIHVzZXJkYXRhLCBwZWVrLCBf X1ZBX0FSR1NfXyApCi0KLS8vIEFwcGxpZXMgdGhlIGZ1bmN0aW9uIG1hY3JvIGBmYCB0byBlYWNo IG9mIHRoZSByZW1haW5pbmcgcGFyYW1ldGVycywgaW5zZXJ0cyBjb21tYXMgYmV0d2VlbiB0aGUg cmVzdWx0cywKLS8vIGFuZCBwYXNzZXMgdXNlcmRhdGEgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0 byBlYWNoIGludm9jYXRpb24sCi0vLyBlLmcuIENBVENIX1JFQ19MSVNUX1VEKGYsIHgsIGEsIGIs IGMpIGV2YWx1YXRlcyB0byBmKHgsIGEpLCBmKHgsIGIpLCBmKHgsIGMpCi0jZGVmaW5lIENBVENI X1JFQ19MSVNUX1VEKGYsIHVzZXJkYXRhLCAuLi4pIENBVENIX1JFQ1VSU0UoQ0FUQ0hfUkVDX0xJ U1QyX1VEKGYsIHVzZXJkYXRhLCBfX1ZBX0FSR1NfXywgKCkoKSgpLCAoKSgpKCksICgpKCkoKSwg MCkpCi0KLSNkZWZpbmUgQ0FUQ0hfUkVDX0xJU1QoZiwgLi4uKSBDQVRDSF9SRUNVUlNFKENBVENI X1JFQ19MSVNUMihmLCBfX1ZBX0FSR1NfXywgKCkoKSgpLCAoKSgpKCksICgpKCkoKSwgMCkpCi0K LSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EMShwYXJhbSkgSU5URVJOQUxfQ0FUQ0hfRVhQ QU5EMihwYXJhbSkKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EMiguLi4pIElOVEVSTkFM X0NBVENIX05PIyMgX19WQV9BUkdTX18KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVGKC4uLikg SU5URVJOQUxfQ0FUQ0hfREVGIF9fVkFfQVJHU19fCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX05P SU5URVJOQUxfQ0FUQ0hfREVGCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0laRSguLi4p IElOVEVSTkFMX0NBVENIX1NUUklOR0laRTIoX19WQV9BUkdTX18pCi0jaWZuZGVmIENBVENIX0NP TkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgotI2RlZmluZSBJTlRFUk5BTF9DQVRD SF9TVFJJTkdJWkUyKC4uLikgI19fVkFfQVJHU19fCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX1NU UklOR0laRV9XSVRIT1VUX1BBUkVOUyhwYXJhbSkgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFKElO VEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMocGFyYW0pKQotI2Vsc2UKLS8vIE1TVkMgaXMgYWRk aW5nIGV4dHJhIHNwYWNlIGFuZCBuZWVkcyBhbm90aGVyIGluZGlyZWN0aW9uIHRvIGV4cGFuZCBJ TlRFUk5BTF9DQVRDSF9OT0lOVEVSTkFMX0NBVENIX0RFRgotI2RlZmluZSBJTlRFUk5BTF9DQVRD SF9TVFJJTkdJWkUyKC4uLikgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFMyhfX1ZBX0FSR1NfXykK LSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFMyguLi4pICNfX1ZBX0FSR1NfXwotI2Rl ZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJWkVfV0lUSE9VVF9QQVJFTlMocGFyYW0pIChJTlRF Uk5BTF9DQVRDSF9TVFJJTkdJWkUoSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhwYXJhbSkp ICsgMSkKLSNlbmRpZgotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX01BS0VfTkFNRVNQQUNFMigu Li4pIG5zXyMjX19WQV9BUkdTX18KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BB Q0UobmFtZSkgSU5URVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UyKG5hbWUpCi0KLSNkZWZpbmUg SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyguLi4pIElOVEVSTkFMX0NBVENIX0VYUEFORDEo SU5URVJOQUxfQ0FUQ0hfREVGIF9fVkFfQVJHU19fKQotCi0jaWZuZGVmIENBVENIX0NPTkZJR19U UkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NQUtF X1RZUEVfTElTVDIoLi4uKSBkZWNsdHlwZShnZXRfd3JhcHBlcjxJTlRFUk5BTF9DQVRDSF9SRU1P VkVfUEFSRU5TX0dFTihfX1ZBX0FSR1NfXyk+KCkpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX01B S0VfVFlQRV9MSVNUKC4uLikgSU5URVJOQUxfQ0FUQ0hfTUFLRV9UWVBFX0xJU1QyKElOVEVSTkFM X0NBVENIX1JFTU9WRV9QQVJFTlMoX19WQV9BUkdTX18pKQotI2Vsc2UKLSNkZWZpbmUgSU5URVJO QUxfQ0FUQ0hfTUFLRV9UWVBFX0xJU1QyKC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdT KGRlY2x0eXBlKGdldF93cmFwcGVyPElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfR0VOKF9f VkFfQVJHU19fKT4oKSkpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9MSVNUKC4u LikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9M SVNUMihJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF9fVkFfQVJHU19fKSkpCi0jZW5kaWYK LQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NQUtFX1RZUEVfTElTVFNfRlJPTV9UWVBFUyguLi4p XAotICAgIENBVENIX1JFQ19MSVNUKElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9MSVNULF9fVkFf QVJHU19fKQotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfMV9BUkcoXzAp IElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoXzApCi0jZGVmaW5lIElOVEVSTkFMX0NBVENI X1JFTU9WRV9QQVJFTlNfMl9BUkcoXzAsIF8xKSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5T KF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18xX0FSRyhfMSkKLSNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18zX0FSRyhfMCwgXzEsIF8yKSBJTlRFUk5BTF9DQVRD SF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18yX0FSRyhf MSwgXzIpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfNF9BUkcoXzAsIF8x LCBfMiwgXzMpIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoXzApLCBJTlRFUk5BTF9DQVRD SF9SRU1PVkVfUEFSRU5TXzNfQVJHKF8xLCBfMiwgXzMpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENI X1JFTU9WRV9QQVJFTlNfNV9BUkcoXzAsIF8xLCBfMiwgXzMsIF80KSBJTlRFUk5BTF9DQVRDSF9S RU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU180X0FSRyhfMSwg XzIsIF8zLCBfNCkKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU182X0FSRyhf MCwgXzEsIF8yLCBfMywgXzQsIF81KSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwg SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU181X0FSRyhfMSwgXzIsIF8zLCBfNCwgXzUpCi0j ZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfN19BUkcoXzAsIF8xLCBfMiwgXzMs IF80LCBfNSwgXzYpIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoXzApLCBJTlRFUk5BTF9D QVRDSF9SRU1PVkVfUEFSRU5TXzZfQVJHKF8xLCBfMiwgXzMsIF80LCBfNSwgXzYpCi0jZGVmaW5l IElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfOF9BUkcoXzAsIF8xLCBfMiwgXzMsIF80LCBf NSwgXzYsIF83KSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FU Q0hfUkVNT1ZFX1BBUkVOU183X0FSRyhfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNykKLSNkZWZp bmUgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU185X0FSRyhfMCwgXzEsIF8yLCBfMywgXzQs IF81LCBfNiwgXzcsIF84KSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJO QUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU184X0FSRyhfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywg XzgpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfMTBfQVJHKF8wLCBfMSwg XzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85KSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFS RU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU185X0FSRyhfMSwgXzIsIF8zLCBf NCwgXzUsIF82LCBfNywgXzgsIF85KQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFS RU5TXzExX0FSRyhfMCwgXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwKSBJ TlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKF8wKSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOU18xMF9BUkcoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwKQotCi0j ZGVmaW5lIElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoXzAsIF8xLCBfMiwgXzMsIF80LCBf NSwgXzYsIF83LCBfOCwgXzksIF8xMCwgTiwgLi4uKSBOCi0KLSNkZWZpbmUgSU5URVJOQUxfQ0FU Q0hfVFlQRV9HRU5cCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+IHN0cnVjdCBUeXBlTGlzdCB7 fTtcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUuLi5Ucz5cCi0gICAgY29uc3RleHByIGF1dG8gZ2V0 X3dyYXBwZXIoKSBub2V4Y2VwdCAtPiBUeXBlTGlzdDxUcy4uLj4geyByZXR1cm4ge307IH1cCi0g ICAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUuLi4+IGNsYXNzLi4uPiBzdHJ1Y3QgVGVtcGxh dGVUeXBlTGlzdHt9O1wKLSAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gY2xhc3Mu Li5Dcz5cCi0gICAgY29uc3RleHByIGF1dG8gZ2V0X3dyYXBwZXIoKSBub2V4Y2VwdCAtPiBUZW1w bGF0ZVR5cGVMaXN0PENzLi4uPiB7IHJldHVybiB7fTsgfVwKLSAgICB0ZW1wbGF0ZTx0eXBlbmFt ZS4uLj5cCi0gICAgc3RydWN0IGFwcGVuZDtcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4+XAot ICAgIHN0cnVjdCByZXdyYXA7XAotICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lLi4uPiBj bGFzcywgdHlwZW5hbWUuLi4+XAotICAgIHN0cnVjdCBjcmVhdGU7XAotICAgIHRlbXBsYXRlPHRl bXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcywgdHlwZW5hbWU+XAotICAgIHN0cnVjdCBjb252ZXJ0 O1wKLSAgICBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gXAotICAgIHN0cnVjdCBhcHBlbmQ8 VD4geyB1c2luZyB0eXBlID0gVDsgfTtcCi0gICAgdGVtcGxhdGU8IHRlbXBsYXRlPHR5cGVuYW1l Li4uPiBjbGFzcyBMMSwgdHlwZW5hbWUuLi5FMSwgdGVtcGxhdGU8dHlwZW5hbWUuLi4+IGNsYXNz IEwyLCB0eXBlbmFtZS4uLkUyLCB0eXBlbmFtZS4uLlJlc3Q+XAotICAgIHN0cnVjdCBhcHBlbmQ8 TDE8RTEuLi4+LCBMMjxFMi4uLj4sIFJlc3QuLi4+IHsgdXNpbmcgdHlwZSA9IHR5cGVuYW1lIGFw cGVuZDxMMTxFMS4uLixFMi4uLj4sIFJlc3QuLi4+Ojp0eXBlOyB9O1wKLSAgICB0ZW1wbGF0ZTwg dGVtcGxhdGU8dHlwZW5hbWUuLi4+IGNsYXNzIEwxLCB0eXBlbmFtZS4uLkUxLCB0eXBlbmFtZS4u LlJlc3Q+XAotICAgIHN0cnVjdCBhcHBlbmQ8TDE8RTEuLi4+LCBUeXBlTGlzdDxtcGxfOjpuYT4s IFJlc3QuLi4+IHsgdXNpbmcgdHlwZSA9IEwxPEUxLi4uPjsgfTtcCi0gICAgXAotICAgIHRlbXBs YXRlPCB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gY2xhc3MgQ29udGFpbmVyLCB0ZW1wbGF0ZTx0eXBl bmFtZS4uLj4gY2xhc3MgTGlzdCwgdHlwZW5hbWUuLi5lbGVtcz5cCi0gICAgc3RydWN0IHJld3Jh cDxUZW1wbGF0ZVR5cGVMaXN0PENvbnRhaW5lcj4sIExpc3Q8ZWxlbXMuLi4+PiB7IHVzaW5nIHR5 cGUgPSBUeXBlTGlzdDxDb250YWluZXI8ZWxlbXMuLi4+PjsgfTtcCi0gICAgdGVtcGxhdGU8IHRl bXBsYXRlPHR5cGVuYW1lLi4uPiBjbGFzcyBDb250YWluZXIsIHRlbXBsYXRlPHR5cGVuYW1lLi4u PiBjbGFzcyBMaXN0LCBjbGFzcy4uLkVsZW1zLCB0eXBlbmFtZS4uLkVsZW1lbnRzPlwKLSAgICBz dHJ1Y3QgcmV3cmFwPFRlbXBsYXRlVHlwZUxpc3Q8Q29udGFpbmVyPiwgTGlzdDxFbGVtcy4uLj4s IEVsZW1lbnRzLi4uPiB7IHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBhcHBlbmQ8VHlwZUxpc3Q8Q29u dGFpbmVyPEVsZW1zLi4uPj4sIHR5cGVuYW1lIHJld3JhcDxUZW1wbGF0ZVR5cGVMaXN0PENvbnRh aW5lcj4sIEVsZW1lbnRzLi4uPjo6dHlwZT46OnR5cGU7IH07XAotICAgIFwKLSAgICB0ZW1wbGF0 ZTx0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+IGNsYXNzIEZpbmFsLCB0ZW1wbGF0ZTwgdHlwZW5hbWUu Li4+IGNsYXNzLi4uQ29udGFpbmVycywgdHlwZW5hbWUuLi5UeXBlcz5cCi0gICAgc3RydWN0IGNy ZWF0ZTxGaW5hbCwgVGVtcGxhdGVUeXBlTGlzdDxDb250YWluZXJzLi4uPiwgVHlwZUxpc3Q8VHlw ZXMuLi4+PiB7IHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBhcHBlbmQ8RmluYWw8PiwgdHlwZW5hbWUg cmV3cmFwPFRlbXBsYXRlVHlwZUxpc3Q8Q29udGFpbmVycz4sIFR5cGVzLi4uPjo6dHlwZS4uLj46 OnR5cGU7IH07XAotICAgIHRlbXBsYXRlPHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gY2xhc3MgRmlu YWwsIHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gY2xhc3MgTGlzdCwgdHlwZW5hbWUuLi5Ucz5cCi0g ICAgc3RydWN0IGNvbnZlcnQ8RmluYWwsIExpc3Q8VHMuLi4+PiB7IHVzaW5nIHR5cGUgPSB0eXBl bmFtZSBhcHBlbmQ8RmluYWw8PixUeXBlTGlzdDxUcz4uLi4+Ojp0eXBlOyB9OwotCi0jZGVmaW5l IElOVEVSTkFMX0NBVENIX05UVFBfMShzaWduYXR1cmUsIC4uLilcCi0gICAgdGVtcGxhdGU8SU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhzaWduYXR1cmUpPiBzdHJ1Y3QgTnR0cHt9O1wKLSAg ICB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+XAotICAg IGNvbnN0ZXhwciBhdXRvIGdldF93cmFwcGVyKCkgbm9leGNlcHQgLT4gTnR0cDxfX1ZBX0FSR1Nf Xz4geyByZXR1cm4ge307IH0gXAotICAgIHRlbXBsYXRlPHRlbXBsYXRlPElOVEVSTkFMX0NBVENI X1JFTU9WRV9QQVJFTlMoc2lnbmF0dXJlKT4gY2xhc3MuLi4+IHN0cnVjdCBOdHRwVGVtcGxhdGVU eXBlTGlzdHt9O1wKLSAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVf UEFSRU5TKHNpZ25hdHVyZSk+IGNsYXNzLi4uQ3M+XAotICAgIGNvbnN0ZXhwciBhdXRvIGdldF93 cmFwcGVyKCkgbm9leGNlcHQgLT4gTnR0cFRlbXBsYXRlVHlwZUxpc3Q8Q3MuLi4+IHsgcmV0dXJu IHt9OyB9IFwKLSAgICBcCi0gICAgdGVtcGxhdGU8IHRlbXBsYXRlPElOVEVSTkFMX0NBVENIX1JF TU9WRV9QQVJFTlMoc2lnbmF0dXJlKT4gY2xhc3MgQ29udGFpbmVyLCB0ZW1wbGF0ZTxJTlRFUk5B TF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IGNsYXNzIExpc3QsIElOVEVSTkFMX0NB VENIX1JFTU9WRV9QQVJFTlMoc2lnbmF0dXJlKT5cCi0gICAgc3RydWN0IHJld3JhcDxOdHRwVGVt cGxhdGVUeXBlTGlzdDxDb250YWluZXI+LCBMaXN0PF9fVkFfQVJHU19fPj4geyB1c2luZyB0eXBl ID0gVHlwZUxpc3Q8Q29udGFpbmVyPF9fVkFfQVJHU19fPj47IH07XAotICAgIHRlbXBsYXRlPCB0 ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IGNsYXNzIENv bnRhaW5lciwgdGVtcGxhdGU8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhzaWduYXR1cmUp PiBjbGFzcyBMaXN0LCBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSksIHR5 cGVuYW1lLi4uRWxlbWVudHM+XAotICAgIHN0cnVjdCByZXdyYXA8TnR0cFRlbXBsYXRlVHlwZUxp c3Q8Q29udGFpbmVyPiwgTGlzdDxfX1ZBX0FSR1NfXz4sIEVsZW1lbnRzLi4uPiB7IHVzaW5nIHR5 cGUgPSB0eXBlbmFtZSBhcHBlbmQ8VHlwZUxpc3Q8Q29udGFpbmVyPF9fVkFfQVJHU19fPj4sIHR5 cGVuYW1lIHJld3JhcDxOdHRwVGVtcGxhdGVUeXBlTGlzdDxDb250YWluZXI+LCBFbGVtZW50cy4u Lj46OnR5cGU+Ojp0eXBlOyB9O1wKLSAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+ IGNsYXNzIEZpbmFsLCB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25h dHVyZSk+IGNsYXNzLi4uQ29udGFpbmVycywgdHlwZW5hbWUuLi5UeXBlcz5cCi0gICAgc3RydWN0 IGNyZWF0ZTxGaW5hbCwgTnR0cFRlbXBsYXRlVHlwZUxpc3Q8Q29udGFpbmVycy4uLj4sIFR5cGVM aXN0PFR5cGVzLi4uPj4geyB1c2luZyB0eXBlID0gdHlwZW5hbWUgYXBwZW5kPEZpbmFsPD4sIHR5 cGVuYW1lIHJld3JhcDxOdHRwVGVtcGxhdGVUeXBlTGlzdDxDb250YWluZXJzPiwgVHlwZXMuLi4+ Ojp0eXBlLi4uPjo6dHlwZTsgfTsKLQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJ R19URVNUMChUZXN0TmFtZSkKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVT VDEoVGVzdE5hbWUsIHNpZ25hdHVyZSlcCi0gICAgdGVtcGxhdGU8SU5URVJOQUxfQ0FUQ0hfUkVN T1ZFX1BBUkVOUyhzaWduYXR1cmUpPlwKLSAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCi0jZGVm aW5lIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfWChUZXN0TmFtZSwgc2lnbmF0dXJl LCAuLi4pXAotICAgIHRlbXBsYXRlPElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoc2lnbmF0 dXJlKT5cCi0gICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKQotCi0jZGVmaW5lIElOVEVSTkFMX0NB VENIX0RFRklORV9TSUdfVEVTVDAoVGVzdE5hbWUpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RF RklORV9TSUdfVEVTVDEoVGVzdE5hbWUsIHNpZ25hdHVyZSlcCi0gICAgdGVtcGxhdGU8SU5URVJO QUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhzaWduYXR1cmUpPlwKLSAgICBzdGF0aWMgdm9pZCBUZXN0 TmFtZSgpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YKFRlc3ROYW1l LCBzaWduYXR1cmUsLi4uKVwKLSAgICB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFS RU5TKHNpZ25hdHVyZSk+XAotICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKLQotI2RlZmluZSBJ TlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSMChUZXN0RnVuYywgc2lnbmF0dXJlKVwKLSAgICB0 ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPlwKLSAgICB2b2lkIHJlZ190ZXN0KFR5cGVMaXN0PFR5cGU+ LCBDYXRjaDo6TmFtZUFuZFRhZ3MgbmFtZUFuZFRhZ3MpXAotICAgIHtcCi0gICAgICAgIENhdGNo OjpBdXRvUmVnKCBDYXRjaDo6bWFrZVRlc3RJbnZva2VyKCZUZXN0RnVuYzxUeXBlPiksIENBVENI X0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6U3RyaW5nUmVmKCksIG5hbWVBbmRUYWdzKTtcCi0g ICAgfQotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIoVGVzdEZ1bmMsIHNp Z25hdHVyZSwgLi4uKVwKLSAgICB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5T KHNpZ25hdHVyZSk+XAotICAgIHZvaWQgcmVnX3Rlc3QoTnR0cDxfX1ZBX0FSR1NfXz4sIENhdGNo OjpOYW1lQW5kVGFncyBuYW1lQW5kVGFncylcCi0gICAge1wKLSAgICAgICAgQ2F0Y2g6OkF1dG9S ZWcoIENhdGNoOjptYWtlVGVzdEludm9rZXIoJlRlc3RGdW5jPF9fVkFfQVJHU19fPiksIENBVENI X0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6U3RyaW5nUmVmKCksIG5hbWVBbmRUYWdzKTtcCi0g ICAgfQotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9EMChUZXN0 TmFtZSwgc2lnbmF0dXJlLCAuLi4pXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+XAotICAg IHZvaWQgcmVnX3Rlc3QoVHlwZUxpc3Q8VHlwZT4sIENhdGNoOjpTdHJpbmdSZWYgY2xhc3NOYW1l LCBDYXRjaDo6TmFtZUFuZFRhZ3MgbmFtZUFuZFRhZ3MpXAotICAgIHtcCi0gICAgICAgIENhdGNo OjpBdXRvUmVnKCBDYXRjaDo6bWFrZVRlc3RJbnZva2VyKCZUZXN0TmFtZTxUeXBlPjo6dGVzdCks IENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBjbGFzc05hbWUsIG5hbWVBbmRUYWdzKTtcCi0gICAg fQotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVUSE9EKFRlc3ROYW1l LCBzaWduYXR1cmUsIC4uLilcCi0gICAgdGVtcGxhdGU8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOUyhzaWduYXR1cmUpPlwKLSAgICB2b2lkIHJlZ190ZXN0KE50dHA8X19WQV9BUkdTX18+LCBD YXRjaDo6U3RyaW5nUmVmIGNsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmRUYWdzIG5hbWVBbmRUYWdz KVwKLSAgICB7XAotICAgICAgICBDYXRjaDo6QXV0b1JlZyggQ2F0Y2g6Om1ha2VUZXN0SW52b2tl cigmVGVzdE5hbWU8X19WQV9BUkdTX18+Ojp0ZXN0KSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8s IGNsYXNzTmFtZSwgbmFtZUFuZFRhZ3MpO1wKLSAgICB9Ci0KLSNkZWZpbmUgSU5URVJOQUxfQ0FU Q0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0QwKFRlc3ROYW1lLCBDbGFzc05hbWUpCi0jZGVmaW5l IElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EMShUZXN0TmFtZSwgQ2xhc3NO YW1lLCBzaWduYXR1cmUpXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRlc3RUeXBlPiBcCi0gICAg c3RydWN0IFRlc3ROYW1lIDogSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhDbGFzc05hbWUp PFRlc3RUeXBlPiB7IFwKLSAgICAgICAgdm9pZCB0ZXN0KCk7XAotICAgIH0KLQotI2RlZmluZSBJ TlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX01FVEhPRF9YKFRlc3ROYW1lLCBDbGFzc05h bWUsIHNpZ25hdHVyZSwgLi4uKVwKLSAgICB0ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVf UEFSRU5TKHNpZ25hdHVyZSk+IFwKLSAgICBzdHJ1Y3QgVGVzdE5hbWUgOiBJTlRFUk5BTF9DQVRD SF9SRU1PVkVfUEFSRU5TKENsYXNzTmFtZSk8X19WQV9BUkdTX18+IHsgXAotICAgICAgICB2b2lk IHRlc3QoKTtcCi0gICAgfQotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVT VF9NRVRIT0QwKFRlc3ROYW1lKQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RF U1RfTUVUSE9EMShUZXN0TmFtZSwgc2lnbmF0dXJlKVwKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU ZXN0VHlwZT4gXAotICAgIHZvaWQgSU5URVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UoVGVzdE5h bWUpOjpUZXN0TmFtZTxUZXN0VHlwZT46OnRlc3QoKQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9E RUZJTkVfU0lHX1RFU1RfTUVUSE9EX1goVGVzdE5hbWUsIHNpZ25hdHVyZSwgLi4uKVwKLSAgICB0 ZW1wbGF0ZTxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKHNpZ25hdHVyZSk+IFwKLSAgICB2 b2lkIElOVEVSTkFMX0NBVENIX01BS0VfTkFNRVNQQUNFKFRlc3ROYW1lKTo6VGVzdE5hbWU8X19W QV9BUkdTX18+Ojp0ZXN0KCkKLQotI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNW Q19QUkVQUk9DRVNTT1IKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTlRUUF8wCi0jZGVmaW5lIElO VEVSTkFMX0NBVENIX05UVFBfR0VOKC4uLikgSU5URVJOQUxfQ0FUQ0hfVkFfTkFSR1NfSU1QTChf X1ZBX0FSR1NfXywgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKF9fVkFfQVJHU19fKSwgSU5URVJOQUxf Q0FUQ0hfTlRUUF8xKF9fVkFfQVJHU19fKSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKF9fVkFfQVJH U19fKSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKF9fVkFfQVJHU19fKSwgSU5URVJOQUxfQ0FUQ0hf TlRUUF8xKF9fVkFfQVJHU19fKSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKCBfX1ZBX0FSR1NfXyks IElOVEVSTkFMX0NBVENIX05UVFBfMSggX19WQV9BUkdTX18pLCBJTlRFUk5BTF9DQVRDSF9OVFRQ XzEoIF9fVkFfQVJHU19fKSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xKCBfX1ZBX0FSR1NfXyksSU5U RVJOQUxfQ0FUQ0hfTlRUUF8xKCBfX1ZBX0FSR1NfXyksIElOVEVSTkFMX0NBVENIX05UVFBfMCkK LSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRChUZXN0TmFtZSwg Li4uKSBJTlRFUk5BTF9DQVRDSF9WQV9OQVJHU19JTVBMKCAiZHVtbXkiLCBfX1ZBX0FSR1NfXywg SU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRF9YLElOVEVSTkFMX0NBVENIX0RF RklORV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01F VEhPRF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFM X0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJ R19URVNUX01FVEhPRF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gs SU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRF9YLElOVEVSTkFMX0NBVENIX0RF RklORV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01F VEhPRDEsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0QwKShUZXN0TmFtZSwg X19WQV9BUkdTX18pCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVU SE9EKFRlc3ROYW1lLCBDbGFzc05hbWUsIC4uLikgSU5URVJOQUxfQ0FUQ0hfVkFfTkFSR1NfSU1Q TCggImR1bW15IiwgX19WQV9BUkdTX18sIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1Rf TUVUSE9EX1gsSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJO QUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFS RV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRI T0RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxf Q0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCxJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJ R19URVNUX01FVEhPRF9YLElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gs IElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EMSwgSU5URVJOQUxfQ0FUQ0hf REVDTEFSRV9TSUdfVEVTVF9NRVRIT0QwKShUZXN0TmFtZSwgQ2xhc3NOYW1lLCBfX1ZBX0FSR1Nf XykKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdfTUVUSE9EX0dFTihUZXN0TmFtZSwg Li4uKSBJTlRFUk5BTF9DQVRDSF9WQV9OQVJHU19JTVBMKCAiZHVtbXkiLCBfX1ZBX0FSR1NfXywg SU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBf UkVHSVNURVJfTUVUSE9ELCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5U RVJOQUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVH SVNURVJfTUVUSE9ELCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJO QUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNU RVJfTUVUSE9ELCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxf Q0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRIT0QwLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVS X01FVEhPRDApKFRlc3ROYW1lLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hf TlRUUF9SRUdfR0VOKFRlc3RGdW5jLCAuLi4pIElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwo ICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRF Uk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJ TlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVS LCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lT VEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JF R0lTVEVSLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSMCwgSU5URVJOQUxfQ0FUQ0hfTlRU UF9SRUdJU1RFUjApKFRlc3RGdW5jLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgSU5URVJOQUxfQ0FU Q0hfREVGSU5FX1NJR19URVNUKFRlc3ROYW1lLCAuLi4pIElOVEVSTkFMX0NBVENIX1ZBX05BUkdT X0lNUEwoICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RF U1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RF RklORV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfWCwgSU5URVJO QUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVT VF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVG SU5FX1NJR19URVNUX1gsSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsSU5URVJOQUxf Q0FUQ0hfREVGSU5FX1NJR19URVNUMSwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUMCko VGVzdE5hbWUsIF9fVkFfQVJHU19fKQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJ R19URVNUKFRlc3ROYW1lLCAuLi4pIElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoICJkdW1t eSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsSU5URVJO QUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19U RVNUX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hf REVDTEFSRV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsIElO VEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lH X1RFU1RfWCxJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENI X0RFQ0xBUkVfU0lHX1RFU1QxLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUMCkoVGVz dE5hbWUsIF9fVkFfQVJHU19fKQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5T X0dFTiguLi4pIElOVEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoX19WQV9BUkdTX18sIElOVEVS TkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfMTFfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJF TlNfMTBfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfOV9BUkcsSU5URVJOQUxfQ0FU Q0hfUkVNT1ZFX1BBUkVOU184X0FSRyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzdfQVJH LElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfNl9BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZF X1BBUkVOU181X0FSRyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzRfQVJHLElOVEVSTkFM X0NBVENIX1JFTU9WRV9QQVJFTlNfM19BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18y X0FSRyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzFfQVJHKShfX1ZBX0FSR1NfXykKLSNl bHNlCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBfMChzaWduYXR1cmUpCi0jZGVmaW5lIElO VEVSTkFMX0NBVENIX05UVFBfR0VOKC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElO VEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoX19WQV9BUkdTX18sIElOVEVSTkFMX0NBVENIX05U VFBfMSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xLCBJTlRFUk5BTF9DQVRDSF9OVFRQXzEsIElOVEVS TkFMX0NBVENIX05UVFBfMSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xLCBJTlRFUk5BTF9DQVRDSF9O VFRQXzEsIElOVEVSTkFMX0NBVENIX05UVFBfMSwgSU5URVJOQUxfQ0FUQ0hfTlRUUF8xLCBJTlRF Uk5BTF9DQVRDSF9OVFRQXzEsSU5URVJOQUxfQ0FUQ0hfTlRUUF8xLCBJTlRFUk5BTF9DQVRDSF9O VFRQXzApKCBfX1ZBX0FSR1NfXykpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdf VEVTVF9NRVRIT0QoVGVzdE5hbWUsIC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElO VEVSTkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5B TF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gsSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJ R19URVNUX01FVEhPRF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gs IElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0RfWCwgSU5URVJOQUxfQ0FUQ0hf REVGSU5FX1NJR19URVNUX01FVEhPRF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1Rf TUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9NRVRIT0RfWCxJTlRFUk5B TF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EX1gsSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJ R19URVNUX01FVEhPRF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EMSwg SU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRDApKFRlc3ROYW1lLCBfX1ZBX0FS R1NfXykpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EKFRl c3ROYW1lLCBDbGFzc05hbWUsIC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElOVEVS TkFMX0NBVENIX1ZBX05BUkdTX0lNUEwoICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9D QVRDSF9ERUNMQVJFX1NJR19URVNUX01FVEhPRF9YLElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lH X1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gs IElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENI X0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RF U1RfTUVUSE9EX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EX1gsSU5U RVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0RfWCxJTlRFUk5BTF9DQVRDSF9ERUNM QVJFX1NJR19URVNUX01FVEhPRF9YLCBJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX01F VEhPRDEsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfTUVUSE9EMCkoVGVzdE5hbWUs IENsYXNzTmFtZSwgX19WQV9BUkdTX18pKQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9OVFRQX1JF R19NRVRIT0RfR0VOKFRlc3ROYW1lLCAuLi4pIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyhJ TlRFUk5BTF9DQVRDSF9WQV9OQVJHU19JTVBMKCAiZHVtbXkiLCBfX1ZBX0FSR1NfXywgSU5URVJO QUxfQ0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNU RVJfTUVUSE9ELCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxf Q0FUQ0hfTlRUUF9SRUdJU1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJf TUVUSE9ELCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FU Q0hfTlRUUF9SRUdJU1RFUl9NRVRIT0QsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVJfTUVU SE9ELCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhPRCwgSU5URVJOQUxfQ0FUQ0hf TlRUUF9SRUdJU1RFUl9NRVRIT0QwLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSX01FVEhP RDApKFRlc3ROYW1lLCBfX1ZBX0FSR1NfXykpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX05UVFBf UkVHX0dFTihUZXN0RnVuYywgLi4uKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoSU5URVJO QUxfQ0FUQ0hfVkFfTkFSR1NfSU1QTCggImR1bW15IiwgX19WQV9BUkdTX18sIElOVEVSTkFMX0NB VENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFM X0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVS TkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElO VEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIs IElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNURVIsIElOVEVSTkFMX0NBVENIX05UVFBfUkVHSVNU RVIwLCBJTlRFUk5BTF9DQVRDSF9OVFRQX1JFR0lTVEVSMCkoVGVzdEZ1bmMsIF9fVkFfQVJHU19f KSkKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUKFRlc3ROYW1lLCAuLi4p IElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyhJTlRFUk5BTF9DQVRDSF9WQV9OQVJHU19JTVBM KCAiZHVtbXkiLCBfX1ZBX0FSR1NfXywgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gs IElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVf U0lHX1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsIElOVEVSTkFMX0NB VENIX0RFRklORV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfWCwg SU5URVJOQUxfQ0FUQ0hfREVGSU5FX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9T SUdfVEVTVF9YLElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLElOVEVSTkFMX0NBVENI X0RFRklORV9TSUdfVEVTVDEsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVDApKFRlc3RO YW1lLCBfX1ZBX0FSR1NfXykpCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RF U1QoVGVzdE5hbWUsIC4uLikgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKElOVEVSTkFMX0NB VENIX1ZBX05BUkdTX0lNUEwoICJkdW1teSIsIF9fVkFfQVJHU19fLCBJTlRFUk5BTF9DQVRDSF9E RUNMQVJFX1NJR19URVNUX1gsSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9YLCBJTlRF Uk5BTF9DQVRDSF9ERUNMQVJFX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lH X1RFU1RfWCwgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9YLCBJTlRFUk5BTF9DQVRD SF9ERUNMQVJFX1NJR19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFRklORV9TSUdfVEVTVF9YLElO VEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1RfWCxJTlRFUk5BTF9DQVRDSF9ERUNMQVJFX1NJ R19URVNUX1gsIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RFU1QxLCBJTlRFUk5BTF9DQVRD SF9ERUNMQVJFX1NJR19URVNUMCkoVGVzdE5hbWUsIF9fVkFfQVJHU19fKSkKLSNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU19HRU4oLi4uKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRf VkFSR1MoSU5URVJOQUxfQ0FUQ0hfVkFfTkFSR1NfSU1QTChfX1ZBX0FSR1NfXywgSU5URVJOQUxf Q0FUQ0hfUkVNT1ZFX1BBUkVOU18xMV9BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU18x MF9BUkcsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU185X0FSRyxJTlRFUk5BTF9DQVRDSF9S RU1PVkVfUEFSRU5TXzhfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfN19BUkcsSU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOU182X0FSRyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFS RU5TXzVfQVJHLElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfNF9BUkcsSU5URVJOQUxfQ0FU Q0hfUkVNT1ZFX1BBUkVOU18zX0FSRyxJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TXzJfQVJH LElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlNfMV9BUkcpKF9fVkFfQVJHU19fKSkKLSNlbmRp ZgotCi0vLyBlbmQgY2F0Y2hfcHJlcHJvY2Vzc29yLmhwcAotLy8gc3RhcnQgY2F0Y2hfbWV0YS5o cHAKLQotCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAg dGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdHJ1Y3QgYWx3YXlzX2ZhbHNlIDogc3RkOjpmYWxz ZV90eXBlIHt9OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lPiBzdHJ1Y3QgdHJ1ZV9naXZlbiA6 IHN0ZDo6dHJ1ZV90eXBlIHt9OwotICAgIHN0cnVjdCBpc19jYWxsYWJsZV90ZXN0ZXIgewotICAg ICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuLCB0eXBlbmFtZS4uLiBBcmdzPgotICAgICAgICB0 cnVlX2dpdmVuPGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxGdW4+KCkoc3RkOjpkZWNsdmFsPEFyZ3M+ KCkuLi4pKT4gc3RhdGljIHRlc3QoaW50KTsKLSAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4u PgotICAgICAgICBzdGQ6OmZhbHNlX3R5cGUgc3RhdGljIHRlc3QoLi4uKTsKLSAgICB9OwotCi0g ICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgc3RydWN0IGlzX2NhbGxhYmxlOwotCi0gICAg dGVtcGxhdGUgPHR5cGVuYW1lIEZ1biwgdHlwZW5hbWUuLi4gQXJncz4KLSAgICBzdHJ1Y3QgaXNf Y2FsbGFibGU8RnVuKEFyZ3MuLi4pPiA6IGRlY2x0eXBlKGlzX2NhbGxhYmxlX3Rlc3Rlcjo6dGVz dDxGdW4sIEFyZ3MuLi4+KDApKSB7fTsKLQotI2lmIGRlZmluZWQoX19jcHBfbGliX2lzX2ludm9j YWJsZSkgJiYgX19jcHBfbGliX2lzX2ludm9jYWJsZSA+PSAyMDE3MDMKLSAgICAvLyBzdGQ6OnJl c3VsdF9vZiBpcyBkZXByZWNhdGVkIGluIEMrKzE3IGFuZCByZW1vdmVkIGluIEMrKzIwLiBIZW5j ZSwgaXQgaXMKLSAgICAvLyByZXBsYWNlZCB3aXRoIHN0ZDo6aW52b2tlX3Jlc3VsdCBoZXJlLgot ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZS4uLiBVPgotICAgIHVzaW5nIEZ1 bmN0aW9uUmV0dXJuVHlwZSA9IHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PHN0ZDo6cmVtb3ZlX2N2 X3Q8c3RkOjppbnZva2VfcmVzdWx0X3Q8RnVuYywgVS4uLj4+PjsKLSNlbHNlCi0gICAgLy8gS2Vl cCA6OnR5cGUgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIHN1cHBvcnQgQysrMTEKLSAgICB0ZW1wbGF0 ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUuLi4gVT4KLSAgICB1c2luZyBGdW5jdGlvblJldHVy blR5cGUgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8dHlwZW5hbWUgc3RkOjpyZW1v dmVfY3Y8dHlwZW5hbWUgc3RkOjpyZXN1bHRfb2Y8RnVuYyhVLi4uKT46OnR5cGU+Ojp0eXBlPjo6 dHlwZTsKLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi1uYW1lc3BhY2UgbXBsX3sK LSAgICBzdHJ1Y3QgbmE7Ci19Ci0KLS8vIGVuZCBjYXRjaF9tZXRhLmhwcAotbmFtZXNwYWNlIENh dGNoIHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgQz4KLWNsYXNzIFRlc3RJbnZva2VyQXNNZXRob2Qg OiBwdWJsaWMgSVRlc3RJbnZva2VyIHsKLSAgICB2b2lkIChDOjoqbV90ZXN0QXNNZXRob2QpKCk7 Ci1wdWJsaWM6Ci0gICAgVGVzdEludm9rZXJBc01ldGhvZCggdm9pZCAoQzo6KnRlc3RBc01ldGhv ZCkoKSApIG5vZXhjZXB0IDogbV90ZXN0QXNNZXRob2QoIHRlc3RBc01ldGhvZCApIHt9Ci0KLSAg ICB2b2lkIGludm9rZSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgQyBvYmo7Ci0gICAgICAg IChvYmouKm1fdGVzdEFzTWV0aG9kKSgpOwotICAgIH0KLX07Ci0KLWF1dG8gbWFrZVRlc3RJbnZv a2VyKCB2b2lkKCp0ZXN0QXNGdW5jdGlvbikoKSApIG5vZXhjZXB0IC0+IElUZXN0SW52b2tlcio7 Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEM+Ci1hdXRvIG1ha2VUZXN0SW52b2tlciggdm9pZCAoQzo6 KnRlc3RBc01ldGhvZCkoKSApIG5vZXhjZXB0IC0+IElUZXN0SW52b2tlciogewotICAgIHJldHVy biBuZXcoc3RkOjpub3Rocm93KSBUZXN0SW52b2tlckFzTWV0aG9kPEM+KCB0ZXN0QXNNZXRob2Qg KTsKLX0KLQotc3RydWN0IE5hbWVBbmRUYWdzIHsKLSAgICBOYW1lQW5kVGFncyggU3RyaW5nUmVm IGNvbnN0JiBuYW1lXyA9IFN0cmluZ1JlZigpLCBTdHJpbmdSZWYgY29uc3QmIHRhZ3NfID0gU3Ry aW5nUmVmKCkgKSBub2V4Y2VwdDsKLSAgICBTdHJpbmdSZWYgbmFtZTsKLSAgICBTdHJpbmdSZWYg dGFnczsKLX07Ci0KLXN0cnVjdCBBdXRvUmVnIDogTm9uQ29weWFibGUgewotICAgIEF1dG9SZWco IElUZXN0SW52b2tlciogaW52b2tlciwgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLCBT dHJpbmdSZWYgY29uc3QmIGNsYXNzT3JNZXRob2QsIE5hbWVBbmRUYWdzIGNvbnN0JiBuYW1lQW5k VGFncyApIG5vZXhjZXB0OwotICAgIH5BdXRvUmVnKCk7Ci19OwotCi19IC8vIGVuZCBuYW1lc3Bh Y2UgQ2F0Y2gKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEUpCi0gICAgI2RlZmlu ZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRV9OT19SRUdJU1RSQVRJT04oIFRlc3ROYW1lLCAuLi4g KSBcCi0gICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKLSAgICAjZGVmaW5lIElOVEVSTkFM X0NBVENIX1RFU1RDQVNFX01FVEhPRF9OT19SRUdJU1RSQVRJT04oIFRlc3ROYW1lLCBDbGFzc05h bWUsIC4uLiApIFwKLSAgICAgICAgbmFtZXNwYWNleyAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICAgICAgIHN0cnVjdCBUZXN0TmFtZSA6IElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJF TlMoQ2xhc3NOYW1lKSB7IFwKLSAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgICAgICAgICAg ICAgIFwKLSAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAg ICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdm9pZCBUZXN0 TmFtZTo6dGVzdCgpCi0gICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NB U0VfTk9fUkVHSVNUUkFUSU9OXzIoIFRlc3ROYW1lLCBUZXN0RnVuYywgTmFtZSwgVGFncywgU2ln bmF0dXJlLCAuLi4gKSAgXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1Qo VGVzdEZ1bmMsIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJFTlMoU2lnbmF0dXJlKSkKLSAgICAj ZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9fUkVHSVNU UkFUSU9OXzIoIFRlc3ROYW1lQ2xhc3MsIFRlc3ROYW1lLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3Ms IFNpZ25hdHVyZSwgLi4uICkgICAgXAotICAgICAgICBuYW1lc3BhY2V7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICAgICAgIG5hbWVzcGFjZSBJTlRFUk5BTF9DQVRDSF9NQUtFX05B TUVTUEFDRShUZXN0TmFtZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAotICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVF9NRVRIT0QoVGVz dE5hbWUsIENsYXNzTmFtZSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUp KTtcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAg ICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgSU5URVJOQUxf Q0FUQ0hfREVGSU5FX1NJR19URVNUX01FVEhPRChUZXN0TmFtZSwgSU5URVJOQUxfQ0FUQ0hfUkVN T1ZFX1BBUkVOUyhTaWduYXR1cmUpKQotCi0gICAgI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElU SU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IKLSAgICAgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9U RU1QTEFURV9URVNUX0NBU0VfTk9fUkVHSVNUUkFUSU9OKE5hbWUsIFRhZ3MsIC4uLikgXAotICAg ICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX05PX1JFR0lTVFJBVElP Tl8yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1Rf RV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9N X1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5hbWUsIFRhZ3MsIHR5cGVuYW1lIFRlc3RU eXBlLCBfX1ZBX0FSR1NfXyApCi0gICAgI2Vsc2UKLSAgICAgICAgI2RlZmluZSBJTlRFUk5BTF9D QVRDSF9URU1QTEFURV9URVNUX0NBU0VfTk9fUkVHSVNUUkFUSU9OKE5hbWUsIFRhZ3MsIC4uLikg XAotICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRD SF9URU1QTEFURV9URVNUX0NBU0VfTk9fUkVHSVNUUkFUSU9OXzIoIElOVEVSTkFMX0NBVENIX1VO SVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVSTkFM X0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfRl9V X05fQ18gKSwgTmFtZSwgVGFncywgdHlwZW5hbWUgVGVzdFR5cGUsIF9fVkFfQVJHU19fICkgKQot ICAgICNlbmRpZgotCi0gICAgI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19Q UkVQUk9DRVNTT1IKLSAgICAgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNU X0NBU0VfU0lHX05PX1JFR0lTVFJBVElPTihOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLikgXAot ICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX05PX1JFR0lTVFJB VElPTl8yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9B X1RfRV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1Rf RV9NX1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwg X19WQV9BUkdTX18gKQotICAgICNlbHNlCi0gICAgICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hf VEVNUExBVEVfVEVTVF9DQVNFX1NJR19OT19SRUdJU1RSQVRJT04oTmFtZSwgVGFncywgU2lnbmF0 dXJlLCAuLi4pIFwKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX05PX1JFR0lTVFJBVElPTl8yKCBJTlRFUk5B TF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyAp LCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9U X0VfU19UX0ZfVV9OX0NfICksIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKSAp Ci0gICAgI2VuZGlmCi0KLSAgICAjaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZD X1BSRVBST0NFU1NPUgotICAgICAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RF U1RfQ0FTRV9NRVRIT0RfTk9fUkVHSVNUUkFUSU9OKCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsLi4u ICkgXAotICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhP RF9OT19SRUdJU1RSQVRJT05fMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0Nf SF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9DX0xfQV9TX1NfICksIElOVEVSTkFMX0NBVENIX1VO SVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICkgLCBDbGFzc05h bWUsIE5hbWUsIFRhZ3MsIHR5cGVuYW1lIFQsIF9fVkFfQVJHU19fICkKLSAgICAjZWxzZQotICAg ICAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9f UkVHSVNUUkFUSU9OKCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsLi4uICkgXAotICAgICAgICAgICAg SU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNU X0NBU0VfTUVUSE9EX05PX1JFR0lTVFJBVElPTl8yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFN RSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UX0NfTF9BX1NfU18gKSwgSU5URVJO QUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8g KSAsIENsYXNzTmFtZSwgTmFtZSwgVGFncywgdHlwZW5hbWUgVCwgX19WQV9BUkdTX18gKSApCi0g ICAgI2VuZGlmCi0KLSAgICAjaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BS RVBST0NFU1NPUgotICAgICAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1Rf Q0FTRV9NRVRIT0RfU0lHX05PX1JFR0lTVFJBVElPTiggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBT aWduYXR1cmUsIC4uLiApIFwKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RF U1RfQ0FTRV9NRVRIT0RfTk9fUkVHSVNUUkFUSU9OXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9O QU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfQ19MX0FfU19TXyApLCBJTlRF Uk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19U XyApICwgQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIF9fVkFfQVJHU19fICkKLSAg ICAjZWxzZQotICAgICAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FT RV9NRVRIT0RfU0lHX05PX1JFR0lTVFJBVElPTiggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBTaWdu YXR1cmUsIC4uLiApIFwKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUygg SU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9OT19SRUdJU1RSQVRJT05f MiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0Vf VF9FX1NfVF9DX0xfQV9TX1NfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9D X0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICkgLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNp Z25hdHVyZSwgX19WQV9BUkdTX18gKSApCi0gICAgI2VuZGlmCi0jZW5kaWYKLQotICAgIC8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8KLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMigg VGVzdE5hbWUsIC4uLiApIFwKLSAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKTsgXAotICAg ICAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCi0gICAgICAg IENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAotICAgICAgICBuYW1l c3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVn aXN0cmFyICkoIENhdGNoOjptYWtlVGVzdEludm9rZXIoICZUZXN0TmFtZSApLCBDQVRDSF9JTlRF Uk5BTF9MSU5FSU5GTywgQ2F0Y2g6OlN0cmluZ1JlZigpLCBDYXRjaDo6TmFtZUFuZFRhZ3N7IF9f VkFfQVJHU19fIH0gKTsgfSAvKiBOT0xJTlQgKi8gXAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9T VE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKLSAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUo KQotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIC4uLiApIFwKLSAgICAgICAg SU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19B X1RfQ19IX1RfRV9TX1RfICksIF9fVkFfQVJHU19fICkKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8KLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1 YWxpZmllZE1ldGhvZCwgLi4uICkgXAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJO SU5HU19TVVBQUkVTU0lPTiBcCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JB TFNfV0FSTklOR1MgXAotICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFM X0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoIENhdGNoOjptYWtlVGVzdEludm9r ZXIoICZRdWFsaWZpZWRNZXRob2QgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICImIiAjUXVh bGlmaWVkTWV0aG9kLCBDYXRjaDo6TmFtZUFuZFRhZ3N7IF9fVkFfQVJHU19fIH0gKTsgfSAvKiBO T0xJTlQgKi8gXAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNT SU9OCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgI2RlZmluZSBJTlRFUk5BTF9D QVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdE5hbWUsIENsYXNzTmFtZSwgLi4uIClcCi0gICAg ICAgIENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKLSAgICAgICAg Q0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfR0xPQkFMU19XQVJOSU5HUyBcCi0gICAgICAgIG5hbWVz cGFjZXsgXAotICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1lIDogSU5URVJOQUxfQ0FUQ0hfUkVN T1ZFX1BBUkVOUyhDbGFzc05hbWUpIHsgXAotICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpOyBc Ci0gICAgICAgICAgICB9OyBcCi0gICAgICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9D QVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApICggQ2F0Y2g6Om1ha2VUZXN0SW52b2tl ciggJlRlc3ROYW1lOjp0ZXN0ICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjQ2xhc3NOYW1l LCBDYXRjaDo6TmFtZUFuZFRhZ3N7IF9fVkFfQVJHU19fIH0gKTsgLyogTk9MSU5UICovIFwKLSAg ICAgICAgfSBcCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJ T04gXAotICAgICAgICB2b2lkIFRlc3ROYW1lOjp0ZXN0KCkKLSAgICAjZGVmaW5lIElOVEVSTkFM X0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgLi4uICkgXAotICAgICAgICBJTlRF Uk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUo IENfQV9UX0NfSF9UX0VfU19UXyApLCBDbGFzc05hbWUsIF9fVkFfQVJHU19fICkKLQotICAgIC8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVS X1RFU1RDQVNFKCBGdW5jdGlvbiwgLi4uICkgXAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVEFS VF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNT X0dMT0JBTFNfV0FSTklOR1MgXAotICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRD SF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCBDYXRjaDo6bWFrZVRlc3RJbnZva2VyKCBG dW5jdGlvbiApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6OlN0cmluZ1JlZigpLCBD YXRjaDo6TmFtZUFuZFRhZ3N7IF9fVkFfQVJHU19fIH0gKTsgLyogTk9MSU5UICovIFwKLSAgICAg ICAgQ0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTgotCi0gICAgLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLwotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVT VF9DQVNFXzIoVGVzdE5hbWUsIFRlc3RGdW5jLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLiAp XAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCi0g ICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAotICAgICAg ICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19aRVJPX1ZBUklBRElDX1dBUk5JTkdTIFwKLSAgICAg ICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfVU5VU0VEX1RFTVBMQVRFX1dBUk5JTkdTIFwKLSAg ICAgICAgSU5URVJOQUxfQ0FUQ0hfREVDTEFSRV9TSUdfVEVTVChUZXN0RnVuYywgSU5URVJOQUxf Q0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKTtcCi0gICAgICAgIG5hbWVzcGFjZSB7XAot ICAgICAgICBuYW1lc3BhY2UgSU5URVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UoVGVzdE5hbWUp e1wKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1RZUEVfR0VOXAotICAgICAgICAgICAgSU5U RVJOQUxfQ0FUQ0hfTlRUUF9HRU4oSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1 cmUpKVwKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX05UVFBfUkVHX0dFTihUZXN0RnVuYyxJ TlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKFNpZ25hdHVyZSkpXAotICAgICAgICAgICAgdGVt cGxhdGU8dHlwZW5hbWUuLi5UeXBlcz4gXAotICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1le1wK LSAgICAgICAgICAgICAgICBUZXN0TmFtZSgpe1wKLSAgICAgICAgICAgICAgICAgICAgaW50IGlu ZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAg ICAgICAgICAgIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiB0bXBsX3R5cGVzW10gPSB7Q0FUQ0hfUkVD X0xJU1QoSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFX1dJVEhPVVRfUEFSRU5TLCBfX1ZBX0FSR1Nf Xyl9O1wKLSAgICAgICAgICAgICAgICAgICAgdXNpbmcgZXhwYW5kZXIgPSBpbnRbXTtcCi0gICAg ICAgICAgICAgICAgICAgICh2b2lkKWV4cGFuZGVyeyhyZWdfdGVzdChUeXBlc3t9LCBDYXRjaDo6 TmFtZUFuZFRhZ3N7IE5hbWUgIiAtICIgKyBzdGQ6OnN0cmluZyh0bXBsX3R5cGVzW2luZGV4XSks IFRhZ3MgfSApLCBpbmRleCsrKS4uLiB9Oy8qIE5PTElOVCAqLyBcCi0gICAgICAgICAgICAgICAg fVwKLSAgICAgICAgICAgIH07XAotICAgICAgICAgICAgc3RhdGljIGludCBJTlRFUk5BTF9DQVRD SF9VTklRVUVfTkFNRSggZ2xvYmFsUmVnaXN0cmFyICkgPSBbXSgpe1wKLSAgICAgICAgICAgIFRl c3ROYW1lPElOVEVSTkFMX0NBVENIX01BS0VfVFlQRV9MSVNUU19GUk9NX1RZUEVTKF9fVkFfQVJH U19fKT4oKTtcCi0gICAgICAgICAgICByZXR1cm4gMDtcCi0gICAgICAgIH0oKTtcCi0gICAgICAg IH1cCi0gICAgICAgIH1cCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQ UFJFU1NJT04gXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1QoVGVzdEZ1 bmMsSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKQotCi0jaWZuZGVmIENB VENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgotICAgICNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFKE5hbWUsIFRhZ3MsIC4uLikgXAotICAgICAg ICBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfMiggSU5URVJOQUxfQ0FUQ0hfVU5J UVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxf Q0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1Vf Tl9DXyApLCBOYW1lLCBUYWdzLCB0eXBlbmFtZSBUZXN0VHlwZSwgX19WQV9BUkdTX18gKQotI2Vs c2UKLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRShOYW1lLCBU YWdzLCAuLi4pIFwKLSAgICAgICAgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5B TF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUo IENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hfVU5J UVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyApLCBO YW1lLCBUYWdzLCB0eXBlbmFtZSBUZXN0VHlwZSwgX19WQV9BUkdTX18gKSApCi0jZW5kaWYKLQot I2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IKLSAgICAj ZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9TSUcoTmFtZSwgVGFncywg U2lnbmF0dXJlLCAuLi4pIFwKLSAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9D QVNFXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0Ff VF9FX1RfRV9TX1RfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9F X01fUF9MX0FfVF9FX1RfRV9TX1RfRl9VX05fQ18gKSwgTmFtZSwgVGFncywgU2lnbmF0dXJlLCBf X1ZBX0FSR1NfXyApCi0jZWxzZQotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf VEVTVF9DQVNFX1NJRyhOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLikgXAotICAgICAgICBJTlRF Uk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FT RV8yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1Rf RV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9N X1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19W QV9BUkdTX18gKSApCi0jZW5kaWYKLQotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExB VEVfUFJPRFVDVF9URVNUX0NBU0UyKFRlc3ROYW1lLCBUZXN0RnVuY05hbWUsIE5hbWUsIFRhZ3Ms IFNpZ25hdHVyZSwgVG1wbFR5cGVzLCBUeXBlc0xpc3QpIFwKLSAgICAgICAgQ0FUQ0hfSU5URVJO QUxfU1RBUlRfV0FSTklOR1NfU1VQUFJFU1NJT04gICAgICAgICAgICAgICAgICAgICAgXAotICAg ICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdTICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfWkVST19WQVJJQURJ Q19XQVJOSU5HUyAgICAgICAgICAgICAgICBcCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBS RVNTX1VOVVNFRF9URU1QTEFURV9XQVJOSU5HUyAgICAgICAgICAgICAgXAotICAgICAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBUZXN0VHlwZT4gc3RhdGljIHZvaWQgVGVzdEZ1bmNOYW1lKCk7ICAgICAg IFwKLSAgICAgICAgbmFtZXNwYWNlIHtcCi0gICAgICAgIG5hbWVzcGFjZSBJTlRFUk5BTF9DQVRD SF9NQUtFX05BTUVTUEFDRShUZXN0TmFtZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCi0gICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9UWVBFX0dFTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgSU5U RVJOQUxfQ0FUQ0hfTlRUUF9HRU4oSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1 cmUpKSAgICAgICAgIFwKLSAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFR5cGVzPiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBzdHJ1Y3QgVGVzdE5h bWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAg ICAgICAgIHZvaWQgcmVnX3Rlc3RzKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIHVzaW5nIGV4 cGFuZGVyID0gaW50W107ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAg ICAgICAgICBjb25zdGV4cHIgY2hhciBjb25zdCogdG1wbF90eXBlc1tdID0ge0NBVENIX1JFQ19M SVNUKElOVEVSTkFMX0NBVENIX1NUUklOR0laRV9XSVRIT1VUX1BBUkVOUywgSU5URVJOQUxfQ0FU Q0hfUkVNT1ZFX1BBUkVOUyhUbXBsVHlwZXMpKX07XAotICAgICAgICAgICAgICAgICAgICBjb25z dGV4cHIgY2hhciBjb25zdCogdHlwZXNfbGlzdFtdID0ge0NBVENIX1JFQ19MSVNUKElOVEVSTkFM X0NBVENIX1NUUklOR0laRV9XSVRIT1VUX1BBUkVOUywgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BB UkVOUyhUeXBlc0xpc3QpKX07XAotICAgICAgICAgICAgICAgICAgICBjb25zdGV4cHIgYXV0byBu dW1fdHlwZXMgPSBzaXplb2YodHlwZXNfbGlzdCkgLyBzaXplb2YodHlwZXNfbGlzdFswXSk7XAot ICAgICAgICAgICAgICAgICAgICAodm9pZClleHBhbmRlcnsoQ2F0Y2g6OkF1dG9SZWcoIENhdGNo OjptYWtlVGVzdEludm9rZXIoICZUZXN0RnVuY05hbWU8VHlwZXM+ICksIENBVENIX0lOVEVSTkFM X0xJTkVJTkZPLCBDYXRjaDo6U3RyaW5nUmVmKCksIENhdGNoOjpOYW1lQW5kVGFnc3sgTmFtZSAi IC0gIiArIHN0ZDo6c3RyaW5nKHRtcGxfdHlwZXNbaW5kZXggLyBudW1fdHlwZXNdKSArICI8IiAr IHN0ZDo6c3RyaW5nKHR5cGVzX2xpc3RbaW5kZXggJSBudW1fdHlwZXNdKSArICI+IiwgVGFncyB9 ICksIGluZGV4KyspLi4uIH07LyogTk9MSU5UICovXAotICAgICAgICAgICAgICAgIH0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAg ICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgICAgICBzdGF0aWMgaW50IElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1F KCBnbG9iYWxSZWdpc3RyYXIgKSA9IFtdKCl7IFwKLSAgICAgICAgICAgICAgICB1c2luZyBUZXN0 SW5pdCA9IHR5cGVuYW1lIGNyZWF0ZTxUZXN0TmFtZSwgZGVjbHR5cGUoZ2V0X3dyYXBwZXI8SU5U RVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhUbXBsVHlwZXMpPigpKSwgVHlwZUxpc3Q8SU5URVJO QUxfQ0FUQ0hfTUFLRV9UWVBFX0xJU1RTX0ZST01fVFlQRVMoSU5URVJOQUxfQ0FUQ0hfUkVNT1ZF X1BBUkVOUyhUeXBlc0xpc3QpKT4+Ojp0eXBlOyBcCi0gICAgICAgICAgICAgICAgVGVzdEluaXQg dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAg ICAgICAgIHQucmVnX3Rlc3RzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9KCk7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJF U1NJT04gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg VGVzdFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0 YXRpYyB2b2lkIFRlc3RGdW5jTmFtZSgpCi0KLSNpZm5kZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElP TkFMX01TVkNfUFJFUFJPQ0VTU09SCi0gICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFU RV9QUk9EVUNUX1RFU1RfQ0FTRShOYW1lLCBUYWdzLCAuLi4pXAotICAgICAgICBJTlRFUk5BTF9D QVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRTIoSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05B TUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hf VU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyAp LCBOYW1lLCBUYWdzLCB0eXBlbmFtZSBULF9fVkFfQVJHU19fKQotI2Vsc2UKLSAgICAjZGVmaW5l IElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFKE5hbWUsIFRhZ3MsIC4u LilcCi0gICAgICAgIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hf VEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSgg Q19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklR VUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5h bWUsIFRhZ3MsIHR5cGVuYW1lIFQsIF9fVkFfQVJHU19fICkgKQotI2VuZGlmCi0KLSNpZm5kZWYg Q0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09SCi0gICAgI2RlZmluZSBJ TlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9TSUcoTmFtZSwgVGFncywg U2lnbmF0dXJlLCAuLi4pXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNU X1RFU1RfQ0FTRTIoSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9Q X0xfQV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0Nf SF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyApLCBOYW1lLCBUYWdzLCBTaWduYXR1 cmUsIF9fVkFfQVJHU19fKQotI2Vsc2UKLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBM QVRFX1BST0RVQ1RfVEVTVF9DQVNFX1NJRyhOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4uLilcCi0g ICAgICAgIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExB VEVfUFJPRFVDVF9URVNUX0NBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1Rf Q19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFN RSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UX0ZfVV9OX0NfICksIE5hbWUsIFRh Z3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKSApCi0jZW5kaWYKLQotICAgICNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfTElTVF9URVNUX0NBU0VfMihUZXN0TmFtZSwgVGVzdEZ1bmMs IE5hbWUsIFRhZ3MsIFRtcGxMaXN0KVwKLSAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1RBUlRfV0FS TklOR1NfU1VQUFJFU1NJT04gXAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9C QUxTX1dBUk5JTkdTIFwKLSAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfVU5VU0VEX1RF TVBMQVRFX1dBUk5JTkdTIFwKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGVzdFR5cGU+IHN0 YXRpYyB2b2lkIFRlc3RGdW5jKCk7ICAgICAgIFwKLSAgICAgICAgbmFtZXNwYWNlIHtcCi0gICAg ICAgIG5hbWVzcGFjZSBJTlRFUk5BTF9DQVRDSF9NQUtFX05BTUVTUEFDRShUZXN0TmFtZSl7XAot ICAgICAgICBJTlRFUk5BTF9DQVRDSF9UWVBFX0dFTlwKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5h bWUuLi4gVHlwZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3Ry dWN0IFRlc3ROYW1lIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICAgICAgIHZvaWQgcmVnX3Rlc3RzKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICB1c2luZyBleHBh bmRlciA9IGludFtdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAg ICAodm9pZClleHBhbmRlcnsoQ2F0Y2g6OkF1dG9SZWcoIENhdGNoOjptYWtlVGVzdEludm9rZXIo ICZUZXN0RnVuYzxUeXBlcz4gKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpTdHJp bmdSZWYoKSwgQ2F0Y2g6Ok5hbWVBbmRUYWdzeyBOYW1lICIgLSAiICsgc3RkOjpzdHJpbmcoSU5U RVJOQUxfQ0FUQ0hfU1RSSU5HSVpFKFRtcGxMaXN0KSkgKyAiIC0gIiArIHN0ZDo6dG9fc3RyaW5n KGluZGV4KSwgVGFncyB9ICksIGluZGV4KyspLi4uIH07LyogTk9MSU5UICovXAotICAgICAgICAg ICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAotICAgICAgICB9O1wKLSAgICAgICAgc3RhdGljIGludCBJTlRFUk5BTF9DQVRDSF9VTklRVUVf TkFNRSggZ2xvYmFsUmVnaXN0cmFyICkgPSBbXSgpeyBcCi0gICAgICAgICAgICAgICAgdXNpbmcg VGVzdEluaXQgPSB0eXBlbmFtZSBjb252ZXJ0PFRlc3ROYW1lLCBUbXBsTGlzdD46OnR5cGU7IFwK LSAgICAgICAgICAgICAgICBUZXN0SW5pdCB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgdC5yZWdfdGVzdHMoKTsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHJldHVybiAw OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAg ICAgIH0oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgIH19XAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdT X1NVUFBSRVNTSU9OICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFRlc3RUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICAgICBzdGF0aWMgdm9pZCBUZXN0RnVuYygpCi0KLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENI X1RFTVBMQVRFX0xJU1RfVEVTVF9DQVNFKE5hbWUsIFRhZ3MsIFRtcGxMaXN0KSBcCi0gICAgICAg IElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX0xJU1RfVEVTVF9DQVNFXzIoIElOVEVSTkFMX0NBVENI X1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVS TkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1Rf Rl9VX05fQ18gKSwgTmFtZSwgVGFncywgVG1wbExpc3QgKQotCi0gICAgI2RlZmluZSBJTlRFUk5B TF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EXzIoIFRlc3ROYW1lQ2xhc3MsIFRlc3RO YW1lLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgLi4uICkgXAotICAgICAgICBD QVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTiBcCi0gICAgICAgIENBVENI X0lOVEVSTkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MgXAotICAgICAgICBDQVRDSF9JTlRF Uk5BTF9TVVBQUkVTU19aRVJPX1ZBUklBRElDX1dBUk5JTkdTIFwKLSAgICAgICAgQ0FUQ0hfSU5U RVJOQUxfU1VQUFJFU1NfVU5VU0VEX1RFTVBMQVRFX1dBUk5JTkdTIFwKLSAgICAgICAgbmFtZXNw YWNlIHtcCi0gICAgICAgIG5hbWVzcGFjZSBJTlRFUk5BTF9DQVRDSF9NQUtFX05BTUVTUEFDRShU ZXN0TmFtZSl7IFwKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1RZUEVfR0VOXAotICAgICAg ICAgICAgSU5URVJOQUxfQ0FUQ0hfTlRUUF9HRU4oSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVO UyhTaWduYXR1cmUpKVwKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX0RFQ0xBUkVfU0lHX1RF U1RfTUVUSE9EKFRlc3ROYW1lLCBDbGFzc05hbWUsIElOVEVSTkFMX0NBVENIX1JFTU9WRV9QQVJF TlMoU2lnbmF0dXJlKSk7XAotICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfTlRUUF9SRUdfTUVU SE9EX0dFTihUZXN0TmFtZSwgSU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUp KVwKLSAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uVHlwZXM+IFwKLSAgICAgICAgICAg IHN0cnVjdCBUZXN0TmFtZUNsYXNze1wKLSAgICAgICAgICAgICAgICBUZXN0TmFtZUNsYXNzKCl7 XAotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY29uc3RleHByIGNoYXIgY29u c3QqIHRtcGxfdHlwZXNbXSA9IHtDQVRDSF9SRUNfTElTVChJTlRFUk5BTF9DQVRDSF9TVFJJTkdJ WkVfV0lUSE9VVF9QQVJFTlMsIF9fVkFfQVJHU19fKX07XAotICAgICAgICAgICAgICAgICAgICB1 c2luZyBleHBhbmRlciA9IGludFtdO1wKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpZXhwYW5k ZXJ7KHJlZ190ZXN0KFR5cGVze30sICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kVGFnc3sgTmFt ZSAiIC0gIiArIHN0ZDo6c3RyaW5nKHRtcGxfdHlwZXNbaW5kZXhdKSwgVGFncyB9ICksIGluZGV4 KyspLi4uIH07LyogTk9MSU5UICovIFwKLSAgICAgICAgICAgICAgICB9XAotICAgICAgICAgICAg fTtcCi0gICAgICAgICAgICBzdGF0aWMgaW50IElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBn bG9iYWxSZWdpc3RyYXIgKSA9IFtdKCl7XAotICAgICAgICAgICAgICAgIFRlc3ROYW1lQ2xhc3M8 SU5URVJOQUxfQ0FUQ0hfTUFLRV9UWVBFX0xJU1RTX0ZST01fVFlQRVMoX19WQV9BUkdTX18pPigp O1wKLSAgICAgICAgICAgICAgICByZXR1cm4gMDtcCi0gICAgICAgIH0oKTtcCi0gICAgICAgIH1c Ci0gICAgICAgIH1cCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJF U1NJT04gXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9ERUZJTkVfU0lHX1RFU1RfTUVUSE9EKFRl c3ROYW1lLCBJTlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKFNpZ25hdHVyZSkpCi0KLSNpZm5k ZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJFUFJPQ0VTU09SCi0gICAgI2RlZmlu ZSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIE5h bWUsIFRhZ3MsLi4uICkgXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NB U0VfTUVUSE9EXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01f UF9MX0FfVF9FX1RfRV9TX1RfQ19MX0FfU19TXyApLCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFN RSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApICwgQ2xhc3NOYW1lLCBOYW1l LCBUYWdzLCB0eXBlbmFtZSBULCBfX1ZBX0FSR1NfXyApCi0jZWxzZQotICAgICNkZWZpbmUgSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCBOYW1lLCBU YWdzLC4uLiApIFwKLSAgICAgICAgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5B TF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EXzIoIElOVEVSTkFMX0NBVENIX1VOSVFV RV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfQ19MX0FfU19TXyApLCBJ TlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0Vf U19UXyApICwgQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCB0eXBlbmFtZSBULCBfX1ZBX0FSR1NfXyAp ICkKLSNlbmRpZgotCi0jaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBS T0NFU1NPUgotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01F VEhPRF9TSUcoIENsYXNzTmFtZSwgTmFtZSwgVGFncywgU2lnbmF0dXJlLCAuLi4gKSBcCi0gICAg ICAgIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfMiggSU5URVJOQUxf Q0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9DX0xf QV9TX1NfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9M X0FfVF9FX1RfRV9TX1RfICkgLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19W QV9BUkdTX18gKQotI2Vsc2UKLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RF U1RfQ0FTRV9NRVRIT0RfU0lHKCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgLi4u ICkgXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENI X1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUo IENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9DX0xfQV9TX1NfICksIElOVEVSTkFM X0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICkg LCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKSApCi0jZW5k aWYKLQotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NB U0VfTUVUSE9EXzIoVGVzdE5hbWVDbGFzcywgVGVzdE5hbWUsIENsYXNzTmFtZSwgTmFtZSwgVGFn cywgU2lnbmF0dXJlLCBUbXBsVHlwZXMsIFR5cGVzTGlzdClcCi0gICAgICAgIENBVENIX0lOVEVS TkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKLSAgICAgICAgQ0FUQ0hfSU5URVJOQUxf U1VQUFJFU1NfR0xPQkFMU19XQVJOSU5HUyBcCi0gICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBS RVNTX1pFUk9fVkFSSUFESUNfV0FSTklOR1MgXAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQ UkVTU19VTlVTRURfVEVNUExBVEVfV0FSTklOR1MgXAotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBUZXN0VHlwZT4gXAotICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1lIDogSU5URVJOQUxfQ0FU Q0hfUkVNT1ZFX1BBUkVOUyhDbGFzc05hbWUgPFRlc3RUeXBlPikgeyBcCi0gICAgICAgICAgICAg ICAgdm9pZCB0ZXN0KCk7XAotICAgICAgICAgICAgfTtcCi0gICAgICAgIG5hbWVzcGFjZSB7XAot ICAgICAgICBuYW1lc3BhY2UgSU5URVJOQUxfQ0FUQ0hfTUFLRV9OQU1FU1BBQ0UoVGVzdE5hbWVD bGFzcykge1wKLSAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1RZUEVfR0VOICAgICAgICAgICAg ICAgICAgXAotICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfTlRUUF9HRU4oSU5URVJOQUxfQ0FU Q0hfUkVNT1ZFX1BBUkVOUyhTaWduYXR1cmUpKVwKLSAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVu YW1lLi4uVHlwZXM+XAotICAgICAgICAgICAgc3RydWN0IFRlc3ROYW1lQ2xhc3N7XAotICAgICAg ICAgICAgICAgIHZvaWQgcmVnX3Rlc3RzKCl7XAotICAgICAgICAgICAgICAgICAgICBpbnQgaW5k ZXggPSAwO1wKLSAgICAgICAgICAgICAgICAgICAgdXNpbmcgZXhwYW5kZXIgPSBpbnRbXTtcCi0g ICAgICAgICAgICAgICAgICAgIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiB0bXBsX3R5cGVzW10gPSB7 Q0FUQ0hfUkVDX0xJU1QoSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFX1dJVEhPVVRfUEFSRU5TLCBJ TlRFUk5BTF9DQVRDSF9SRU1PVkVfUEFSRU5TKFRtcGxUeXBlcykpfTtcCi0gICAgICAgICAgICAg ICAgICAgIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiB0eXBlc19saXN0W10gPSB7Q0FUQ0hfUkVDX0xJ U1QoSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSVpFX1dJVEhPVVRfUEFSRU5TLCBJTlRFUk5BTF9DQVRD SF9SRU1PVkVfUEFSRU5TKFR5cGVzTGlzdCkpfTtcCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0 ZXhwciBhdXRvIG51bV90eXBlcyA9IHNpemVvZih0eXBlc19saXN0KSAvIHNpemVvZih0eXBlc19s aXN0WzBdKTtcCi0gICAgICAgICAgICAgICAgICAgICh2b2lkKWV4cGFuZGVyeyhDYXRjaDo6QXV0 b1JlZyggQ2F0Y2g6Om1ha2VUZXN0SW52b2tlciggJlRlc3ROYW1lPFR5cGVzPjo6dGVzdCApLCBD QVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmRUYWdzeyBO YW1lICIgLSAiICsgc3RkOjpzdHJpbmcodG1wbF90eXBlc1tpbmRleCAvIG51bV90eXBlc10pICsg IjwiICsgc3RkOjpzdHJpbmcodHlwZXNfbGlzdFtpbmRleCAlIG51bV90eXBlc10pICsgIj4iLCBU YWdzIH0gKSwgaW5kZXgrKykuLi4gfTsvKiBOT0xJTlQgKi8gXAotICAgICAgICAgICAgICAgIH1c Ci0gICAgICAgICAgICB9O1wKLSAgICAgICAgICAgIHN0YXRpYyBpbnQgSU5URVJOQUxfQ0FUQ0hf VU5JUVVFX05BTUUoIGdsb2JhbFJlZ2lzdHJhciApID0gW10oKXtcCi0gICAgICAgICAgICAgICAg dXNpbmcgVGVzdEluaXQgPSB0eXBlbmFtZSBjcmVhdGU8VGVzdE5hbWVDbGFzcywgZGVjbHR5cGUo Z2V0X3dyYXBwZXI8SU5URVJOQUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhUbXBsVHlwZXMpPigpKSwg VHlwZUxpc3Q8SU5URVJOQUxfQ0FUQ0hfTUFLRV9UWVBFX0xJU1RTX0ZST01fVFlQRVMoSU5URVJO QUxfQ0FUQ0hfUkVNT1ZFX1BBUkVOUyhUeXBlc0xpc3QpKT4+Ojp0eXBlO1wKLSAgICAgICAgICAg ICAgICBUZXN0SW5pdCB0O1wKLSAgICAgICAgICAgICAgICB0LnJlZ190ZXN0cygpO1wKLSAgICAg ICAgICAgICAgICByZXR1cm4gMDtcCi0gICAgICAgICAgICB9KCk7IFwKLSAgICAgICAgfVwKLSAg ICAgICAgfVwKLSAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVTU0lP TiBcCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRlc3RUeXBlPiBcCi0gICAgICAgIHZvaWQg VGVzdE5hbWU8VGVzdFR5cGU+Ojp0ZXN0KCkKLQotI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElU SU9OQUxfTVNWQ19QUkVQUk9DRVNTT1IKLSAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFTVBM QVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCAuLi4g KVwKLSAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVU SE9EXzIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0Ff VF9FX1RfRV9TX1RfICksIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9F X01fUF9MX0FfVF9FX1RfRV9TX1RfRl9VX05fQ18gKSwgQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCB0 eXBlbmFtZSBULCBfX1ZBX0FSR1NfXyApCi0jZWxzZQotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FU Q0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIE5hbWUsIFRh Z3MsIC4uLiApXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFM X0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRF8yKCBJTlRFUk5BTF9DQVRD SF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19UXyApLCBJTlRF Uk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9NX1BfTF9BX1RfRV9UX0VfU19U X0ZfVV9OX0NfICksIENsYXNzTmFtZSwgTmFtZSwgVGFncywgdHlwZW5hbWUgVCxfX1ZBX0FSR1Nf XyApICkKLSNlbmRpZgotCi0jaWZuZGVmIENBVENIX0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BS RVBST0NFU1NPUgotICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9U RVNUX0NBU0VfTUVUSE9EX1NJRyggQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBTaWduYXR1cmUsIC4u LiApXAotICAgICAgICBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9N RVRIT0RfMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xf QV9UX0VfVF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9U X0VfTV9QX0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyApLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3Ms IFNpZ25hdHVyZSwgX19WQV9BUkdTX18gKQotI2Vsc2UKLSAgICAjZGVmaW5lIElOVEVSTkFMX0NB VENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRF9TSUcoIENsYXNzTmFtZSwgTmFt ZSwgVGFncywgU2lnbmF0dXJlLCAuLi4gKVwKLSAgICAgICAgSU5URVJOQUxfQ0FUQ0hfRVhQQU5E X1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0Rf MiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9QX0xfQV9UX0Vf VF9FX1NfVF8gKSwgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENfQV9UX0NfSF9UX0VfTV9Q X0xfQV9UX0VfVF9FX1NfVF9GX1VfTl9DXyApLCBDbGFzc05hbWUsIE5hbWUsIFRhZ3MsIFNpZ25h dHVyZSxfX1ZBX0FSR1NfXyApICkKLSNlbmRpZgotCi0gICAgI2RlZmluZSBJTlRFUk5BTF9DQVRD SF9URU1QTEFURV9MSVNUX1RFU1RfQ0FTRV9NRVRIT0RfMiggVGVzdE5hbWVDbGFzcywgVGVzdE5h bWUsIENsYXNzTmFtZSwgTmFtZSwgVGFncywgVG1wbExpc3QpIFwKLSAgICAgICAgQ0FUQ0hfSU5U RVJOQUxfU1RBUlRfV0FSTklOR1NfU1VQUFJFU1NJT04gXAotICAgICAgICBDQVRDSF9JTlRFUk5B TF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdTIFwKLSAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQ UFJFU1NfVU5VU0VEX1RFTVBMQVRFX1dBUk5JTkdTIFwKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5h bWUgVGVzdFR5cGU+IFwKLSAgICAgICAgc3RydWN0IFRlc3ROYW1lIDogSU5URVJOQUxfQ0FUQ0hf UkVNT1ZFX1BBUkVOUyhDbGFzc05hbWUgPFRlc3RUeXBlPikgeyBcCi0gICAgICAgICAgICB2b2lk IHRlc3QoKTtcCi0gICAgICAgIH07XAotICAgICAgICBuYW1lc3BhY2Uge1wKLSAgICAgICAgbmFt ZXNwYWNlIElOVEVSTkFMX0NBVENIX01BS0VfTkFNRVNQQUNFKFRlc3ROYW1lKXsgXAotICAgICAg ICAgICAgSU5URVJOQUxfQ0FUQ0hfVFlQRV9HRU5cCi0gICAgICAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZS4uLlR5cGVzPlwKLSAgICAgICAgICAgIHN0cnVjdCBUZXN0TmFtZUNsYXNze1wKLSAgICAg ICAgICAgICAgICB2b2lkIHJlZ190ZXN0cygpe1wKLSAgICAgICAgICAgICAgICAgICAgaW50IGlu ZGV4ID0gMDtcCi0gICAgICAgICAgICAgICAgICAgIHVzaW5nIGV4cGFuZGVyID0gaW50W107XAot ICAgICAgICAgICAgICAgICAgICAodm9pZClleHBhbmRlcnsoQ2F0Y2g6OkF1dG9SZWcoIENhdGNo OjptYWtlVGVzdEludm9rZXIoICZUZXN0TmFtZTxUeXBlcz46OnRlc3QgKSwgQ0FUQ0hfSU5URVJO QUxfTElORUlORk8sICNDbGFzc05hbWUsIENhdGNoOjpOYW1lQW5kVGFnc3sgTmFtZSAiIC0gIiAr IHN0ZDo6c3RyaW5nKElOVEVSTkFMX0NBVENIX1NUUklOR0laRShUbXBsTGlzdCkpICsgIiAtICIg KyBzdGQ6OnRvX3N0cmluZyhpbmRleCksIFRhZ3MgfSApLCBpbmRleCsrKS4uLiB9Oy8qIE5PTElO VCAqLyBcCi0gICAgICAgICAgICAgICAgfVwKLSAgICAgICAgICAgIH07XAotICAgICAgICAgICAg c3RhdGljIGludCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggZ2xvYmFsUmVnaXN0cmFyICkg PSBbXSgpe1wKLSAgICAgICAgICAgICAgICB1c2luZyBUZXN0SW5pdCA9IHR5cGVuYW1lIGNvbnZl cnQ8VGVzdE5hbWVDbGFzcywgVG1wbExpc3Q+Ojp0eXBlO1wKLSAgICAgICAgICAgICAgICBUZXN0 SW5pdCB0O1wKLSAgICAgICAgICAgICAgICB0LnJlZ190ZXN0cygpO1wKLSAgICAgICAgICAgICAg ICByZXR1cm4gMDtcCi0gICAgICAgICAgICB9KCk7IFwKLSAgICAgICAgfX1cCi0gICAgICAgIENB VENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJT04gXAotICAgICAgICB0ZW1wbGF0 ZTx0eXBlbmFtZSBUZXN0VHlwZT4gXAotICAgICAgICB2b2lkIFRlc3ROYW1lPFRlc3RUeXBlPjo6 dGVzdCgpCi0KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfTElTVF9URVNUX0NBU0Vf TUVUSE9EKENsYXNzTmFtZSwgTmFtZSwgVGFncywgVG1wbExpc3QpIFwKLSAgICAgICAgSU5URVJO QUxfQ0FUQ0hfVEVNUExBVEVfTElTVF9URVNUX0NBU0VfTUVUSE9EXzIoIElOVEVSTkFMX0NBVENI X1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1RfICksIElOVEVS TkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX01fUF9MX0FfVF9FX1RfRV9TX1Rf Rl9VX05fQ18gKSwgQ2xhc3NOYW1lLCBOYW1lLCBUYWdzLCBUbXBsTGlzdCApCi0KLS8vIGVuZCBj YXRjaF90ZXN0X3JlZ2lzdHJ5LmgKLS8vIHN0YXJ0IGNhdGNoX2NhcHR1cmUuaHBwCi0KLS8vIHN0 YXJ0IGNhdGNoX2Fzc2VydGlvbmhhbmRsZXIuaAotCi0vLyBzdGFydCBjYXRjaF9hc3NlcnRpb25p bmZvLmgKLQotLy8gc3RhcnQgY2F0Y2hfcmVzdWx0X3R5cGUuaAotCi1uYW1lc3BhY2UgQ2F0Y2gg ewotCi0gICAgLy8gUmVzdWx0V2FzOjpPZlR5cGUgZW51bQotICAgIHN0cnVjdCBSZXN1bHRXYXMg eyBlbnVtIE9mVHlwZSB7Ci0gICAgICAgIFVua25vd24gPSAtMSwKLSAgICAgICAgT2sgPSAwLAot ICAgICAgICBJbmZvID0gMSwKLSAgICAgICAgV2FybmluZyA9IDIsCi0KLSAgICAgICAgRmFpbHVy ZUJpdCA9IDB4MTAsCi0KLSAgICAgICAgRXhwcmVzc2lvbkZhaWxlZCA9IEZhaWx1cmVCaXQgfCAx LAotICAgICAgICBFeHBsaWNpdEZhaWx1cmUgPSBGYWlsdXJlQml0IHwgMiwKLQotICAgICAgICBF eGNlcHRpb24gPSAweDEwMCB8IEZhaWx1cmVCaXQsCi0KLSAgICAgICAgVGhyZXdFeGNlcHRpb24g PSBFeGNlcHRpb24gfCAxLAotICAgICAgICBEaWRudFRocm93RXhjZXB0aW9uID0gRXhjZXB0aW9u IHwgMiwKLQotICAgICAgICBGYXRhbEVycm9yQ29uZGl0aW9uID0gMHgyMDAgfCBGYWlsdXJlQml0 Ci0KLSAgICB9OyB9OwotCi0gICAgYm9vbCBpc09rKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRU eXBlICk7Ci0gICAgYm9vbCBpc0p1c3RJbmZvKCBpbnQgZmxhZ3MgKTsKLQotICAgIC8vIFJlc3Vs dERpc3Bvc2l0aW9uOjpGbGFncyBlbnVtCi0gICAgc3RydWN0IFJlc3VsdERpc3Bvc2l0aW9uIHsg ZW51bSBGbGFncyB7Ci0gICAgICAgIE5vcm1hbCA9IDB4MDEsCi0KLSAgICAgICAgQ29udGludWVP bkZhaWx1cmUgPSAweDAyLCAgIC8vIEZhaWx1cmVzIGZhaWwgdGVzdCwgYnV0IGV4ZWN1dGlvbiBj b250aW51ZXMKLSAgICAgICAgRmFsc2VUZXN0ID0gMHgwNCwgICAgICAgICAgIC8vIFByZWZpeCBl eHByZXNzaW9uIHdpdGggIQotICAgICAgICBTdXBwcmVzc0ZhaWwgPSAweDA4ICAgICAgICAgLy8g RmFpbHVyZXMgYXJlIHJlcG9ydGVkIGJ1dCBkbyBub3QgZmFpbCB0aGUgdGVzdAotICAgIH07IH07 Ci0KLSAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3Mgb3BlcmF0b3IgfCAoIFJlc3VsdERpc3Bv c2l0aW9uOjpGbGFncyBsaHMsIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByaHMgKTsKLQotICAg IGJvb2wgc2hvdWxkQ29udGludWVPbkZhaWx1cmUoIGludCBmbGFncyApOwotICAgIGlubGluZSBi b29sIGlzRmFsc2VUZXN0KCBpbnQgZmxhZ3MgKSB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlz cG9zaXRpb246OkZhbHNlVGVzdCApICE9IDA7IH0KLSAgICBib29sIHNob3VsZFN1cHByZXNzRmFp bHVyZSggaW50IGZsYWdzICk7Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQg Y2F0Y2hfcmVzdWx0X3R5cGUuaAotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBBc3Nl cnRpb25JbmZvCi0gICAgewotICAgICAgICBTdHJpbmdSZWYgbWFjcm9OYW1lOwotICAgICAgICBT b3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKLSAgICAgICAgU3RyaW5nUmVmIGNhcHR1cmVkRXhwcmVz c2lvbjsKLSAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9u OwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gZGVsZXRlIHRoaXMgY29uc3RydWN0b3IgYnV0IGEg Y29tcGlsZXIgYnVnIGluIDQuOCBtZWFucwotICAgICAgICAvLyB0aGUgc3RydWN0IGlzIHRoZW4g dHJlYXRlZCBhcyBub24tYWdncmVnYXRlCi0gICAgICAgIC8vQXNzZXJ0aW9uSW5mbygpID0gZGVs ZXRlOwotICAgIH07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hf YXNzZXJ0aW9uaW5mby5oCi0vLyBzdGFydCBjYXRjaF9kZWNvbXBvc2VyLmgKLQotLy8gc3RhcnQg Y2F0Y2hfdG9zdHJpbmcuaAotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNzdGRkZWY+ Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8c3RyaW5nPgotLy8gc3RhcnQgY2F0 Y2hfc3RyZWFtLmgKLQotI2luY2x1ZGUgPGlvc2Z3ZD4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2lu Y2x1ZGUgPG9zdHJlYW0+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBzdGQ6Om9zdHJlYW0m IGNvdXQoKTsKLSAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKTsKLSAgICBzdGQ6Om9zdHJlYW0mIGNs b2coKTsKLQotICAgIGNsYXNzIFN0cmluZ1JlZjsKLQotICAgIHN0cnVjdCBJU3RyZWFtIHsKLSAg ICAgICAgdmlydHVhbCB+SVN0cmVhbSgpOwotICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYg c3RyZWFtKCkgY29uc3QgPSAwOwotICAgIH07Ci0KLSAgICBhdXRvIG1ha2VTdHJlYW0oIFN0cmlu Z1JlZiBjb25zdCAmZmlsZW5hbWUgKSAtPiBJU3RyZWFtIGNvbnN0KjsKLQotICAgIGNsYXNzIFJl dXNhYmxlU3RyaW5nU3RyZWFtIDogTm9uQ29weWFibGUgewotICAgICAgICBzdGQ6OnNpemVfdCBt X2luZGV4OwotICAgICAgICBzdGQ6Om9zdHJlYW0qIG1fb3NzOwotICAgIHB1YmxpYzoKLSAgICAg ICAgUmV1c2FibGVTdHJpbmdTdHJlYW0oKTsKLSAgICAgICAgflJldXNhYmxlU3RyaW5nU3RyZWFt KCk7Ci0KLSAgICAgICAgYXV0byBzdHIoKSBjb25zdCAtPiBzdGQ6OnN0cmluZzsKLQotICAgICAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBhdXRvIG9wZXJhdG9yIDw8ICggVCBjb25z dCYgdmFsdWUgKSAtPiBSZXVzYWJsZVN0cmluZ1N0cmVhbSYgewotICAgICAgICAgICAgKm1fb3Nz IDw8IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgICAg IGF1dG8gZ2V0KCkgLT4gc3RkOjpvc3RyZWFtJiB7IHJldHVybiAqbV9vc3M7IH0KLSAgICB9Owot fQotCi0vLyBlbmQgY2F0Y2hfc3RyZWFtLmgKLS8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfZW51 bV92YWx1ZXNfcmVnaXN0cnkuaAotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgQ2F0 Y2ggewotCi0gICAgbmFtZXNwYWNlIERldGFpbCB7Ci0gICAgICAgIHN0cnVjdCBFbnVtSW5mbyB7 Ci0gICAgICAgICAgICBTdHJpbmdSZWYgbV9uYW1lOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8 c3RkOjpwYWlyPGludCwgU3RyaW5nUmVmPj4gbV92YWx1ZXM7Ci0KLSAgICAgICAgICAgIH5FbnVt SW5mbygpOwotCi0gICAgICAgICAgICBTdHJpbmdSZWYgbG9va3VwKCBpbnQgdmFsdWUgKSBjb25z dDsKLSAgICAgICAgfTsKLSAgICB9IC8vIG5hbWVzcGFjZSBEZXRhaWwKLQotICAgIHN0cnVjdCBJ TXV0YWJsZUVudW1WYWx1ZXNSZWdpc3RyeSB7Ci0gICAgICAgIHZpcnR1YWwgfklNdXRhYmxlRW51 bVZhbHVlc1JlZ2lzdHJ5KCk7Ci0KLSAgICAgICAgdmlydHVhbCBEZXRhaWw6OkVudW1JbmZvIGNv bnN0JiByZWdpc3RlckVudW0oIFN0cmluZ1JlZiBlbnVtTmFtZSwgU3RyaW5nUmVmIGFsbEVudW1z LCBzdGQ6OnZlY3RvcjxpbnQ+IGNvbnN0JiB2YWx1ZXMgKSA9IDA7Ci0KLSAgICAgICAgdGVtcGxh dGU8dHlwZW5hbWUgRT4KLSAgICAgICAgRGV0YWlsOjpFbnVtSW5mbyBjb25zdCYgcmVnaXN0ZXJF bnVtKCBTdHJpbmdSZWYgZW51bU5hbWUsIFN0cmluZ1JlZiBhbGxFbnVtcywgc3RkOjppbml0aWFs aXplcl9saXN0PEU+IHZhbHVlcyApIHsKLSAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9m KGludCkgPj0gc2l6ZW9mKEUpLCAiQ2Fubm90IHNlcmlhbGl6ZSBlbnVtIHRvIGludCIpOwotICAg ICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBpbnRWYWx1ZXM7Ci0gICAgICAgICAgICBpbnRWYWx1 ZXMucmVzZXJ2ZSggdmFsdWVzLnNpemUoKSApOwotICAgICAgICAgICAgZm9yKCBhdXRvIGVudW1W YWx1ZSA6IHZhbHVlcyApCi0gICAgICAgICAgICAgICAgaW50VmFsdWVzLnB1c2hfYmFjayggc3Rh dGljX2Nhc3Q8aW50PiggZW51bVZhbHVlICkgKTsKLSAgICAgICAgICAgIHJldHVybiByZWdpc3Rl ckVudW0oIGVudW1OYW1lLCBhbGxFbnVtcywgaW50VmFsdWVzICk7Ci0gICAgICAgIH0KLSAgICB9 OwotCi19IC8vIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9pbnRlcmZhY2VzX2VudW1fdmFsdWVzX3Jl Z2lzdHJ5LmgKLQotI2lmZGVmIENBVENIX0NPTkZJR19DUFAxN19TVFJJTkdfVklFVwotI2luY2x1 ZGUgPHN0cmluZ192aWV3PgotI2VuZGlmCi0KLSNpZmRlZiBfX09CSkNfXwotLy8gc3RhcnQgY2F0 Y2hfb2JqY19hcmMuaHBwCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0j aWZkZWYgX19oYXNfZmVhdHVyZQotI2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCBfX2hhc19mZWF0 dXJlKG9iamNfYXJjKQotI2Vsc2UKLSNkZWZpbmUgQ0FUQ0hfQVJDX0VOQUJMRUQgMAotI2VuZGlm Ci0KLXZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiBvYmogKTsKLWlkIHBlcmZvcm1PcHRp b25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKTsKLQotI2lmICFDQVRDSF9BUkNfRU5BQkxF RAotaW5saW5lIHZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiBvYmogKSB7Ci0gICAgW29i aiByZWxlYXNlXTsKLX0KLWlubGluZSBpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2Jq LCBTRUwgc2VsICkgewotICAgIGlmKCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCi0g ICAgICAgIHJldHVybiBbb2JqIHBlcmZvcm1TZWxlY3Rvcjogc2VsXTsKLSAgICByZXR1cm4gbmls OwotfQotI2RlZmluZSBDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRAotI2RlZmluZSBDQVRDSF9BUkNf U1RST05HCi0jZWxzZQotaW5saW5lIHZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiApe30K LWlubGluZSBpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICkgewot I2lmZGVmIF9fY2xhbmdfXwotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEg Y2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2FyYy1wZXJmb3JtU2VsZWN0b3ItbGVha3MiCi0j ZW5kaWYKLSAgICBpZiggW29iaiByZXNwb25kc1RvU2VsZWN0b3I6IHNlbF0gKQotICAgICAgICBy ZXR1cm4gW29iaiBwZXJmb3JtU2VsZWN0b3I6IHNlbF07Ci0jaWZkZWYgX19jbGFuZ19fCi0jcHJh Z21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLSAgICByZXR1cm4gbmlsOwotfQotI2Rl ZmluZSBDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRCBfX3Vuc2FmZV91bnJldGFpbmVkCi0jZGVmaW5l IENBVENIX0FSQ19TVFJPTkcgX19zdHJvbmcKLSNlbmRpZgotCi0vLyBlbmQgY2F0Y2hfb2JqY19h cmMuaHBwCi0jZW5kaWYKLQotI2lmZGVmIF9NU0NfVkVSCi0jcHJhZ21hIHdhcm5pbmcocHVzaCkK LSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxODApIC8vIFdlIGF0dGVtcHQgdG8gc3RyZWFtIGEg ZnVuY3Rpb24gKGFkZHJlc3MpIGJ5IGNvbnN0Jiwgd2hpY2ggTVNWQyBjb21wbGFpbnMgYWJvdXQg YnV0IGlzIGhhcm1sZXNzCi0jZW5kaWYKLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBuYW1lc3Bh Y2UgRGV0YWlsIHsKLQotICAgICAgICBleHRlcm4gY29uc3Qgc3RkOjpzdHJpbmcgdW5wcmludGFi bGVTdHJpbmc7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0 IHZvaWQgKm9iamVjdCwgc3RkOjpzaXplX3Qgc2l6ZSApOwotCi0gICAgICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFQ+Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCBU JiBvYmplY3QgKSB7Ci0gICAgICAgICAgcmV0dXJuIHJhd01lbW9yeVRvU3RyaW5nKCAmb2JqZWN0 LCBzaXplb2Yob2JqZWN0KSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5h bWUgVD4KLSAgICAgICAgY2xhc3MgSXNTdHJlYW1JbnNlcnRhYmxlIHsKLSAgICAgICAgICAgIHRl bXBsYXRlPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgVT4KLSAgICAgICAgICAgIHN0YXRpYyBh dXRvIHRlc3QoaW50KQotICAgICAgICAgICAgICAgIC0+IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxT dHJlYW0mPigpIDw8IHN0ZDo6ZGVjbHZhbDxVPigpLCBzdGQ6OnRydWVfdHlwZSgpKTsKLQotICAg ICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgotICAgICAgICAgICAgc3RhdGlj IGF1dG8gdGVzdCguLi4pLT5zdGQ6OmZhbHNlX3R5cGU7Ci0KLSAgICAgICAgcHVibGljOgotICAg ICAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBkZWNsdHlwZSh0ZXN0PHN0ZDo6b3N0 cmVhbSwgY29uc3QgVCY+KDApKTo6dmFsdWU7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdGVtcGxh dGU8dHlwZW5hbWUgRT4KLSAgICAgICAgc3RkOjpzdHJpbmcgY29udmVydFVua25vd25FbnVtVG9T dHJpbmcoIEUgZSApOwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHR5 cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAotICAgICAgICAgICAgIXN0ZDo6aXNfZW51bTxUPjo6dmFs dWUgJiYgIXN0ZDo6aXNfYmFzZV9vZjxzdGQ6OmV4Y2VwdGlvbiwgVD46OnZhbHVlLAotICAgICAg ICBzdGQ6OnN0cmluZz46OnR5cGUgY29udmVydFVuc3RyZWFtYWJsZSggVCBjb25zdCYgKSB7Ci0g ICAgICAgICAgICByZXR1cm4gRGV0YWlsOjp1bnByaW50YWJsZVN0cmluZzsKLSAgICAgICAgfQot ICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJs ZV9pZjwKLSAgICAgICAgICAgICFzdGQ6OmlzX2VudW08VD46OnZhbHVlICYmIHN0ZDo6aXNfYmFz ZV9vZjxzdGQ6OmV4Y2VwdGlvbiwgVD46OnZhbHVlLAotICAgICAgICAgc3RkOjpzdHJpbmc+Ojp0 eXBlIGNvbnZlcnRVbnN0cmVhbWFibGUoVCBjb25zdCYgZXgpIHsKLSAgICAgICAgICAgIHJldHVy biBleC53aGF0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgot ICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKLSAgICAgICAgICAgIHN0ZDo6aXNfZW51 bTxUPjo6dmFsdWUKLSAgICAgICAgLCBzdGQ6OnN0cmluZz46OnR5cGUgY29udmVydFVuc3RyZWFt YWJsZSggVCBjb25zdCYgdmFsdWUgKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydFVua25v d25FbnVtVG9TdHJpbmcoIHZhbHVlICk7Ci0gICAgICAgIH0KLQotI2lmIGRlZmluZWQoX01BTkFH RUQpCi0gICAgICAgIC8vISBDb252ZXJ0IGEgQ0xSIHN0cmluZyB0byBhIHV0Zjggc3RkOjpzdHJp bmcKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgc3RkOjpzdHJpbmcgY2xy UmVmZXJlbmNlVG9TdHJpbmcoIFReIHJlZiApIHsKLSAgICAgICAgICAgIGlmIChyZWYgPT0gbnVs bHB0cikKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoIm51bGwiKTsKLSAgICAg ICAgICAgIGF1dG8gYnl0ZXMgPSBTeXN0ZW06OlRleHQ6OkVuY29kaW5nOjpVVEY4LT5HZXRCeXRl cyhyZWYtPlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgY2xpOjpwaW5fcHRyPFN5c3RlbTo6Qnl0 ZT4gcCA9ICZieXRlc1swXTsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhyZWludGVy cHJldF9jYXN0PGNoYXIgY29uc3QgKj4ocCksIGJ5dGVzLT5MZW5ndGgpOwotICAgICAgICB9Ci0j ZW5kaWYKLQotICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAotCi0gICAgLy8gSWYgd2UgZGVjaWRl IGZvciBDKysxNCwgY2hhbmdlIHRoZXNlIHRvIGVuYWJsZV9pZl90cwotICAgIHRlbXBsYXRlIDx0 eXBlbmFtZSBULCB0eXBlbmFtZSA9IHZvaWQ+Ci0gICAgc3RydWN0IFN0cmluZ01ha2VyIHsKLSAg ICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZha2UgPSBUPgotICAgICAgICBzdGF0aWMKLSAgICAg ICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8OjpDYXRjaDo6RGV0YWlsOjpJc1N0cmVhbUluc2Vy dGFibGU8RmFrZT46OnZhbHVlLCBzdGQ6OnN0cmluZz46OnR5cGUKLSAgICAgICAgICAgIGNvbnZl cnQoY29uc3QgRmFrZSYgdmFsdWUpIHsKLSAgICAgICAgICAgICAgICBSZXVzYWJsZVN0cmluZ1N0 cmVhbSByc3M7Ci0gICAgICAgICAgICAgICAgLy8gTkI6IGNhbGwgdXNpbmcgdGhlIGZ1bmN0aW9u LWxpa2Ugc3ludGF4IHRvIGF2b2lkIGFtYmlndWl0eSB3aXRoCi0gICAgICAgICAgICAgICAgLy8g dXNlci1kZWZpbmVkIHRlbXBsYXRlZCBvcGVyYXRvcjw8IHVuZGVyIGNsYW5nLgotICAgICAgICAg ICAgICAgIHJzcy5vcGVyYXRvcjw8KHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcnNz LnN0cigpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZha2UgPSBU PgotICAgICAgICBzdGF0aWMKLSAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ITo6Q2F0 Y2g6OkRldGFpbDo6SXNTdHJlYW1JbnNlcnRhYmxlPEZha2U+Ojp2YWx1ZSwgc3RkOjpzdHJpbmc+ Ojp0eXBlCi0gICAgICAgICAgICBjb252ZXJ0KCBjb25zdCBGYWtlJiB2YWx1ZSApIHsKLSNpZiAh ZGVmaW5lZChDQVRDSF9DT05GSUdfRkFMTEJBQ0tfU1RSSU5HSUZJRVIpCi0gICAgICAgICAgICBy ZXR1cm4gRGV0YWlsOjpjb252ZXJ0VW5zdHJlYW1hYmxlKHZhbHVlKTsKLSNlbHNlCi0gICAgICAg ICAgICByZXR1cm4gQ0FUQ0hfQ09ORklHX0ZBTExCQUNLX1NUUklOR0lGSUVSKHZhbHVlKTsKLSNl bmRpZgotICAgICAgICB9Ci0gICAgfTsKLQotICAgIG5hbWVzcGFjZSBEZXRhaWwgewotCi0gICAg ICAgIC8vIFRoaXMgZnVuY3Rpb24gZGlzcGF0Y2hlcyBhbGwgc3RyaW5naWZpY2F0aW9uIHJlcXVl c3RzIGluc2lkZSBvZiBDYXRjaC4KLSAgICAgICAgLy8gU2hvdWxkIGJlIHByZWZlcmFibHkgY2Fs bGVkIGZ1bGx5IHF1YWxpZmllZCwgbGlrZSA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeQotICAg ICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICAgICAgc3RkOjpzdHJpbmcgc3RyaW5naWZ5 KGNvbnN0IFQmIGUpIHsKLSAgICAgICAgICAgIHJldHVybiA6OkNhdGNoOjpTdHJpbmdNYWtlcjx0 eXBlbmFtZSBzdGQ6OnJlbW92ZV9jdjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46 OnR5cGU+Ojp0eXBlPjo6Y29udmVydChlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRl PHR5cGVuYW1lIEU+Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGNvbnZlcnRVbmtub3duRW51bVRvU3Ry aW5nKCBFIGUgKSB7Ci0gICAgICAgICAgICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdp Znkoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU+KGUp KTsKLSAgICAgICAgfQotCi0jaWYgZGVmaW5lZChfTUFOQUdFRCkKLSAgICAgICAgdGVtcGxhdGUg PHR5cGVuYW1lIFQ+Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ2lmeSggVF4gZSApIHsKLSAg ICAgICAgICAgIHJldHVybiA6OkNhdGNoOjpTdHJpbmdNYWtlcjxUXj46OmNvbnZlcnQoZSk7Ci0g ICAgICAgIH0KLSNlbmRpZgotCi0gICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCi0KLSAgICAvLyBT b21lIHByZWRlZmluZWQgc3BlY2lhbGl6YXRpb25zCi0KLSAgICB0ZW1wbGF0ZTw+Ci0gICAgc3Ry dWN0IFN0cmluZ01ha2VyPHN0ZDo6c3RyaW5nPiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmlu ZyBjb252ZXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotICAgIH07Ci0KLSNpZmRlZiBDQVRD SF9DT05GSUdfQ1BQMTdfU1RSSU5HX1ZJRVcKLSAgICB0ZW1wbGF0ZTw+Ci0gICAgc3RydWN0IFN0 cmluZ01ha2VyPHN0ZDo6c3RyaW5nX3ZpZXc+IHsKLSAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5n IGNvbnZlcnQoc3RkOjpzdHJpbmdfdmlldyBzdHIpOwotICAgIH07Ci0jZW5kaWYKLQotICAgIHRl bXBsYXRlPD4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8Y2hhciBjb25zdCAqPiB7Ci0gICAgICAg IHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGNoYXIgY29uc3QgKiBzdHIpOwotICAgIH07Ci0g ICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxjaGFyICo+IHsKLSAgICAgICAg c3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoY2hhciAqIHN0cik7Ci0gICAgfTsKLQotI2lmZGVm IENBVENIX0NPTkZJR19XQ0hBUgotICAgIHRlbXBsYXRlPD4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFr ZXI8c3RkOjp3c3RyaW5nPiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGNv bnN0IHN0ZDo6d3N0cmluZyYgd3N0cik7Ci0gICAgfTsKLQotIyBpZmRlZiBDQVRDSF9DT05GSUdf Q1BQMTdfU1RSSU5HX1ZJRVcKLSAgICB0ZW1wbGF0ZTw+Ci0gICAgc3RydWN0IFN0cmluZ01ha2Vy PHN0ZDo6d3N0cmluZ192aWV3PiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0 KHN0ZDo6d3N0cmluZ192aWV3IHN0cik7Ci0gICAgfTsKLSMgZW5kaWYKLQotICAgIHRlbXBsYXRl PD4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8d2NoYXJfdCBjb25zdCAqPiB7Ci0gICAgICAgIHN0 YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KHdjaGFyX3QgY29uc3QgKiBzdHIpOwotICAgIH07Ci0g ICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjx3Y2hhcl90ICo+IHsKLSAgICAg ICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQod2NoYXJfdCAqIHN0cik7Ci0gICAgfTsKLSNl bmRpZgotCi0gICAgLy8gVEJEOiBTaG91bGQgd2UgdXNlIGBzdHJubGVuYCB0byBlbnN1cmUgdGhh dCB3ZSBkb24ndCBnbyBvdXQgb2YgdGhlIGJ1ZmZlciwKLSAgICAvLyAgICAgIHdoaWxlIGtlZXBp bmcgc3RyaW5nIHNlbWFudGljcz8KLSAgICB0ZW1wbGF0ZTxpbnQgU1o+Ci0gICAgc3RydWN0IFN0 cmluZ01ha2VyPGNoYXJbU1pdPiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0 KGNoYXIgY29uc3QqIHN0cikgewotICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6 c3RyaW5naWZ5KHN0ZDo6c3RyaW5neyBzdHIgfSk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIHRl bXBsYXRlPGludCBTWj4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8c2lnbmVkIGNoYXJbU1pdPiB7 Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KHNpZ25lZCBjaGFyIGNvbnN0KiBz dHIpIHsKLSAgICAgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGQ6 OnN0cmluZ3sgcmVpbnRlcnByZXRfY2FzdDxjaGFyIGNvbnN0ICo+KHN0cikgfSk7Ci0gICAgICAg IH0KLSAgICB9OwotICAgIHRlbXBsYXRlPGludCBTWj4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8 dW5zaWduZWQgY2hhcltTWl0+IHsKLSAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQo dW5zaWduZWQgY2hhciBjb25zdCogc3RyKSB7Ci0gICAgICAgICAgICByZXR1cm4gOjpDYXRjaDo6 RGV0YWlsOjpzdHJpbmdpZnkoc3RkOjpzdHJpbmd7IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciBjb25z dCAqPihzdHIpIH0pOwotICAgICAgICB9Ci0gICAgfTsKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09O RklHX0NQUDE3X0JZVEUpCi0gICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxz dGQ6OmJ5dGU+IHsKLSAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoc3RkOjpieXRl IHZhbHVlKTsKLSAgICB9OwotI2VuZGlmIC8vIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDE3X0JZ VEUpCi0gICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxpbnQ+IHsKLSAgICAg ICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoaW50IHZhbHVlKTsKLSAgICB9OwotICAgIHRl bXBsYXRlPD4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8bG9uZz4gewotICAgICAgICBzdGF0aWMg c3RkOjpzdHJpbmcgY29udmVydChsb25nIHZhbHVlKTsKLSAgICB9OwotICAgIHRlbXBsYXRlPD4K LSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8bG9uZyBsb25nPiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6 OnN0cmluZyBjb252ZXJ0KGxvbmcgbG9uZyB2YWx1ZSk7Ci0gICAgfTsKLSAgICB0ZW1wbGF0ZTw+ Ci0gICAgc3RydWN0IFN0cmluZ01ha2VyPHVuc2lnbmVkIGludD4gewotICAgICAgICBzdGF0aWMg c3RkOjpzdHJpbmcgY29udmVydCh1bnNpZ25lZCBpbnQgdmFsdWUpOwotICAgIH07Ci0gICAgdGVt cGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjx1bnNpZ25lZCBsb25nPiB7Ci0gICAgICAg IHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KHVuc2lnbmVkIGxvbmcgdmFsdWUpOwotICAgIH07 Ci0gICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjx1bnNpZ25lZCBsb25nIGxv bmc+IHsKLSAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQodW5zaWduZWQgbG9uZyBs b25nIHZhbHVlKTsKLSAgICB9OwotCi0gICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdN YWtlcjxib29sPiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KGJvb2wgYik7 Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPD4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8Y2hhcj4g ewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChjaGFyIGMpOwotICAgIH07Ci0g ICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzaWduZWQgY2hhcj4gewotICAg ICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChzaWduZWQgY2hhciBjKTsKLSAgICB9Owot ICAgIHRlbXBsYXRlPD4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8dW5zaWduZWQgY2hhcj4gewot ICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCh1bnNpZ25lZCBjaGFyIGMpOwotICAg IH07Ci0KLSAgICB0ZW1wbGF0ZTw+Ci0gICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6bnVsbHB0 cl90PiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KHN0ZDo6bnVsbHB0cl90 KTsKLSAgICB9OwotCi0gICAgdGVtcGxhdGU8PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxmbG9h dD4gewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChmbG9hdCB2YWx1ZSk7Ci0g ICAgICAgIHN0YXRpYyBpbnQgcHJlY2lzaW9uOwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTw+Ci0g ICAgc3RydWN0IFN0cmluZ01ha2VyPGRvdWJsZT4gewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJp bmcgY29udmVydChkb3VibGUgdmFsdWUpOwotICAgICAgICBzdGF0aWMgaW50IHByZWNpc2lvbjsK LSAgICB9OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgc3RydWN0IFN0cmluZ01h a2VyPFQqPiB7Ci0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICAgICAgICBzdGF0aWMg c3RkOjpzdHJpbmcgY29udmVydChVKiBwKSB7Ci0gICAgICAgICAgICBpZiAocCkgewotICAgICAg ICAgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKHApOwot ICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIm51bGxwdHIiOwot ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFt ZSBSLCB0eXBlbmFtZSBDPgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxSIEM6Oio+IHsKLSAgICAg ICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoUiBDOjoqIHApIHsKLSAgICAgICAgICAgIGlm IChwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6cmF3TWVtb3J5 VG9TdHJpbmcocCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVy biAibnVsbHB0ciI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0jaWYgZGVm aW5lZChfTUFOQUdFRCkKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBzdHJ1Y3QgU3Ry aW5nTWFrZXI8VF4+IHsKLSAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFReIHJl ZiApIHsKLSAgICAgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OmNsclJlZmVyZW5jZVRv U3RyaW5nKHJlZik7Ci0gICAgICAgIH0KLSAgICB9OwotI2VuZGlmCi0KLSAgICBuYW1lc3BhY2Ug RGV0YWlsIHsKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvciwgdHlwZW5h bWUgU2VudGluZWwgPSBJbnB1dEl0ZXJhdG9yPgotICAgICAgICBzdGQ6OnN0cmluZyByYW5nZVRv U3RyaW5nKElucHV0SXRlcmF0b3IgZmlyc3QsIFNlbnRpbmVsIGxhc3QpIHsKLSAgICAgICAgICAg IFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKLSAgICAgICAgICAgIHJzcyA8PCAieyAiOwotICAg ICAgICAgICAgaWYgKGZpcnN0ICE9IGxhc3QpIHsKLSAgICAgICAgICAgICAgICByc3MgPDwgOjpD YXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoKmZpcnN0KTsKLSAgICAgICAgICAgICAgICBmb3IgKCsr Zmlyc3Q7IGZpcnN0ICE9IGxhc3Q7ICsrZmlyc3QpCi0gICAgICAgICAgICAgICAgICAgIHJzcyA8 PCAiLCAiIDw8IDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCpmaXJzdCk7Ci0gICAgICAgICAg ICB9Ci0gICAgICAgICAgICByc3MgPDwgIiB9IjsKLSAgICAgICAgICAgIHJldHVybiByc3Muc3Ry KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBfX09CSkNfXwotICAgIHRlbXBsYXRlPD4K LSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8TlNTdHJpbmcqPiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6 OnN0cmluZyBjb252ZXJ0KE5TU3RyaW5nICogbnNzdHJpbmcpIHsKLSAgICAgICAgICAgIGlmICgh bnNzdHJpbmcpCi0gICAgICAgICAgICAgICAgcmV0dXJuICJuaWwiOwotICAgICAgICAgICAgcmV0 dXJuIHN0ZDo6c3RyaW5nKCJAIikgKyBbbnNzdHJpbmcgVVRGOFN0cmluZ107Ci0gICAgICAgIH0K LSAgICB9OwotICAgIHRlbXBsYXRlPD4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8TlNPYmplY3Qq PiB7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KE5TT2JqZWN0KiBuc09iamVj dCkgewotICAgICAgICAgICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KFtuc09i amVjdCBkZXNjcmlwdGlvbl0pOwotICAgICAgICB9Ci0KLSAgICB9OwotICAgIG5hbWVzcGFjZSBE ZXRhaWwgewotICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgc3RyaW5naWZ5KCBOU1N0cmluZyog bnNzdHJpbmcgKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nTWFrZXI8TlNTdHJpbmcqPjo6 Y29udmVydCggbnNzdHJpbmcgKTsKLSAgICAgICAgfQotCi0gICAgfSAvLyBuYW1lc3BhY2UgRGV0 YWlsCi0jZW5kaWYgLy8gX19PQkpDX18KLQotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTZXBh cmF0ZSBzdGQtbGliIHR5cGVzIHN0cmluZ2lmaWNhdGlvbiwgc28gaXQgY2FuIGJlIHNlbGVjdGl2 ZWx5IGVuYWJsZWQKLS8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBkbyBub3QgYnJpbmcgaW4KLQotI2lm IGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9BTExfU1RSSU5HTUFLRVJTKQotIyAgZGVmaW5l IENBVENIX0NPTkZJR19FTkFCTEVfUEFJUl9TVFJJTkdNQUtFUgotIyAgZGVmaW5lIENBVENIX0NP TkZJR19FTkFCTEVfVFVQTEVfU1RSSU5HTUFLRVIKLSMgIGRlZmluZSBDQVRDSF9DT05GSUdfRU5B QkxFX1ZBUklBTlRfU1RSSU5HTUFLRVIKLSMgIGRlZmluZSBDQVRDSF9DT05GSUdfRU5BQkxFX0NI Uk9OT19TVFJJTkdNQUtFUgotIyAgZGVmaW5lIENBVENIX0NPTkZJR19FTkFCTEVfT1BUSU9OQUxf U1RSSU5HTUFLRVIKLSNlbmRpZgotCi0vLyBTZXBhcmF0ZSBzdGQ6OnBhaXIgc3BlY2lhbGl6YXRp b24KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfUEFJUl9TVFJJTkdNQUtFUikKLSNp bmNsdWRlIDx1dGlsaXR5PgotbmFtZXNwYWNlIENhdGNoIHsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBUMSwgdHlwZW5hbWUgVDI+Ci0gICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6cGFpcjxUMSwg VDI+ID4gewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBzdGQ6OnBh aXI8VDEsIFQyPiYgcGFpcikgewotICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNz OwotICAgICAgICAgICAgcnNzIDw8ICJ7ICIKLSAgICAgICAgICAgICAgICA8PCA6OkNhdGNoOjpE ZXRhaWw6OnN0cmluZ2lmeShwYWlyLmZpcnN0KQotICAgICAgICAgICAgICAgIDw8ICIsICIKLSAg ICAgICAgICAgICAgICA8PCA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShwYWlyLnNlY29uZCkK LSAgICAgICAgICAgICAgICA8PCAiIH0iOwotICAgICAgICAgICAgcmV0dXJuIHJzcy5zdHIoKTsK LSAgICAgICAgfQotICAgIH07Ci19Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9QQUlS X1NUUklOR01BS0VSCi0KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfT1BUSU9OQUxf U1RSSU5HTUFLRVIpICYmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDE3X09QVElPTkFMKQotI2lu Y2x1ZGUgPG9wdGlvbmFsPgotbmFtZXNwYWNlIENhdGNoIHsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBUPgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6Om9wdGlvbmFsPFQ+ID4gewotICAgICAg ICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBzdGQ6Om9wdGlvbmFsPFQ+JiBvcHRp b25hbCkgewotICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwotICAgICAgICAg ICAgaWYgKG9wdGlvbmFsLmhhc192YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcnNzIDw8IDo6 Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCpvcHRpb25hbCk7Ci0gICAgICAgICAgICB9IGVsc2Ug ewotICAgICAgICAgICAgICAgIHJzcyA8PCAieyB9IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAg ICAgIHJldHVybiByc3Muc3RyKCk7Ci0gICAgICAgIH0KLSAgICB9OwotfQotI2VuZGlmIC8vIENB VENIX0NPTkZJR19FTkFCTEVfT1BUSU9OQUxfU1RSSU5HTUFLRVIKLQotLy8gU2VwYXJhdGUgc3Rk Ojp0dXBsZSBzcGVjaWFsaXphdGlvbgotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9U VVBMRV9TVFJJTkdNQUtFUikKLSNpbmNsdWRlIDx0dXBsZT4KLW5hbWVzcGFjZSBDYXRjaCB7Ci0g ICAgbmFtZXNwYWNlIERldGFpbCB7Ci0gICAgICAgIHRlbXBsYXRlPAotICAgICAgICAgICAgdHlw ZW5hbWUgVHVwbGUsCi0gICAgICAgICAgICBzdGQ6OnNpemVfdCBOID0gMCwKLSAgICAgICAgICAg IGJvb2wgPSAoTiA8IHN0ZDo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKQotICAgICAgICAgICAg PgotICAgICAgICAgICAgc3RydWN0IFR1cGxlRWxlbWVudFByaW50ZXIgewotICAgICAgICAgICAg c3RhdGljIHZvaWQgcHJpbnQoY29uc3QgVHVwbGUmIHR1cGxlLCBzdGQ6Om9zdHJlYW0mIG9zKSB7 Ci0gICAgICAgICAgICAgICAgb3MgPDwgKE4gPyAiLCAiIDogIiAiKQotICAgICAgICAgICAgICAg ICAgICA8PCA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGQ6OmdldDxOPih0dXBsZSkpOwot ICAgICAgICAgICAgICAgIFR1cGxlRWxlbWVudFByaW50ZXI8VHVwbGUsIE4gKyAxPjo6cHJpbnQo dHVwbGUsIG9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB0ZW1wbGF0 ZTwKLSAgICAgICAgICAgIHR5cGVuYW1lIFR1cGxlLAotICAgICAgICAgICAgc3RkOjpzaXplX3Qg TgotICAgICAgICA+Ci0gICAgICAgICAgICBzdHJ1Y3QgVHVwbGVFbGVtZW50UHJpbnRlcjxUdXBs ZSwgTiwgZmFsc2U+IHsKLSAgICAgICAgICAgIHN0YXRpYyB2b2lkIHByaW50KGNvbnN0IFR1cGxl Jiwgc3RkOjpvc3RyZWFtJikge30KLSAgICAgICAgfTsKLQotICAgIH0KLQotICAgIHRlbXBsYXRl PHR5cGVuYW1lIC4uLlR5cGVzPgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OnR1cGxlPFR5 cGVzLi4uPj4gewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBzdGQ6 OnR1cGxlPFR5cGVzLi4uPiYgdHVwbGUpIHsKLSAgICAgICAgICAgIFJldXNhYmxlU3RyaW5nU3Ry ZWFtIHJzczsKLSAgICAgICAgICAgIHJzcyA8PCAneyc7Ci0gICAgICAgICAgICBEZXRhaWw6OlR1 cGxlRWxlbWVudFByaW50ZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+OjpwcmludCh0dXBsZSwgcnNz LmdldCgpKTsKLSAgICAgICAgICAgIHJzcyA8PCAiIH0iOwotICAgICAgICAgICAgcmV0dXJuIHJz cy5zdHIoKTsKLSAgICAgICAgfQotICAgIH07Ci19Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VO QUJMRV9UVVBMRV9TVFJJTkdNQUtFUgotCi0jaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRU5BQkxF X1ZBUklBTlRfU1RSSU5HTUFLRVIpICYmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDE3X1ZBUklB TlQpCi0jaW5jbHVkZSA8dmFyaWFudD4KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgdGVtcGxhdGU8 PgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6Om1vbm9zdGF0ZT4gewotICAgICAgICBzdGF0 aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBzdGQ6Om1vbm9zdGF0ZSYpIHsKLSAgICAgICAg ICAgIHJldHVybiAieyB9IjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBl bmFtZS4uLiBFbGVtZW50cz4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp2YXJpYW50PEVs ZW1lbnRzLi4uPj4gewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChjb25zdCBz dGQ6OnZhcmlhbnQ8RWxlbWVudHMuLi4+JiB2YXJpYW50KSB7Ci0gICAgICAgICAgICBpZiAodmFy aWFudC52YWx1ZWxlc3NfYnlfZXhjZXB0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4g Int2YWx1ZWxlc3MgdmFyaWFudH0iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg ICAgICByZXR1cm4gc3RkOjp2aXNpdCgKLSAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYXV0 byYgdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRh aWw6OnN0cmluZ2lmeSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAg ICAgICAgICAgIHZhcmlhbnQKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfQotICAg ICAgICB9Ci0gICAgfTsKLX0KLSNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRU5BQkxFX1ZBUklBTlRf U1RSSU5HTUFLRVIKLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICAvLyBJbXBvcnQgYmVnaW4vIGVu ZCBmcm9tIHN0ZCBoZXJlCi0gICAgdXNpbmcgc3RkOjpiZWdpbjsKLSAgICB1c2luZyBzdGQ6OmVu ZDsKLQotICAgIG5hbWVzcGFjZSBkZXRhaWwgewotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUu Li4+Ci0gICAgICAgIHN0cnVjdCB2b2lkX3R5cGUgewotICAgICAgICAgICAgdXNpbmcgdHlwZSA9 IHZvaWQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVu YW1lID0gdm9pZD4KLSAgICAgICAgc3RydWN0IGlzX3JhbmdlX2ltcGwgOiBzdGQ6OmZhbHNlX3R5 cGUgewotICAgICAgICB9OwotCi0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgICAg ICBzdHJ1Y3QgaXNfcmFuZ2VfaW1wbDxULCB0eXBlbmFtZSB2b2lkX3R5cGU8ZGVjbHR5cGUoYmVn aW4oc3RkOjpkZWNsdmFsPFQ+KCkpKT46OnR5cGU+IDogc3RkOjp0cnVlX3R5cGUgewotICAgICAg ICB9OwotICAgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1l IFQ+Ci0gICAgc3RydWN0IGlzX3JhbmdlIDogZGV0YWlsOjppc19yYW5nZV9pbXBsPFQ+IHsKLSAg ICB9OwotCi0jaWYgZGVmaW5lZChfTUFOQUdFRCkgLy8gTWFuYWdlZCB0eXBlcyBhcmUgbmV2ZXIg cmFuZ2VzCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgc3RydWN0IGlzX3JhbmdlPFRe PiB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Ci0gICAgfTsKLSNl bmRpZgotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUmFuZ2U+Ci0gICAgc3RkOjpzdHJpbmcgcmFu Z2VUb1N0cmluZyggUmFuZ2UgY29uc3QmIHJhbmdlICkgewotICAgICAgICByZXR1cm4gOjpDYXRj aDo6RGV0YWlsOjpyYW5nZVRvU3RyaW5nKCBiZWdpbiggcmFuZ2UgKSwgZW5kKCByYW5nZSApICk7 Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIHZlY3Rvcjxib29sPiBzcGVjaWFsbHkKLSAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3I+Ci0gICAgc3RkOjpzdHJpbmcgcmFuZ2VUb1N0cmluZygg c3RkOjp2ZWN0b3I8Ym9vbCwgQWxsb2NhdG9yPiBjb25zdCYgdiApIHsKLSAgICAgICAgUmV1c2Fi bGVTdHJpbmdTdHJlYW0gcnNzOwotICAgICAgICByc3MgPDwgInsgIjsKLSAgICAgICAgYm9vbCBm aXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciggYm9vbCBiIDogdiApIHsKLSAgICAgICAgICAgIGlm KCBmaXJzdCApCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGVs c2UKLSAgICAgICAgICAgICAgICByc3MgPDwgIiwgIjsKLSAgICAgICAgICAgIHJzcyA8PCA6OkNh dGNoOjpEZXRhaWw6OnN0cmluZ2lmeSggYiApOwotICAgICAgICB9Ci0gICAgICAgIHJzcyA8PCAi IH0iOwotICAgICAgICByZXR1cm4gcnNzLnN0cigpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFI+Ci0gICAgc3RydWN0IFN0cmluZ01ha2VyPFIsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxl X2lmPGlzX3JhbmdlPFI+Ojp2YWx1ZSAmJiAhOjpDYXRjaDo6RGV0YWlsOjpJc1N0cmVhbUluc2Vy dGFibGU8Uj46OnZhbHVlPjo6dHlwZT4gewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29u dmVydCggUiBjb25zdCYgcmFuZ2UgKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmFuZ2VUb1N0cmlu ZyggcmFuZ2UgKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUg VCwgaW50IFNaPgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxUW1NaXT4gewotICAgICAgICBzdGF0 aWMgc3RkOjpzdHJpbmcgY29udmVydChUIGNvbnN0KCZhcnIpW1NaXSkgewotICAgICAgICAgICAg cmV0dXJuIHJhbmdlVG9TdHJpbmcoYXJyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLX0gLy8gbmFt ZXNwYWNlIENhdGNoCi0KLS8vIFNlcGFyYXRlIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbiBzcGVjaWFs aXphdGlvbgotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9DSFJPTk9fU1RSSU5HTUFL RVIpCi0jaW5jbHVkZSA8Y3RpbWU+Ci0jaW5jbHVkZSA8cmF0aW8+Ci0jaW5jbHVkZSA8Y2hyb25v PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi10ZW1wbGF0ZSA8Y2xhc3MgUmF0aW8+Ci1zdHJ1Y3Qg cmF0aW9fc3RyaW5nIHsKLSAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Ci19OwotCi10 ZW1wbGF0ZSA8Y2xhc3MgUmF0aW8+Ci1zdGQ6OnN0cmluZyByYXRpb19zdHJpbmc8UmF0aW8+Ojpz eW1ib2woKSB7Ci0gICAgQ2F0Y2g6OlJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKLSAgICByc3Mg PDwgJ1snIDw8IFJhdGlvOjpudW0gPDwgJy8nCi0gICAgICAgIDw8IFJhdGlvOjpkZW4gPDwgJ10n OwotICAgIHJldHVybiByc3Muc3RyKCk7Ci19Ci10ZW1wbGF0ZSA8Pgotc3RydWN0IHJhdGlvX3N0 cmluZzxzdGQ6OmF0dG8+IHsKLSAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Ci19Owot dGVtcGxhdGUgPD4KLXN0cnVjdCByYXRpb19zdHJpbmc8c3RkOjpmZW10bz4gewotICAgIHN0YXRp YyBzdGQ6OnN0cmluZyBzeW1ib2woKTsKLX07Ci10ZW1wbGF0ZSA8Pgotc3RydWN0IHJhdGlvX3N0 cmluZzxzdGQ6OnBpY28+IHsKLSAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Ci19Owot dGVtcGxhdGUgPD4KLXN0cnVjdCByYXRpb19zdHJpbmc8c3RkOjpuYW5vPiB7Ci0gICAgc3RhdGlj IHN0ZDo6c3RyaW5nIHN5bWJvbCgpOwotfTsKLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgcmF0aW9fc3Ry aW5nPHN0ZDo6bWljcm8+IHsKLSAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc3ltYm9sKCk7Ci19Owot dGVtcGxhdGUgPD4KLXN0cnVjdCByYXRpb19zdHJpbmc8c3RkOjptaWxsaT4gewotICAgIHN0YXRp YyBzdGQ6OnN0cmluZyBzeW1ib2woKTsKLX07Ci0KLSAgICAvLy8vLy8vLy8vLy8KLSAgICAvLyBz dGQ6OmNocm9ubzo6ZHVyYXRpb24gc3BlY2lhbGl6YXRpb25zCi0gICAgdGVtcGxhdGU8dHlwZW5h bWUgVmFsdWUsIHR5cGVuYW1lIFJhdGlvPgotICAgIHN0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OmNo cm9ubzo6ZHVyYXRpb248VmFsdWUsIFJhdGlvPj4gewotICAgICAgICBzdGF0aWMgc3RkOjpzdHJp bmcgY29udmVydChzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUsIFJhdGlvPiBjb25zdCYgZHVy YXRpb24pIHsKLSAgICAgICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKLSAgICAgICAg ICAgIHJzcyA8PCBkdXJhdGlvbi5jb3VudCgpIDw8ICcgJyA8PCByYXRpb19zdHJpbmc8UmF0aW8+ OjpzeW1ib2woKSA8PCAncyc7Ci0gICAgICAgICAgICByZXR1cm4gcnNzLnN0cigpOwotICAgICAg ICB9Ci0gICAgfTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZT4KLSAgICBzdHJ1Y3QgU3Ry aW5nTWFrZXI8c3RkOjpjaHJvbm86OmR1cmF0aW9uPFZhbHVlLCBzdGQ6OnJhdGlvPDE+Pj4gewot ICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChzdGQ6OmNocm9ubzo6ZHVyYXRpb248 VmFsdWUsIHN0ZDo6cmF0aW88MT4+IGNvbnN0JiBkdXJhdGlvbikgewotICAgICAgICAgICAgUmV1 c2FibGVTdHJpbmdTdHJlYW0gcnNzOwotICAgICAgICAgICAgcnNzIDw8IGR1cmF0aW9uLmNvdW50 KCkgPDwgIiBzIjsKLSAgICAgICAgICAgIHJldHVybiByc3Muc3RyKCk7Ci0gICAgICAgIH0KLSAg ICB9OwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlPgotICAgIHN0cnVjdCBTdHJpbmdNYWtl cjxzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUsIHN0ZDo6cmF0aW88NjA+Pj4gewotICAgICAg ICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUs IHN0ZDo6cmF0aW88NjA+PiBjb25zdCYgZHVyYXRpb24pIHsKLSAgICAgICAgICAgIFJldXNhYmxl U3RyaW5nU3RyZWFtIHJzczsKLSAgICAgICAgICAgIHJzcyA8PCBkdXJhdGlvbi5jb3VudCgpIDw8 ICIgbSI7Ci0gICAgICAgICAgICByZXR1cm4gcnNzLnN0cigpOwotICAgICAgICB9Ci0gICAgfTsK LSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZT4KLSAgICBzdHJ1Y3QgU3RyaW5nTWFrZXI8c3Rk OjpjaHJvbm86OmR1cmF0aW9uPFZhbHVlLCBzdGQ6OnJhdGlvPDM2MDA+Pj4gewotICAgICAgICBz dGF0aWMgc3RkOjpzdHJpbmcgY29udmVydChzdGQ6OmNocm9ubzo6ZHVyYXRpb248VmFsdWUsIHN0 ZDo6cmF0aW88MzYwMD4+IGNvbnN0JiBkdXJhdGlvbikgewotICAgICAgICAgICAgUmV1c2FibGVT dHJpbmdTdHJlYW0gcnNzOwotICAgICAgICAgICAgcnNzIDw8IGR1cmF0aW9uLmNvdW50KCkgPDwg IiBoIjsKLSAgICAgICAgICAgIHJldHVybiByc3Muc3RyKCk7Ci0gICAgICAgIH0KLSAgICB9Owot Ci0gICAgLy8vLy8vLy8vLy8vCi0gICAgLy8gc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQgc3BlY2lh bGl6YXRpb24KLSAgICAvLyBHZW5lcmljIHRpbWVfcG9pbnQgY2Fubm90IGJlIHNwZWNpYWxpemVk LCBvbmx5IHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN5c3RlbV9jbG9jaz4KLSAgICB0ZW1wbGF0 ZTx0eXBlbmFtZSBDbG9jaywgdHlwZW5hbWUgRHVyYXRpb24+Ci0gICAgc3RydWN0IFN0cmluZ01h a2VyPHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PENsb2NrLCBEdXJhdGlvbj4+IHsKLSAgICAgICAg c3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8Q2xvY2ss IER1cmF0aW9uPiBjb25zdCYgdGltZV9wb2ludCkgewotICAgICAgICAgICAgcmV0dXJuIDo6Q2F0 Y2g6OkRldGFpbDo6c3RyaW5naWZ5KHRpbWVfcG9pbnQudGltZV9zaW5jZV9lcG9jaCgpKSArICIg c2luY2UgZXBvY2giOwotICAgICAgICB9Ci0gICAgfTsKLSAgICAvLyBzdGQ6OmNocm9ubzo6dGlt ZV9wb2ludDxzeXN0ZW1fY2xvY2s+IHNwZWNpYWxpemF0aW9uCi0gICAgdGVtcGxhdGU8dHlwZW5h bWUgRHVyYXRpb24+Ci0gICAgc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6Y2hyb25vOjp0aW1lX3Bv aW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2ssIER1cmF0aW9uPj4gewotICAgICAgICBzdGF0 aWMgc3RkOjpzdHJpbmcgY29udmVydChzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9u bzo6c3lzdGVtX2Nsb2NrLCBEdXJhdGlvbj4gY29uc3QmIHRpbWVfcG9pbnQpIHsKLSAgICAgICAg ICAgIGF1dG8gY29udmVydGVkID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90 KHRpbWVfcG9pbnQpOwotCi0jaWZkZWYgX01TQ19WRVIKLSAgICAgICAgICAgIHN0ZDo6dG0gdGlt ZUluZm8gPSB7fTsKLSAgICAgICAgICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJmNvbnZlcnRlZCk7 Ci0jZWxzZQotICAgICAgICAgICAgc3RkOjp0bSogdGltZUluZm8gPSBzdGQ6OmdtdGltZSgmY29u dmVydGVkKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBhdXRvIGNvbnN0IHRpbWVTdGFtcFNpemUg PSBzaXplb2YoIjIwMTctMDEtMTZUMTc6MDY6NDVaIik7Ci0gICAgICAgICAgICBjaGFyIHRpbWVT dGFtcFt0aW1lU3RhbXBTaXplXTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBmbXQg PSAiJVktJW0tJWRUJUg6JU06JVNaIjsKLQotI2lmZGVmIF9NU0NfVkVSCi0gICAgICAgICAgICBz dGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCAmdGltZUluZm8pOwot I2Vsc2UKLSAgICAgICAgICAgIHN0ZDo6c3RyZnRpbWUodGltZVN0YW1wLCB0aW1lU3RhbXBTaXpl LCBmbXQsIHRpbWVJbmZvKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5n KHRpbWVTdGFtcCk7Ci0gICAgICAgIH0KLSAgICB9OwotfQotI2VuZGlmIC8vIENBVENIX0NPTkZJ R19FTkFCTEVfQ0hST05PX1NUUklOR01BS0VSCi0KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVH SVNURVJfRU5VTSggZW51bU5hbWUsIC4uLiApIFwKLW5hbWVzcGFjZSBDYXRjaCB7IFwKLSAgICB0 ZW1wbGF0ZTw+IHN0cnVjdCBTdHJpbmdNYWtlcjxlbnVtTmFtZT4geyBcCi0gICAgICAgIHN0YXRp YyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBlbnVtTmFtZSB2YWx1ZSApIHsgXAotICAgICAgICAgICAg c3RhdGljIGNvbnN0IGF1dG8mIGVudW1JbmZvID0gOjpDYXRjaDo6Z2V0TXV0YWJsZVJlZ2lzdHJ5 SHViKCkuZ2V0TXV0YWJsZUVudW1WYWx1ZXNSZWdpc3RyeSgpLnJlZ2lzdGVyRW51bSggI2VudW1O YW1lLCAjX19WQV9BUkdTX18sIHsgX19WQV9BUkdTX18gfSApOyBcCi0gICAgICAgICAgICByZXR1 cm4gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc+KGVudW1JbmZvLmxvb2t1cCggc3RhdGljX2Nhc3Q8 aW50PiggdmFsdWUgKSApKTsgXAotICAgICAgICB9IFwKLSAgICB9OyBcCi19Ci0KLSNkZWZpbmUg Q0FUQ0hfUkVHSVNURVJfRU5VTSggZW51bU5hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lT VEVSX0VOVU0oIGVudW1OYW1lLCBfX1ZBX0FSR1NfXyApCi0KLSNpZmRlZiBfTVNDX1ZFUgotI3By YWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi0vLyBlbmQgY2F0Y2hfdG9zdHJpbmcuaAotI2lu Y2x1ZGUgPGlvc2Z3ZD4KLQotI2lmZGVmIF9NU0NfVkVSCi0jcHJhZ21hIHdhcm5pbmcocHVzaCkK LSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzODkpIC8vICc9PScgOiBzaWduZWQvdW5zaWduZWQg bWlzbWF0Y2gKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwMTgpIC8vIG1vcmUgInNpZ25lZC91 bnNpZ25lZCBtaXNtYXRjaCIKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzMTIpIC8vIENvbnZl cnRpbmcgaW50IHRvIFQqIHVzaW5nIHJlaW50ZXJwcmV0X2Nhc3QgKGlzc3VlIG9uIHg2NCBwbGF0 Zm9ybSkKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxODApIC8vIHF1YWxpZmllciBhcHBsaWVk IHRvIGZ1bmN0aW9uIHR5cGUgaGFzIG5vIG1lYW5pbmcKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxl OjQ4MDApIC8vIEZvcmNpbmcgcmVzdWx0IHRvIHRydWUgb3IgZmFsc2UKLSNlbmRpZgotCi1uYW1l c3BhY2UgQ2F0Y2ggewotCi0gICAgc3RydWN0IElUcmFuc2llbnRFeHByZXNzaW9uIHsKLSAgICAg ICAgYXV0byBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCAtPiBib29sIHsgcmV0dXJuIG1faXNC aW5hcnlFeHByZXNzaW9uOyB9Ci0gICAgICAgIGF1dG8gZ2V0UmVzdWx0KCkgY29uc3QgLT4gYm9v bCB7IHJldHVybiBtX3Jlc3VsdDsgfQotICAgICAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtUmVjb25z dHJ1Y3RlZEV4cHJlc3Npb24oIHN0ZDo6b3N0cmVhbSAmb3MgKSBjb25zdCA9IDA7Ci0KLSAgICAg ICAgSVRyYW5zaWVudEV4cHJlc3Npb24oIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uLCBib29sIHJl c3VsdCApCi0gICAgICAgIDogICBtX2lzQmluYXJ5RXhwcmVzc2lvbiggaXNCaW5hcnlFeHByZXNz aW9uICksCi0gICAgICAgICAgICBtX3Jlc3VsdCggcmVzdWx0ICkKLSAgICAgICAge30KLQotICAg ICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBuZWVkIGEgdmlydHVhbCBkZXN0cnVjdG9yLCBidXQg bWFueSBzdGF0aWMgYW5hbHlzZXJzCi0gICAgICAgIC8vIGNvbXBsYWluIGlmIGl0J3Mgbm90IGhl cmUgOi0oCi0gICAgICAgIHZpcnR1YWwgfklUcmFuc2llbnRFeHByZXNzaW9uKCk7Ci0KLSAgICAg ICAgYm9vbCBtX2lzQmluYXJ5RXhwcmVzc2lvbjsKLSAgICAgICAgYm9vbCBtX3Jlc3VsdDsKLQot ICAgIH07Ci0KLSAgICB2b2lkIGZvcm1hdFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCBzdGQ6Om9z dHJlYW0gJm9zLCBzdGQ6OnN0cmluZyBjb25zdCYgbGhzLCBTdHJpbmdSZWYgb3AsIHN0ZDo6c3Ry aW5nIGNvbnN0JiByaHMgKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIExoc1QsIHR5cGVuYW1l IFJoc1Q+Ci0gICAgY2xhc3MgQmluYXJ5RXhwciAgOiBwdWJsaWMgSVRyYW5zaWVudEV4cHJlc3Np b24gewotICAgICAgICBMaHNUIG1fbGhzOwotICAgICAgICBTdHJpbmdSZWYgbV9vcDsKLSAgICAg ICAgUmhzVCBtX3JoczsKLQotICAgICAgICB2b2lkIHN0cmVhbVJlY29uc3RydWN0ZWRFeHByZXNz aW9uKCBzdGQ6Om9zdHJlYW0gJm9zICkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgZm9y bWF0UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgKCBvcywgQ2F0 Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBtX2xocyApLCBtX29wLCBDYXRjaDo6RGV0YWlsOjpzdHJp bmdpZnkoIG1fcmhzICkgKTsKLSAgICAgICAgfQotCi0gICAgcHVibGljOgotICAgICAgICBCaW5h cnlFeHByKCBib29sIGNvbXBhcmlzb25SZXN1bHQsIExoc1QgbGhzLCBTdHJpbmdSZWYgb3AsIFJo c1QgcmhzICkKLSAgICAgICAgOiAgIElUcmFuc2llbnRFeHByZXNzaW9ueyB0cnVlLCBjb21wYXJp c29uUmVzdWx0IH0sCi0gICAgICAgICAgICBtX2xocyggbGhzICksCi0gICAgICAgICAgICBtX29w KCBvcCApLAotICAgICAgICAgICAgbV9yaHMoIHJocyApCi0gICAgICAgIHt9Ci0KLSAgICAgICAg dGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgYXV0byBvcGVyYXRvciAmJiAoIFQgKSBjb25z dCAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7Ci0gICAgICAgICAgICBz dGF0aWNfYXNzZXJ0KGFsd2F5c19mYWxzZTxUPjo6dmFsdWUsCi0gICAgICAgICAgICAiY2hhaW5l ZCBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXNzZXJ0aW9ucywgIgotICAg ICAgICAgICAgIndyYXAgdGhlIGV4cHJlc3Npb24gaW5zaWRlIHBhcmVudGhlc2VzLCBvciBkZWNv bXBvc2UgaXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0g ICAgICAgIGF1dG8gb3BlcmF0b3IgfHwgKCBUICkgY29uc3QgLT4gQmluYXJ5RXhwcjxMaHNULCBS aHNUIGNvbnN0Jj4gY29uc3QgewotICAgICAgICAgICAgc3RhdGljX2Fzc2VydChhbHdheXNfZmFs c2U8VD46OnZhbHVlLAotICAgICAgICAgICAgImNoYWluZWQgY29tcGFyaXNvbnMgYXJlIG5vdCBz dXBwb3J0ZWQgaW5zaWRlIGFzc2VydGlvbnMsICIKLSAgICAgICAgICAgICJ3cmFwIHRoZSBleHBy ZXNzaW9uIGluc2lkZSBwYXJlbnRoZXNlcywgb3IgZGVjb21wb3NlIGl0Iik7Ci0gICAgICAgIH0K LQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBhdXRvIG9wZXJhdG9yID09 ICggVCApIGNvbnN0IC0+IEJpbmFyeUV4cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKLSAg ICAgICAgICAgIHN0YXRpY19hc3NlcnQoYWx3YXlzX2ZhbHNlPFQ+Ojp2YWx1ZSwKLSAgICAgICAg ICAgICJjaGFpbmVkIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBhc3NlcnRp b25zLCAiCi0gICAgICAgICAgICAid3JhcCB0aGUgZXhwcmVzc2lvbiBpbnNpZGUgcGFyZW50aGVz ZXMsIG9yIGRlY29tcG9zZSBpdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcGxhdGU8dHlw ZW5hbWUgVD4KLSAgICAgICAgYXV0byBvcGVyYXRvciAhPSAoIFQgKSBjb25zdCAtPiBCaW5hcnlF eHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7Ci0gICAgICAgICAgICBzdGF0aWNfYXNzZXJ0 KGFsd2F5c19mYWxzZTxUPjo6dmFsdWUsCi0gICAgICAgICAgICAiY2hhaW5lZCBjb21wYXJpc29u cyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXNzZXJ0aW9ucywgIgotICAgICAgICAgICAgIndy YXAgdGhlIGV4cHJlc3Npb24gaW5zaWRlIHBhcmVudGhlc2VzLCBvciBkZWNvbXBvc2UgaXQiKTsK LSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGF1dG8g b3BlcmF0b3IgPiAoIFQgKSBjb25zdCAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBj b25zdCB7Ci0gICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KGFsd2F5c19mYWxzZTxUPjo6dmFsdWUs Ci0gICAgICAgICAgICAiY2hhaW5lZCBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBpbnNp ZGUgYXNzZXJ0aW9ucywgIgotICAgICAgICAgICAgIndyYXAgdGhlIGV4cHJlc3Npb24gaW5zaWRl IHBhcmVudGhlc2VzLCBvciBkZWNvbXBvc2UgaXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRl bXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGF1dG8gb3BlcmF0b3IgPCAoIFQgKSBjb25zdCAt PiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7Ci0gICAgICAgICAgICBzdGF0 aWNfYXNzZXJ0KGFsd2F5c19mYWxzZTxUPjo6dmFsdWUsCi0gICAgICAgICAgICAiY2hhaW5lZCBj b21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUgYXNzZXJ0aW9ucywgIgotICAgICAg ICAgICAgIndyYXAgdGhlIGV4cHJlc3Npb24gaW5zaWRlIHBhcmVudGhlc2VzLCBvciBkZWNvbXBv c2UgaXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAg ICAgIGF1dG8gb3BlcmF0b3IgPj0gKCBUICkgY29uc3QgLT4gQmluYXJ5RXhwcjxMaHNULCBSaHNU IGNvbnN0Jj4gY29uc3QgewotICAgICAgICAgICAgc3RhdGljX2Fzc2VydChhbHdheXNfZmFsc2U8 VD46OnZhbHVlLAotICAgICAgICAgICAgImNoYWluZWQgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBw b3J0ZWQgaW5zaWRlIGFzc2VydGlvbnMsICIKLSAgICAgICAgICAgICJ3cmFwIHRoZSBleHByZXNz aW9uIGluc2lkZSBwYXJlbnRoZXNlcywgb3IgZGVjb21wb3NlIGl0Iik7Ci0gICAgICAgIH0KLQot ICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBhdXRvIG9wZXJhdG9yIDw9ICgg VCApIGNvbnN0IC0+IEJpbmFyeUV4cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKLSAgICAg ICAgICAgIHN0YXRpY19hc3NlcnQoYWx3YXlzX2ZhbHNlPFQ+Ojp2YWx1ZSwKLSAgICAgICAgICAg ICJjaGFpbmVkIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBhc3NlcnRpb25z LCAiCi0gICAgICAgICAgICAid3JhcCB0aGUgZXhwcmVzc2lvbiBpbnNpZGUgcGFyZW50aGVzZXMs IG9yIGRlY29tcG9zZSBpdCIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5 cGVuYW1lIExoc1Q+Ci0gICAgY2xhc3MgVW5hcnlFeHByIDogcHVibGljIElUcmFuc2llbnRFeHBy ZXNzaW9uIHsKLSAgICAgICAgTGhzVCBtX2xoczsKLQotICAgICAgICB2b2lkIHN0cmVhbVJlY29u c3RydWN0ZWRFeHByZXNzaW9uKCBzdGQ6Om9zdHJlYW0gJm9zICkgY29uc3Qgb3ZlcnJpZGUgewot ICAgICAgICAgICAgb3MgPDwgQ2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBtX2xocyApOwotICAg ICAgICB9Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IFVuYXJ5RXhwciggTGhzVCBs aHMgKQotICAgICAgICA6ICAgSVRyYW5zaWVudEV4cHJlc3Npb257IGZhbHNlLCBzdGF0aWNfY2Fz dDxib29sPihsaHMpIH0sCi0gICAgICAgICAgICBtX2xocyggbGhzICkKLSAgICAgICAge30KLSAg ICB9OwotCi0gICAgLy8gU3BlY2lhbGlzZWQgY29tcGFyaXNvbiBmdW5jdGlvbnMgdG8gaGFuZGxl IGVxdWFsaXR5IGNvbXBhcmlzb25zIGJldHdlZW4gaW50cyBhbmQgcG9pbnRlcnMgKE5VTEwgZGVk dWNlcyBhcyBhbiBpbnQpCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgdHlwZW5hbWUgUmhz VD4KLSAgICBhdXRvIGNvbXBhcmVFcXVhbCggTGhzVCBjb25zdCYgbGhzLCBSaHNUIGNvbnN0JiBy aHMgKSAtPiBib29sIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KGxocyA9PSByaHMpOyB9Ci0g ICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBhdXRvIGNvbXBhcmVFcXVhbCggVCogY29uc3Qm IGxocywgaW50IHJocyApIC0+IGJvb2wgeyByZXR1cm4gbGhzID09IHJlaW50ZXJwcmV0X2Nhc3Q8 dm9pZCBjb25zdCo+KCByaHMgKTsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgYXV0 byBjb21wYXJlRXF1YWwoIFQqIGNvbnN0JiBsaHMsIGxvbmcgcmhzICkgLT4gYm9vbCB7IHJldHVy biBsaHMgPT0gcmVpbnRlcnByZXRfY2FzdDx2b2lkIGNvbnN0Kj4oIHJocyApOyB9Ci0gICAgdGVt cGxhdGU8dHlwZW5hbWUgVD4KLSAgICBhdXRvIGNvbXBhcmVFcXVhbCggaW50IGxocywgVCogY29u c3QmIHJocyApIC0+IGJvb2wgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkIGNvbnN0Kj4o IGxocyApID09IHJoczsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgYXV0byBjb21w YXJlRXF1YWwoIGxvbmcgbGhzLCBUKiBjb25zdCYgcmhzICkgLT4gYm9vbCB7IHJldHVybiByZWlu dGVycHJldF9jYXN0PHZvaWQgY29uc3QqPiggbGhzICkgPT0gcmhzOyB9Ci0KLSAgICB0ZW1wbGF0 ZTx0eXBlbmFtZSBMaHNULCB0eXBlbmFtZSBSaHNUPgotICAgIGF1dG8gY29tcGFyZU5vdEVxdWFs KCBMaHNUIGNvbnN0JiBsaHMsIFJoc1QmJiByaHMgKSAtPiBib29sIHsgcmV0dXJuIHN0YXRpY19j YXN0PGJvb2w+KGxocyAhPSByaHMpOyB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBh dXRvIGNvbXBhcmVOb3RFcXVhbCggVCogY29uc3QmIGxocywgaW50IHJocyApIC0+IGJvb2wgeyBy ZXR1cm4gbGhzICE9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCBjb25zdCo+KCByaHMgKTsgfQotICAg IHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgYXV0byBjb21wYXJlTm90RXF1YWwoIFQqIGNvbnN0 JiBsaHMsIGxvbmcgcmhzICkgLT4gYm9vbCB7IHJldHVybiBsaHMgIT0gcmVpbnRlcnByZXRfY2Fz dDx2b2lkIGNvbnN0Kj4oIHJocyApOyB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBh dXRvIGNvbXBhcmVOb3RFcXVhbCggaW50IGxocywgVCogY29uc3QmIHJocyApIC0+IGJvb2wgeyBy ZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkIGNvbnN0Kj4oIGxocyApICE9IHJoczsgfQotICAg IHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgYXV0byBjb21wYXJlTm90RXF1YWwoIGxvbmcgbGhz LCBUKiBjb25zdCYgcmhzICkgLT4gYm9vbCB7IHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQg Y29uc3QqPiggbGhzICkgIT0gcmhzOyB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNUPgot ICAgIGNsYXNzIEV4cHJMaHMgewotICAgICAgICBMaHNUIG1fbGhzOwotICAgIHB1YmxpYzoKLSAg ICAgICAgZXhwbGljaXQgRXhwckxocyggTGhzVCBsaHMgKSA6IG1fbGhzKCBsaHMgKSB7fQotCi0g ICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+Ci0gICAgICAgIGF1dG8gb3BlcmF0b3IgPT0g KCBSaHNUIGNvbnN0JiByaHMgKSAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25z dCB7Ci0gICAgICAgICAgICByZXR1cm4geyBjb21wYXJlRXF1YWwoIG1fbGhzLCByaHMgKSwgbV9s aHMsICI9PSIsIHJocyB9OwotICAgICAgICB9Ci0gICAgICAgIGF1dG8gb3BlcmF0b3IgPT0gKCBi b29sIHJocyApIC0+IEJpbmFyeUV4cHI8TGhzVCwgYm9vbD4gY29uc3QgewotICAgICAgICAgICAg cmV0dXJuIHsgbV9saHMgPT0gcmhzLCBtX2xocywgIj09IiwgcmhzIH07Ci0gICAgICAgIH0KLQot ICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgotICAgICAgICBhdXRvIG9wZXJhdG9yICE9 ICggUmhzVCBjb25zdCYgcmhzICkgLT4gQmluYXJ5RXhwcjxMaHNULCBSaHNUIGNvbnN0Jj4gY29u c3QgewotICAgICAgICAgICAgcmV0dXJuIHsgY29tcGFyZU5vdEVxdWFsKCBtX2xocywgcmhzICks IG1fbGhzLCAiIT0iLCByaHMgfTsKLSAgICAgICAgfQotICAgICAgICBhdXRvIG9wZXJhdG9yICE9 ICggYm9vbCByaHMgKSAtPiBCaW5hcnlFeHByPExoc1QsIGJvb2w+IGNvbnN0IHsKLSAgICAgICAg ICAgIHJldHVybiB7IG1fbGhzICE9IHJocywgbV9saHMsICIhPSIsIHJocyB9OwotICAgICAgICB9 Ci0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KLSAgICAgICAgYXV0byBvcGVyYXRv ciA+ICggUmhzVCBjb25zdCYgcmhzICkgLT4gQmluYXJ5RXhwcjxMaHNULCBSaHNUIGNvbnN0Jj4g Y29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGljX2Nhc3Q8Ym9vbD4obV9saHMgPiBy aHMpLCBtX2xocywgIj4iLCByaHMgfTsKLSAgICAgICAgfQotICAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBSaHNUPgotICAgICAgICBhdXRvIG9wZXJhdG9yIDwgKCBSaHNUIGNvbnN0JiByaHMgKSAt PiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7Ci0gICAgICAgICAgICByZXR1 cm4geyBzdGF0aWNfY2FzdDxib29sPihtX2xocyA8IHJocyksIG1fbGhzLCAiPCIsIHJocyB9Owot ICAgICAgICB9Ci0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+Ci0gICAgICAgIGF1dG8g b3BlcmF0b3IgPj0gKCBSaHNUIGNvbnN0JiByaHMgKSAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1Qg Y29uc3QmPiBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4geyBzdGF0aWNfY2FzdDxib29sPiht X2xocyA+PSByaHMpLCBtX2xocywgIj49IiwgcmhzIH07Ci0gICAgICAgIH0KLSAgICAgICAgdGVt cGxhdGU8dHlwZW5hbWUgUmhzVD4KLSAgICAgICAgYXV0byBvcGVyYXRvciA8PSAoIFJoc1QgY29u c3QmIHJocyApIC0+IEJpbmFyeUV4cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKLSAgICAg ICAgICAgIHJldHVybiB7IHN0YXRpY19jYXN0PGJvb2w+KG1fbGhzIDw9IHJocyksIG1fbGhzLCAi PD0iLCByaHMgfTsKLSAgICAgICAgfQotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzVD4K LSAgICAgICAgYXV0byBvcGVyYXRvciB8IChSaHNUIGNvbnN0JiByaHMpIC0+IEJpbmFyeUV4cHI8 TGhzVCwgUmhzVCBjb25zdCY+IGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiB7IHN0YXRpY19j YXN0PGJvb2w+KG1fbGhzIHwgcmhzKSwgbV9saHMsICJ8IiwgcmhzIH07Ci0gICAgICAgIH0KLSAg ICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJoc1Q+Ci0gICAgICAgIGF1dG8gb3BlcmF0b3IgJiAo UmhzVCBjb25zdCYgcmhzKSAtPiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7 Ci0gICAgICAgICAgICByZXR1cm4geyBzdGF0aWNfY2FzdDxib29sPihtX2xocyAmIHJocyksIG1f bGhzLCAiJiIsIHJocyB9OwotICAgICAgICB9Ci0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBS aHNUPgotICAgICAgICBhdXRvIG9wZXJhdG9yIF4gKFJoc1QgY29uc3QmIHJocykgLT4gQmluYXJ5 RXhwcjxMaHNULCBSaHNUIGNvbnN0Jj4gY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHsgc3Rh dGljX2Nhc3Q8Ym9vbD4obV9saHMgXiByaHMpLCBtX2xocywgIl4iLCByaHMgfTsKLSAgICAgICAg fQotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+Ci0gICAgICAgIGF1dG8gb3BlcmF0 b3IgJiYgKCBSaHNUIGNvbnN0JiApIC0+IEJpbmFyeUV4cHI8TGhzVCwgUmhzVCBjb25zdCY+IGNv bnN0IHsKLSAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoYWx3YXlzX2ZhbHNlPFJoc1Q+Ojp2YWx1 ZSwKLSAgICAgICAgICAgICJvcGVyYXRvciYmIGlzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGFzc2Vy dGlvbnMsICIKLSAgICAgICAgICAgICJ3cmFwIHRoZSBleHByZXNzaW9uIGluc2lkZSBwYXJlbnRo ZXNlcywgb3IgZGVjb21wb3NlIGl0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZTx0 eXBlbmFtZSBSaHNUPgotICAgICAgICBhdXRvIG9wZXJhdG9yIHx8ICggUmhzVCBjb25zdCYgKSAt PiBCaW5hcnlFeHByPExoc1QsIFJoc1QgY29uc3QmPiBjb25zdCB7Ci0gICAgICAgICAgICBzdGF0 aWNfYXNzZXJ0KGFsd2F5c19mYWxzZTxSaHNUPjo6dmFsdWUsCi0gICAgICAgICAgICAib3BlcmF0 b3J8fCBpcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhc3NlcnRpb25zLCAiCi0gICAgICAgICAgICAi d3JhcCB0aGUgZXhwcmVzc2lvbiBpbnNpZGUgcGFyZW50aGVzZXMsIG9yIGRlY29tcG9zZSBpdCIp OwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBtYWtlVW5hcnlFeHByKCkgY29uc3QgLT4gVW5h cnlFeHByPExoc1Q+IHsKLSAgICAgICAgICAgIHJldHVybiBVbmFyeUV4cHI8TGhzVD57IG1fbGhz IH07Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgdm9pZCBoYW5kbGVFeHByZXNzaW9uKCBJVHJh bnNpZW50RXhwcmVzc2lvbiBjb25zdCYgZXhwciApOwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUg VD4KLSAgICB2b2lkIGhhbmRsZUV4cHJlc3Npb24oIEV4cHJMaHM8VD4gY29uc3QmIGV4cHIgKSB7 Ci0gICAgICAgIGhhbmRsZUV4cHJlc3Npb24oIGV4cHIubWFrZVVuYXJ5RXhwcigpICk7Ci0gICAg fQotCi0gICAgc3RydWN0IERlY29tcG9zZXIgewotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU PgotICAgICAgICBhdXRvIG9wZXJhdG9yIDw9ICggVCBjb25zdCYgbGhzICkgLT4gRXhwckxoczxU IGNvbnN0Jj4gewotICAgICAgICAgICAgcmV0dXJuIEV4cHJMaHM8VCBjb25zdCY+eyBsaHMgfTsK LSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gb3BlcmF0b3IgPD0oIGJvb2wgdmFsdWUgKSAtPiBF eHByTGhzPGJvb2w+IHsKLSAgICAgICAgICAgIHJldHVybiBFeHByTGhzPGJvb2w+eyB2YWx1ZSB9 OwotICAgICAgICB9Ci0gICAgfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLSNpZmRl ZiBfTVNDX1ZFUgotI3ByYWdtYSB3YXJuaW5nKHBvcCkKLSNlbmRpZgotCi0vLyBlbmQgY2F0Y2hf ZGVjb21wb3Nlci5oCi0vLyBzdGFydCBjYXRjaF9pbnRlcmZhY2VzX2NhcHR1cmUuaAotCi0jaW5j bHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGNocm9ubz4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQot ICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdDsKLSAgICBzdHJ1Y3QgQXNzZXJ0aW9uSW5mbzsKLSAg ICBzdHJ1Y3QgU2VjdGlvbkluZm87Ci0gICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvOwotICAgIHN0 cnVjdCBNZXNzYWdlSW5mbzsKLSAgICBzdHJ1Y3QgTWVzc2FnZUJ1aWxkZXI7Ci0gICAgc3RydWN0 IENvdW50czsKLSAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVhY3Rpb247Ci0gICAgc3RydWN0IFNvdXJj ZUxpbmVJbmZvOwotCi0gICAgc3RydWN0IElUcmFuc2llbnRFeHByZXNzaW9uOwotICAgIHN0cnVj dCBJR2VuZXJhdG9yVHJhY2tlcjsKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9C RU5DSE1BUktJTkcpCi0gICAgc3RydWN0IEJlbmNobWFya0luZm87Ci0gICAgdGVtcGxhdGUgPHR5 cGVuYW1lIER1cmF0aW9uID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjpuYW5v Pj4KLSAgICBzdHJ1Y3QgQmVuY2htYXJrU3RhdHM7Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VO QUJMRV9CRU5DSE1BUktJTkcKLQotICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZSB7Ci0KLSAgICAg ICAgdmlydHVhbCB+SVJlc3VsdENhcHR1cmUoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2Vj dGlvblN0YXJ0ZWQoICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbywKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMgKSA9IDA7 Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25FbmRJbmZvIGNvbnN0 JiBlbmRJbmZvICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHko IFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgPSAwOwotCi0gICAgICAgIHZpcnR1YWwg YXV0byBhY3F1aXJlR2VuZXJhdG9yVHJhY2tlciggU3RyaW5nUmVmIGdlbmVyYXRvck5hbWUsIFNv dXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIC0+IElHZW5lcmF0b3JUcmFja2VyJiA9IDA7 Ci0KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQotICAgICAg ICB2aXJ0dWFsIHZvaWQgYmVuY2htYXJrUHJlcGFyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFt ZSApID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIGJlbmNobWFya1N0YXJ0aW5nKCBCZW5jaG1h cmtJbmZvIGNvbnN0JiBpbmZvICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgYmVuY2htYXJr RW5kZWQoIEJlbmNobWFya1N0YXRzPD4gY29uc3QmIHN0YXRzICkgPSAwOwotICAgICAgICB2aXJ0 dWFsIHZvaWQgYmVuY2htYXJrRmFpbGVkKCBzdGQ6OnN0cmluZyBjb25zdCYgZXJyb3IgKSA9IDA7 Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcKLQotICAgICAgICB2 aXJ0dWFsIHZvaWQgcHVzaFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdl ICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUlu Zm8gY29uc3QmIG1lc3NhZ2UgKSA9IDA7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGVtcGxhY2VV bnNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICkgPSAwOwotCi0g ICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBTdHJpbmdSZWYg bWVzc2FnZSApID0gMDsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXhwcgotICAgICAg ICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLAotICAgICAgICAgICAgICAg ICAgICBJVHJhbnNpZW50RXhwcmVzc2lvbiBjb25zdCYgZXhwciwKLSAgICAgICAgICAgICAgICAg ICAgQXNzZXJ0aW9uUmVhY3Rpb24mIHJlYWN0aW9uICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZv aWQgaGFuZGxlTWVzc2FnZQotICAgICAgICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0 JiBpbmZvLAotICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBl LAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgY29uc3QmIG1lc3NhZ2UsCi0gICAgICAg ICAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9uJiByZWFjdGlvbiApID0gMDsKLSAgICAgICAg dmlydHVhbCB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb25Ob3RUaHJvd24KLSAgICAgICAg ICAgICAgICAoICAgQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywKLSAgICAgICAgICAgICAgICAg ICAgQXNzZXJ0aW9uUmVhY3Rpb24mIHJlYWN0aW9uICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZv aWQgaGFuZGxlVW5leHBlY3RlZEluZmxpZ2h0RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgKCAg IEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3Ry aW5nIGNvbnN0JiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZWFjdGlv biYgcmVhY3Rpb24gKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVJbmNvbXBsZXRl Ci0gICAgICAgICAgICAgICAgKCAgIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8gKSA9IDA7Ci0g ICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVOb25FeHByCi0gICAgICAgICAgICAgICAgKCAgIEFz c2VydGlvbkluZm8gY29uc3QgJmluZm8sCi0gICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6 T2ZUeXBlIHJlc3VsdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9u ICZyZWFjdGlvbiApID0gMDsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgbGFzdEFzc2VydGlvblBh c3NlZCgpID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblBhc3NlZCgpID0gMDsK LQotICAgICAgICAvLyBEZXByZWNhdGVkLCBkbyBub3QgdXNlOgotICAgICAgICB2aXJ0dWFsIHN0 ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVh bCBjb25zdCBBc3NlcnRpb25SZXN1bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCA9IDA7Ci0gICAg ICAgIHZpcnR1YWwgdm9pZCBleGNlcHRpb25FYXJseVJlcG9ydGVkKCkgPSAwOwotICAgIH07Ci0K LSAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpOwotfQotCi0vLyBlbmQgY2F0 Y2hfaW50ZXJmYWNlc19jYXB0dXJlLmgKLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBzdHJ1Y3Qg VGVzdEZhaWx1cmVFeGNlcHRpb257fTsKLSAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVzdWx0RGF0YTsK LSAgICBzdHJ1Y3QgSVJlc3VsdENhcHR1cmU7Ci0gICAgY2xhc3MgUnVuQ29udGV4dDsKLQotICAg IGNsYXNzIExhenlFeHByZXNzaW9uIHsKLSAgICAgICAgZnJpZW5kIGNsYXNzIEFzc2VydGlvbkhh bmRsZXI7Ci0gICAgICAgIGZyaWVuZCBzdHJ1Y3QgQXNzZXJ0aW9uU3RhdHM7Ci0gICAgICAgIGZy aWVuZCBjbGFzcyBSdW5Db250ZXh0OwotCi0gICAgICAgIElUcmFuc2llbnRFeHByZXNzaW9uIGNv bnN0KiBtX3RyYW5zaWVudEV4cHJlc3Npb24gPSBudWxscHRyOwotICAgICAgICBib29sIG1faXNO ZWdhdGVkOwotICAgIHB1YmxpYzoKLSAgICAgICAgTGF6eUV4cHJlc3Npb24oIGJvb2wgaXNOZWdh dGVkICk7Ci0gICAgICAgIExhenlFeHByZXNzaW9uKCBMYXp5RXhwcmVzc2lvbiBjb25zdCYgb3Ro ZXIgKTsKLSAgICAgICAgTGF6eUV4cHJlc3Npb24mIG9wZXJhdG9yID0gKCBMYXp5RXhwcmVzc2lv biBjb25zdCYgKSA9IGRlbGV0ZTsKLQotICAgICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkg Y29uc3Q7Ci0KLSAgICAgICAgZnJpZW5kIGF1dG8gb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0m IG9zLCBMYXp5RXhwcmVzc2lvbiBjb25zdCYgbGF6eUV4cHIgKSAtPiBzdGQ6Om9zdHJlYW0mOwot ICAgIH07Ci0KLSAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVhY3Rpb24gewotICAgICAgICBib29sIHNo b3VsZERlYnVnQnJlYWsgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBzaG91bGRUaHJvdyA9IGZhbHNl OwotICAgIH07Ci0KLSAgICBjbGFzcyBBc3NlcnRpb25IYW5kbGVyIHsKLSAgICAgICAgQXNzZXJ0 aW9uSW5mbyBtX2Fzc2VydGlvbkluZm87Ci0gICAgICAgIEFzc2VydGlvblJlYWN0aW9uIG1fcmVh Y3Rpb247Ci0gICAgICAgIGJvb2wgbV9jb21wbGV0ZWQgPSBmYWxzZTsKLSAgICAgICAgSVJlc3Vs dENhcHR1cmUmIG1fcmVzdWx0Q2FwdHVyZTsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgQXNzZXJ0 aW9uSGFuZGxlcgotICAgICAgICAgICAgKCAgIFN0cmluZ1JlZiBjb25zdCYgbWFjcm9OYW1lLAot ICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKLSAgICAgICAg ICAgICAgICBTdHJpbmdSZWYgY2FwdHVyZWRFeHByZXNzaW9uLAotICAgICAgICAgICAgICAgIFJl c3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiApOwotICAgICAgICB+QXNz ZXJ0aW9uSGFuZGxlcigpIHsKLSAgICAgICAgICAgIGlmICggIW1fY29tcGxldGVkICkgewotICAg ICAgICAgICAgICAgIG1fcmVzdWx0Q2FwdHVyZS5oYW5kbGVJbmNvbXBsZXRlKCBtX2Fzc2VydGlv bkluZm8gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFQ+Ci0gICAgICAgIHZvaWQgaGFuZGxlRXhwciggRXhwckxoczxUPiBjb25zdCYgZXhw ciApIHsKLSAgICAgICAgICAgIGhhbmRsZUV4cHIoIGV4cHIubWFrZVVuYXJ5RXhwcigpICk7Ci0g ICAgICAgIH0KLSAgICAgICAgdm9pZCBoYW5kbGVFeHByKCBJVHJhbnNpZW50RXhwcmVzc2lvbiBj b25zdCYgZXhwciApOwotCi0gICAgICAgIHZvaWQgaGFuZGxlTWVzc2FnZShSZXN1bHRXYXM6Ok9m VHlwZSByZXN1bHRUeXBlLCBTdHJpbmdSZWYgY29uc3QmIG1lc3NhZ2UpOwotCi0gICAgICAgIHZv aWQgaGFuZGxlRXhjZXB0aW9uVGhyb3duQXNFeHBlY3RlZCgpOwotICAgICAgICB2b2lkIGhhbmRs ZVVuZXhwZWN0ZWRFeGNlcHRpb25Ob3RUaHJvd24oKTsKLSAgICAgICAgdm9pZCBoYW5kbGVFeGNl cHRpb25Ob3RUaHJvd25Bc0V4cGVjdGVkKCk7Ci0gICAgICAgIHZvaWQgaGFuZGxlVGhyb3dpbmdD YWxsU2tpcHBlZCgpOwotICAgICAgICB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2Vw dGlvbigpOwotCi0gICAgICAgIHZvaWQgY29tcGxldGUoKTsKLSAgICAgICAgdm9pZCBzZXRDb21w bGV0ZWQoKTsKLQotICAgICAgICAvLyBxdWVyeQotICAgICAgICBhdXRvIGFsbG93VGhyb3dzKCkg Y29uc3QgLT4gYm9vbDsKLSAgICB9OwotCi0gICAgdm9pZCBoYW5kbGVFeGNlcHRpb25NYXRjaEV4 cHIoIEFzc2VydGlvbkhhbmRsZXImIGhhbmRsZXIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIFN0 cmluZ1JlZiBjb25zdCYgbWF0Y2hlclN0cmluZyApOwotCi19IC8vIG5hbWVzcGFjZSBDYXRjaAot Ci0vLyBlbmQgY2F0Y2hfYXNzZXJ0aW9uaGFuZGxlci5oCi0vLyBzdGFydCBjYXRjaF9tZXNzYWdl LmgKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBD YXRjaCB7Ci0KLSAgICBzdHJ1Y3QgTWVzc2FnZUluZm8gewotICAgICAgICBNZXNzYWdlSW5mbygg ICAgU3RyaW5nUmVmIGNvbnN0JiBfbWFjcm9OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAg U291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAg IFJlc3VsdFdhczo6T2ZUeXBlIF90eXBlICk7Ci0KLSAgICAgICAgU3RyaW5nUmVmIG1hY3JvTmFt ZTsKLSAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgU291cmNlTGluZUluZm8g bGluZUluZm87Ci0gICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5cGU7Ci0gICAgICAgIHVuc2ln bmVkIGludCBzZXF1ZW5jZTsKLQotICAgICAgICBib29sIG9wZXJhdG9yID09ICggTWVzc2FnZUlu Zm8gY29uc3QmIG90aGVyICkgY29uc3Q7Ci0gICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIE1lc3Nh Z2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OwotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0YXRp YyB1bnNpZ25lZCBpbnQgZ2xvYmFsQ291bnQ7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNZXNzYWdl U3RyZWFtIHsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBNZXNzYWdl U3RyZWFtJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgewotICAgICAgICAgICAgbV9z dHJlYW0gPDwgdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQot ICAgICAgICBSZXVzYWJsZVN0cmluZ1N0cmVhbSBtX3N0cmVhbTsKLSAgICB9OwotCi0gICAgc3Ry dWN0IE1lc3NhZ2VCdWlsZGVyIDogTWVzc2FnZVN0cmVhbSB7Ci0gICAgICAgIE1lc3NhZ2VCdWls ZGVyKCBTdHJpbmdSZWYgY29uc3QmIG1hY3JvTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAg IFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAg IFJlc3VsdFdhczo6T2ZUeXBlIHR5cGUgKTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU PgotICAgICAgICBNZXNzYWdlQnVpbGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSAp IHsKLSAgICAgICAgICAgIG1fc3RyZWFtIDw8IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuICp0 aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOwotICAgIH07Ci0K LSAgICBjbGFzcyBTY29wZWRNZXNzYWdlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0 IFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICk7Ci0gICAgICAg IFNjb3BlZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UmIGR1cGxpY2F0ZSApID0gZGVsZXRlOwotICAg ICAgICBTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlJiYgb2xkICk7Ci0gICAgICAgIH5TY29w ZWRNZXNzYWdlKCk7Ci0KLSAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOwotICAgICAgICBib29s IG1fbW92ZWQ7Ci0gICAgfTsKLQotICAgIGNsYXNzIENhcHR1cmVyIHsKLSAgICAgICAgc3RkOjp2 ZWN0b3I8TWVzc2FnZUluZm8+IG1fbWVzc2FnZXM7Ci0gICAgICAgIElSZXN1bHRDYXB0dXJlJiBt X3Jlc3VsdENhcHR1cmUgPSBnZXRSZXN1bHRDYXB0dXJlKCk7Ci0gICAgICAgIHNpemVfdCBtX2Nh cHR1cmVkID0gMDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENhcHR1cmVyKCBTdHJpbmdSZWYgbWFj cm9OYW1lLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sIFJlc3VsdFdhczo6T2ZUeXBl IHJlc3VsdFR5cGUsIFN0cmluZ1JlZiBuYW1lcyApOwotICAgICAgICB+Q2FwdHVyZXIoKTsKLQot ICAgICAgICB2b2lkIGNhcHR1cmVWYWx1ZSggc2l6ZV90IGluZGV4LCBzdGQ6OnN0cmluZyBjb25z dCYgdmFsdWUgKTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICB2b2lk IGNhcHR1cmVWYWx1ZXMoIHNpemVfdCBpbmRleCwgVCBjb25zdCYgdmFsdWUgKSB7Ci0gICAgICAg ICAgICBjYXB0dXJlVmFsdWUoIGluZGV4LCBDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoIHZhbHVl ICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1l Li4uIFRzPgotICAgICAgICB2b2lkIGNhcHR1cmVWYWx1ZXMoIHNpemVfdCBpbmRleCwgVCBjb25z dCYgdmFsdWUsIFRzIGNvbnN0Ji4uLiB2YWx1ZXMgKSB7Ci0gICAgICAgICAgICBjYXB0dXJlVmFs dWUoIGluZGV4LCBDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkodmFsdWUpICk7Ci0gICAgICAgICAg ICBjYXB0dXJlVmFsdWVzKCBpbmRleCsxLCB2YWx1ZXMuLi4gKTsKLSAgICAgICAgfQotICAgIH07 Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfbWVzc2FnZS5oCi0j aWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEUpCi0KLSNpZiAhZGVmaW5lZChDQVRDSF9D T05GSUdfRElTQUJMRV9TVFJJTkdJRklDQVRJT04pCi0gICNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxf U1RSSU5HSUZZKC4uLikgI19fVkFfQVJHU19fCi0jZWxzZQotICAjZGVmaW5lIENBVENIX0lOVEVS TkFMX1NUUklOR0lGWSguLi4pICJEaXNhYmxlZCBieSBDQVRDSF9DT05GSUdfRElTQUJMRV9TVFJJ TkdJRklDQVRJT04iCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09N UElMRSkgfHwgZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TKQotCi0vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBbm90aGVyIHdheSB0byBzcGVlZC11cCBjb21waWxhdGlv biBpcyB0byBvbWl0IGxvY2FsIHRyeS1jYXRjaCBmb3IgUkVRVUlSRSoKLS8vIG1hY3Jvcy4KLSNk ZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJZCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0NBVENIKCBj YXB0dXJlciApCi0KLSNlbHNlIC8vIENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUKLQotI2RlZmlu ZSBJTlRFUk5BTF9DQVRDSF9UUlkgdHJ5Ci0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0NBVENIKCBo YW5kbGVyICkgY2F0Y2goLi4uKSB7IGhhbmRsZXIuaGFuZGxlVW5leHBlY3RlZEluZmxpZ2h0RXhj ZXB0aW9uKCk7IH0KLQotI2VuZGlmCi0KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIGhh bmRsZXIgKSBoYW5kbGVyLmNvbXBsZXRlKCk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNk ZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwg Li4uICkgXAotICAgIGRvIHsgXAotICAgICAgICBDQVRDSF9JTlRFUk5BTF9JR05PUkVfQlVUX1dB Uk4oX19WQV9BUkdTX18pOyBcCi0gICAgICAgIENhdGNoOjpBc3NlcnRpb25IYW5kbGVyIGNhdGNo QXNzZXJ0aW9uSGFuZGxlciggbWFjcm9OYW1lIyNfY2F0Y2hfc3IsIENBVENIX0lOVEVSTkFMX0xJ TkVJTkZPLCBDQVRDSF9JTlRFUk5BTF9TVFJJTkdJRlkoX19WQV9BUkdTX18pLCByZXN1bHREaXNw b3NpdGlvbiApOyBcCi0gICAgICAgIElOVEVSTkFMX0NBVENIX1RSWSB7IFwKLSAgICAgICAgICAg IENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKLSAgICAgICAgICAg IENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKLSAgICAgICAg ICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVFeHByKCBDYXRjaDo6RGVjb21wb3Nlcigp IDw9IF9fVkFfQVJHU19fICk7IFwKLSAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NUT1BfV0FS TklOR1NfU1VQUFJFU1NJT04gXAotICAgICAgICB9IElOVEVSTkFMX0NBVENIX0NBVENIKCBjYXRj aEFzc2VydGlvbkhhbmRsZXIgKSBcCi0gICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBjYXRj aEFzc2VydGlvbkhhbmRsZXIgKSBcCi0gICAgfSB3aGlsZSggKHZvaWQpMCwgKGZhbHNlKSAmJiBz dGF0aWNfY2FzdDxib29sPiggISEoX19WQV9BUkdTX18pICkgKQotCi0vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0lGKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bv c2l0aW9uLCAuLi4gKSBcCi0gICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1 bHREaXNwb3NpdGlvbiwgX19WQV9BUkdTX18gKTsgXAotICAgIGlmKCBDYXRjaDo6Z2V0UmVzdWx0 Q2FwdHVyZSgpLmxhc3RBc3NlcnRpb25QYXNzZWQoKSApCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfRUxTRSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3Np dGlvbiwgLi4uICkgXAotICAgIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0 RGlzcG9zaXRpb24sIF9fVkFfQVJHU19fICk7IFwKLSAgICBpZiggIUNhdGNoOjpnZXRSZXN1bHRD YXB0dXJlKCkubGFzdEFzc2VydGlvblBhc3NlZCgpICkKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v LwotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggbWFjcm9OYW1lLCByZXN1bHREaXNw b3NpdGlvbiwgLi4uICkgXAotICAgIGRvIHsgXAotICAgICAgICBDYXRjaDo6QXNzZXJ0aW9uSGFu ZGxlciBjYXRjaEFzc2VydGlvbkhhbmRsZXIoIG1hY3JvTmFtZSMjX2NhdGNoX3NyLCBDQVRDSF9J TlRFUk5BTF9MSU5FSU5GTywgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKF9fVkFfQVJHU19fKSwg cmVzdWx0RGlzcG9zaXRpb24gKTsgXAotICAgICAgICB0cnkgeyBcCi0gICAgICAgICAgICBzdGF0 aWNfY2FzdDx2b2lkPihfX1ZBX0FSR1NfXyk7IFwKLSAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9u SGFuZGxlci5oYW5kbGVFeGNlcHRpb25Ob3RUaHJvd25Bc0V4cGVjdGVkKCk7IFwKLSAgICAgICAg fSBcCi0gICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKLSAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9u SGFuZGxlci5oYW5kbGVVbmV4cGVjdGVkSW5mbGlnaHRFeGNlcHRpb24oKTsgXAotICAgICAgICB9 IFwKLSAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciAp IFwKLSAgICB9IHdoaWxlKCBmYWxzZSApCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZp bmUgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCAu Li4gKSBcCi0gICAgZG8geyBcCi0gICAgICAgIENhdGNoOjpBc3NlcnRpb25IYW5kbGVyIGNhdGNo QXNzZXJ0aW9uSGFuZGxlciggbWFjcm9OYW1lIyNfY2F0Y2hfc3IsIENBVENIX0lOVEVSTkFMX0xJ TkVJTkZPLCBDQVRDSF9JTlRFUk5BTF9TVFJJTkdJRlkoX19WQV9BUkdTX18pLCByZXN1bHREaXNw b3NpdGlvbik7IFwKLSAgICAgICAgaWYoIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5hbGxvd1Rocm93 cygpICkgXAotICAgICAgICAgICAgdHJ5IHsgXAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0 PHZvaWQ+KF9fVkFfQVJHU19fKTsgXAotICAgICAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFu ZGxlci5oYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uTm90VGhyb3duKCk7IFwKLSAgICAgICAgICAg IH0gXAotICAgICAgICAgICAgY2F0Y2goIC4uLiApIHsgXAotICAgICAgICAgICAgICAgIGNhdGNo QXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb25UaHJvd25Bc0V4cGVjdGVkKCk7IFwKLSAg ICAgICAgICAgIH0gXAotICAgICAgICBlbHNlIFwKLSAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9u SGFuZGxlci5oYW5kbGVUaHJvd2luZ0NhbGxTa2lwcGVkKCk7IFwKLSAgICAgICAgSU5URVJOQUxf Q0FUQ0hfUkVBQ1QoIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciApIFwKLSAgICB9IHdoaWxlKCBmYWxz ZSApCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhS T1dTX0FTKCBtYWNyb05hbWUsIGV4Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHBy ICkgXAotICAgIGRvIHsgXAotICAgICAgICBDYXRjaDo6QXNzZXJ0aW9uSGFuZGxlciBjYXRjaEFz c2VydGlvbkhhbmRsZXIoIG1hY3JvTmFtZSMjX2NhdGNoX3NyLCBDQVRDSF9JTlRFUk5BTF9MSU5F SU5GTywgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKGV4cHIpICIsICIgQ0FUQ0hfSU5URVJOQUxf U1RSSU5HSUZZKGV4Y2VwdGlvblR5cGUpLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCi0gICAgICAg IGlmKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIuYWxsb3dUaHJvd3MoKSApIFwKLSAgICAgICAgICAg IHRyeSB7IFwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAotICAg ICAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVVbmV4cGVjdGVkRXhjZXB0 aW9uTm90VGhyb3duKCk7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgY2F0Y2goIGV4 Y2VwdGlvblR5cGUgY29uc3QmICkgeyBcCi0gICAgICAgICAgICAgICAgY2F0Y2hBc3NlcnRpb25I YW5kbGVyLmhhbmRsZUV4Y2VwdGlvblRocm93bkFzRXhwZWN0ZWQoKTsgXAotICAgICAgICAgICAg fSBcCi0gICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCi0gICAgICAgICAgICAgICAgY2F0Y2hB c3NlcnRpb25IYW5kbGVyLmhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbigpOyBcCi0g ICAgICAgICAgICB9IFwKLSAgICAgICAgZWxzZSBcCi0gICAgICAgICAgICBjYXRjaEFzc2VydGlv bkhhbmRsZXIuaGFuZGxlVGhyb3dpbmdDYWxsU2tpcHBlZCgpOyBcCi0gICAgICAgIElOVEVSTkFM X0NBVENIX1JFQUNUKCBjYXRjaEFzc2VydGlvbkhhbmRsZXIgKSBcCi0gICAgfSB3aGlsZSggZmFs c2UgKQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX01T RyggbWFjcm9OYW1lLCBtZXNzYWdlVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24sIC4uLiApIFwKLSAg ICBkbyB7IFwKLSAgICAgICAgQ2F0Y2g6OkFzc2VydGlvbkhhbmRsZXIgY2F0Y2hBc3NlcnRpb25I YW5kbGVyKCBtYWNyb05hbWUjI19jYXRjaF9zciwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENh dGNoOjpTdHJpbmdSZWYoKSwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAotICAgICAgICBjYXRjaEFz c2VydGlvbkhhbmRsZXIuaGFuZGxlTWVzc2FnZSggbWVzc2FnZVR5cGUsICggQ2F0Y2g6Ok1lc3Nh Z2VTdHJlYW0oKSA8PCBfX1ZBX0FSR1NfXyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKSApLm1f c3RyZWFtLnN0cigpICk7IFwKLSAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIGNhdGNoQXNz ZXJ0aW9uSGFuZGxlciApIFwKLSAgICB9IHdoaWxlKCBmYWxzZSApCi0KLS8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfQ0FQVFVSRSggdmFyTmFtZSwgbWFjcm9O YW1lLCAuLi4gKSBcCi0gICAgYXV0byB2YXJOYW1lID0gQ2F0Y2g6OkNhcHR1cmVyKCBtYWNyb05h bWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6UmVzdWx0V2FzOjpJbmZvLCAjX19W QV9BUkdTX18gKTsgXAotICAgIHZhck5hbWUuY2FwdHVyZVZhbHVlcyggMCwgX19WQV9BUkdTX18g KQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0lORk8o IG1hY3JvTmFtZSwgbG9nICkgXAotICAgIENhdGNoOjpTY29wZWRNZXNzYWdlIElOVEVSTkFMX0NB VENIX1VOSVFVRV9OQU1FKCBzY29wZWRNZXNzYWdlICkoIENhdGNoOjpNZXNzYWdlQnVpbGRlcigg bWFjcm9OYW1lIyNfY2F0Y2hfc3IsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6UmVz dWx0V2FzOjpJbmZvICkgPDwgbG9nICk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZp bmUgSU5URVJOQUxfQ0FUQ0hfVU5TQ09QRURfSU5GTyggbWFjcm9OYW1lLCBsb2cgKSBcCi0gICAg Q2F0Y2g6OmdldFJlc3VsdENhcHR1cmUoKS5lbXBsYWNlVW5zY29wZWRNZXNzYWdlKCBDYXRjaDo6 TWVzc2FnZUJ1aWxkZXIoIG1hY3JvTmFtZSMjX2NhdGNoX3NyLCBDQVRDSF9JTlRFUk5BTF9MSU5F SU5GTywgQ2F0Y2g6OlJlc3VsdFdhczo6SW5mbyApIDw8IGxvZyApCi0KLS8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8KLS8vIEFsdGhvdWdoIHRoaXMgaXMgbWF0Y2hlci1iYXNlZCwgaXQgY2FuIGJlIHVz ZWQgd2l0aCBqdXN0IGEgc3RyaW5nCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XU19TVFJf TUFUQ0hFUyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgbWF0Y2hlciwgLi4uICkgXAot ICAgIGRvIHsgXAotICAgICAgICBDYXRjaDo6QXNzZXJ0aW9uSGFuZGxlciBjYXRjaEFzc2VydGlv bkhhbmRsZXIoIG1hY3JvTmFtZSMjX2NhdGNoX3NyLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywg Q0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKF9fVkFfQVJHU19fKSAiLCAiIENBVENIX0lOVEVSTkFM X1NUUklOR0lGWShtYXRjaGVyKSwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAotICAgICAgICBpZigg Y2F0Y2hBc3NlcnRpb25IYW5kbGVyLmFsbG93VGhyb3dzKCkgKSBcCi0gICAgICAgICAgICB0cnkg eyBcCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oX19WQV9BUkdTX18pOyBcCi0g ICAgICAgICAgICAgICAgY2F0Y2hBc3NlcnRpb25IYW5kbGVyLmhhbmRsZVVuZXhwZWN0ZWRFeGNl cHRpb25Ob3RUaHJvd24oKTsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICBjYXRjaCgg Li4uICkgeyBcCi0gICAgICAgICAgICAgICAgQ2F0Y2g6OmhhbmRsZUV4Y2VwdGlvbk1hdGNoRXhw ciggY2F0Y2hBc3NlcnRpb25IYW5kbGVyLCBtYXRjaGVyLCAjbWF0Y2hlciMjX2NhdGNoX3NyICk7 IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICBlbHNlIFwKLSAgICAgICAgICAgIGNhdGNoQXNz ZXJ0aW9uSGFuZGxlci5oYW5kbGVUaHJvd2luZ0NhbGxTa2lwcGVkKCk7IFwKLSAgICAgICAgSU5U RVJOQUxfQ0FUQ0hfUkVBQ1QoIGNhdGNoQXNzZXJ0aW9uSGFuZGxlciApIFwKLSAgICB9IHdoaWxl KCBmYWxzZSApCi0KLSNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRElTQUJMRQotCi0vLyBlbmQgY2F0 Y2hfY2FwdHVyZS5ocHAKLS8vIHN0YXJ0IGNhdGNoX3NlY3Rpb24uaAotCi0vLyBzdGFydCBjYXRj aF9zZWN0aW9uX2luZm8uaAotCi0vLyBzdGFydCBjYXRjaF90b3RhbHMuaAotCi0jaW5jbHVkZSA8 Y3N0ZGRlZj4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBDb3VudHMgewotICAg ICAgICBDb3VudHMgb3BlcmF0b3IgLSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSBjb25zdDsKLSAg ICAgICAgQ291bnRzJiBvcGVyYXRvciArPSAoIENvdW50cyBjb25zdCYgb3RoZXIgKTsKLQotICAg ICAgICBzdGQ6OnNpemVfdCB0b3RhbCgpIGNvbnN0OwotICAgICAgICBib29sIGFsbFBhc3NlZCgp IGNvbnN0OwotICAgICAgICBib29sIGFsbE9rKCkgY29uc3Q7Ci0KLSAgICAgICAgc3RkOjpzaXpl X3QgcGFzc2VkID0gMDsKLSAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkID0gMDsKLSAgICAgICAg c3RkOjpzaXplX3QgZmFpbGVkQnV0T2sgPSAwOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVG90YWxz IHsKLQotICAgICAgICBUb3RhbHMgb3BlcmF0b3IgLSAoIFRvdGFscyBjb25zdCYgb3RoZXIgKSBj b25zdDsKLSAgICAgICAgVG90YWxzJiBvcGVyYXRvciArPSAoIFRvdGFscyBjb25zdCYgb3RoZXIg KTsKLQotICAgICAgICBUb3RhbHMgZGVsdGEoIFRvdGFscyBjb25zdCYgcHJldlRvdGFscyApIGNv bnN0OwotCi0gICAgICAgIGludCBlcnJvciA9IDA7Ci0gICAgICAgIENvdW50cyBhc3NlcnRpb25z OwotICAgICAgICBDb3VudHMgdGVzdENhc2VzOwotICAgIH07Ci19Ci0KLS8vIGVuZCBjYXRjaF90 b3RhbHMuaAotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0 cnVjdCBTZWN0aW9uSW5mbyB7Ci0gICAgICAgIFNlY3Rpb25JbmZvCi0gICAgICAgICAgICAoICAg U291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKLSAgICAgICAgICAgICAgICBzdGQ6OnN0 cmluZyBjb25zdCYgX25hbWUgKTsKLQotICAgICAgICAvLyBEZXByZWNhdGVkCi0gICAgICAgIFNl Y3Rpb25JbmZvCi0gICAgICAgICAgICAoICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5m bywKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCi0gICAgICAgICAg ICAgICAgc3RkOjpzdHJpbmcgY29uc3QmICkgOiBTZWN0aW9uSW5mbyggX2xpbmVJbmZvLCBfbmFt ZSApIHt9Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgc3RkOjpzdHJpbmcg ZGVzY3JpcHRpb247IC8vICFEZXByZWNhdGVkOiB0aGlzIHdpbGwgYWx3YXlzIGJlIGVtcHR5Ci0g ICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2Vj dGlvbkVuZEluZm8gewotICAgICAgICBTZWN0aW9uSW5mbyBzZWN0aW9uSW5mbzsKLSAgICAgICAg Q291bnRzIHByZXZBc3NlcnRpb25zOwotICAgICAgICBkb3VibGUgZHVyYXRpb25JblNlY29uZHM7 Ci0gICAgfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9zZWN0 aW9uX2luZm8uaAotLy8gc3RhcnQgY2F0Y2hfdGltZXIuaAotCi0jaW5jbHVkZSA8Y3N0ZGludD4K LQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIGF1dG8gZ2V0Q3VycmVudE5hbm9zZWNvbmRzU2lu Y2VFcG9jaCgpIC0+IHVpbnQ2NF90OwotICAgIGF1dG8gZ2V0RXN0aW1hdGVkQ2xvY2tSZXNvbHV0 aW9uKCkgLT4gdWludDY0X3Q7Ci0KLSAgICBjbGFzcyBUaW1lciB7Ci0gICAgICAgIHVpbnQ2NF90 IG1fbmFub3NlY29uZHMgPSAwOwotICAgIHB1YmxpYzoKLSAgICAgICAgdm9pZCBzdGFydCgpOwot ICAgICAgICBhdXRvIGdldEVsYXBzZWROYW5vc2Vjb25kcygpIGNvbnN0IC0+IHVpbnQ2NF90Owot ICAgICAgICBhdXRvIGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdCAtPiB1aW50NjRfdDsK LSAgICAgICAgYXV0byBnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3QgLT4gdW5zaWduZWQg aW50OwotICAgICAgICBhdXRvIGdldEVsYXBzZWRTZWNvbmRzKCkgY29uc3QgLT4gZG91YmxlOwot ICAgIH07Ci0KLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF90aW1lci5oCi0j aW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgY2xhc3MgU2VjdGlv biA6IE5vbkNvcHlhYmxlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNlY3Rpb24oIFNlY3Rpb25J bmZvIGNvbnN0JiBpbmZvICk7Ci0gICAgICAgIH5TZWN0aW9uKCk7Ci0KLSAgICAgICAgLy8gVGhp cyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90 Ci0gICAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdDsKLQotICAgIHByaXZhdGU6 Ci0gICAgICAgIFNlY3Rpb25JbmZvIG1faW5mbzsKLQotICAgICAgICBzdGQ6OnN0cmluZyBtX25h bWU7Ci0gICAgICAgIENvdW50cyBtX2Fzc2VydGlvbnM7Ci0gICAgICAgIGJvb2wgbV9zZWN0aW9u SW5jbHVkZWQ7Ci0gICAgICAgIFRpbWVyIG1fdGltZXI7Ci0gICAgfTsKLQotfSAvLyBlbmQgbmFt ZXNwYWNlIENhdGNoCi0KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggLi4uICkgXAot ICAgIENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKLSAgICBDQVRD SF9JTlRFUk5BTF9TVVBQUkVTU19VTlVTRURfV0FSTklOR1MgXAotICAgIGlmKCBDYXRjaDo6U2Vj dGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1Nl Y3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIF9f VkFfQVJHU19fICkgKSBcCi0gICAgQ0FUQ0hfSU5URVJOQUxfU1RPUF9XQVJOSU5HU19TVVBQUkVT U0lPTgotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0RZTkFNSUNfU0VDVElPTiggLi4uICkgXAot ICAgIENBVENIX0lOVEVSTkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKLSAgICBDQVRD SF9JTlRFUk5BTF9TVVBQUkVTU19VTlVTRURfV0FSTklOR1MgXAotICAgIGlmKCBDYXRjaDo6U2Vj dGlvbiBjb25zdCYgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX1Nl Y3Rpb24gKSA9IENhdGNoOjpTZWN0aW9uSW5mbyggQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIChD YXRjaDo6UmV1c2FibGVTdHJpbmdTdHJlYW0oKSA8PCBfX1ZBX0FSR1NfXykuc3RyKCkgKSApIFwK LSAgICBDQVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OCi0KLS8vIGVuZCBj YXRjaF9zZWN0aW9uLmgKLS8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfZXhjZXB0aW9uLmgKLQot Ly8gc3RhcnQgY2F0Y2hfaW50ZXJmYWNlc19yZWdpc3RyeV9odWIuaAotCi0jaW5jbHVkZSA8c3Ry aW5nPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIGNsYXNz IFRlc3RDYXNlOwotICAgIHN0cnVjdCBJVGVzdENhc2VSZWdpc3RyeTsKLSAgICBzdHJ1Y3QgSUV4 Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKLSAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0 b3I7Ci0gICAgc3RydWN0IElSZXBvcnRlclJlZ2lzdHJ5OwotICAgIHN0cnVjdCBJUmVwb3J0ZXJG YWN0b3J5OwotICAgIHN0cnVjdCBJVGFnQWxpYXNSZWdpc3RyeTsKLSAgICBzdHJ1Y3QgSU11dGFi bGVFbnVtVmFsdWVzUmVnaXN0cnk7Ci0KLSAgICBjbGFzcyBTdGFydHVwRXhjZXB0aW9uUmVnaXN0 cnk7Ci0KLSAgICB1c2luZyBJUmVwb3J0ZXJGYWN0b3J5UHRyID0gc3RkOjpzaGFyZWRfcHRyPElS ZXBvcnRlckZhY3Rvcnk+OwotCi0gICAgc3RydWN0IElSZWdpc3RyeUh1YiB7Ci0gICAgICAgIHZp cnR1YWwgfklSZWdpc3RyeUh1YigpOwotCi0gICAgICAgIHZpcnR1YWwgSVJlcG9ydGVyUmVnaXN0 cnkgY29uc3QmIGdldFJlcG9ydGVyUmVnaXN0cnkoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1 YWwgSVRlc3RDYXNlUmVnaXN0cnkgY29uc3QmIGdldFRlc3RDYXNlUmVnaXN0cnkoKSBjb25zdCA9 IDA7Ci0gICAgICAgIHZpcnR1YWwgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFz UmVnaXN0cnkoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0 b3JSZWdpc3RyeSBjb25zdCYgZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgY29uc3Qg PSAwOwotCi0gICAgICAgIHZpcnR1YWwgU3RhcnR1cEV4Y2VwdGlvblJlZ2lzdHJ5IGNvbnN0JiBn ZXRTdGFydHVwRXhjZXB0aW9uUmVnaXN0cnkoKSBjb25zdCA9IDA7Ci0gICAgfTsKLQotICAgIHN0 cnVjdCBJTXV0YWJsZVJlZ2lzdHJ5SHViIHsKLSAgICAgICAgdmlydHVhbCB+SU11dGFibGVSZWdp c3RyeUh1YigpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpz dHJpbmcgY29uc3QmIG5hbWUsIElSZXBvcnRlckZhY3RvcnlQdHIgY29uc3QmIGZhY3RvcnkgKSA9 IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBJUmVwb3J0ZXJGYWN0 b3J5UHRyIGNvbnN0JiBmYWN0b3J5ICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0 ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwg dm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFu c2xhdG9yICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3Rk OjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5l SW5mbyBjb25zdCYgbGluZUluZm8gKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3Rl clN0YXJ0dXBFeGNlcHRpb24oKSBub2V4Y2VwdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgSU11dGFi bGVFbnVtVmFsdWVzUmVnaXN0cnkmIGdldE11dGFibGVFbnVtVmFsdWVzUmVnaXN0cnkoKSA9IDA7 Ci0gICAgfTsKLQotICAgIElSZWdpc3RyeUh1YiBjb25zdCYgZ2V0UmVnaXN0cnlIdWIoKTsKLSAg ICBJTXV0YWJsZVJlZ2lzdHJ5SHViJiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKTsKLSAgICB2b2lk IGNsZWFuVXAoKTsKLSAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsK LQotfQotCi0vLyBlbmQgY2F0Y2hfaW50ZXJmYWNlc19yZWdpc3RyeV9odWIuaAotI2lmIGRlZmlu ZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEUpCi0gICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFO U0xBVEVfRVhDRVBUSU9OX05PX1JFRyggdHJhbnNsYXRvck5hbWUsIHNpZ25hdHVyZSkgXAotICAg ICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApCi0jZW5k aWYKLQotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8 dmVjdG9yPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIHVzaW5nIGV4Y2VwdGlvblRyYW5zbGF0 ZUZ1bmN0aW9uID0gc3RkOjpzdHJpbmcoKikoKTsKLQotICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJh bnNsYXRvcjsKLSAgICB1c2luZyBFeGNlcHRpb25UcmFuc2xhdG9ycyA9IHN0ZDo6dmVjdG9yPHN0 ZDo6dW5pcXVlX3B0cjxJRXhjZXB0aW9uVHJhbnNsYXRvciBjb25zdD4+OwotCi0gICAgc3RydWN0 IElFeGNlcHRpb25UcmFuc2xhdG9yIHsKLSAgICAgICAgdmlydHVhbCB+SUV4Y2VwdGlvblRyYW5z bGF0b3IoKTsKLSAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlv blRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNv bnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgPSAwOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgSUV4 Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSB7Ci0gICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25U cmFuc2xhdG9yUmVnaXN0cnkoKTsKLQotICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5z bGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0ID0gMDsKLSAgICB9OwotCi0gICAgY2xhc3MgRXhj ZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciB7Ci0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ Ci0gICAgICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3IgOiBwdWJsaWMgSUV4Y2VwdGlvblRy YW5zbGF0b3IgewotICAgICAgICBwdWJsaWM6Ci0KLSAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5z bGF0b3IoIHN0ZDo6c3RyaW5nKCp0cmFuc2xhdGVGdW5jdGlvbikoIFQmICkgKQotICAgICAgICAg ICAgOiBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCB0cmFuc2xhdGVGdW5jdGlvbiApCi0gICAgICAgICAg ICB7fQotCi0gICAgICAgICAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5z bGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0 ZXJhdG9yIGl0RW5kICkgY29uc3Qgb3ZlcnJpZGUgewotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklH X0RJU0FCTEVfRVhDRVBUSU9OUykKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0jZWxzZQot ICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVu ZCApCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJldGhyb3dfZXhjZXB0aW9uKHN0ZDo6 Y3VycmVudF9leGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAg ICAgICAgICAgICAgICAgIHJldHVybiAoKml0KS0+dHJhbnNsYXRlKCBpdCsxLCBpdEVuZCApOwot ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggVCYgZXggKSB7Ci0gICAg ICAgICAgICAgICAgICAgIHJldHVybiBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCBleCApOwotICAgICAg ICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZDoK LSAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCptX3RyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKTsKLSAg ICAgICAgfTsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAg ICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0 ZUZ1bmN0aW9uKSggVCYgKSApIHsKLSAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1Yigp LnJlZ2lzdGVyVHJhbnNsYXRvcgotICAgICAgICAgICAgICAgICggbmV3IEV4Y2VwdGlvblRyYW5z bGF0b3I8VD4oIHRyYW5zbGF0ZUZ1bmN0aW9uICkgKTsKLSAgICAgICAgfQotICAgIH07Ci19Ci0K LS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRF X0VYQ0VQVElPTjIoIHRyYW5zbGF0b3JOYW1lLCBzaWduYXR1cmUgKSBcCi0gICAgc3RhdGljIHN0 ZDo6c3RyaW5nIHRyYW5zbGF0b3JOYW1lKCBzaWduYXR1cmUgKTsgXAotICAgIENBVENIX0lOVEVS TkFMX1NUQVJUX1dBUk5JTkdTX1NVUFBSRVNTSU9OIFwKLSAgICBDQVRDSF9JTlRFUk5BTF9TVVBQ UkVTU19HTE9CQUxTX1dBUk5JTkdTIFwKLSAgICBuYW1lc3BhY2V7IENhdGNoOjpFeGNlcHRpb25U cmFuc2xhdG9yUmVnaXN0cmFyIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRl cm5hbF9FeGNlcHRpb25SZWdpc3RyYXIgKSggJnRyYW5zbGF0b3JOYW1lICk7IH0gXAotICAgIENB VENIX0lOVEVSTkFMX1NUT1BfV0FSTklOR1NfU1VQUFJFU1NJT04gXAotICAgIHN0YXRpYyBzdGQ6 OnN0cmluZyB0cmFuc2xhdG9yTmFtZSggc2lnbmF0dXJlICkKLQotI2RlZmluZSBJTlRFUk5BTF9D QVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFO U0xBVEVfRVhDRVBUSU9OMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVy bmFsX0V4Y2VwdGlvblRyYW5zbGF0b3IgKSwgc2lnbmF0dXJlICkKLQotLy8gZW5kIGNhdGNoX2lu dGVyZmFjZXNfZXhjZXB0aW9uLmgKLS8vIHN0YXJ0IGNhdGNoX2FwcHJveC5oCi0KLSNpbmNsdWRl IDx0eXBlX3RyYWl0cz4KLQotbmFtZXNwYWNlIENhdGNoIHsKLW5hbWVzcGFjZSBEZXRhaWwgewot Ci0gICAgY2xhc3MgQXBwcm94IHsKLSAgICBwcml2YXRlOgotICAgICAgICBib29sIGVxdWFsaXR5 Q29tcGFyaXNvbkltcGwoZG91YmxlIG90aGVyKSBjb25zdDsKLSAgICAgICAgLy8gVmFsaWRhdGVz IHRoZSBuZXcgbWFyZ2luIChtYXJnaW4gPj0gMCkKLSAgICAgICAgLy8gb3V0LW9mLWxpbmUgdG8g YXZvaWQgaW5jbHVkaW5nIHN0ZGV4Y2VwdCBpbiB0aGUgaGVhZGVyCi0gICAgICAgIHZvaWQgc2V0 TWFyZ2luKGRvdWJsZSBtYXJnaW4pOwotICAgICAgICAvLyBWYWxpZGF0ZXMgdGhlIG5ldyBlcHNp bG9uICgwIDwgZXBzaWxvbiA8IDEpCi0gICAgICAgIC8vIG91dC1vZi1saW5lIHRvIGF2b2lkIGlu Y2x1ZGluZyBzdGRleGNlcHQgaW4gdGhlIGhlYWRlcgotICAgICAgICB2b2lkIHNldEVwc2lsb24o ZG91YmxlIGVwc2lsb24pOwotCi0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBBcHByb3gg KCBkb3VibGUgdmFsdWUgKTsKLQotICAgICAgICBzdGF0aWMgQXBwcm94IGN1c3RvbSgpOwotCi0g ICAgICAgIEFwcHJveCBvcGVyYXRvci0oKSBjb25zdDsKLQotICAgICAgICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0 cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgotICAgICAgICBBcHByb3ggb3BlcmF0 b3IoKSggVCBjb25zdCYgdmFsdWUgKSBjb25zdCB7Ci0gICAgICAgICAgICBBcHByb3ggYXBwcm94 KCBzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSApOwotICAgICAgICAgICAgYXBwcm94Lm1fZXBz aWxvbiA9IG1fZXBzaWxvbjsKLSAgICAgICAgICAgIGFwcHJveC5tX21hcmdpbiA9IG1fbWFyZ2lu OwotICAgICAgICAgICAgYXBwcm94Lm1fc2NhbGUgPSBtX3NjYWxlOwotICAgICAgICAgICAgcmV0 dXJuIGFwcHJveDsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0 eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxk b3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+Ci0gICAgICAgIGV4cGxpY2l0IEFwcHJveCggVCBjb25z dCYgdmFsdWUgKTogQXBwcm94KHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpKQotICAgICAgICB7 fQotCi0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0 ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5 cGU+Ci0gICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggY29uc3QgVCYgbGhzLCBBcHBy b3ggY29uc3QmIHJocyApIHsKLSAgICAgICAgICAgIGF1dG8gbGhzX3YgPSBzdGF0aWNfY2FzdDxk b3VibGU+KGxocyk7Ci0gICAgICAgICAgICByZXR1cm4gcmhzLmVxdWFsaXR5Q29tcGFyaXNvbklt cGwobGhzX3YpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5 cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRv dWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KLSAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPT0g KCBBcHByb3ggY29uc3QmIGxocywgY29uc3QgVCYgcmhzICkgewotICAgICAgICAgICAgcmV0dXJu IG9wZXJhdG9yPT0oIHJocywgbGhzICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZSA8 dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Nv bnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgotICAgICAgICBmcmllbmQgYm9v bCBvcGVyYXRvciAhPSAoIFQgY29uc3QmIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7Ci0gICAg ICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIGxocywgcmhzICk7Ci0gICAgICAgIH0KLQotICAg ICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJs ZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgotICAg ICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIGNvbnN0 JiByaHMgKSB7Ci0gICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7Ci0g ICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBl bmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFs dWU+Ojp0eXBlPgotICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIFQgY29uc3QmIGxo cywgQXBwcm94IGNvbnN0JiByaHMgKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8 ZG91YmxlPihsaHMpIDwgcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKLSAgICAgICAgfQotCi0g ICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5h YmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+Ci0g ICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgY29u c3QmIHJocyApIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA8IHN0YXRpY19jYXN0 PGRvdWJsZT4ocmhzKSB8fCBsaHMgPT0gcmhzOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcGxh dGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpp c19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KLSAgICAgICAgZnJpZW5k IGJvb2wgb3BlcmF0b3IgPj0gKCBUIGNvbnN0JiBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgewot ICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obGhzKSA+IHJocy5tX3ZhbHVl IHx8IGxocyA9PSByaHM7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUg VCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGli bGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgotICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRv ciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIGNvbnN0JiByaHMgKSB7Ci0gICAgICAgICAgICBy ZXR1cm4gbGhzLm1fdmFsdWUgPiBzdGF0aWNfY2FzdDxkb3VibGU+KHJocykgfHwgbGhzID09IHJo czsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9 IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+ Ojp2YWx1ZT46OnR5cGU+Ci0gICAgICAgIEFwcHJveCYgZXBzaWxvbiggVCBjb25zdCYgbmV3RXBz aWxvbiApIHsKLSAgICAgICAgICAgIGRvdWJsZSBlcHNpbG9uQXNEb3VibGUgPSBzdGF0aWNfY2Fz dDxkb3VibGU+KG5ld0Vwc2lsb24pOwotICAgICAgICAgICAgc2V0RXBzaWxvbihlcHNpbG9uQXNE b3VibGUpOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAg dGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8 c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KLSAgICAgICAg QXBwcm94JiBtYXJnaW4oIFQgY29uc3QmIG5ld01hcmdpbiApIHsKLSAgICAgICAgICAgIGRvdWJs ZSBtYXJnaW5Bc0RvdWJsZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obmV3TWFyZ2luKTsKLSAgICAg ICAgICAgIHNldE1hcmdpbihtYXJnaW5Bc0RvdWJsZSk7Ci0gICAgICAgICAgICByZXR1cm4gKnRo aXM7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUg PSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBU Pjo6dmFsdWU+Ojp0eXBlPgotICAgICAgICBBcHByb3gmIHNjYWxlKCBUIGNvbnN0JiBuZXdTY2Fs ZSApIHsKLSAgICAgICAgICAgIG1fc2NhbGUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG5ld1NjYWxl KTsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIHN0ZDo6 c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBkb3VibGUg bV9lcHNpbG9uOwotICAgICAgICBkb3VibGUgbV9tYXJnaW47Ci0gICAgICAgIGRvdWJsZSBtX3Nj YWxlOwotICAgICAgICBkb3VibGUgbV92YWx1ZTsKLSAgICB9OwotfSAvLyBlbmQgbmFtZXNwYWNl IERldGFpbAotCi1uYW1lc3BhY2UgbGl0ZXJhbHMgewotICAgIERldGFpbDo6QXBwcm94IG9wZXJh dG9yICIiIF9hKGxvbmcgZG91YmxlIHZhbCk7Ci0gICAgRGV0YWlsOjpBcHByb3ggb3BlcmF0b3Ig IiIgX2EodW5zaWduZWQgbG9uZyBsb25nIHZhbCk7Ci19IC8vIGVuZCBuYW1lc3BhY2UgbGl0ZXJh bHMKLQotdGVtcGxhdGU8Pgotc3RydWN0IFN0cmluZ01ha2VyPENhdGNoOjpEZXRhaWw6OkFwcHJv eD4gewotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KENhdGNoOjpEZXRhaWw6OkFwcHJv eCBjb25zdCYgdmFsdWUpOwotfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVu ZCBjYXRjaF9hcHByb3guaAotLy8gc3RhcnQgY2F0Y2hfc3RyaW5nX21hbmlwLmgKLQotI2luY2x1 ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3Nmd2Q+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1l c3BhY2UgQ2F0Y2ggewotCi0gICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYg cywgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApOwotICAgIGJvb2wgc3RhcnRzV2l0aCggc3Rk OjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICk7Ci0gICAgYm9vbCBlbmRzV2l0aCggc3Rk OjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKTsKLSAgICBib29s IGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBzdWZmaXggKTsKLSAgICBib29s IGNvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIGluZml4 ICk7Ci0gICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKTsKLSAgICBzdGQ6 OnN0cmluZyB0b0xvd2VyKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApOwotICAgIC8vISBSZXR1cm5z IGEgbmV3IHN0cmluZyB3aXRob3V0IHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0L2VuZAotICAgIHN0 ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKTsKLSAgICAvLyEgUmV0dXJu cyBhIHN1YnN0cmluZyBvZiB0aGUgb3JpZ2luYWwgcmVmIHdpdGhvdXQgd2hpdGVzcGFjZS4gQmV3 YXJlIGxpZmV0aW1lcyEKLSAgICBTdHJpbmdSZWYgdHJpbShTdHJpbmdSZWYgcmVmKTsKLQotICAg IC8vICEhISBCZSBhd2FyZSwgcmV0dXJucyByZWZzIGludG8gb3JpZ2luYWwgc3RyaW5nIC0gbWFr ZSBzdXJlIG9yaWdpbmFsIHN0cmluZyBvdXRsaXZlcyB0aGVtCi0gICAgc3RkOjp2ZWN0b3I8U3Ry aW5nUmVmPiBzcGxpdFN0cmluZ1JlZiggU3RyaW5nUmVmIHN0ciwgY2hhciBkZWxpbWl0ZXIgKTsK LSAgICBib29sIHJlcGxhY2VJblBsYWNlKCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZyBj b25zdCYgcmVwbGFjZVRoaXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB3aXRoVGhpcyApOwotCi0gICAg c3RydWN0IHBsdXJhbGlzZSB7Ci0gICAgICAgIHBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQs IHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCApOwotCi0gICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJl YW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVy YWxpc2VyICk7Ci0KLSAgICAgICAgc3RkOjpzaXplX3QgbV9jb3VudDsKLSAgICAgICAgc3RkOjpz dHJpbmcgbV9sYWJlbDsKLSAgICB9OwotfQotCi0vLyBlbmQgY2F0Y2hfc3RyaW5nX21hbmlwLmgK LSNpZm5kZWYgQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMKLS8vIHN0YXJ0IGNhdGNoX2Nh cHR1cmVfbWF0Y2hlcnMuaAotCi0vLyBzdGFydCBjYXRjaF9tYXRjaGVycy5oCi0KLSNpbmNsdWRl IDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotbmFtZXNw YWNlIE1hdGNoZXJzIHsKLSAgICBuYW1lc3BhY2UgSW1wbCB7Ci0KLSAgICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoQWxsT2Y7Ci0gICAgICAgIHRlbXBsYXRlPHR5cGVu YW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFueU9mOwotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBB cmdUPiBzdHJ1Y3QgTWF0Y2hOb3RPZjsKLQotICAgICAgICBjbGFzcyBNYXRjaGVyVW50eXBlZEJh c2UgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBNYXRjaGVyVW50eXBlZEJhc2UoKSA9 IGRlZmF1bHQ7Ci0gICAgICAgICAgICBNYXRjaGVyVW50eXBlZEJhc2UgKCBNYXRjaGVyVW50eXBl ZEJhc2UgY29uc3QmICkgPSBkZWZhdWx0OwotICAgICAgICAgICAgTWF0Y2hlclVudHlwZWRCYXNl JiBvcGVyYXRvciA9ICggTWF0Y2hlclVudHlwZWRCYXNlIGNvbnN0JiApID0gZGVsZXRlOwotICAg ICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKLQotICAgICAgICBwcm90ZWN0 ZWQ6Ci0gICAgICAgICAgICB2aXJ0dWFsIH5NYXRjaGVyVW50eXBlZEJhc2UoKTsKLSAgICAgICAg ICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCA9IDA7Ci0gICAgICAgICAg ICBtdXRhYmxlIHN0ZDo6c3RyaW5nIG1fY2FjaGVkVG9TdHJpbmc7Ci0gICAgICAgIH07Ci0KLSNp ZmRlZiBfX2NsYW5nX18KLSMgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotIyAgICBw cmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV25vbi12aXJ0dWFsLWR0b3IiCi0jZW5k aWYKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RUPgotICAgICAgICBzdHJ1Y3Qg TWF0Y2hlck1ldGhvZCB7Ci0gICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE9iamVjdFQg Y29uc3QmIGFyZyApIGNvbnN0ID0gMDsKLSAgICAgICAgfTsKLQotI2lmIGRlZmluZWQoX19PQkpD X18pCi0gICAgICAgIC8vIEhhY2sgdG8gZml4IENhdGNoIEdIIGlzc3VlICMxNjYxLiBDb3VsZCB1 c2UgaWQgZm9yIGdlbmVyaWMgT2JqZWN0IHN1cHBvcnQuCi0gICAgICAgIC8vIHVzZSBvZiBjb25z dCBmb3IgT2JqZWN0IHBvaW50ZXJzIGlzIHZlcnkgdW5jb21tb24gYW5kIHVuZGVyIEFSQyBpdCBj YXVzZXMgc29tZSBraW5kIG9mIHNpZ25hdHVyZSBtaXNtYXRjaCB0aGF0IGJyZWFrcyBjb21waWxh dGlvbgotICAgICAgICB0ZW1wbGF0ZTw+Ci0gICAgICAgIHN0cnVjdCBNYXRjaGVyTWV0aG9kPE5T U3RyaW5nKj4gewotICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogYXJn ICkgY29uc3QgPSAwOwotICAgICAgICB9OwotI2VuZGlmCi0KLSNpZmRlZiBfX2NsYW5nX18KLSMg ICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotICAgICAgICB0ZW1wbGF0 ZTx0eXBlbmFtZSBUPgotICAgICAgICBzdHJ1Y3QgTWF0Y2hlckJhc2UgOiBNYXRjaGVyVW50eXBl ZEJhc2UsIE1hdGNoZXJNZXRob2Q8VD4gewotCi0gICAgICAgICAgICBNYXRjaEFsbE9mPFQ+IG9w ZXJhdG9yICYmICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7Ci0gICAgICAgICAg ICBNYXRjaEFueU9mPFQ+IG9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkg Y29uc3Q7Ci0gICAgICAgICAgICBNYXRjaE5vdE9mPFQ+IG9wZXJhdG9yICEgKCkgY29uc3Q7Ci0g ICAgICAgIH07Ci0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KLSAgICAgICAgc3Ry dWN0IE1hdGNoQWxsT2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7Ci0gICAgICAgICAgICBib29sIG1h dGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAg Zm9yKCBhdXRvIG1hdGNoZXIgOiBtX21hdGNoZXJzICkgewotICAgICAgICAgICAgICAgICAgICBp ZiAoIW1hdGNoZXItPm1hdGNoKGFyZykpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwot ICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBv dmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247Ci0gICAg ICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMy ICk7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiggIjsKLSAgICAgICAgICAgICAg ICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IoIGF1dG8gbWF0Y2hlciA6 IG1fbWF0Y2hlcnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmaXJzdCApCi0gICAgICAg ICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBlbHNl Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiIGFuZCAiOwotICAgICAg ICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtYXRjaGVyLT50b1N0cmluZygpOwotICAgICAg ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOwotICAgICAg ICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg ICAgTWF0Y2hBbGxPZjxBcmdUPiBvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0 JiBvdGhlciApIHsKLSAgICAgICAgICAgICAgICBhdXRvIGNvcHkoKnRoaXMpOwotICAgICAgICAg ICAgICAgIGNvcHkubV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOwotICAgICAgICAgICAg ICAgIHJldHVybiBjb3B5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGQ6OnZlY3Rv cjxNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCo+IG1fbWF0Y2hlcnM7Ci0gICAgICAgIH07Ci0gICAg ICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+Ci0gICAgICAgIHN0cnVjdCBNYXRjaEFueU9mIDog TWF0Y2hlckJhc2U8QXJnVD4gewotCi0gICAgICAgICAgICBib29sIG1hdGNoKCBBcmdUIGNvbnN0 JiBhcmcgKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgZm9yKCBhdXRvIG1hdGNo ZXIgOiBtX21hdGNoZXJzICkgewotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci0+bWF0 Y2goYXJnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAg ICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0g ICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAg ICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICAgICAgICAgICAgICBkZXNj cmlwdGlvbi5yZXNlcnZlKCA0ICsgbV9tYXRjaGVycy5zaXplKCkqMzIgKTsKLSAgICAgICAgICAg ICAgICBkZXNjcmlwdGlvbiArPSAiKCAiOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0 cnVlOwotICAgICAgICAgICAgICAgIGZvciggYXV0byBtYXRjaGVyIDogbV9tYXRjaGVycyApIHsK LSAgICAgICAgICAgICAgICAgICAgaWYoIGZpcnN0ICkKLSAgICAgICAgICAgICAgICAgICAgICAg IGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg ICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgb3IgIjsKLSAgICAgICAgICAgICAgICAgICAgZGVz Y3JpcHRpb24gKz0gbWF0Y2hlci0+dG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg ICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiApIjsKLSAgICAgICAgICAgICAgICByZXR1cm4g ZGVzY3JpcHRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hdGNoQW55T2Y8QXJn VD4gb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7Ci0gICAg ICAgICAgICAgICAgYXV0byBjb3B5KCp0aGlzKTsKLSAgICAgICAgICAgICAgICBjb3B5Lm1fbWF0 Y2hlcnMucHVzaF9iYWNrKCAmb3RoZXIgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29weTsK LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJn VD4gY29uc3QqPiBtX21hdGNoZXJzOwotICAgICAgICB9OwotCi0gICAgICAgIHRlbXBsYXRlPHR5 cGVuYW1lIEFyZ1Q+Ci0gICAgICAgIHN0cnVjdCBNYXRjaE5vdE9mIDogTWF0Y2hlckJhc2U8QXJn VD4gewotCi0gICAgICAgICAgICBNYXRjaE5vdE9mKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYg dW5kZXJseWluZ01hdGNoZXIgKSA6IG1fdW5kZXJseWluZ01hdGNoZXIoIHVuZGVybHlpbmdNYXRj aGVyICkge30KLQotICAgICAgICAgICAgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29u c3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIHJldHVybiAhbV91bmRlcmx5aW5nTWF0Y2hl ci5tYXRjaCggYXJnICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0ZDo6c3RyaW5n IGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIHJldHVybiAibm90 ICIgKyBtX3VuZGVybHlpbmdNYXRjaGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAg ICAgICAgICBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgbV91bmRlcmx5aW5nTWF0Y2hlcjsKLSAg ICAgICAgfTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBNYXRjaEFs bE9mPFQ+IE1hdGNoZXJCYXNlPFQ+OjpvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBv dGhlciApIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBNYXRjaEFsbE9mPFQ+KCkgJiYgKnRo aXMgJiYgb3RoZXI7Ci0gICAgICAgIH0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAg ICAgICAgTWF0Y2hBbnlPZjxUPiBNYXRjaGVyQmFzZTxUPjo6b3BlcmF0b3IgfHwgKCBNYXRjaGVy QmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gTWF0Y2hBbnlP ZjxUPigpIHx8ICp0aGlzIHx8IG90aGVyOwotICAgICAgICB9Ci0gICAgICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFQ+Ci0gICAgICAgIE1hdGNoTm90T2Y8VD4gTWF0Y2hlckJhc2U8VD46Om9wZXJhdG9y ICEgKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIE1hdGNoTm90T2Y8VD4oICp0aGlzICk7 Ci0gICAgICAgIH0KLQotICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKLQotfSAvLyBuYW1lc3BhY2Ug TWF0Y2hlcnMKLQotdXNpbmcgbmFtZXNwYWNlIE1hdGNoZXJzOwotdXNpbmcgTWF0Y2hlcnM6Oklt cGw6Ok1hdGNoZXJCYXNlOwotCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hf bWF0Y2hlcnMuaAotLy8gc3RhcnQgY2F0Y2hfbWF0Y2hlcnNfZXhjZXB0aW9uLmhwcAotCi1uYW1l c3BhY2UgQ2F0Y2ggewotbmFtZXNwYWNlIE1hdGNoZXJzIHsKLW5hbWVzcGFjZSBFeGNlcHRpb24g ewotCi1jbGFzcyBFeGNlcHRpb25NZXNzYWdlTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVyQmFzZTxz dGQ6OmV4Y2VwdGlvbj4gewotICAgIHN0ZDo6c3RyaW5nIG1fbWVzc2FnZTsKLXB1YmxpYzoKLQot ICAgIEV4Y2VwdGlvbk1lc3NhZ2VNYXRjaGVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlKToK LSAgICAgICAgbV9tZXNzYWdlKG1lc3NhZ2UpCi0gICAge30KLQotICAgIGJvb2wgbWF0Y2goc3Rk OjpleGNlcHRpb24gY29uc3QmIGV4KSBjb25zdCBvdmVycmlkZTsKLQotICAgIHN0ZDo6c3RyaW5n IGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBFeGNlcHRp b24KLQotRXhjZXB0aW9uOjpFeGNlcHRpb25NZXNzYWdlTWF0Y2hlciBNZXNzYWdlKHN0ZDo6c3Ry aW5nIGNvbnN0JiBtZXNzYWdlKTsKLQotfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKLX0gLy8gbmFt ZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9tYXRjaGVyc19leGNlcHRpb24uaHBwCi0vLyBz dGFydCBjYXRjaF9tYXRjaGVyc19mbG9hdGluZy5oCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci1uYW1l c3BhY2UgTWF0Y2hlcnMgewotCi0gICAgbmFtZXNwYWNlIEZsb2F0aW5nIHsKLQotICAgICAgICBl bnVtIGNsYXNzIEZsb2F0aW5nUG9pbnRLaW5kIDogdWludDhfdDsKLQotICAgICAgICBzdHJ1Y3Qg V2l0aGluQWJzTWF0Y2hlciA6IE1hdGNoZXJCYXNlPGRvdWJsZT4gewotICAgICAgICAgICAgV2l0 aGluQWJzTWF0Y2hlcihkb3VibGUgdGFyZ2V0LCBkb3VibGUgbWFyZ2luKTsKLSAgICAgICAgICAg IGJvb2wgbWF0Y2goZG91YmxlIGNvbnN0JiBtYXRjaGVlKSBjb25zdCBvdmVycmlkZTsKLSAgICAg ICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgIHBy aXZhdGU6Ci0gICAgICAgICAgICBkb3VibGUgbV90YXJnZXQ7Ci0gICAgICAgICAgICBkb3VibGUg bV9tYXJnaW47Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IFdpdGhpblVscHNNYXRjaGVy IDogTWF0Y2hlckJhc2U8ZG91YmxlPiB7Ci0gICAgICAgICAgICBXaXRoaW5VbHBzTWF0Y2hlcihk b3VibGUgdGFyZ2V0LCB1aW50NjRfdCB1bHBzLCBGbG9hdGluZ1BvaW50S2luZCBiYXNlVHlwZSk7 Ci0gICAgICAgICAgICBib29sIG1hdGNoKGRvdWJsZSBjb25zdCYgbWF0Y2hlZSkgY29uc3Qgb3Zl cnJpZGU7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRl OwotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgZG91YmxlIG1fdGFyZ2V0OwotICAgICAg ICAgICAgdWludDY0X3QgbV91bHBzOwotICAgICAgICAgICAgRmxvYXRpbmdQb2ludEtpbmQgbV90 eXBlOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIEdpdmVuIElFRUUtNzU0IGZvcm1hdCBmb3Ig ZmxvYXRzIGFuZCBkb3VibGVzLCB3ZSBjYW4gYXNzdW1lCi0gICAgICAgIC8vIHRoYXQgZmxvYXQg LT4gZG91YmxlIHByb21vdGlvbiBpcyBsb3NzbGVzcy4gR2l2ZW4gdGhpcywgd2UgY2FuCi0gICAg ICAgIC8vIGFzc3VtZSB0aGF0IGlmIHdlIGRvIHRoZSBzdGFuZGFyZCByZWxhdGl2ZSBjb21wYXJp c29uIG9mCi0gICAgICAgIC8vIHxsaHMgLSByaHN8IDw9IGVwc2lsb24gKiBtYXgoZmFicyhsaHMp LCBmYWJzKHJocykpLCB0aGVuIHdlIGdldAotICAgICAgICAvLyB0aGUgc2FtZSByZXN1bHQgaWYg d2UgZG8gdGhpcyBmb3IgZmxvYXRzLCBhcyBpZiB3ZSBkbyB0aGlzIGZvcgotICAgICAgICAvLyBk b3VibGVzIHRoYXQgd2VyZSBwcm9tb3RlZCBmcm9tIGZsb2F0cy4KLSAgICAgICAgc3RydWN0IFdp dGhpblJlbE1hdGNoZXIgOiBNYXRjaGVyQmFzZTxkb3VibGU+IHsKLSAgICAgICAgICAgIFdpdGhp blJlbE1hdGNoZXIoZG91YmxlIHRhcmdldCwgZG91YmxlIGVwc2lsb24pOwotICAgICAgICAgICAg Ym9vbCBtYXRjaChkb3VibGUgY29uc3QmIG1hdGNoZWUpIGNvbnN0IG92ZXJyaWRlOwotICAgICAg ICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgcHJp dmF0ZToKLSAgICAgICAgICAgIGRvdWJsZSBtX3RhcmdldDsKLSAgICAgICAgICAgIGRvdWJsZSBt X2Vwc2lsb247Ci0gICAgICAgIH07Ci0KLSAgICB9IC8vIG5hbWVzcGFjZSBGbG9hdGluZwotCi0g ICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBv YmplY3RzLgotICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAotICAg IEZsb2F0aW5nOjpXaXRoaW5VbHBzTWF0Y2hlciBXaXRoaW5VTFAoZG91YmxlIHRhcmdldCwgdWlu dDY0X3QgbWF4VWxwRGlmZik7Ci0gICAgRmxvYXRpbmc6OldpdGhpblVscHNNYXRjaGVyIFdpdGhp blVMUChmbG9hdCB0YXJnZXQsIHVpbnQ2NF90IG1heFVscERpZmYpOwotICAgIEZsb2F0aW5nOjpX aXRoaW5BYnNNYXRjaGVyIFdpdGhpbkFicyhkb3VibGUgdGFyZ2V0LCBkb3VibGUgbWFyZ2luKTsK LSAgICBGbG9hdGluZzo6V2l0aGluUmVsTWF0Y2hlciBXaXRoaW5SZWwoZG91YmxlIHRhcmdldCwg ZG91YmxlIGVwcyk7Ci0gICAgLy8gZGVmYXVsdHMgZXBzaWxvbiB0byAxMDAqbnVtZXJpY19saW1p dHM8ZG91YmxlPjo6ZXBzaWxvbigpCi0gICAgRmxvYXRpbmc6OldpdGhpblJlbE1hdGNoZXIgV2l0 aGluUmVsKGRvdWJsZSB0YXJnZXQpOwotICAgIEZsb2F0aW5nOjpXaXRoaW5SZWxNYXRjaGVyIFdp dGhpblJlbChmbG9hdCB0YXJnZXQsIGZsb2F0IGVwcyk7Ci0gICAgLy8gZGVmYXVsdHMgZXBzaWxv biB0byAxMDAqbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkKLSAgICBGbG9hdGluZzo6 V2l0aGluUmVsTWF0Y2hlciBXaXRoaW5SZWwoZmxvYXQgdGFyZ2V0KTsKLQotfSAvLyBuYW1lc3Bh Y2UgTWF0Y2hlcnMKLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9tYXRjaGVy c19mbG9hdGluZy5oCi0vLyBzdGFydCBjYXRjaF9tYXRjaGVyc19nZW5lcmljLmhwcAotCi0jaW5j bHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7 Ci1uYW1lc3BhY2UgTWF0Y2hlcnMgewotbmFtZXNwYWNlIEdlbmVyaWMgewotCi1uYW1lc3BhY2Ug RGV0YWlsIHsKLSAgICBzdGQ6OnN0cmluZyBmaW5hbGl6ZURlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6 c3RyaW5nJiBkZXNjKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBQcmVkaWNh dGVNYXRjaGVyIDogcHVibGljIE1hdGNoZXJCYXNlPFQ+IHsKLSAgICBzdGQ6OmZ1bmN0aW9uPGJv b2woVCBjb25zdCYpPiBtX3ByZWRpY2F0ZTsKLSAgICBzdGQ6OnN0cmluZyBtX2Rlc2NyaXB0aW9u OwotcHVibGljOgotCi0gICAgUHJlZGljYXRlTWF0Y2hlcihzdGQ6OmZ1bmN0aW9uPGJvb2woVCBj b25zdCYpPiBjb25zdCYgZWxlbSwgc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyKQotICAgICAgICA6 bV9wcmVkaWNhdGUoc3RkOjptb3ZlKGVsZW0pKSwKLSAgICAgICAgbV9kZXNjcmlwdGlvbihEZXRh aWw6OmZpbmFsaXplRGVzY3JpcHRpb24oZGVzY3IpKQotICAgIHt9Ci0KLSAgICBib29sIG1hdGNo KCBUIGNvbnN0JiBpdGVtICkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbV9wcmVk aWNhdGUoaXRlbSk7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBv dmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtX2Rlc2NyaXB0aW9uOwotICAgIH0KLX07Ci0KLX0g Ly8gbmFtZXNwYWNlIEdlbmVyaWMKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNy ZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KLSAgICAvLyBUaGUgdXNlciBoYXMgdG8g ZXhwbGljaXRseSBzcGVjaWZ5IHR5cGUgdG8gdGhlIGZ1bmN0aW9uLCBiZWNhdXNlCi0gICAgLy8g aW5mZXJyaW5nIHN0ZDo6ZnVuY3Rpb248Ym9vbChUIGNvbnN0Jik+IGlzIGhhcmQgKGJ1dCBwb3Nz aWJsZSkgYW5kCi0gICAgLy8gcmVxdWlyZXMgYSBsb3Qgb2YgVE1QLgotICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFQ+Ci0gICAgR2VuZXJpYzo6UHJlZGljYXRlTWF0Y2hlcjxUPiBQcmVkaWNhdGUoc3Rk OjpmdW5jdGlvbjxib29sKFQgY29uc3QmKT4gY29uc3QmIHByZWRpY2F0ZSwgc3RkOjpzdHJpbmcg Y29uc3QmIGRlc2NyaXB0aW9uID0gIiIpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyaWM6OlByZWRp Y2F0ZU1hdGNoZXI8VD4ocHJlZGljYXRlLCBkZXNjcmlwdGlvbik7Ci0gICAgfQotCi19IC8vIG5h bWVzcGFjZSBNYXRjaGVycwotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX21h dGNoZXJzX2dlbmVyaWMuaHBwCi0vLyBzdGFydCBjYXRjaF9tYXRjaGVyc19zdHJpbmcuaAotCi0j aW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotbmFtZXNwYWNlIE1hdGNoZXJz IHsKLQotICAgIG5hbWVzcGFjZSBTdGRTdHJpbmcgewotCi0gICAgICAgIHN0cnVjdCBDYXNlZFN0 cmluZwotICAgICAgICB7Ci0gICAgICAgICAgICBDYXNlZFN0cmluZyggc3RkOjpzdHJpbmcgY29u c3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApOwotICAgICAg ICAgICAgc3RkOjpzdHJpbmcgYWRqdXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkg Y29uc3Q7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBj b25zdDsKLQotICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2 aXR5OwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV9zdHI7Ci0gICAgICAgIH07Ci0KLSAgICAg ICAgc3RydWN0IFN0cmluZ01hdGNoZXJCYXNlIDogTWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IHsK LSAgICAgICAgICAgIFN0cmluZ01hdGNoZXJCYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0 aW9uLCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOwotICAgICAgICAgICAgc3RkOjpz dHJpbmcgZGVzY3JpYmUoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAgICAgQ2FzZWRTdHJp bmcgbV9jb21wYXJhdG9yOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV9vcGVyYXRpb247Ci0g ICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IEVxdWFsc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVy QmFzZSB7Ci0gICAgICAgICAgICBFcXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29t cGFyYXRvciApOwotICAgICAgICAgICAgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNv dXJjZSApIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICB9OwotICAgICAgICBzdHJ1Y3QgQ29udGFp bnNNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgewotICAgICAgICAgICAgQ29udGFpbnNNYXRj aGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOwotICAgICAgICAgICAgYm9vbCBt YXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IG92ZXJyaWRlOwotICAgICAg ICB9OwotICAgICAgICBzdHJ1Y3QgU3RhcnRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFz ZSB7Ci0gICAgICAgICAgICBTdGFydHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNv bXBhcmF0b3IgKTsKLSAgICAgICAgICAgIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBz b3VyY2UgKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgfTsKLSAgICAgICAgc3RydWN0IEVuZHNX aXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKLSAgICAgICAgICAgIEVuZHNXaXRoTWF0 Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKLSAgICAgICAgICAgIGJvb2wg bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBvdmVycmlkZTsKLSAgICAg ICAgfTsKLQotICAgICAgICBzdHJ1Y3QgUmVnZXhNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjpz dHJpbmc+IHsKLSAgICAgICAgICAgIFJlZ2V4TWF0Y2hlciggc3RkOjpzdHJpbmcgcmVnZXgsIENh c2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKTsKLSAgICAgICAgICAgIGJvb2wg bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBtYXRjaGVlICkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAg ICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAg IHByaXZhdGU6Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBtX3JlZ2V4OwotICAgICAgICAgICAg Q2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OwotICAgICAgICB9OwotCi0g ICAgfSAvLyBuYW1lc3BhY2UgU3RkU3RyaW5nCi0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0 aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCi0gICAgLy8gVGhpcyBhbGxv d3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCi0KLSAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNo ZXIgRXF1YWxzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2Ug Y2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7Ci0gICAgU3RkU3RyaW5nOjpD b250YWluc01hdGNoZXIgQ29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5z aXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKLSAg ICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3Qm IHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRp dmU6OlllcyApOwotICAgIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIgU3RhcnRzV2l0aCgg c3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRp dml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOwotICAgIFN0ZFN0cmluZzo6UmVnZXhNYXRjaGVy IE1hdGNoZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiByZWdleCwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNl IGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOwotCi19IC8vIG5hbWVzcGFj ZSBNYXRjaGVycwotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX21hdGNoZXJz X3N0cmluZy5oCi0vLyBzdGFydCBjYXRjaF9tYXRjaGVyc192ZWN0b3IuaAotCi0jaW5jbHVkZSA8 YWxnb3JpdGhtPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotbmFtZXNwYWNlIE1hdGNoZXJzIHsKLQot ICAgIG5hbWVzcGFjZSBWZWN0b3IgewotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBl bmFtZSBBbGxvYz4KLSAgICAgICAgc3RydWN0IENvbnRhaW5zRWxlbWVudE1hdGNoZXIgOiBNYXRj aGVyQmFzZTxzdGQ6OnZlY3RvcjxULCBBbGxvYz4+IHsKLQotICAgICAgICAgICAgQ29udGFpbnNF bGVtZW50TWF0Y2hlcihUIGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFy YXRvcikge30KLQotICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxULCBBbGxvYz4g Y29uc3QgJnYpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29u c3QmIGVsIDogdikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWwgPT0gbV9jb21wYXJhdG9y KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAg ICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7 Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29u c3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyA6OkNh dGNoOjpEZXRhaWw6OnN0cmluZ2lmeSggbV9jb21wYXJhdG9yICk7Ci0gICAgICAgICAgICB9Ci0K LSAgICAgICAgICAgIFQgY29uc3QmIG1fY29tcGFyYXRvcjsKLSAgICAgICAgfTsKLQotICAgICAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY0NvbXAsIHR5cGVuYW1lIEFsbG9j TWF0Y2g+Ci0gICAgICAgIHN0cnVjdCBDb250YWluc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6 OnZlY3RvcjxULCBBbGxvY01hdGNoPj4gewotCi0gICAgICAgICAgICBDb250YWluc01hdGNoZXIo c3RkOjp2ZWN0b3I8VCwgQWxsb2NDb21wPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0 b3IoIGNvbXBhcmF0b3IgKSB7fQotCi0gICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9y PFQsIEFsbG9jTWF0Y2g+IGNvbnN0ICZ2KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAg ICAgLy8gIVRCRDogc2VlIG5vdGUgaW4gRXF1YWxzTWF0Y2hlcgotICAgICAgICAgICAgICAgIGlm IChtX2NvbXBhcmF0b3Iuc2l6ZSgpID4gdi5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgIHJl dHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIGNvbXBhcmF0b3Ig OiBtX2NvbXBhcmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBwcmVzZW50ID0gZmFs c2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWwgOiB2KSB7Ci0gICAg ICAgICAgICAgICAgICAgICAgICBpZiAoZWwgPT0gY29tcGFyYXRvcikgewotICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcHJlc2VudCkgewotICAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg ICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAg ICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAg ICAgICAgICAgcmV0dXJuICJDb250YWluczogIiArIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5 KCBtX2NvbXBhcmF0b3IgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RkOjp2ZWN0 b3I8VCwgQWxsb2NDb21wPiBjb25zdCYgbV9jb21wYXJhdG9yOwotICAgICAgICB9OwotCi0gICAg ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jQ29tcCwgdHlwZW5hbWUgQWxs b2NNYXRjaD4KLSAgICAgICAgc3RydWN0IEVxdWFsc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6 OnZlY3RvcjxULCBBbGxvY01hdGNoPj4gewotCi0gICAgICAgICAgICBFcXVhbHNNYXRjaGVyKHN0 ZDo6dmVjdG9yPFQsIEFsbG9jQ29tcD4gY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9y KCBjb21wYXJhdG9yICkge30KLQotICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxU LCBBbGxvY01hdGNoPiBjb25zdCAmdikgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAg IC8vICFUQkQ6IFRoaXMgY3VycmVudGx5IHdvcmtzIGlmIGFsbCBlbGVtZW50cyBjYW4gYmUgY29t cGFyZWQgdXNpbmcgIT0KLSAgICAgICAgICAgICAgICAvLyAtIGEgbW9yZSBnZW5lcmFsIGFwcHJv YWNoIHdvdWxkIGJlIHZpYSBhIGNvbXBhcmUgdGVtcGxhdGUgdGhhdCBkZWZhdWx0cwotICAgICAg ICAgICAgICAgIC8vIHRvIHVzaW5nICE9LiBidXQgY291bGQgYmUgc3BlY2lhbGlzZWQgZm9yLCBl LmcuIHN0ZDo6dmVjdG9yPFQsIEFsbG9jPiBldGMKLSAgICAgICAgICAgICAgICAvLyAtIHRoZW4g anVzdCBjYWxsIHRoYXQgZGlyZWN0bHkKLSAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9y LnNpemUoKSAhPSB2LnNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot ICAgICAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytp KQotICAgICAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yW2ldICE9IHZbaV0pCi0gICAg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJu IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmliZSgp IGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkVxdWFsczogIiArIDo6 Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBtX2NvbXBhcmF0b3IgKTsKLSAgICAgICAgICAgIH0K LSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQsIEFsbG9jQ29tcD4gY29uc3QmIG1fY29tcGFyYXRv cjsKLSAgICAgICAgfTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBB bGxvY0NvbXAsIHR5cGVuYW1lIEFsbG9jTWF0Y2g+Ci0gICAgICAgIHN0cnVjdCBBcHByb3hNYXRj aGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VCwgQWxsb2NNYXRjaD4+IHsKLQotICAgICAg ICAgICAgQXBwcm94TWF0Y2hlcihzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiBjb21w YXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9Ci0KLSAgICAgICAgICAgIGJv b2wgbWF0Y2goc3RkOjp2ZWN0b3I8VCwgQWxsb2NNYXRjaD4gY29uc3QgJnYpIGNvbnN0IG92ZXJy aWRlIHsKLSAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSAhPSB2LnNpemUo KSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGZv ciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAg ICAgICBpZiAobV9jb21wYXJhdG9yW2ldICE9IGFwcHJveCh2W2ldKSkKLSAgICAgICAgICAgICAg ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg ICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3Zl cnJpZGUgewotICAgICAgICAgICAgICAgIHJldHVybiAiaXMgYXBwcm94OiAiICsgOjpDYXRjaDo6 RGV0YWlsOjpzdHJpbmdpZnkoIG1fY29tcGFyYXRvciApOwotICAgICAgICAgICAgfQotICAgICAg ICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpp c19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KLSAgICAgICAgICAgIEFw cHJveE1hdGNoZXImIGVwc2lsb24oIFQgY29uc3QmIG5ld0Vwc2lsb24gKSB7Ci0gICAgICAgICAg ICAgICAgYXBwcm94LmVwc2lsb24obmV3RXBzaWxvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJu ICp0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lID0g dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46 OnZhbHVlPjo6dHlwZT4KLSAgICAgICAgICAgIEFwcHJveE1hdGNoZXImIG1hcmdpbiggVCBjb25z dCYgbmV3TWFyZ2luICkgewotICAgICAgICAgICAgICAgIGFwcHJveC5tYXJnaW4obmV3TWFyZ2lu KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAg ICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6Omlz X2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgotICAgICAgICAgICAgQXBw cm94TWF0Y2hlciYgc2NhbGUoIFQgY29uc3QmIG5ld1NjYWxlICkgewotICAgICAgICAgICAgICAg IGFwcHJveC5zY2FsZShuZXdTY2FsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwot ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNv bnN0JiBtX2NvbXBhcmF0b3I7Ci0gICAgICAgICAgICBtdXRhYmxlIENhdGNoOjpEZXRhaWw6OkFw cHJveCBhcHByb3ggPSBDYXRjaDo6RGV0YWlsOjpBcHByb3g6OmN1c3RvbSgpOwotICAgICAgICB9 OwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jQ29tcCwgdHlw ZW5hbWUgQWxsb2NNYXRjaD4KLSAgICAgICAgc3RydWN0IFVub3JkZXJlZEVxdWFsc01hdGNoZXIg OiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxULCBBbGxvY01hdGNoPj4gewotICAgICAgICAgICAg VW5vcmRlcmVkRXF1YWxzTWF0Y2hlcihzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiB0 YXJnZXQpIDogbV90YXJnZXQodGFyZ2V0KSB7fQotICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6 OnZlY3RvcjxULCBBbGxvY01hdGNoPiBjb25zdCYgdmVjKSBjb25zdCBvdmVycmlkZSB7Ci0gICAg ICAgICAgICAgICAgaWYgKG1fdGFyZ2V0LnNpemUoKSAhPSB2ZWMuc2l6ZSgpKSB7Ci0gICAgICAg ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg ICAgICAgcmV0dXJuIHN0ZDo6aXNfcGVybXV0YXRpb24obV90YXJnZXQuYmVnaW4oKSwgbV90YXJn ZXQuZW5kKCksIHZlYy5iZWdpbigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3Rk OjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgcmV0 dXJuICJVbm9yZGVyZWRFcXVhbHM6ICIgKyA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShtX3Rh cmdldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBzdGQ6 OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiBtX3RhcmdldDsKLSAgICAgICAgfTsKLQotICAg IH0gLy8gbmFtZXNwYWNlIFZlY3RvcgotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMg Y3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgotICAgIC8vIFRoaXMgYWxsb3dzIHRo ZSB0eXBlcyB0byBiZSBpbmZlcnJlZAotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5h bWUgQWxsb2NDb21wID0gc3RkOjphbGxvY2F0b3I8VD4sIHR5cGVuYW1lIEFsbG9jTWF0Y2ggPSBB bGxvY0NvbXA+Ci0gICAgVmVjdG9yOjpDb250YWluc01hdGNoZXI8VCwgQWxsb2NDb21wLCBBbGxv Y01hdGNoPiBDb250YWlucyggc3RkOjp2ZWN0b3I8VCwgQWxsb2NDb21wPiBjb25zdCYgY29tcGFy YXRvciApIHsKLSAgICAgICAgcmV0dXJuIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQsIEFsbG9j Q29tcCwgQWxsb2NNYXRjaD4oIGNvbXBhcmF0b3IgKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0 eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPFQ+PgotICAgIFZlY3Rv cjo6Q29udGFpbnNFbGVtZW50TWF0Y2hlcjxULCBBbGxvYz4gVmVjdG9yQ29udGFpbnMoIFQgY29u c3QmIGNvbXBhcmF0b3IgKSB7Ci0gICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zRWxlbWVu dE1hdGNoZXI8VCwgQWxsb2M+KCBjb21wYXJhdG9yICk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8 dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NDb21wID0gc3RkOjphbGxvY2F0b3I8VD4sIHR5cGVu YW1lIEFsbG9jTWF0Y2ggPSBBbGxvY0NvbXA+Ci0gICAgVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQs IEFsbG9jQ29tcCwgQWxsb2NNYXRjaD4gRXF1YWxzKCBzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+ IGNvbnN0JiBjb21wYXJhdG9yICkgewotICAgICAgICByZXR1cm4gVmVjdG9yOjpFcXVhbHNNYXRj aGVyPFQsIEFsbG9jQ29tcCwgQWxsb2NNYXRjaD4oIGNvbXBhcmF0b3IgKTsKLSAgICB9Ci0KLSAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY0NvbXAgPSBzdGQ6OmFsbG9jYXRv cjxUPiwgdHlwZW5hbWUgQWxsb2NNYXRjaCA9IEFsbG9jQ29tcD4KLSAgICBWZWN0b3I6OkFwcHJv eE1hdGNoZXI8VCwgQWxsb2NDb21wLCBBbGxvY01hdGNoPiBBcHByb3goIHN0ZDo6dmVjdG9yPFQs IEFsbG9jQ29tcD4gY29uc3QmIGNvbXBhcmF0b3IgKSB7Ci0gICAgICAgIHJldHVybiBWZWN0b3I6 OkFwcHJveE1hdGNoZXI8VCwgQWxsb2NDb21wLCBBbGxvY01hdGNoPiggY29tcGFyYXRvciApOwot ICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jQ29tcCA9IHN0 ZDo6YWxsb2NhdG9yPFQ+LCB0eXBlbmFtZSBBbGxvY01hdGNoID0gQWxsb2NDb21wPgotICAgIFZl Y3Rvcjo6VW5vcmRlcmVkRXF1YWxzTWF0Y2hlcjxULCBBbGxvY0NvbXAsIEFsbG9jTWF0Y2g+IFVu b3JkZXJlZEVxdWFscyhzdGQ6OnZlY3RvcjxULCBBbGxvY0NvbXA+IGNvbnN0JiB0YXJnZXQpIHsK LSAgICAgICAgcmV0dXJuIFZlY3Rvcjo6VW5vcmRlcmVkRXF1YWxzTWF0Y2hlcjxULCBBbGxvY0Nv bXAsIEFsbG9jTWF0Y2g+KCB0YXJnZXQgKTsKLSAgICB9Ci0KLX0gLy8gbmFtZXNwYWNlIE1hdGNo ZXJzCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfbWF0Y2hlcnNfdmVjdG9y LmgKLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBl bmFtZSBNYXRjaGVyVD4KLSAgICBjbGFzcyBNYXRjaEV4cHIgOiBwdWJsaWMgSVRyYW5zaWVudEV4 cHJlc3Npb24gewotICAgICAgICBBcmdUIGNvbnN0JiBtX2FyZzsKLSAgICAgICAgTWF0Y2hlclQg bV9tYXRjaGVyOwotICAgICAgICBTdHJpbmdSZWYgbV9tYXRjaGVyU3RyaW5nOwotICAgIHB1Ymxp YzoKLSAgICAgICAgTWF0Y2hFeHByKCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBt YXRjaGVyLCBTdHJpbmdSZWYgY29uc3QmIG1hdGNoZXJTdHJpbmcgKQotICAgICAgICA6ICAgSVRy YW5zaWVudEV4cHJlc3Npb257IHRydWUsIG1hdGNoZXIubWF0Y2goIGFyZyApIH0sCi0gICAgICAg ICAgICBtX2FyZyggYXJnICksCi0gICAgICAgICAgICBtX21hdGNoZXIoIG1hdGNoZXIgKSwKLSAg ICAgICAgICAgIG1fbWF0Y2hlclN0cmluZyggbWF0Y2hlclN0cmluZyApCi0gICAgICAgIHt9Ci0K LSAgICAgICAgdm9pZCBzdHJlYW1SZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiggc3RkOjpvc3RyZWFt ICZvcyApIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGF1dG8gbWF0Y2hlckFzU3RyaW5n ID0gbV9tYXRjaGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBvcyA8PCBDYXRjaDo6RGV0YWls OjpzdHJpbmdpZnkoIG1fYXJnICkgPDwgJyAnOwotICAgICAgICAgICAgaWYoIG1hdGNoZXJBc1N0 cmluZyA9PSBEZXRhaWw6OnVucHJpbnRhYmxlU3RyaW5nICkKLSAgICAgICAgICAgICAgICBvcyA8 PCBtX21hdGNoZXJTdHJpbmc7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3Mg PDwgbWF0Y2hlckFzU3RyaW5nOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHVzaW5nIFN0cmlu Z01hdGNoZXIgPSBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+OwotCi0g ICAgdm9pZCBoYW5kbGVFeGNlcHRpb25NYXRjaEV4cHIoIEFzc2VydGlvbkhhbmRsZXImIGhhbmRs ZXIsIFN0cmluZ01hdGNoZXIgY29uc3QmIG1hdGNoZXIsIFN0cmluZ1JlZiBjb25zdCYgbWF0Y2hl clN0cmluZyAgKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lIE1hdGNo ZXJUPgotICAgIGF1dG8gbWFrZU1hdGNoRXhwciggQXJnVCBjb25zdCYgYXJnLCBNYXRjaGVyVCBj b25zdCYgbWF0Y2hlciwgU3RyaW5nUmVmIGNvbnN0JiBtYXRjaGVyU3RyaW5nICApIC0+IE1hdGNo RXhwcjxBcmdULCBNYXRjaGVyVD4gewotICAgICAgICByZXR1cm4gTWF0Y2hFeHByPEFyZ1QsIE1h dGNoZXJUPiggYXJnLCBtYXRjaGVyLCBtYXRjaGVyU3RyaW5nICk7Ci0gICAgfQotCi19IC8vIG5h bWVzcGFjZSBDYXRjaAotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jZGVmaW5lIElOVEVSTkFM X0NIRUNLX1RIQVQoIG1hY3JvTmFtZSwgbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24sIGFyZyAp IFwKLSAgICBkbyB7IFwKLSAgICAgICAgQ2F0Y2g6OkFzc2VydGlvbkhhbmRsZXIgY2F0Y2hBc3Nl cnRpb25IYW5kbGVyKCBtYWNyb05hbWUjI19jYXRjaF9zciwgQ0FUQ0hfSU5URVJOQUxfTElORUlO Rk8sIENBVENIX0lOVEVSTkFMX1NUUklOR0lGWShhcmcpICIsICIgQ0FUQ0hfSU5URVJOQUxfU1RS SU5HSUZZKG1hdGNoZXIpLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCi0gICAgICAgIElOVEVSTkFM X0NBVENIX1RSWSB7IFwKLSAgICAgICAgICAgIGNhdGNoQXNzZXJ0aW9uSGFuZGxlci5oYW5kbGVF eHByKCBDYXRjaDo6bWFrZU1hdGNoRXhwciggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciMjX2NhdGNo X3NyICkgKTsgXAotICAgICAgICB9IElOVEVSTkFMX0NBVENIX0NBVENIKCBjYXRjaEFzc2VydGlv bkhhbmRsZXIgKSBcCi0gICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBjYXRjaEFzc2VydGlv bkhhbmRsZXIgKSBcCi0gICAgfSB3aGlsZSggZmFsc2UgKQotCi0vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XU19NQVRDSEVTKCBtYWNyb05hbWUsIGV4 Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCBtYXRjaGVyLCAuLi4gKSBcCi0gICAgZG8g eyBcCi0gICAgICAgIENhdGNoOjpBc3NlcnRpb25IYW5kbGVyIGNhdGNoQXNzZXJ0aW9uSGFuZGxl ciggbWFjcm9OYW1lIyNfY2F0Y2hfc3IsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDQVRDSF9J TlRFUk5BTF9TVFJJTkdJRlkoX19WQV9BUkdTX18pICIsICIgQ0FUQ0hfSU5URVJOQUxfU1RSSU5H SUZZKGV4Y2VwdGlvblR5cGUpICIsICIgQ0FUQ0hfSU5URVJOQUxfU1RSSU5HSUZZKG1hdGNoZXIp LCByZXN1bHREaXNwb3NpdGlvbiApOyBcCi0gICAgICAgIGlmKCBjYXRjaEFzc2VydGlvbkhhbmRs ZXIuYWxsb3dUaHJvd3MoKSApIFwKLSAgICAgICAgICAgIHRyeSB7IFwKLSAgICAgICAgICAgICAg ICBzdGF0aWNfY2FzdDx2b2lkPihfX1ZBX0FSR1NfXyApOyBcCi0gICAgICAgICAgICAgICAgY2F0 Y2hBc3NlcnRpb25IYW5kbGVyLmhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb25Ob3RUaHJvd24oKTsg XAotICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICBjYXRjaCggZXhjZXB0aW9uVHlwZSBjb25z dCYgZXggKSB7IFwKLSAgICAgICAgICAgICAgICBjYXRjaEFzc2VydGlvbkhhbmRsZXIuaGFuZGxl RXhwciggQ2F0Y2g6Om1ha2VNYXRjaEV4cHIoIGV4LCBtYXRjaGVyLCAjbWF0Y2hlciMjX2NhdGNo X3NyICkgKTsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICBjYXRjaCggLi4uICkgeyBc Ci0gICAgICAgICAgICAgICAgY2F0Y2hBc3NlcnRpb25IYW5kbGVyLmhhbmRsZVVuZXhwZWN0ZWRJ bmZsaWdodEV4Y2VwdGlvbigpOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgZWxzZSBcCi0g ICAgICAgICAgICBjYXRjaEFzc2VydGlvbkhhbmRsZXIuaGFuZGxlVGhyb3dpbmdDYWxsU2tpcHBl ZCgpOyBcCi0gICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBjYXRjaEFzc2VydGlvbkhhbmRs ZXIgKSBcCi0gICAgfSB3aGlsZSggZmFsc2UgKQotCi0vLyBlbmQgY2F0Y2hfY2FwdHVyZV9tYXRj aGVycy5oCi0jZW5kaWYKLS8vIHN0YXJ0IGNhdGNoX2dlbmVyYXRvcnMuaHBwCi0KLS8vIHN0YXJ0 IGNhdGNoX2ludGVyZmFjZXNfZ2VuZXJhdG9ydHJhY2tlci5oCi0KLQotI2luY2x1ZGUgPG1lbW9y eT4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIG5hbWVzcGFjZSBHZW5lcmF0b3JzIHsKLSAg ICAgICAgY2xhc3MgR2VuZXJhdG9yVW50eXBlZEJhc2UgewotICAgICAgICBwdWJsaWM6Ci0gICAg ICAgICAgICBHZW5lcmF0b3JVbnR5cGVkQmFzZSgpID0gZGVmYXVsdDsKLSAgICAgICAgICAgIHZp cnR1YWwgfkdlbmVyYXRvclVudHlwZWRCYXNlKCk7Ci0gICAgICAgICAgICAvLyBBdHRlbXB0cyB0 byBtb3ZlIHRoZSBnZW5lcmF0b3IgdG8gdGhlIG5leHQgZWxlbWVudAotICAgICAgICAgICAgIC8v Ci0gICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbW92ZSBzdWNjZWVkZWQgKGFu ZCBhIHZhbGlkIGVsZW1lbnQKLSAgICAgICAgICAgICAvLyBjYW4gYmUgcmV0cmlldmVkKS4KLSAg ICAgICAgICAgIHZpcnR1YWwgYm9vbCBuZXh0KCkgPSAwOwotICAgICAgICB9OwotICAgICAgICB1 c2luZyBHZW5lcmF0b3JCYXNlUHRyID0gc3RkOjp1bmlxdWVfcHRyPEdlbmVyYXRvclVudHlwZWRC YXNlPjsKLQotICAgIH0gLy8gbmFtZXNwYWNlIEdlbmVyYXRvcnMKLQotICAgIHN0cnVjdCBJR2Vu ZXJhdG9yVHJhY2tlciB7Ci0gICAgICAgIHZpcnR1YWwgfklHZW5lcmF0b3JUcmFja2VyKCk7Ci0g ICAgICAgIHZpcnR1YWwgYXV0byBoYXNHZW5lcmF0b3IoKSBjb25zdCAtPiBib29sID0gMDsKLSAg ICAgICAgdmlydHVhbCBhdXRvIGdldEdlbmVyYXRvcigpIGNvbnN0IC0+IEdlbmVyYXRvcnM6Okdl bmVyYXRvckJhc2VQdHIgY29uc3QmID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldEdlbmVy YXRvciggR2VuZXJhdG9yczo6R2VuZXJhdG9yQmFzZVB0ciYmIGdlbmVyYXRvciApID0gMDsKLSAg ICB9OwotCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfaW50ZXJmYWNlc19n ZW5lcmF0b3J0cmFja2VyLmgKLS8vIHN0YXJ0IGNhdGNoX2VuZm9yY2UuaAotCi0jaW5jbHVkZSA8 ZXhjZXB0aW9uPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotI2lmICFkZWZpbmVkKENBVENIX0NPTkZJ R19ESVNBQkxFX0VYQ0VQVElPTlMpCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4PgotICAgIFtb bm9yZXR1cm5dXQotICAgIHZvaWQgdGhyb3dfZXhjZXB0aW9uKEV4IGNvbnN0JiBlKSB7Ci0gICAg ICAgIHRocm93IGU7Ci0gICAgfQotI2Vsc2UgLy8gXl4gRXhjZXB0aW9ucyBhcmUgZW5hYmxlZCAv LyAgRXhjZXB0aW9ucyBhcmUgZGlzYWJsZWQgdnYKLSAgICBbW25vcmV0dXJuXV0KLSAgICB2b2lk IHRocm93X2V4Y2VwdGlvbihzdGQ6OmV4Y2VwdGlvbiBjb25zdCYgZSk7Ci0jZW5kaWYKLQotICAg IFtbbm9yZXR1cm5dXQotICAgIHZvaWQgdGhyb3dfbG9naWNfZXJyb3Ioc3RkOjpzdHJpbmcgY29u c3QmIG1zZyk7Ci0gICAgW1tub3JldHVybl1dCi0gICAgdm9pZCB0aHJvd19kb21haW5fZXJyb3Io c3RkOjpzdHJpbmcgY29uc3QmIG1zZyk7Ci0gICAgW1tub3JldHVybl1dCi0gICAgdm9pZCB0aHJv d19ydW50aW1lX2Vycm9yKHN0ZDo6c3RyaW5nIGNvbnN0JiBtc2cpOwotCi19IC8vIG5hbWVzcGFj ZSBDYXRjaDsKLQotI2RlZmluZSBDQVRDSF9NQUtFX01TRyguLi4pIFwKLSAgICAoQ2F0Y2g6OlJl dXNhYmxlU3RyaW5nU3RyZWFtKCkgPDwgX19WQV9BUkdTX18pLnN0cigpCi0KLSNkZWZpbmUgQ0FU Q0hfSU5URVJOQUxfRVJST1IoLi4uKSBcCi0gICAgQ2F0Y2g6OnRocm93X2xvZ2ljX2Vycm9yKENB VENIX01BS0VfTVNHKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyA8PCAiOiBJbnRlcm5hbCBDYXRj aDIgZXJyb3I6ICIgPDwgX19WQV9BUkdTX18pKQotCi0jZGVmaW5lIENBVENIX0VSUk9SKC4uLikg XAotICAgIENhdGNoOjp0aHJvd19kb21haW5fZXJyb3IoQ0FUQ0hfTUFLRV9NU0coIF9fVkFfQVJH U19fICkpCi0KLSNkZWZpbmUgQ0FUQ0hfUlVOVElNRV9FUlJPUiguLi4pIFwKLSAgICBDYXRjaDo6 dGhyb3dfcnVudGltZV9lcnJvcihDQVRDSF9NQUtFX01TRyggX19WQV9BUkdTX18gKSkKLQotI2Rl ZmluZSBDQVRDSF9FTkZPUkNFKCBjb25kaXRpb24sIC4uLiApIFwKLSAgICBkb3sgaWYoICEoY29u ZGl0aW9uKSApIENBVENIX0VSUk9SKCBfX1ZBX0FSR1NfXyApOyB9IHdoaWxlKGZhbHNlKQotCi0v LyBlbmQgY2F0Y2hfZW5mb3JjZS5oCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rv cj4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxl eGNlcHRpb24+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLWNsYXNzIEdlbmVyYXRvckV4Y2VwdGlv biA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7Ci0gICAgY29uc3QgY2hhciogY29uc3QgbV9tc2cg PSAiIjsKLQotcHVibGljOgotICAgIEdlbmVyYXRvckV4Y2VwdGlvbihjb25zdCBjaGFyKiBtc2cp OgotICAgICAgICBtX21zZyhtc2cpCi0gICAge30KLQotICAgIGNvbnN0IGNoYXIqIHdoYXQoKSBj b25zdCBub2V4Y2VwdCBvdmVycmlkZSBmaW5hbDsKLX07Ci0KLW5hbWVzcGFjZSBHZW5lcmF0b3Jz IHsKLQotICAgIC8vICFUQkQgbW92ZSB0aGlzIGludG8gaXRzIG93biBsb2NhdGlvbj8KLSAgICBu YW1lc3BhY2UgcGZ7Ci0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFy Z3M+Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlX3VuaXF1ZSggQXJncyYmLi4uIGFy Z3MgKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQ+KG5ldyBUKHN0ZDo6 Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdGVtcGxh dGU8dHlwZW5hbWUgVD4KLSAgICBzdHJ1Y3QgSUdlbmVyYXRvciA6IEdlbmVyYXRvclVudHlwZWRC YXNlIHsKLSAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvcigpID0gZGVmYXVsdDsKLQotICAgICAg ICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlIGdlbmVyYXRvcgotICAgICAg ICAvLwotICAgICAgICAvLyBcUHJlY29uZGl0aW9uIFRoZSBnZW5lcmF0b3IgaXMgZWl0aGVyIGZy ZXNobHkgY29uc3RydWN0ZWQsCi0gICAgICAgIC8vIG9yIHRoZSBsYXN0IGNhbGwgdG8gYG5leHQo KWAgcmV0dXJuZWQgdHJ1ZQotICAgICAgICB2aXJ0dWFsIFQgY29uc3QmIGdldCgpIGNvbnN0ID0g MDsKLSAgICAgICAgdXNpbmcgdHlwZSA9IFQ7Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5cGVu YW1lIFQ+Ci0gICAgY2xhc3MgU2luZ2xlVmFsdWVHZW5lcmF0b3IgZmluYWwgOiBwdWJsaWMgSUdl bmVyYXRvcjxUPiB7Ci0gICAgICAgIFQgbV92YWx1ZTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNp bmdsZVZhbHVlR2VuZXJhdG9yKFQmJiB2YWx1ZSkgOiBtX3ZhbHVlKHN0ZDo6bW92ZSh2YWx1ZSkp IHt9Ci0KLSAgICAgICAgVCBjb25zdCYgZ2V0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAg ICAgcmV0dXJuIG1fdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBuZXh0KCkgb3ZlcnJp ZGUgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAg IHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgY2xhc3MgRml4ZWRWYWx1ZXNHZW5lcmF0b3IgZmlu YWwgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6 aXNfc2FtZTxULCBib29sPjo6dmFsdWUsCi0gICAgICAgICAgICAiRml4ZWRWYWx1ZXNHZW5lcmF0 b3IgZG9lcyBub3Qgc3VwcG9ydCBib29scyBiZWNhdXNlIG9mIHN0ZDo6dmVjdG9yPGJvb2w+Igot ICAgICAgICAgICAgInNwZWNpYWxpemF0aW9uLCB1c2UgU2luZ2xlVmFsdWUgR2VuZXJhdG9yIGlu c3RlYWQuIik7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFQ+IG1fdmFsdWVzOwotICAgICAgICBzaXpl X3QgbV9pZHggPSAwOwotICAgIHB1YmxpYzoKLSAgICAgICAgRml4ZWRWYWx1ZXNHZW5lcmF0b3Io IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMgKSA6IG1fdmFsdWVzKCB2YWx1ZXMgKSB7 fQotCi0gICAgICAgIFQgY29uc3QmIGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAg IHJldHVybiBtX3ZhbHVlc1ttX2lkeF07Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBuZXh0KCkg b3ZlcnJpZGUgewotICAgICAgICAgICAgKyttX2lkeDsKLSAgICAgICAgICAgIHJldHVybiBtX2lk eCA8IG1fdmFsdWVzLnNpemUoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZSA8 dHlwZW5hbWUgVD4KLSAgICBjbGFzcyBHZW5lcmF0b3JXcmFwcGVyIGZpbmFsIHsKLSAgICAgICAg c3RkOjp1bmlxdWVfcHRyPElHZW5lcmF0b3I8VD4+IG1fZ2VuZXJhdG9yOwotICAgIHB1YmxpYzoK LSAgICAgICAgR2VuZXJhdG9yV3JhcHBlcihzdGQ6OnVuaXF1ZV9wdHI8SUdlbmVyYXRvcjxUPj4g Z2VuZXJhdG9yKToKLSAgICAgICAgICAgIG1fZ2VuZXJhdG9yKHN0ZDo6bW92ZShnZW5lcmF0b3Ip KQotICAgICAgICB7fQotICAgICAgICBUIGNvbnN0JiBnZXQoKSBjb25zdCB7Ci0gICAgICAgICAg ICByZXR1cm4gbV9nZW5lcmF0b3ItPmdldCgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgbmV4 dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtX2dlbmVyYXRvci0+bmV4dCgpOwotICAgICAgICB9 Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIEdlbmVyYXRvcldyYXBw ZXI8VD4gdmFsdWUoVCYmIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmF0b3JXcmFwcGVy PFQ+KHBmOjptYWtlX3VuaXF1ZTxTaW5nbGVWYWx1ZUdlbmVyYXRvcjxUPj4oc3RkOjpmb3J3YXJk PFQ+KHZhbHVlKSkpOwotICAgIH0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBHZW5l cmF0b3JXcmFwcGVyPFQ+IHZhbHVlcyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7 Ci0gICAgICAgIHJldHVybiBHZW5lcmF0b3JXcmFwcGVyPFQ+KHBmOjptYWtlX3VuaXF1ZTxGaXhl ZFZhbHVlc0dlbmVyYXRvcjxUPj4odmFsdWVzKSk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlw ZW5hbWUgVD4KLSAgICBjbGFzcyBHZW5lcmF0b3JzIDogcHVibGljIElHZW5lcmF0b3I8VD4gewot ICAgICAgICBzdGQ6OnZlY3RvcjxHZW5lcmF0b3JXcmFwcGVyPFQ+PiBtX2dlbmVyYXRvcnM7Ci0g ICAgICAgIHNpemVfdCBtX2N1cnJlbnQgPSAwOwotCi0gICAgICAgIHZvaWQgcG9wdWxhdGUoR2Vu ZXJhdG9yV3JhcHBlcjxUPiYmIGdlbmVyYXRvcikgewotICAgICAgICAgICAgbV9nZW5lcmF0b3Jz LmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZ2VuZXJhdG9yKSk7Ci0gICAgICAgIH0KLSAgICAgICAg dm9pZCBwb3B1bGF0ZShUJiYgdmFsKSB7Ci0gICAgICAgICAgICBtX2dlbmVyYXRvcnMuZW1wbGFj ZV9iYWNrKHZhbHVlKHN0ZDo6Zm9yd2FyZDxUPih2YWwpKSk7Ci0gICAgICAgIH0KLSAgICAgICAg dGVtcGxhdGU8dHlwZW5hbWUgVT4KLSAgICAgICAgdm9pZCBwb3B1bGF0ZShVJiYgdmFsKSB7Ci0g ICAgICAgICAgICBwb3B1bGF0ZShUKHN0ZDo6Zm9yd2FyZDxVPih2YWwpKSk7Ci0gICAgICAgIH0K LSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gR3M+Ci0gICAgICAgIHZv aWQgcG9wdWxhdGUoVSYmIHZhbHVlT3JHZW5lcmF0b3IsIEdzICYmLi4uIG1vcmVHZW5lcmF0b3Jz KSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZShzdGQ6OmZvcndhcmQ8VT4odmFsdWVPckdlbmVyYXRv cikpOwotICAgICAgICAgICAgcG9wdWxhdGUoc3RkOjpmb3J3YXJkPEdzPihtb3JlR2VuZXJhdG9y cykuLi4pOwotICAgICAgICB9Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIHRlbXBsYXRlIDx0eXBl bmFtZS4uLiBHcz4KLSAgICAgICAgR2VuZXJhdG9ycyhHcyAmJi4uLiBtb3JlR2VuZXJhdG9ycykg ewotICAgICAgICAgICAgbV9nZW5lcmF0b3JzLnJlc2VydmUoc2l6ZW9mLi4uKEdzKSk7Ci0gICAg ICAgICAgICBwb3B1bGF0ZShzdGQ6OmZvcndhcmQ8R3M+KG1vcmVHZW5lcmF0b3JzKS4uLik7Ci0g ICAgICAgIH0KLQotICAgICAgICBUIGNvbnN0JiBnZXQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAg ICAgICAgICByZXR1cm4gbV9nZW5lcmF0b3JzW21fY3VycmVudF0uZ2V0KCk7Ci0gICAgICAgIH0K LQotICAgICAgICBib29sIG5leHQoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBpZiAobV9jdXJy ZW50ID49IG1fZ2VuZXJhdG9ycy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCBib29sIGN1cnJlbnRfc3RhdHVz ID0gbV9nZW5lcmF0b3JzW21fY3VycmVudF0ubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFjdXJy ZW50X3N0YXR1cykgewotICAgICAgICAgICAgICAgICsrbV9jdXJyZW50OwotICAgICAgICAgICAg fQotICAgICAgICAgICAgcmV0dXJuIG1fY3VycmVudCA8IG1fZ2VuZXJhdG9ycy5zaXplKCk7Ci0g ICAgICAgIH0KLSAgICB9OwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+Ci0gICAgR2Vu ZXJhdG9yV3JhcHBlcjxzdGQ6OnR1cGxlPFRzLi4uPj4gdGFibGUoIHN0ZDo6aW5pdGlhbGl6ZXJf bGlzdDxzdGQ6OnR1cGxlPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VHM+Ojp0eXBlLi4uPj4gdHVwbGVz ICkgewotICAgICAgICByZXR1cm4gdmFsdWVzPHN0ZDo6dHVwbGU8VHMuLi4+PiggdHVwbGVzICk7 Ci0gICAgfQotCi0gICAgLy8gVGFnIHR5cGUgdG8gc2lnbmFsIHRoYXQgYSBnZW5lcmF0b3Igc2Vx dWVuY2Ugc2hvdWxkIGNvbnZlcnQgYXJndW1lbnRzIHRvIGEgc3BlY2lmaWMgdHlwZQotICAgIHRl bXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIHN0cnVjdCBhcyB7fTsKLQotICAgIHRlbXBsYXRlPHR5 cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEdzPgotICAgIGF1dG8gbWFrZUdlbmVyYXRvcnMoIEdlbmVy YXRvcldyYXBwZXI8VD4mJiBnZW5lcmF0b3IsIEdzICYmLi4uIG1vcmVHZW5lcmF0b3JzICkgLT4g R2VuZXJhdG9yczxUPiB7Ci0gICAgICAgIHJldHVybiBHZW5lcmF0b3JzPFQ+KHN0ZDo6bW92ZShn ZW5lcmF0b3IpLCBzdGQ6OmZvcndhcmQ8R3M+KG1vcmVHZW5lcmF0b3JzKS4uLik7Ci0gICAgfQot ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgYXV0byBtYWtlR2VuZXJhdG9ycyggR2VuZXJh dG9yV3JhcHBlcjxUPiYmIGdlbmVyYXRvciApIC0+IEdlbmVyYXRvcnM8VD4gewotICAgICAgICBy ZXR1cm4gR2VuZXJhdG9yczxUPihzdGQ6Om1vdmUoZ2VuZXJhdG9yKSk7Ci0gICAgfQotICAgIHRl bXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEdzPgotICAgIGF1dG8gbWFrZUdlbmVyYXRv cnMoIFQmJiB2YWwsIEdzICYmLi4uIG1vcmVHZW5lcmF0b3JzICkgLT4gR2VuZXJhdG9yczxUPiB7 Ci0gICAgICAgIHJldHVybiBtYWtlR2VuZXJhdG9ycyggdmFsdWUoIHN0ZDo6Zm9yd2FyZDxUPigg dmFsICkgKSwgc3RkOjpmb3J3YXJkPEdzPiggbW9yZUdlbmVyYXRvcnMgKS4uLiApOwotICAgIH0K LSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBHcz4KLSAg ICBhdXRvIG1ha2VHZW5lcmF0b3JzKCBhczxUPiwgVSYmIHZhbCwgR3MgJiYuLi4gbW9yZUdlbmVy YXRvcnMgKSAtPiBHZW5lcmF0b3JzPFQ+IHsKLSAgICAgICAgcmV0dXJuIG1ha2VHZW5lcmF0b3Jz KCB2YWx1ZSggVCggc3RkOjpmb3J3YXJkPFU+KCB2YWwgKSApICksIHN0ZDo6Zm9yd2FyZDxHcz4o IG1vcmVHZW5lcmF0b3JzICkuLi4gKTsKLSAgICB9Ci0KLSAgICBhdXRvIGFjcXVpcmVHZW5lcmF0 b3JUcmFja2VyKCBTdHJpbmdSZWYgZ2VuZXJhdG9yTmFtZSwgU291cmNlTGluZUluZm8gY29uc3Qm IGxpbmVJbmZvICkgLT4gSUdlbmVyYXRvclRyYWNrZXImOwotCi0gICAgdGVtcGxhdGU8dHlwZW5h bWUgTD4KLSAgICAvLyBOb3RlOiBUaGUgdHlwZSBhZnRlciAtPiBpcyB3ZWlyZCwgYmVjYXVzZSBW UzIwMTUgY2Fubm90IHBhcnNlCi0gICAgLy8gICAgICAgdGhlIGV4cHJlc3Npb24gdXNlZCBpbiB0 aGUgdHlwZWRlZiBpbnNpZGUsIHdoZW4gaXQgaXMgaW4KLSAgICAvLyAgICAgICByZXR1cm4gdHlw ZS4gWWVhaC4KLSAgICBhdXRvIGdlbmVyYXRlKCBTdHJpbmdSZWYgZ2VuZXJhdG9yTmFtZSwgU291 cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLCBMIGNvbnN0JiBnZW5lcmF0b3JFeHByZXNzaW9u ICkgLT4gZGVjbHR5cGUoc3RkOjpkZWNsdmFsPGRlY2x0eXBlKGdlbmVyYXRvckV4cHJlc3Npb24o KSk+KCkuZ2V0KCkpIHsKLSAgICAgICAgdXNpbmcgVW5kZXJseWluZ1R5cGUgPSB0eXBlbmFtZSBk ZWNsdHlwZShnZW5lcmF0b3JFeHByZXNzaW9uKCkpOjp0eXBlOwotCi0gICAgICAgIElHZW5lcmF0 b3JUcmFja2VyJiB0cmFja2VyID0gYWNxdWlyZUdlbmVyYXRvclRyYWNrZXIoIGdlbmVyYXRvck5h bWUsIGxpbmVJbmZvICk7Ci0gICAgICAgIGlmICghdHJhY2tlci5oYXNHZW5lcmF0b3IoKSkgewot ICAgICAgICAgICAgdHJhY2tlci5zZXRHZW5lcmF0b3IocGY6Om1ha2VfdW5pcXVlPEdlbmVyYXRv cnM8VW5kZXJseWluZ1R5cGU+PihnZW5lcmF0b3JFeHByZXNzaW9uKCkpKTsKLSAgICAgICAgfQot Ci0gICAgICAgIGF1dG8gY29uc3QmIGdlbmVyYXRvciA9IHN0YXRpY19jYXN0PElHZW5lcmF0b3I8 VW5kZXJseWluZ1R5cGU+IGNvbnN0Jj4oICp0cmFja2VyLmdldEdlbmVyYXRvcigpICk7Ci0gICAg ICAgIHJldHVybiBnZW5lcmF0b3IuZ2V0KCk7Ci0gICAgfQotCi19IC8vIG5hbWVzcGFjZSBHZW5l cmF0b3JzCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0jZGVmaW5lIEdFTkVSQVRFKCAuLi4gKSBc Ci0gICAgQ2F0Y2g6OkdlbmVyYXRvcnM6OmdlbmVyYXRlKCBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJ WkUoSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoZ2VuZXJhdG9yKSksIFwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBcCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBbIF17IHVzaW5nIG5hbWVzcGFjZSBDYXRjaDo6R2Vu ZXJhdG9yczsgcmV0dXJuIG1ha2VHZW5lcmF0b3JzKCBfX1ZBX0FSR1NfXyApOyB9ICkgLy9OT0xJ TlQoZ29vZ2xlLWJ1aWxkLXVzaW5nLW5hbWVzcGFjZSkKLSNkZWZpbmUgR0VORVJBVEVfQ09QWSgg Li4uICkgXAotICAgIENhdGNoOjpHZW5lcmF0b3JzOjpnZW5lcmF0ZSggSU5URVJOQUxfQ0FUQ0hf U1RSSU5HSVpFKElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKGdlbmVyYXRvcikpLCBcCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgXAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWz1deyB1c2luZyBuYW1lc3BhY2UgQ2F0 Y2g6OkdlbmVyYXRvcnM7IHJldHVybiBtYWtlR2VuZXJhdG9ycyggX19WQV9BUkdTX18gKTsgfSAp IC8vTk9MSU5UKGdvb2dsZS1idWlsZC11c2luZy1uYW1lc3BhY2UpCi0jZGVmaW5lIEdFTkVSQVRF X1JFRiggLi4uICkgXAotICAgIENhdGNoOjpHZW5lcmF0b3JzOjpnZW5lcmF0ZSggSU5URVJOQUxf Q0FUQ0hfU1RSSU5HSVpFKElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKGdlbmVyYXRvcikpLCBc Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9MSU5FSU5G TywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdeyB1c2luZyBuYW1lc3Bh Y2UgQ2F0Y2g6OkdlbmVyYXRvcnM7IHJldHVybiBtYWtlR2VuZXJhdG9ycyggX19WQV9BUkdTX18g KTsgfSApIC8vTk9MSU5UKGdvb2dsZS1idWlsZC11c2luZy1uYW1lc3BhY2UpCi0KLS8vIGVuZCBj YXRjaF9nZW5lcmF0b3JzLmhwcAotLy8gc3RhcnQgY2F0Y2hfZ2VuZXJhdG9yc19nZW5lcmljLmhw cAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotbmFtZXNwYWNlIEdlbmVyYXRvcnMgewotCi0gICAgdGVt cGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgY2xhc3MgVGFrZUdlbmVyYXRvciA6IHB1YmxpYyBJR2Vu ZXJhdG9yPFQ+IHsKLSAgICAgICAgR2VuZXJhdG9yV3JhcHBlcjxUPiBtX2dlbmVyYXRvcjsKLSAg ICAgICAgc2l6ZV90IG1fcmV0dXJuZWQgPSAwOwotICAgICAgICBzaXplX3QgbV90YXJnZXQ7Ci0g ICAgcHVibGljOgotICAgICAgICBUYWtlR2VuZXJhdG9yKHNpemVfdCB0YXJnZXQsIEdlbmVyYXRv cldyYXBwZXI8VD4mJiBnZW5lcmF0b3IpOgotICAgICAgICAgICAgbV9nZW5lcmF0b3Ioc3RkOjpt b3ZlKGdlbmVyYXRvcikpLAotICAgICAgICAgICAgbV90YXJnZXQodGFyZ2V0KQotICAgICAgICB7 Ci0gICAgICAgICAgICBhc3NlcnQodGFyZ2V0ICE9IDAgJiYgIkVtcHR5IGdlbmVyYXRvcnMgYXJl IG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgVCBjb25zdCYgZ2V0KCkgY29uc3Qg b3ZlcnJpZGUgewotICAgICAgICAgICAgcmV0dXJuIG1fZ2VuZXJhdG9yLmdldCgpOwotICAgICAg ICB9Ci0gICAgICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgICsrbV9yZXR1 cm5lZDsKLSAgICAgICAgICAgIGlmIChtX3JldHVybmVkID49IG1fdGFyZ2V0KSB7Ci0gICAgICAg ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25z dCBhdXRvIHN1Y2Nlc3MgPSBtX2dlbmVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBJZiB0 aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggdmFsdWVzCi0g ICAgICAgICAgICAvLyB0aGVuIHdlIGN1dCBzaG9ydCBhcyB3ZWxsCi0gICAgICAgICAgICBpZiAo IXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICBtX3JldHVybmVkID0gbV90YXJnZXQ7Ci0gICAg ICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotICAgIH07 Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBHZW5lcmF0b3JXcmFwcGVyPFQ+IHRh a2Uoc2l6ZV90IHRhcmdldCwgR2VuZXJhdG9yV3JhcHBlcjxUPiYmIGdlbmVyYXRvcikgewotICAg ICAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxUPihwZjo6bWFrZV91bmlxdWU8VGFrZUdlbmVy YXRvcjxUPj4odGFyZ2V0LCBzdGQ6Om1vdmUoZ2VuZXJhdG9yKSkpOwotICAgIH0KLQotICAgIHRl bXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBQcmVkaWNhdGU+Ci0gICAgY2xhc3MgRmlsdGVy R2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4gewotICAgICAgICBHZW5lcmF0b3JXcmFw cGVyPFQ+IG1fZ2VuZXJhdG9yOwotICAgICAgICBQcmVkaWNhdGUgbV9wcmVkaWNhdGU7Ci0gICAg cHVibGljOgotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUCA9IFByZWRpY2F0ZT4KLSAgICAg ICAgRmlsdGVyR2VuZXJhdG9yKFAmJiBwcmVkLCBHZW5lcmF0b3JXcmFwcGVyPFQ+JiYgZ2VuZXJh dG9yKToKLSAgICAgICAgICAgIG1fZ2VuZXJhdG9yKHN0ZDo6bW92ZShnZW5lcmF0b3IpKSwKLSAg ICAgICAgICAgIG1fcHJlZGljYXRlKHN0ZDo6Zm9yd2FyZDxQPihwcmVkKSkKLSAgICAgICAgewot ICAgICAgICAgICAgaWYgKCFtX3ByZWRpY2F0ZShtX2dlbmVyYXRvci5nZXQoKSkpIHsKLSAgICAg ICAgICAgICAgICAvLyBJdCBtaWdodCBoYXBwZW4gdGhhdCB0aGVyZSBhcmUgbm8gdmFsdWVzIHRo YXQgcGFzcyB0aGUKLSAgICAgICAgICAgICAgICAvLyBmaWx0ZXIuIEluIHRoYXQgY2FzZSB3ZSB0 aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgYXV0byBoYXNfaW5pdGlhbF92YWx1 ZSA9IG5leHRJbXBsKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNfaW5pdGlhbF92YWx1ZSkg ewotICAgICAgICAgICAgICAgICAgICBDYXRjaDo6dGhyb3dfZXhjZXB0aW9uKEdlbmVyYXRvckV4 Y2VwdGlvbigiTm8gdmFsaWQgdmFsdWUgZm91bmQgaW4gZmlsdGVyZWQgZ2VuZXJhdG9yIikpOwot ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFQg Y29uc3QmIGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIHJldHVybiBtX2dlbmVy YXRvci5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsK LSAgICAgICAgICAgIHJldHVybiBuZXh0SW1wbCgpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRl OgotICAgICAgICBib29sIG5leHRJbXBsKCkgewotICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0g bV9nZW5lcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAg ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUg KCFtX3ByZWRpY2F0ZShtX2dlbmVyYXRvci5nZXQoKSkgJiYgKHN1Y2Nlc3MgPSBtX2dlbmVyYXRv ci5uZXh0KCkpID09IHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAg IH0KLSAgICB9OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFByZWRpY2F0 ZT4KLSAgICBHZW5lcmF0b3JXcmFwcGVyPFQ+IGZpbHRlcihQcmVkaWNhdGUmJiBwcmVkLCBHZW5l cmF0b3JXcmFwcGVyPFQ+JiYgZ2VuZXJhdG9yKSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmF0b3JX cmFwcGVyPFQ+KHN0ZDo6dW5pcXVlX3B0cjxJR2VuZXJhdG9yPFQ+PihwZjo6bWFrZV91bmlxdWU8 RmlsdGVyR2VuZXJhdG9yPFQsIFByZWRpY2F0ZT4+KHN0ZDo6Zm9yd2FyZDxQcmVkaWNhdGU+KHBy ZWQpLCBzdGQ6Om1vdmUoZ2VuZXJhdG9yKSkpKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgVD4KLSAgICBjbGFzcyBSZXBlYXRHZW5lcmF0b3IgOiBwdWJsaWMgSUdlbmVyYXRvcjxU PiB7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxULCBib29sPjo6dmFsdWUs Ci0gICAgICAgICAgICAiUmVwZWF0R2VuZXJhdG9yIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0 IGJvb2xzIgotICAgICAgICAgICAgImJlY2F1c2Ugb2Ygc3RkOjp2ZWN0b3I8Ym9vbD4gc3BlY2lh bGl6YXRpb24iKTsKLSAgICAgICAgR2VuZXJhdG9yV3JhcHBlcjxUPiBtX2dlbmVyYXRvcjsKLSAg ICAgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxUPiBtX3JldHVybmVkOwotICAgICAgICBzaXplX3Qg bV90YXJnZXRfcmVwZWF0czsKLSAgICAgICAgc2l6ZV90IG1fY3VycmVudF9yZXBlYXQgPSAwOwot ICAgICAgICBzaXplX3QgbV9yZXBlYXRfaW5kZXggPSAwOwotICAgIHB1YmxpYzoKLSAgICAgICAg UmVwZWF0R2VuZXJhdG9yKHNpemVfdCByZXBlYXRzLCBHZW5lcmF0b3JXcmFwcGVyPFQ+JiYgZ2Vu ZXJhdG9yKToKLSAgICAgICAgICAgIG1fZ2VuZXJhdG9yKHN0ZDo6bW92ZShnZW5lcmF0b3IpKSwK LSAgICAgICAgICAgIG1fdGFyZ2V0X3JlcGVhdHMocmVwZWF0cykKLSAgICAgICAgewotICAgICAg ICAgICAgYXNzZXJ0KG1fdGFyZ2V0X3JlcGVhdHMgPiAwICYmICJSZXBlYXQgZ2VuZXJhdG9yIG11 c3QgcmVwZWF0IGF0IGxlYXN0IG9uY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFQgY29uc3Qm IGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGlmIChtX2N1cnJlbnRfcmVwZWF0 ID09IDApIHsKLSAgICAgICAgICAgICAgICBtX3JldHVybmVkLnB1c2hfYmFjayhtX2dlbmVyYXRv ci5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fcmV0dXJuZWQuYmFjaygpOwotICAg ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fcmV0dXJuZWRbbV9yZXBlYXRfaW5kZXhd OwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBuZXh0KCkgb3ZlcnJpZGUgewotICAgICAgICAg ICAgLy8gVGhlcmUgYXJlIDIgYmFzaWMgY2FzZXM6Ci0gICAgICAgICAgICAvLyAxKSBXZSBhcmUg c3RpbGwgcmVhZGluZyB0aGUgZ2VuZXJhdG9yCi0gICAgICAgICAgICAvLyAyKSBXZSBhcmUgcmVh ZGluZyBvdXIgb3duIGNhY2hlCi0KLSAgICAgICAgICAgIC8vIEluIHRoZSBmaXJzdCBjYXNlLCB3 ZSBuZWVkIHRvIHBva2UgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yLgotICAgICAgICAgICAgLy8g SWYgaXQgaGFwcGlseSBtb3Zlcywgd2UgYXJlIGxlZnQgaW4gdGhhdCBzdGF0ZSwgb3RoZXJ3aXNl IGl0IGlzIHRpbWUgdG8gc3RhcnQgcmVhZGluZyBmcm9tIG91ciBjYWNoZQotICAgICAgICAgICAg aWYgKG1fY3VycmVudF9yZXBlYXQgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8g c3VjY2VzcyA9IG1fZ2VuZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nl c3MpIHsKLSAgICAgICAgICAgICAgICAgICAgKyttX2N1cnJlbnRfcmVwZWF0OwotICAgICAgICAg ICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbV9jdXJyZW50X3JlcGVhdCA8IG1fdGFy Z2V0X3JlcGVhdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEluIHRoZSBzZWNv bmQgY2FzZSwgd2UgbmVlZCB0byBtb3ZlIGluZGljZXMgZm9yd2FyZCBhbmQgY2hlY2sgdGhhdCB3 ZSBoYXZlbid0IHJ1biB1cCBhZ2FpbnN0IHRoZSBlbmQKLSAgICAgICAgICAgICsrbV9yZXBlYXRf aW5kZXg7Ci0gICAgICAgICAgICBpZiAobV9yZXBlYXRfaW5kZXggPT0gbV9yZXR1cm5lZC5zaXpl KCkpIHsKLSAgICAgICAgICAgICAgICBtX3JlcGVhdF9pbmRleCA9IDA7Ci0gICAgICAgICAgICAg ICAgKyttX2N1cnJlbnRfcmVwZWF0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJu IG1fY3VycmVudF9yZXBlYXQgPCBtX3RhcmdldF9yZXBlYXRzOwotICAgICAgICB9Ci0gICAgfTsK LQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIEdlbmVyYXRvcldyYXBwZXI8VD4gcmVw ZWF0KHNpemVfdCByZXBlYXRzLCBHZW5lcmF0b3JXcmFwcGVyPFQ+JiYgZ2VuZXJhdG9yKSB7Ci0g ICAgICAgIHJldHVybiBHZW5lcmF0b3JXcmFwcGVyPFQ+KHBmOjptYWtlX3VuaXF1ZTxSZXBlYXRH ZW5lcmF0b3I8VD4+KHJlcGVhdHMsIHN0ZDo6bW92ZShnZW5lcmF0b3IpKSk7Ci0gICAgfQotCi0g ICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEZ1bmM+Ci0gICAg Y2xhc3MgTWFwR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4gewotICAgICAgICAvLyBU QkQ6IHByb3ZpZGUgc3RhdGljIGFzc2VydCBmb3IgbWFwcGluZyBmdW5jdGlvbiwgZm9yIGZyaWVu ZGx5IGVycm9yIG1lc3NhZ2UKLSAgICAgICAgR2VuZXJhdG9yV3JhcHBlcjxVPiBtX2dlbmVyYXRv cjsKLSAgICAgICAgRnVuYyBtX2Z1bmN0aW9uOwotICAgICAgICAvLyBUbyBhdm9pZCByZXR1cm5p bmcgZGFuZ2xpbmcgcmVmZXJlbmNlLCB3ZSBoYXZlIHRvIHNhdmUgdGhlIHZhbHVlcwotICAgICAg ICBUIG1fY2FjaGU7Ci0gICAgcHVibGljOgotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRjIg PSBGdW5jPgotICAgICAgICBNYXBHZW5lcmF0b3IoRjImJiBmdW5jdGlvbiwgR2VuZXJhdG9yV3Jh cHBlcjxVPiYmIGdlbmVyYXRvcikgOgotICAgICAgICAgICAgbV9nZW5lcmF0b3Ioc3RkOjptb3Zl KGdlbmVyYXRvcikpLAotICAgICAgICAgICAgbV9mdW5jdGlvbihzdGQ6OmZvcndhcmQ8RjI+KGZ1 bmN0aW9uKSksCi0gICAgICAgICAgICBtX2NhY2hlKG1fZnVuY3Rpb24obV9nZW5lcmF0b3IuZ2V0 KCkpKQotICAgICAgICB7fQotCi0gICAgICAgIFQgY29uc3QmIGdldCgpIGNvbnN0IG92ZXJyaWRl IHsKLSAgICAgICAgICAgIHJldHVybiBtX2NhY2hlOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wg bmV4dCgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gc3VjY2VzcyA9IG1fZ2Vu ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAg ICAgbV9jYWNoZSA9IG1fZnVuY3Rpb24obV9nZW5lcmF0b3IuZ2V0KCkpOwotICAgICAgICAgICAg fQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAg dGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQgPSBGdW5jdGlv blJldHVyblR5cGU8RnVuYywgVT4+Ci0gICAgR2VuZXJhdG9yV3JhcHBlcjxUPiBtYXAoRnVuYyYm IGZ1bmN0aW9uLCBHZW5lcmF0b3JXcmFwcGVyPFU+JiYgZ2VuZXJhdG9yKSB7Ci0gICAgICAgIHJl dHVybiBHZW5lcmF0b3JXcmFwcGVyPFQ+KAotICAgICAgICAgICAgcGY6Om1ha2VfdW5pcXVlPE1h cEdlbmVyYXRvcjxULCBVLCBGdW5jPj4oc3RkOjpmb3J3YXJkPEZ1bmM+KGZ1bmN0aW9uKSwgc3Rk Ojptb3ZlKGdlbmVyYXRvcikpCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5 cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEZ1bmM+Ci0gICAgR2VuZXJhdG9yV3JhcHBl cjxUPiBtYXAoRnVuYyYmIGZ1bmN0aW9uLCBHZW5lcmF0b3JXcmFwcGVyPFU+JiYgZ2VuZXJhdG9y KSB7Ci0gICAgICAgIHJldHVybiBHZW5lcmF0b3JXcmFwcGVyPFQ+KAotICAgICAgICAgICAgcGY6 Om1ha2VfdW5pcXVlPE1hcEdlbmVyYXRvcjxULCBVLCBGdW5jPj4oc3RkOjpmb3J3YXJkPEZ1bmM+ KGZ1bmN0aW9uKSwgc3RkOjptb3ZlKGdlbmVyYXRvcikpCi0gICAgICAgICk7Ci0gICAgfQotCi0g ICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgY2xhc3MgQ2h1bmtHZW5lcmF0b3IgZmluYWwg OiBwdWJsaWMgSUdlbmVyYXRvcjxzdGQ6OnZlY3RvcjxUPj4gewotICAgICAgICBzdGQ6OnZlY3Rv cjxUPiBtX2NodW5rOwotICAgICAgICBzaXplX3QgbV9jaHVua19zaXplOwotICAgICAgICBHZW5l cmF0b3JXcmFwcGVyPFQ+IG1fZ2VuZXJhdG9yOwotICAgICAgICBib29sIG1fdXNlZF91cCA9IGZh bHNlOwotICAgIHB1YmxpYzoKLSAgICAgICAgQ2h1bmtHZW5lcmF0b3Ioc2l6ZV90IHNpemUsIEdl bmVyYXRvcldyYXBwZXI8VD4gZ2VuZXJhdG9yKSA6Ci0gICAgICAgICAgICBtX2NodW5rX3NpemUo c2l6ZSksIG1fZ2VuZXJhdG9yKHN0ZDo6bW92ZShnZW5lcmF0b3IpKQotICAgICAgICB7Ci0gICAg ICAgICAgICBtX2NodW5rLnJlc2VydmUobV9jaHVua19zaXplKTsKLSAgICAgICAgICAgIGlmICht X2NodW5rX3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fY2h1bmsucHVzaF9iYWNrKG1f Z2VuZXJhdG9yLmdldCgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8 IG1fY2h1bmtfc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbV9nZW5lcmF0 b3IubmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYXRjaDo6dGhyb3dfZXhjZXB0 aW9uKEdlbmVyYXRvckV4Y2VwdGlvbigiTm90IGVub3VnaCB2YWx1ZXMgdG8gaW5pdGlhbGl6ZSB0 aGUgZmlyc3QgY2h1bmsiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg ICAgICAgbV9jaHVuay5wdXNoX2JhY2sobV9nZW5lcmF0b3IuZ2V0KCkpOwotICAgICAgICAgICAg ICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdGQ6OnZlY3RvcjxUPiBj b25zdCYgZ2V0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgcmV0dXJuIG1fY2h1bms7 Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBuZXh0KCkgb3ZlcnJpZGUgewotICAgICAgICAgICAg bV9jaHVuay5jbGVhcigpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwg bV9jaHVua19zaXplOyArK2lkeCkgewotICAgICAgICAgICAgICAgIGlmICghbV9nZW5lcmF0b3Iu bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAg ICAgICB9Ci0gICAgICAgICAgICAgICAgbV9jaHVuay5wdXNoX2JhY2sobV9nZW5lcmF0b3IuZ2V0 KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K LSAgICB9OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgR2VuZXJhdG9yV3JhcHBl cjxzdGQ6OnZlY3RvcjxUPj4gY2h1bmsoc2l6ZV90IHNpemUsIEdlbmVyYXRvcldyYXBwZXI8VD4m JiBnZW5lcmF0b3IpIHsKLSAgICAgICAgcmV0dXJuIEdlbmVyYXRvcldyYXBwZXI8c3RkOjp2ZWN0 b3I8VD4+KAotICAgICAgICAgICAgcGY6Om1ha2VfdW5pcXVlPENodW5rR2VuZXJhdG9yPFQ+Pihz aXplLCBzdGQ6Om1vdmUoZ2VuZXJhdG9yKSkKLSAgICAgICAgKTsKLSAgICB9Ci0KLX0gLy8gbmFt ZXNwYWNlIEdlbmVyYXRvcnMKLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9n ZW5lcmF0b3JzX2dlbmVyaWMuaHBwCi0vLyBzdGFydCBjYXRjaF9nZW5lcmF0b3JzX3NwZWNpZmlj LmhwcAotCi0vLyBzdGFydCBjYXRjaF9jb250ZXh0LmgKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQot bmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZTsKLSAgICBzdHJ1 Y3QgSVJ1bm5lcjsKLSAgICBzdHJ1Y3QgSUNvbmZpZzsKLSAgICBzdHJ1Y3QgSU11dGFibGVDb250 ZXh0OwotCi0gICAgdXNpbmcgSUNvbmZpZ1B0ciA9IHN0ZDo6c2hhcmVkX3B0cjxJQ29uZmlnIGNv bnN0PjsKLQotICAgIHN0cnVjdCBJQ29udGV4dAotICAgIHsKLSAgICAgICAgdmlydHVhbCB+SUNv bnRleHQoKTsKLQotICAgICAgICB2aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0 dXJlKCkgPSAwOwotICAgICAgICB2aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpID0gMDsKLSAg ICAgICAgdmlydHVhbCBJQ29uZmlnUHRyIGNvbnN0JiBnZXRDb25maWcoKSBjb25zdCA9IDA7Ci0g ICAgfTsKLQotICAgIHN0cnVjdCBJTXV0YWJsZUNvbnRleHQgOiBJQ29udGV4dAotICAgIHsKLSAg ICAgICAgdmlydHVhbCB+SU11dGFibGVDb250ZXh0KCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBz ZXRSZXN1bHRDYXB0dXJlKCBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApID0gMDsKLSAg ICAgICAgdmlydHVhbCB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgPSAwOwotICAg ICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29uZmlnKCBJQ29uZmlnUHRyIGNvbnN0JiBjb25maWcgKSA9 IDA7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgSU11dGFibGVDb250ZXh0ICpjdXJy ZW50Q29udGV4dDsKLSAgICAgICAgZnJpZW5kIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11 dGFibGVDb250ZXh0KCk7Ci0gICAgICAgIGZyaWVuZCB2b2lkIGNsZWFuVXBDb250ZXh0KCk7Ci0g ICAgICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUNvbnRleHQoKTsKLSAgICB9OwotCi0gICAgaW5saW5l IElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkKLSAgICB7Ci0gICAg ICAgIGlmKCAhSU11dGFibGVDb250ZXh0OjpjdXJyZW50Q29udGV4dCApCi0gICAgICAgICAgICBJ TXV0YWJsZUNvbnRleHQ6OmNyZWF0ZUNvbnRleHQoKTsKLSAgICAgICAgLy8gTk9MSU5UTkVYVExJ TkUoY2xhbmctYW5hbHl6ZXItY29yZS51bmluaXRpYWxpemVkLlVuZGVmUmV0dXJuKQotICAgICAg ICByZXR1cm4gKklNdXRhYmxlQ29udGV4dDo6Y3VycmVudENvbnRleHQ7Ci0gICAgfQotCi0gICAg aW5saW5lIElDb250ZXh0JiBnZXRDdXJyZW50Q29udGV4dCgpCi0gICAgewotICAgICAgICByZXR1 cm4gZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhblVw Q29udGV4dCgpOwotCi0gICAgY2xhc3MgU2ltcGxlUGNnMzI7Ci0gICAgU2ltcGxlUGNnMzImIHJu ZygpOwotfQotCi0vLyBlbmQgY2F0Y2hfY29udGV4dC5oCi0vLyBzdGFydCBjYXRjaF9pbnRlcmZh Y2VzX2NvbmZpZy5oCi0KLS8vIHN0YXJ0IGNhdGNoX29wdGlvbi5ocHAKLQotbmFtZXNwYWNlIENh dGNoIHsKLQotICAgIC8vIEFuIG9wdGlvbmFsIHR5cGUKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU PgotICAgIGNsYXNzIE9wdGlvbiB7Ci0gICAgcHVibGljOgotICAgICAgICBPcHRpb24oKSA6IG51 bGxhYmxlVmFsdWUoIG51bGxwdHIgKSB7fQotICAgICAgICBPcHRpb24oIFQgY29uc3QmIF92YWx1 ZSApCi0gICAgICAgIDogbnVsbGFibGVWYWx1ZSggbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICkg KQotICAgICAgICB7fQotICAgICAgICBPcHRpb24oIE9wdGlvbiBjb25zdCYgX290aGVyICkKLSAg ICAgICAgOiBudWxsYWJsZVZhbHVlKCBfb3RoZXIgPyBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVy ICkgOiBudWxscHRyICkKLSAgICAgICAge30KLQotICAgICAgICB+T3B0aW9uKCkgewotICAgICAg ICAgICAgcmVzZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9wdGlvbiYgb3BlcmF0b3I9ICgg T3B0aW9uIGNvbnN0JiBfb3RoZXIgKSB7Ci0gICAgICAgICAgICBpZiggJl9vdGhlciAhPSB0aGlz ICkgewotICAgICAgICAgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYoIF9vdGhl ciApCi0gICAgICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBU KCAqX290aGVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0g ICAgICAgIH0KLSAgICAgICAgT3B0aW9uJiBvcGVyYXRvciA9ICggVCBjb25zdCYgX3ZhbHVlICkg ewotICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXco IHN0b3JhZ2UgKSBUKCBfdmFsdWUgKTsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAg ICAgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBpZiggbnVsbGFibGVW YWx1ZSApCi0gICAgICAgICAgICAgICAgbnVsbGFibGVWYWx1ZS0+flQoKTsKLSAgICAgICAgICAg IG51bGxhYmxlVmFsdWUgPSBudWxscHRyOwotICAgICAgICB9Ci0KLSAgICAgICAgVCYgb3BlcmF0 b3IqKCkgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KLSAgICAgICAgVCBjb25zdCYgb3BlcmF0 b3IqKCkgY29uc3QgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KLSAgICAgICAgVCogb3BlcmF0 b3ItPigpIHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KLSAgICAgICAgY29uc3QgVCogb3BlcmF0 b3ItPigpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KLQotICAgICAgICBUIHZhbHVl T3IoIFQgY29uc3QmIGRlZmF1bHRWYWx1ZSApIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBu dWxsYWJsZVZhbHVlID8gKm51bGxhYmxlVmFsdWUgOiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0K LQotICAgICAgICBib29sIHNvbWUoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlICE9IG51 bGxwdHI7IH0KLSAgICAgICAgYm9vbCBub25lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1 ZSA9PSBudWxscHRyOyB9Ci0KLSAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1 cm4gbnVsbGFibGVWYWx1ZSA9PSBudWxscHRyOyB9Ci0gICAgICAgIGV4cGxpY2l0IG9wZXJhdG9y IGJvb2woKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gc29tZSgpOwotICAgICAgICB9Ci0K LSAgICBwcml2YXRlOgotICAgICAgICBUICpudWxsYWJsZVZhbHVlOwotICAgICAgICBhbGlnbmFz KGFsaWdub2YoVCkpIGNoYXIgc3RvcmFnZVtzaXplb2YoVCldOwotICAgIH07Ci0KLX0gLy8gZW5k IG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfb3B0aW9uLmhwcAotI2luY2x1ZGUgPGNo cm9ubz4KLSNpbmNsdWRlIDxpb3Nmd2Q+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZl Y3Rvcj4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBlbnVt IGNsYXNzIFZlcmJvc2l0eSB7Ci0gICAgICAgIFF1aWV0ID0gMCwKLSAgICAgICAgTm9ybWFsLAot ICAgICAgICBIaWdoCi0gICAgfTsKLQotICAgIHN0cnVjdCBXYXJuQWJvdXQgeyBlbnVtIFdoYXQg ewotICAgICAgICBOb3RoaW5nID0gMHgwMCwKLSAgICAgICAgTm9Bc3NlcnRpb25zID0gMHgwMSwK LSAgICAgICAgTm9UZXN0cyA9IDB4MDIKLSAgICB9OyB9OwotCi0gICAgc3RydWN0IFNob3dEdXJh dGlvbnMgeyBlbnVtIE9yTm90IHsKLSAgICAgICAgRGVmYXVsdEZvclJlcG9ydGVyLAotICAgICAg ICBBbHdheXMsCi0gICAgICAgIE5ldmVyCi0gICAgfTsgfTsKLSAgICBzdHJ1Y3QgUnVuVGVzdHMg eyBlbnVtIEluV2hhdE9yZGVyIHsKLSAgICAgICAgSW5EZWNsYXJhdGlvbk9yZGVyLAotICAgICAg ICBJbkxleGljb2dyYXBoaWNhbE9yZGVyLAotICAgICAgICBJblJhbmRvbU9yZGVyCi0gICAgfTsg fTsKLSAgICBzdHJ1Y3QgVXNlQ29sb3VyIHsgZW51bSBZZXNPck5vIHsKLSAgICAgICAgQXV0bywK LSAgICAgICAgWWVzLAotICAgICAgICBObwotICAgIH07IH07Ci0gICAgc3RydWN0IFdhaXRGb3JL ZXlwcmVzcyB7IGVudW0gV2hlbiB7Ci0gICAgICAgIE5ldmVyLAotICAgICAgICBCZWZvcmVTdGFy dCA9IDEsCi0gICAgICAgIEJlZm9yZUV4aXQgPSAyLAotICAgICAgICBCZWZvcmVTdGFydEFuZEV4 aXQgPSBCZWZvcmVTdGFydCB8IEJlZm9yZUV4aXQKLSAgICB9OyB9OwotCi0gICAgY2xhc3MgVGVz dFNwZWM7Ci0KLSAgICBzdHJ1Y3QgSUNvbmZpZyA6IE5vbkNvcHlhYmxlIHsKLQotICAgICAgICB2 aXJ0dWFsIH5JQ29uZmlnKCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkg Y29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3Qg PSAwOwotICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIG5hbWUoKSBjb25zdCA9IDA7Ci0gICAg ICAgIHZpcnR1YWwgYm9vbCBpbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSBjb25zdCA9IDA7Ci0g ICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgPSAwOwotICAgICAg ICB2aXJ0dWFsIGJvb2wgd2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSBjb25zdCA9IDA7Ci0g ICAgICAgIHZpcnR1YWwgYm9vbCB3YXJuQWJvdXROb1Rlc3RzKCkgY29uc3QgPSAwOwotICAgICAg ICB2aXJ0dWFsIGludCBhYm9ydEFmdGVyKCkgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIGJv b2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0 aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9ucygpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBk b3VibGUgbWluRHVyYXRpb24oKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgVGVzdFNwZWMg Y29uc3QmIHRlc3RTcGVjKCkgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzVGVz dEZpbHRlcnMoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpz dHJpbmc+IGNvbnN0JiBnZXRUZXN0c09yVGFncygpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVh bCBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZp cnR1YWwgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwg VXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cigpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVh bCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFNlY3Rpb25zVG9SdW4oKSBjb25z dCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgVmVyYm9zaXR5IHZlcmJvc2l0eSgpIGNvbnN0ID0gMDsK LQotICAgICAgICB2aXJ0dWFsIGJvb2wgYmVuY2htYXJrTm9BbmFseXNpcygpIGNvbnN0ID0gMDsK LSAgICAgICAgdmlydHVhbCBpbnQgYmVuY2htYXJrU2FtcGxlcygpIGNvbnN0ID0gMDsKLSAgICAg ICAgdmlydHVhbCBkb3VibGUgYmVuY2htYXJrQ29uZmlkZW5jZUludGVydmFsKCkgY29uc3QgPSAw OwotICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBiZW5jaG1hcmtSZXNhbXBsZXMoKSBjb25z dCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBiZW5jaG1h cmtXYXJtdXBUaW1lKCkgY29uc3QgPSAwOwotICAgIH07Ci0KLSAgICB1c2luZyBJQ29uZmlnUHRy ID0gc3RkOjpzaGFyZWRfcHRyPElDb25maWcgY29uc3Q+OwotfQotCi0vLyBlbmQgY2F0Y2hfaW50 ZXJmYWNlc19jb25maWcuaAotLy8gc3RhcnQgY2F0Y2hfcmFuZG9tX251bWJlcl9nZW5lcmF0b3Iu aAotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIC8vIFRo aXMgaXMgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgQysrMTEgVW5pZm9ybSBSYW5kb20gTnVt YmVyCi0gICAgLy8gR2VuZXJhdG9yLiBJdCBkb2VzIG5vdCBwcm92aWRlIGFsbCBvcGVyYXRvcnMs IGJlY2F1c2UgQ2F0Y2gyCi0gICAgLy8gZG9lcyBub3QgdXNlIGl0LCBidXQgaXQgc2hvdWxkIGJl aGF2ZSBhcyBleHBlY3RlZCBpbnNpZGUgc3RkbGliJ3MKLSAgICAvLyBkaXN0cmlidXRpb25zLgot ICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgUENHIGZhbWlseSAoaHR0 cDovL3BjZy1yYW5kb20ub3JnKQotICAgIGNsYXNzIFNpbXBsZVBjZzMyIHsKLSAgICAgICAgdXNp bmcgc3RhdGVfdHlwZSA9IHN0ZDo6dWludDY0X3Q7Ci0gICAgcHVibGljOgotICAgICAgICB1c2lu ZyByZXN1bHRfdHlwZSA9IHN0ZDo6dWludDMyX3Q7Ci0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIg cmVzdWx0X3R5cGUgKG1pbikoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQot ICAgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIChtYXgpKCkgewotICAgICAgICAg ICAgcmV0dXJuIHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPigtMSk7Ci0gICAgICAgIH0KLQotICAg ICAgICAvLyBQcm92aWRlIHNvbWUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIGZvciB0aGUgZGVmYXVs dCBjb25zdHJ1Y3RvcgotICAgICAgICBTaW1wbGVQY2czMigpOlNpbXBsZVBjZzMyKDB4ZWQ3NDNj YzRVKSB7fQotCi0gICAgICAgIGV4cGxpY2l0IFNpbXBsZVBjZzMyKHJlc3VsdF90eXBlIHNlZWRf KTsKLQotICAgICAgICB2b2lkIHNlZWQocmVzdWx0X3R5cGUgc2VlZF8pOwotICAgICAgICB2b2lk IGRpc2NhcmQodWludDY0X3Qgc2tpcCk7Ci0KLSAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3Io KSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShTaW1w bGVQY2czMiBjb25zdCYgbGhzLCBTaW1wbGVQY2czMiBjb25zdCYgcmhzKTsKLSAgICAgICAgZnJp ZW5kIGJvb2wgb3BlcmF0b3IhPShTaW1wbGVQY2czMiBjb25zdCYgbGhzLCBTaW1wbGVQY2czMiBj b25zdCYgcmhzKTsKLQotICAgICAgICAvLyBJbiB0aGVvcnkgd2UgYWxzbyBuZWVkIG9wZXJhdG9y PDwgYW5kIG9wZXJhdG9yPj4KLSAgICAgICAgLy8gSW4gcHJhY3RpY2Ugd2UgZG8gbm90IHVzZSB0 aGVtLCBzbyB3ZSB3aWxsIHNraXAgdGhlbSBmb3Igbm93Ci0KLSAgICAgICAgc3RkOjp1aW50NjRf dCBtX3N0YXRlOwotICAgICAgICAvLyBUaGlzIHBhcnQgb2YgdGhlIHN0YXRlIGRldGVybWluZXMg d2hpY2ggInN0cmVhbSIgb2YgdGhlIG51bWJlcnMKLSAgICAgICAgLy8gaXMgY2hvc2VuIC0tIHdl IHRha2UgaXQgYXMgYSBjb25zdGFudCBmb3IgQ2F0Y2gyLCBzbyB3ZSBvbmx5Ci0gICAgICAgIC8v IG5lZWQgdG8gZGVhbCB3aXRoIHNlZWRpbmcgdGhlIG1haW4gc3RhdGUuCi0gICAgICAgIC8vIFBp Y2tlZCBieSByZWFkaW5nIDggYnl0ZXMgZnJvbSBgL2Rldi9yYW5kb21gIDotKQotICAgICAgICBz dGF0aWMgY29uc3Qgc3RkOjp1aW50NjRfdCBzX2luYyA9ICgweDEzZWQwY2M1M2Y5Mzk0NzZVTEwg PDwgMVVMTCkgfCAxVUxMOwotICAgIH07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotCi0v LyBlbmQgY2F0Y2hfcmFuZG9tX251bWJlcl9nZW5lcmF0b3IuaAotI2luY2x1ZGUgPHJhbmRvbT4K LQotbmFtZXNwYWNlIENhdGNoIHsKLW5hbWVzcGFjZSBHZW5lcmF0b3JzIHsKLQotdGVtcGxhdGUg PHR5cGVuYW1lIEZsb2F0PgotY2xhc3MgUmFuZG9tRmxvYXRpbmdHZW5lcmF0b3IgZmluYWwgOiBw dWJsaWMgSUdlbmVyYXRvcjxGbG9hdD4gewotICAgIENhdGNoOjpTaW1wbGVQY2czMiYgbV9ybmc7 Ci0gICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPEZsb2F0PiBtX2Rpc3Q7Ci0gICAg RmxvYXQgbV9jdXJyZW50X251bWJlcjsKLXB1YmxpYzoKLQotICAgIFJhbmRvbUZsb2F0aW5nR2Vu ZXJhdG9yKEZsb2F0IGEsIEZsb2F0IGIpOgotICAgICAgICBtX3JuZyhybmcoKSksCi0gICAgICAg IG1fZGlzdChhLCBiKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KG5leHQoKSk7Ci0gICAg fQotCi0gICAgRmxvYXQgY29uc3QmIGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgcmV0 dXJuIG1fY3VycmVudF9udW1iZXI7Ci0gICAgfQotICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsK LSAgICAgICAgbV9jdXJyZW50X251bWJlciA9IG1fZGlzdChtX3JuZyk7Ci0gICAgICAgIHJldHVy biB0cnVlOwotICAgIH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlZ2VyPgotY2xhc3Mg UmFuZG9tSW50ZWdlckdlbmVyYXRvciBmaW5hbCA6IHB1YmxpYyBJR2VuZXJhdG9yPEludGVnZXI+ IHsKLSAgICBDYXRjaDo6U2ltcGxlUGNnMzImIG1fcm5nOwotICAgIHN0ZDo6dW5pZm9ybV9pbnRf ZGlzdHJpYnV0aW9uPEludGVnZXI+IG1fZGlzdDsKLSAgICBJbnRlZ2VyIG1fY3VycmVudF9udW1i ZXI7Ci1wdWJsaWM6Ci0KLSAgICBSYW5kb21JbnRlZ2VyR2VuZXJhdG9yKEludGVnZXIgYSwgSW50 ZWdlciBiKToKLSAgICAgICAgbV9ybmcocm5nKCkpLAotICAgICAgICBtX2Rpc3QoYSwgYikgewot ICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihuZXh0KCkpOwotICAgIH0KLQotICAgIEludGVnZXIg Y29uc3QmIGdldCgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1fY3VycmVudF9u dW1iZXI7Ci0gICAgfQotICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKLSAgICAgICAgbV9jdXJy ZW50X251bWJlciA9IG1fZGlzdChtX3JuZyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K LX07Ci0KLS8vIFRPRE86IElkZWFsbHkgdGhpcyB3b3VsZCBiZSBhbHNvIGNvbnN0cmFpbmVkIGFn YWluc3QgdGhlIHZhcmlvdXMgY2hhciB0eXBlcywKLS8vICAgICAgIGJ1dCBJIGRvbid0IGV4cGVj dCB1c2VycyB0byBydW4gaW50byB0aGF0IGluIHByYWN0aWNlLgotdGVtcGxhdGUgPHR5cGVuYW1l IFQ+Ci10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAm JiAhc3RkOjppc19zYW1lPFQsIGJvb2w+Ojp2YWx1ZSwKLUdlbmVyYXRvcldyYXBwZXI8VD4+Ojp0 eXBlCi1yYW5kb20oVCBhLCBUIGIpIHsKLSAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxUPigK LSAgICAgICAgcGY6Om1ha2VfdW5pcXVlPFJhbmRvbUludGVnZXJHZW5lcmF0b3I8VD4+KGEsIGIp Ci0gICAgKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBzdGQ6OmVuYWJs ZV9pZjxzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSwKLUdlbmVyYXRvcldyYXBwZXI8 VD4+Ojp0eXBlCi1yYW5kb20oVCBhLCBUIGIpIHsKLSAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBl cjxUPigKLSAgICAgICAgcGY6Om1ha2VfdW5pcXVlPFJhbmRvbUZsb2F0aW5nR2VuZXJhdG9yPFQ+ PihhLCBiKQotICAgICk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUmFuZ2VH ZW5lcmF0b3IgZmluYWwgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7Ci0gICAgVCBtX2N1cnJlbnQ7 Ci0gICAgVCBtX2VuZDsKLSAgICBUIG1fc3RlcDsKLSAgICBib29sIG1fcG9zaXRpdmU7Ci0KLXB1 YmxpYzoKLSAgICBSYW5nZUdlbmVyYXRvcihUIGNvbnN0JiBzdGFydCwgVCBjb25zdCYgZW5kLCBU IGNvbnN0JiBzdGVwKToKLSAgICAgICAgbV9jdXJyZW50KHN0YXJ0KSwKLSAgICAgICAgbV9lbmQo ZW5kKSwKLSAgICAgICAgbV9zdGVwKHN0ZXApLAotICAgICAgICBtX3Bvc2l0aXZlKG1fc3RlcCA+ IFQoMCkpCi0gICAgewotICAgICAgICBhc3NlcnQobV9jdXJyZW50ICE9IG1fZW5kICYmICJSYW5n ZSBzdGFydCBhbmQgZW5kIGNhbm5vdCBiZSBlcXVhbCIpOwotICAgICAgICBhc3NlcnQobV9zdGVw ICE9IFQoMCkgJiYgIlN0ZXAgc2l6ZSBjYW5ub3QgYmUgemVybyIpOwotICAgICAgICBhc3NlcnQo KChtX3Bvc2l0aXZlICYmIG1fY3VycmVudCA8PSBtX2VuZCkgfHwgKCFtX3Bvc2l0aXZlICYmIG1f Y3VycmVudCA+PSBtX2VuZCkpICYmICJTdGVwIG1vdmVzIGF3YXkgZnJvbSBlbmQiKTsKLSAgICB9 Ci0KLSAgICBSYW5nZUdlbmVyYXRvcihUIGNvbnN0JiBzdGFydCwgVCBjb25zdCYgZW5kKToKLSAg ICAgICAgUmFuZ2VHZW5lcmF0b3Ioc3RhcnQsIGVuZCwgKHN0YXJ0IDwgZW5kKSA/IFQoMSkgOiBU KC0xKSkKLSAgICB7fQotCi0gICAgVCBjb25zdCYgZ2V0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAg ICAgICByZXR1cm4gbV9jdXJyZW50OwotICAgIH0KLQotICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRl IHsKLSAgICAgICAgbV9jdXJyZW50ICs9IG1fc3RlcDsKLSAgICAgICAgcmV0dXJuIChtX3Bvc2l0 aXZlKSA/IChtX2N1cnJlbnQgPCBtX2VuZCkgOiAobV9jdXJyZW50ID4gbV9lbmQpOwotICAgIH0K LX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotR2VuZXJhdG9yV3JhcHBlcjxUPiByYW5nZShU IGNvbnN0JiBzdGFydCwgVCBjb25zdCYgZW5kLCBUIGNvbnN0JiBzdGVwKSB7Ci0gICAgc3RhdGlj X2Fzc2VydChzdGQ6OmlzX2FyaXRobWV0aWM8VD46OnZhbHVlICYmICFzdGQ6OmlzX3NhbWU8VCwg Ym9vbD46OnZhbHVlLCAiVHlwZSBtdXN0IGJlIG51bWVyaWMiKTsKLSAgICByZXR1cm4gR2VuZXJh dG9yV3JhcHBlcjxUPihwZjo6bWFrZV91bmlxdWU8UmFuZ2VHZW5lcmF0b3I8VD4+KHN0YXJ0LCBl bmQsIHN0ZXApKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1HZW5lcmF0b3JXcmFwcGVy PFQ+IHJhbmdlKFQgY29uc3QmIHN0YXJ0LCBUIGNvbnN0JiBlbmQpIHsKLSAgICBzdGF0aWNfYXNz ZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlICYmICFzdGQ6OmlzX3NhbWU8VCwgYm9vbD46 OnZhbHVlLCAiVHlwZSBtdXN0IGJlIGFuIGludGVnZXIiKTsKLSAgICByZXR1cm4gR2VuZXJhdG9y V3JhcHBlcjxUPihwZjo6bWFrZV91bmlxdWU8UmFuZ2VHZW5lcmF0b3I8VD4+KHN0YXJ0LCBlbmQp KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBJdGVyYXRvckdlbmVyYXRvciBm aW5hbCA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKLSAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6Omlz X3NhbWU8VCwgYm9vbD46OnZhbHVlLAotICAgICAgICAiSXRlcmF0b3JHZW5lcmF0b3IgY3VycmVu dGx5IGRvZXMgbm90IHN1cHBvcnQgYm9vbHMiCi0gICAgICAgICJiZWNhdXNlIG9mIHN0ZDo6dmVj dG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uIik7Ci0KLSAgICBzdGQ6OnZlY3RvcjxUPiBtX2VsZW1z OwotICAgIHNpemVfdCBtX2N1cnJlbnQgPSAwOwotcHVibGljOgotICAgIHRlbXBsYXRlIDx0eXBl bmFtZSBJbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBJbnB1dFNlbnRpbmVsPgotICAgIEl0ZXJhdG9y R2VuZXJhdG9yKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0U2VudGluZWwgbGFzdCk6bV9lbGVt cyhmaXJzdCwgbGFzdCkgewotICAgICAgICBpZiAobV9lbGVtcy5lbXB0eSgpKSB7Ci0gICAgICAg ICAgICBDYXRjaDo6dGhyb3dfZXhjZXB0aW9uKEdlbmVyYXRvckV4Y2VwdGlvbigiSXRlcmF0b3JH ZW5lcmF0b3IgcmVjZWl2ZWQgbm8gdmFsaWQgdmFsdWVzIikpOwotICAgICAgICB9Ci0gICAgfQot Ci0gICAgVCBjb25zdCYgZ2V0KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbV9l bGVtc1ttX2N1cnJlbnRdOwotICAgIH0KLQotICAgIGJvb2wgbmV4dCgpIG92ZXJyaWRlIHsKLSAg ICAgICAgKyttX2N1cnJlbnQ7Ci0gICAgICAgIHJldHVybiBtX2N1cnJlbnQgIT0gbV9lbGVtcy5z aXplKCk7Ci0gICAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcmF0b3IsCi0g ICAgICAgICAgdHlwZW5hbWUgSW5wdXRTZW50aW5lbCwKLSAgICAgICAgICB0eXBlbmFtZSBSZXN1 bHRUeXBlID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SW5wdXRJdGVyYXRvcj46OnZh bHVlX3R5cGU+Ci1HZW5lcmF0b3JXcmFwcGVyPFJlc3VsdFR5cGU+IGZyb21fcmFuZ2UoSW5wdXRJ dGVyYXRvciBmcm9tLCBJbnB1dFNlbnRpbmVsIHRvKSB7Ci0gICAgcmV0dXJuIEdlbmVyYXRvcldy YXBwZXI8UmVzdWx0VHlwZT4ocGY6Om1ha2VfdW5pcXVlPEl0ZXJhdG9yR2VuZXJhdG9yPFJlc3Vs dFR5cGU+Pihmcm9tLCB0bykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyLAot ICAgICAgICAgIHR5cGVuYW1lIFJlc3VsdFR5cGUgPSB0eXBlbmFtZSBDb250YWluZXI6OnZhbHVl X3R5cGU+Ci1HZW5lcmF0b3JXcmFwcGVyPFJlc3VsdFR5cGU+IGZyb21fcmFuZ2UoQ29udGFpbmVy IGNvbnN0JiBjbnQpIHsKLSAgICByZXR1cm4gR2VuZXJhdG9yV3JhcHBlcjxSZXN1bHRUeXBlPihw Zjo6bWFrZV91bmlxdWU8SXRlcmF0b3JHZW5lcmF0b3I8UmVzdWx0VHlwZT4+KGNudC5iZWdpbigp LCBjbnQuZW5kKCkpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgR2VuZXJhdG9ycwotfSAvLyBuYW1l c3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX2dlbmVyYXRvcnNfc3BlY2lmaWMuaHBwCi0KLS8v IFRoZXNlIGZpbGVzIGFyZSBpbmNsdWRlZCBoZXJlIHNvIHRoZSBzaW5nbGVfaW5jbHVkZSBzY3Jp cHQgZG9lc24ndCBwdXQgdGhlbQotLy8gaW4gdGhlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgc2Vj dGlvbnMKLS8vIHN0YXJ0IGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmgKLQotI2luY2x1ZGUgPHN0cmlu Zz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaWZkZWYgX19jbGFu Z19fCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9z dGljIGlnbm9yZWQgIi1XcGFkZGVkIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAg ICBzdHJ1Y3QgSVRlc3RJbnZva2VyOwotCi0gICAgc3RydWN0IFRlc3RDYXNlSW5mbyB7Ci0gICAg ICAgIGVudW0gU3BlY2lhbFByb3BlcnRpZXN7Ci0gICAgICAgICAgICBOb25lID0gMCwKLSAgICAg ICAgICAgIElzSGlkZGVuID0gMSA8PCAxLAotICAgICAgICAgICAgU2hvdWxkRmFpbCA9IDEgPDwg MiwKLSAgICAgICAgICAgIE1heUZhaWwgPSAxIDw8IDMsCi0gICAgICAgICAgICBUaHJvd3MgPSAx IDw8IDQsCi0gICAgICAgICAgICBOb25Qb3J0YWJsZSA9IDEgPDwgNSwKLSAgICAgICAgICAgIEJl bmNobWFyayA9IDEgPDwgNgotICAgICAgICB9OwotCi0gICAgICAgIFRlc3RDYXNlSW5mbyggICBz dGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0 cmluZyBjb25zdCYgX2NsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3Ry aW5nIGNvbnN0JiBfZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZl Y3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIF90YWdzLAotICAgICAgICAgICAgICAgICAgICAgICAg U291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApOwotCi0gICAgICAgIGZyaWVuZCB2b2lk IHNldFRhZ3MoIFRlc3RDYXNlSW5mbyYgdGVzdENhc2VJbmZvLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0 cmluZz4gdGFncyApOwotCi0gICAgICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdDsKLSAgICAgICAg Ym9vbCB0aHJvd3MoKSBjb25zdDsKLSAgICAgICAgYm9vbCBva1RvRmFpbCgpIGNvbnN0OwotICAg ICAgICBib29sIGV4cGVjdGVkVG9GYWlsKCkgY29uc3Q7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcg dGFnc0FzU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAg ICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lOwotICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlv bjsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRhZ3M7Ci0gICAgICAgIHN0ZDo6 dmVjdG9yPHN0ZDo6c3RyaW5nPiBsY2FzZVRhZ3M7Ci0gICAgICAgIFNvdXJjZUxpbmVJbmZvIGxp bmVJbmZvOwotICAgICAgICBTcGVjaWFsUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotICAgIH07Ci0K LSAgICBjbGFzcyBUZXN0Q2FzZSA6IHB1YmxpYyBUZXN0Q2FzZUluZm8gewotICAgIHB1YmxpYzoK LQotICAgICAgICBUZXN0Q2FzZSggSVRlc3RJbnZva2VyKiB0ZXN0Q2FzZSwgVGVzdENhc2VJbmZv JiYgaW5mbyApOwotCi0gICAgICAgIFRlc3RDYXNlIHdpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25z dCYgX25ld05hbWUgKSBjb25zdDsKLQotICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0OwotCi0g ICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Q7Ci0KLSAg ICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0Owot ICAgICAgICBib29sIG9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsK LQotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJVGVzdEludm9rZXI+IHRl c3Q7Ci0gICAgfTsKLQotICAgIFRlc3RDYXNlIG1ha2VUZXN0Q2FzZSggIElUZXN0SW52b2tlciog dGVzdENhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3Qm IGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lQW5kVGFncyBjb25z dCYgbmFtZUFuZFRhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUlu Zm8gY29uc3QmIGxpbmVJbmZvICk7Ci19Ci0KLSNpZmRlZiBfX2NsYW5nX18KLSNwcmFnbWEgY2xh bmcgZGlhZ25vc3RpYyBwb3AKLSNlbmRpZgotCi0vLyBlbmQgY2F0Y2hfdGVzdF9jYXNlX2luZm8u aAotLy8gc3RhcnQgY2F0Y2hfaW50ZXJmYWNlc19ydW5uZXIuaAotCi1uYW1lc3BhY2UgQ2F0Y2gg ewotCi0gICAgc3RydWN0IElSdW5uZXIgewotICAgICAgICB2aXJ0dWFsIH5JUnVubmVyKCk7Ci0g ICAgICAgIHZpcnR1YWwgYm9vbCBhYm9ydGluZygpIGNvbnN0ID0gMDsKLSAgICB9OwotfQotCi0v LyBlbmQgY2F0Y2hfaW50ZXJmYWNlc19ydW5uZXIuaAotCi0jaWZkZWYgX19PQkpDX18KLS8vIHN0 YXJ0IGNhdGNoX29iamMuaHBwCi0KLSNpbXBvcnQgPG9iamMvcnVudGltZS5oPgotCi0jaW5jbHVk ZSA8c3RyaW5nPgotCi0vLyBOQi4gQW55IGdlbmVyYWwgY2F0Y2ggaGVhZGVycyBpbmNsdWRlZCBo ZXJlIG11c3QgYmUgaW5jbHVkZWQKLS8vIGluIGNhdGNoLmhwcCBmaXJzdCB0byBtYWtlIHN1cmUg dGhleSBhcmUgaW5jbHVkZWQgYnkgdGhlIHNpbmdsZQotLy8gaGVhZGVyIGZvciBub24gb2JqLXVz YWdlCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRoaXMgcHJvdG9jb2wgaXMgcmVhbGx5 IG9ubHkgaGVyZSBmb3IgKHNlbGYpIGRvY3VtZW50aW5nIHB1cnBvc2VzLCBzaW5jZQotLy8gYWxs IGl0cyBtZXRob2RzIGFyZSBvcHRpb25hbC4KLUBwcm90b2NvbCBPY0ZpeHR1cmUKLQotQG9wdGlv bmFsCi0KLS0odm9pZCkgc2V0VXA7Ci0tKHZvaWQpIHRlYXJEb3duOwotCi1AZW5kCi0KLW5hbWVz cGFjZSBDYXRjaCB7Ci0KLSAgICBjbGFzcyBPY01ldGhvZCA6IHB1YmxpYyBJVGVzdEludm9rZXIg ewotCi0gICAgcHVibGljOgotICAgICAgICBPY01ldGhvZCggQ2xhc3MgY2xzLCBTRUwgc2VsICkg OiBtX2NscyggY2xzICksIG1fc2VsKCBzZWwgKSB7fQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBp bnZva2UoKSBjb25zdCB7Ci0gICAgICAgICAgICBpZCBvYmogPSBbW21fY2xzIGFsbG9jXSBpbml0 XTsKLQotICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9y KHNldFVwKSAgKTsKLSAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIG1f c2VsICk7Ci0gICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBAc2VsZWN0 b3IodGVhckRvd24pICApOwotCi0gICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggb2JqICk7Ci0g ICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICB2aXJ0dWFsIH5PY01ldGhvZCgpIHt9Ci0K LSAgICAgICAgQ2xhc3MgbV9jbHM7Ci0gICAgICAgIFNFTCBtX3NlbDsKLSAgICB9OwotCi0gICAg bmFtZXNwYWNlIERldGFpbHsKLQotICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QW5ub3Rh dGlvbiggICBDbGFzcyBjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbm5vdGF0aW9uTmFtZSwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RDYXNl TmFtZSApIHsKLSAgICAgICAgICAgIE5TU3RyaW5nKiBzZWxTdHIgPSBbW05TU3RyaW5nIGFsbG9j XSBpbml0V2l0aEZvcm1hdDpAIkNhdGNoXyVzXyVzIiwgYW5ub3RhdGlvbk5hbWUuY19zdHIoKSwg dGVzdENhc2VOYW1lLmNfc3RyKCldOwotICAgICAgICAgICAgU0VMIHNlbCA9IE5TU2VsZWN0b3JG cm9tU3RyaW5nKCBzZWxTdHIgKTsKLSAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBzZWxTdHIg KTsKLSAgICAgICAgICAgIGlkIHZhbHVlID0gcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGNscywg c2VsICk7Ci0gICAgICAgICAgICBpZiggdmFsdWUgKQotICAgICAgICAgICAgICAgIHJldHVybiBb KE5TU3RyaW5nKil2YWx1ZSBVVEY4U3RyaW5nXTsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAg ICAgICAgfQotICAgIH0KLQotICAgIGlubGluZSBzdGQ6OnNpemVfdCByZWdpc3RlclRlc3RNZXRo b2RzKCkgewotICAgICAgICBzdGQ6OnNpemVfdCBub1Rlc3RNZXRob2RzID0gMDsKLSAgICAgICAg aW50IG5vQ2xhc3NlcyA9IG9iamNfZ2V0Q2xhc3NMaXN0KCBudWxscHRyLCAwICk7Ci0KLSAgICAg ICAgQ2xhc3MqIGNsYXNzZXMgPSAoQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgQ2xhc3MgKiltYWxs b2MoIHNpemVvZihDbGFzcykgKiBub0NsYXNzZXMpOwotICAgICAgICBvYmpjX2dldENsYXNzTGlz dCggY2xhc3Nlcywgbm9DbGFzc2VzICk7Ci0KLSAgICAgICAgZm9yKCBpbnQgYyA9IDA7IGMgPCBu b0NsYXNzZXM7IGMrKyApIHsKLSAgICAgICAgICAgIENsYXNzIGNscyA9IGNsYXNzZXNbY107Ci0g ICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdV9pbnQgY291bnQ7Ci0gICAgICAgICAgICAg ICAgTWV0aG9kKiBtZXRob2RzID0gY2xhc3NfY29weU1ldGhvZExpc3QoIGNscywgJmNvdW50ICk7 Ci0gICAgICAgICAgICAgICAgZm9yKCB1X2ludCBtID0gMDsgbSA8IGNvdW50IDsgbSsrICkgewot ICAgICAgICAgICAgICAgICAgICBTRUwgc2VsZWN0b3IgPSBtZXRob2RfZ2V0TmFtZShtZXRob2Rz W21dKTsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kTmFtZSA9IHNlbF9n ZXROYW1lKHNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIG1l dGhvZE5hbWUsICJDYXRjaF9UZXN0Q2FzZV8iICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg ICBzdGQ6OnN0cmluZyB0ZXN0Q2FzZU5hbWUgPSBtZXRob2ROYW1lLnN1YnN0ciggMTUgKTsKLSAg ICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBEZXRhaWw6OmdldEFubm90 YXRpb24oIGNscywgIk5hbWUiLCB0ZXN0Q2FzZU5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICAg ICAgIHN0ZDo6c3RyaW5nIGRlc2MgPSBEZXRhaWw6OmdldEFubm90YXRpb24oIGNscywgIkRlc2Ny aXB0aW9uIiwgdGVzdENhc2VOYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBj aGFyKiBjbGFzc05hbWUgPSBjbGFzc19nZXROYW1lKCBjbHMgKTsKLQotICAgICAgICAgICAgICAg ICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0KCBtYWtlVGVzdENh c2UoIG5ldyBPY01ldGhvZCggY2xzLCBzZWxlY3RvciApLCBjbGFzc05hbWUsIE5hbWVBbmRUYWdz KCBuYW1lLmNfc3RyKCksIGRlc2MuY19zdHIoKSApLCBTb3VyY2VMaW5lSW5mbygiIiwwKSApICk7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBub1Rlc3RNZXRob2RzKys7Ci0gICAgICAgICAgICAg ICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJlZShtZXRob2Rz KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9UZXN0TWV0aG9k czsKLSAgICB9Ci0KLSNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUykK LQotICAgIG5hbWVzcGFjZSBNYXRjaGVycyB7Ci0gICAgICAgIG5hbWVzcGFjZSBJbXBsIHsKLSAg ICAgICAgbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMgewotCi0gICAgICAgICAgICBzdHJ1Y3Qg U3RyaW5nSG9sZGVyIDogTWF0Y2hlckJhc2U8TlNTdHJpbmcqPnsKLSAgICAgICAgICAgICAgICBT dHJpbmdIb2xkZXIoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IG1fc3Vic3RyKCBbc3Vic3RyIGNvcHld ICl7fQotICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggU3RyaW5nSG9sZGVyIGNvbnN0JiBv dGhlciApIDogbV9zdWJzdHIoIFtvdGhlci5tX3N1YnN0ciBjb3B5XSApe30KLSAgICAgICAgICAg ICAgICBTdHJpbmdIb2xkZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNl KCBtX3N1YnN0ciApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJvb2wg bWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAg ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBO U1N0cmluZyogQ0FUQ0hfQVJDX1NUUk9ORyBtX3N1YnN0cjsKLSAgICAgICAgICAgIH07Ci0KLSAg ICAgICAgICAgIHN0cnVjdCBFcXVhbHMgOiBTdHJpbmdIb2xkZXIgewotICAgICAgICAgICAgICAg IEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9Ci0K LSAgICAgICAgICAgICAgICBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3Qgb3ZlcnJp ZGUgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3Ry ID09IG5pbCApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciBpc0VxdWFsVG9T dHJpbmc6bV9zdWJzdHJdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN0 ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgICAg ICByZXR1cm4gImVxdWFscyBzdHJpbmc6ICIgKyBDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoIG1f c3Vic3RyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAg ICAgc3RydWN0IENvbnRhaW5zIDogU3RyaW5nSG9sZGVyIHsKLSAgICAgICAgICAgICAgICBDb250 YWlucyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9Ci0KLSAg ICAgICAgICAgICAgICBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3Qgb3ZlcnJpZGUg ewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09 IG5pbCApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5n Om1fc3Vic3RyXS5sb2NhdGlvbiAhPSBOU05vdEZvdW5kOwotICAgICAgICAgICAgICAgIH0KLQot ICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgewot ICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRhaW5zIHN0cmluZzogIiArIENhdGNoOjpE ZXRhaWw6OnN0cmluZ2lmeSggbV9zdWJzdHIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg ICAgICB9OwotCi0gICAgICAgICAgICBzdHJ1Y3QgU3RhcnRzV2l0aCA6IFN0cmluZ0hvbGRlciB7 Ci0gICAgICAgICAgICAgICAgU3RhcnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5n SG9sZGVyKCBzdWJzdHIgKXt9Ci0KLSAgICAgICAgICAgICAgICBib29sIG1hdGNoKCBOU1N0cmlu Zyogc3RyICkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChz dHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSAwOwotICAgICAg ICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29u c3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YXJ0cyB3aXRoOiAi ICsgQ2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBtX3N1YnN0ciApOwotICAgICAgICAgICAgICAg IH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBzdHJ1Y3QgRW5kc1dpdGggOiBTdHJpbmdI b2xkZXIgewotICAgICAgICAgICAgICAgIEVuZHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICkgOiBT dHJpbmdIb2xkZXIoIHN1YnN0ciApe30KLQotICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2goIE5T U3RyaW5nKiBzdHIgKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVy biAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uID09IFtzdHIg bGVuZ3RoXSAtIFttX3N1YnN0ciBsZW5ndGhdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAg ICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAg ICAgICAgICAgICAgICByZXR1cm4gImVuZHMgd2l0aDogIiArIENhdGNoOjpEZXRhaWw6OnN0cmlu Z2lmeSggbV9zdWJzdHIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0g ICAgICAgIH0gLy8gbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMKLSAgICAgICAgfSAvLyBuYW1l c3BhY2UgSW1wbAotCi0gICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFcXVh bHMKLSAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6 TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzKCBzdWJzdHIgKTsgfQotCi0gICAgICAgIGlubGluZSBJ bXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucwotICAgICAgICAgICAgQ29udGFpbnMoIE5T U3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkNvbnRhaW5z KCBzdWJzdHIgKTsgfQotCi0gICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpT dGFydHNXaXRoCi0gICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJl dHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoKCBzdWJzdHIgKTsgfQotCi0g ICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aAotICAgICAgICAg ICAgRW5kc1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0 Y2hlcnM6OkVuZHNXaXRoKCBzdWJzdHIgKTsgfQotCi0gICAgfSAvLyBuYW1lc3BhY2UgTWF0Y2hl cnMKLQotICAgIHVzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKLQotI2VuZGlmIC8vIENBVENIX0NP TkZJR19ESVNBQkxFX01BVENIRVJTCi0KLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0KLS8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgT0NfTUFLRV9VTklRVUVfTkFNRSggcm9vdCwgdW5pcXVl U3VmZml4ICkgcm9vdCMjdW5pcXVlU3VmZml4Ci0jZGVmaW5lIE9DX1RFU1RfQ0FTRTIoIG5hbWUs IGRlc2MsIHVuaXF1ZVN1ZmZpeCApIFwKLSsoTlNTdHJpbmcqKSBPQ19NQUtFX1VOSVFVRV9OQU1F KCBDYXRjaF9OYW1lX3Rlc3RfLCB1bmlxdWVTdWZmaXggKSBcCi17IFwKLXJldHVybiBAIG5hbWU7 IFwKLX0gXAotKyhOU1N0cmluZyopIE9DX01BS0VfVU5JUVVFX05BTUUoIENhdGNoX0Rlc2NyaXB0 aW9uX3Rlc3RfLCB1bmlxdWVTdWZmaXggKSBcCi17IFwKLXJldHVybiBAIGRlc2M7IFwKLX0gXAot LSh2b2lkKSBPQ19NQUtFX1VOSVFVRV9OQU1FKCBDYXRjaF9UZXN0Q2FzZV90ZXN0XywgdW5pcXVl U3VmZml4ICkKLQotI2RlZmluZSBPQ19URVNUX0NBU0UoIG5hbWUsIGRlc2MgKSBPQ19URVNUX0NB U0UyKCBuYW1lLCBkZXNjLCBfX0xJTkVfXyApCi0KLS8vIGVuZCBjYXRjaF9vYmpjLmhwcAotI2Vu ZGlmCi0KLS8vIEJlbmNobWFya2luZyBuZWVkcyB0aGUgZXh0ZXJuYWxseS1mYWNpbmcgcGFydHMg b2YgcmVwb3J0ZXJzIHRvIHdvcmsKLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FWFRFUk5BTF9J TlRFUkZBQ0VTKSB8fCBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQot Ly8gc3RhcnQgY2F0Y2hfZXh0ZXJuYWxfaW50ZXJmYWNlcy5oCi0KLS8vIHN0YXJ0IGNhdGNoX3Jl cG9ydGVyX2Jhc2VzLmhwcAotCi0vLyBzdGFydCBjYXRjaF9pbnRlcmZhY2VzX3JlcG9ydGVyLmgK LQotLy8gc3RhcnQgY2F0Y2hfY29uZmlnLmhwcAotCi0vLyBzdGFydCBjYXRjaF90ZXN0X3NwZWNf cGFyc2VyLmgKLQotI2lmZGVmIF9fY2xhbmdfXwotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1 c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKLSNlbmRpZgot Ci0vLyBzdGFydCBjYXRjaF90ZXN0X3NwZWMuaAotCi0jaWZkZWYgX19jbGFuZ19fCi0jcHJhZ21h IGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQg Ii1XcGFkZGVkIgotI2VuZGlmCi0KLS8vIHN0YXJ0IGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uaAot Ci1uYW1lc3BhY2UgQ2F0Y2gKLXsKLSAgICBjbGFzcyBXaWxkY2FyZFBhdHRlcm4gewotICAgICAg ICBlbnVtIFdpbGRjYXJkUG9zaXRpb24gewotICAgICAgICAgICAgTm9XaWxkY2FyZCA9IDAsCi0g ICAgICAgICAgICBXaWxkY2FyZEF0U3RhcnQgPSAxLAotICAgICAgICAgICAgV2lsZGNhcmRBdEVu ZCA9IDIsCi0gICAgICAgICAgICBXaWxkY2FyZEF0Qm90aEVuZHMgPSBXaWxkY2FyZEF0U3RhcnQg fCBXaWxkY2FyZEF0RW5kCi0gICAgICAgIH07Ci0KLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgV2ls ZGNhcmRQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgcGF0dGVybiwgQ2FzZVNlbnNpdGl2ZTo6 Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApOwotICAgICAgICB2aXJ0dWFsIH5XaWxkY2FyZFBhdHRl cm4oKSA9IGRlZmF1bHQ7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBzdGQ6OnN0cmlu ZyBjb25zdCYgc3RyICkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGQ6OnN0cmlu ZyBub3JtYWxpc2VTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdDsKLSAgICAg ICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OwotICAgICAgICBXaWxk Y2FyZFBvc2l0aW9uIG1fd2lsZGNhcmQgPSBOb1dpbGRjYXJkOwotICAgICAgICBzdGQ6OnN0cmlu ZyBtX3BhdHRlcm47Ci0gICAgfTsKLX0KLQotLy8gZW5kIGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4u aAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5 PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgc3RydWN0IElDb25maWc7Ci0KLSAgICBjbGFz cyBUZXN0U3BlYyB7Ci0gICAgICAgIGNsYXNzIFBhdHRlcm4gewotICAgICAgICBwdWJsaWM6Ci0g ICAgICAgICAgICBleHBsaWNpdCBQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApOwot ICAgICAgICAgICAgdmlydHVhbCB+UGF0dGVybigpOwotICAgICAgICAgICAgdmlydHVhbCBib29s IG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCA9IDA7Ci0gICAg ICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSgpIGNvbnN0OwotICAgICAgICBwcml2YXRl OgotICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QgbV9uYW1lOwotICAgICAgICB9OwotICAg ICAgICB1c2luZyBQYXR0ZXJuUHRyID0gc3RkOjpzaGFyZWRfcHRyPFBhdHRlcm4+OwotCi0gICAg ICAgIGNsYXNzIE5hbWVQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4gewotICAgICAgICBwdWJsaWM6 Ci0gICAgICAgICAgICBleHBsaWNpdCBOYW1lUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIG5h bWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWx0ZXJTdHJpbmcgKTsKLSAgICAgICAgICAgIGJvb2wg bWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IG92ZXJyaWRlOwot ICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgV2lsZGNhcmRQYXR0ZXJuIG1fd2lsZGNhcmRQ YXR0ZXJuOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFRhZ1BhdHRlcm4gOiBwdWJsaWMg UGF0dGVybiB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGV4cGxpY2l0IFRhZ1BhdHRl cm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWx0ZXJTdHJp bmcgKTsKLSAgICAgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0 Q2FzZSApIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgc3Rk OjpzdHJpbmcgbV90YWc7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgRXhjbHVkZWRQYXR0 ZXJuIDogcHVibGljIFBhdHRlcm4gewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBleHBs aWNpdCBFeGNsdWRlZFBhdHRlcm4oIFBhdHRlcm5QdHIgY29uc3QmIHVuZGVybHlpbmdQYXR0ZXJu ICk7Ci0gICAgICAgICAgICBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENh c2UgKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIFBhdHRl cm5QdHIgbV91bmRlcmx5aW5nUGF0dGVybjsKLSAgICAgICAgfTsKLQotICAgICAgICBzdHJ1Y3Qg RmlsdGVyIHsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhdHRlcm5QdHI+IG1fcGF0dGVybnM7 Ci0KLSAgICAgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2Fz ZSApIGNvbnN0OwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0OwotICAgICAg ICB9OwotCi0gICAgcHVibGljOgotICAgICAgICBzdHJ1Y3QgRmlsdGVyTWF0Y2ggewotICAgICAg ICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNl IGNvbnN0Kj4gdGVzdHM7Ci0gICAgICAgIH07Ci0gICAgICAgIHVzaW5nIE1hdGNoZXMgPSBzdGQ6 OnZlY3RvcjxGaWx0ZXJNYXRjaD47Ci0gICAgICAgIHVzaW5nIHZlY3RvclN0cmluZ3MgPSBzdGQ6 OnZlY3RvcjxzdGQ6OnN0cmluZz47Ci0KLSAgICAgICAgYm9vbCBoYXNGaWx0ZXJzKCkgY29uc3Q7 Ci0gICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNv bnN0OwotICAgICAgICBNYXRjaGVzIG1hdGNoZXNCeUZpbHRlciggc3RkOjp2ZWN0b3I8VGVzdENh c2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0OwotICAg ICAgICBjb25zdCB2ZWN0b3JTdHJpbmdzICYgZ2V0SW52YWxpZEFyZ3MoKSBjb25zdDsKLQotICAg IHByaXZhdGU6Ci0gICAgICAgIHN0ZDo6dmVjdG9yPEZpbHRlcj4gbV9maWx0ZXJzOwotICAgICAg ICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9pbnZhbGlkQXJnczsKLSAgICAgICAgZnJpZW5k IGNsYXNzIFRlc3RTcGVjUGFyc2VyOwotICAgIH07Ci19Ci0KLSNpZmRlZiBfX2NsYW5nX18KLSNw cmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLSNlbmRpZgotCi0vLyBlbmQgY2F0Y2hfdGVzdF9z cGVjLmgKLS8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKLQot I2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBUYWdB bGlhczsKLQotICAgIHN0cnVjdCBJVGFnQWxpYXNSZWdpc3RyeSB7Ci0gICAgICAgIHZpcnR1YWwg fklUYWdBbGlhc1JlZ2lzdHJ5KCk7Ci0gICAgICAgIC8vIE51bGxwdHIgaWYgbm90IHByZXNlbnQK LSAgICAgICAgdmlydHVhbCBUYWdBbGlhcyBjb25zdCogZmluZCggc3RkOjpzdHJpbmcgY29uc3Qm IGFsaWFzICkgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFs aWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCA9IDA7 Ci0KLSAgICAgICAgc3RhdGljIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXQoKTsKLSAgICB9 OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX2ludGVyZmFjZXNf dGFnX2FsaWFzX3JlZ2lzdHJ5LmgKLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBjbGFzcyBUZXN0 U3BlY1BhcnNlciB7Ci0gICAgICAgIGVudW0gTW9kZXsgTm9uZSwgTmFtZSwgUXVvdGVkTmFtZSwg VGFnLCBFc2NhcGVkTmFtZSB9OwotICAgICAgICBNb2RlIG1fbW9kZSA9IE5vbmU7Ci0gICAgICAg IE1vZGUgbGFzdE1vZGUgPSBOb25lOwotICAgICAgICBib29sIG1fZXhjbHVzaW9uID0gZmFsc2U7 Ci0gICAgICAgIHN0ZDo6c2l6ZV90IG1fcG9zID0gMDsKLSAgICAgICAgc3RkOjpzaXplX3QgbV9y ZWFsUGF0dGVyblBvcyA9IDA7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG1fYXJnOwotICAgICAgICBz dGQ6OnN0cmluZyBtX3N1YnN0cmluZzsKLSAgICAgICAgc3RkOjpzdHJpbmcgbV9wYXR0ZXJuTmFt ZTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IG1fZXNjYXBlQ2hhcnM7Ci0gICAg ICAgIFRlc3RTcGVjOjpGaWx0ZXIgbV9jdXJyZW50RmlsdGVyOwotICAgICAgICBUZXN0U3BlYyBt X3Rlc3RTcGVjOwotICAgICAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCogbV90YWdBbGlhc2Vz ID0gbnVsbHB0cjsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgVGVzdFNwZWNQYXJzZXIoIElUYWdB bGlhc1JlZ2lzdHJ5IGNvbnN0JiB0YWdBbGlhc2VzICk7Ci0KLSAgICAgICAgVGVzdFNwZWNQYXJz ZXImIHBhcnNlKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnICk7Ci0gICAgICAgIFRlc3RTcGVjIHRl c3RTcGVjKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBib29sIHZpc2l0Q2hhciggY2hhciBj ICk7Ci0gICAgICAgIHZvaWQgc3RhcnROZXdNb2RlKCBNb2RlIG1vZGUgKTsKLSAgICAgICAgYm9v bCBwcm9jZXNzTm9uZUNoYXIoIGNoYXIgYyApOwotICAgICAgICB2b2lkIHByb2Nlc3NOYW1lQ2hh ciggY2hhciBjICk7Ci0gICAgICAgIGJvb2wgcHJvY2Vzc090aGVyQ2hhciggY2hhciBjICk7Ci0g ICAgICAgIHZvaWQgZW5kTW9kZSgpOwotICAgICAgICB2b2lkIGVzY2FwZSgpOwotICAgICAgICBi b29sIGlzQ29udHJvbENoYXIoIGNoYXIgYyApIGNvbnN0OwotICAgICAgICB2b2lkIHNhdmVMYXN0 TW9kZSgpOwotICAgICAgICB2b2lkIHJldmVydEJhY2tUb0xhc3RNb2RlKCk7Ci0gICAgICAgIHZv aWQgYWRkRmlsdGVyKCk7Ci0gICAgICAgIGJvb2wgc2VwYXJhdGUoKTsKLQotICAgICAgICAvLyBI YW5kbGVzIGNvbW1vbiBwcmVwcm9jZXNzaW5nIG9mIHRoZSBwYXR0ZXJuIGZvciBuYW1lL3RhZyBw YXR0ZXJucwotICAgICAgICBzdGQ6OnN0cmluZyBwcmVwcm9jZXNzUGF0dGVybigpOwotICAgICAg ICAvLyBBZGRzIHRoZSBjdXJyZW50IHBhdHRlcm4gYXMgYSB0ZXN0IG5hbWUKLSAgICAgICAgdm9p ZCBhZGROYW1lUGF0dGVybigpOwotICAgICAgICAvLyBBZGRzIHRoZSBjdXJyZW50IHBhdHRlcm4g YXMgYSB0YWcKLSAgICAgICAgdm9pZCBhZGRUYWdQYXR0ZXJuKCk7Ci0KLSAgICAgICAgaW5saW5l IHZvaWQgYWRkQ2hhclRvUGF0dGVybihjaGFyIGMpIHsKLSAgICAgICAgICAgIG1fc3Vic3RyaW5n ICs9IGM7Ci0gICAgICAgICAgICBtX3BhdHRlcm5OYW1lICs9IGM7Ci0gICAgICAgICAgICBtX3Jl YWxQYXR0ZXJuUG9zKys7Ci0gICAgICAgIH0KLQotICAgIH07Ci0gICAgVGVzdFNwZWMgcGFyc2VU ZXN0U3BlYyggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApOwotCi19IC8vIG5hbWVzcGFjZSBDYXRj aAotCi0jaWZkZWYgX19jbGFuZ19fCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0jZW5k aWYKLQotLy8gZW5kIGNhdGNoX3Rlc3Rfc3BlY19wYXJzZXIuaAotLy8gTGlic3RkYysrIGRvZXNu J3QgbGlrZSBpbmNvbXBsZXRlIGNsYXNzZXMgZm9yIHVuaXF1ZV9wdHIKLQotI2luY2x1ZGUgPG1l bW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaWZuZGVmIENB VENIX0NPTkZJR19DT05TT0xFX1dJRFRICi0jZGVmaW5lIENBVENIX0NPTkZJR19DT05TT0xFX1dJ RFRIIDgwCi0jZW5kaWYKLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBJU3RyZWFt OwotCi0gICAgc3RydWN0IENvbmZpZ0RhdGEgewotICAgICAgICBib29sIGxpc3RUZXN0cyA9IGZh bHNlOwotICAgICAgICBib29sIGxpc3RUYWdzID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgbGlzdFJl cG9ydGVycyA9IGZhbHNlOwotICAgICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5ID0gZmFsc2U7 Ci0KLSAgICAgICAgYm9vbCBzaG93U3VjY2Vzc2Z1bFRlc3RzID0gZmFsc2U7Ci0gICAgICAgIGJv b2wgc2hvdWxkRGVidWdCcmVhayA9IGZhbHNlOwotICAgICAgICBib29sIG5vVGhyb3cgPSBmYWxz ZTsKLSAgICAgICAgYm9vbCBzaG93SGVscCA9IGZhbHNlOwotICAgICAgICBib29sIHNob3dJbnZp c2libGVzID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgZmlsZW5hbWVzQXNUYWdzID0gZmFsc2U7Ci0g ICAgICAgIGJvb2wgbGliSWRlbnRpZnkgPSBmYWxzZTsKLQotICAgICAgICBpbnQgYWJvcnRBZnRl ciA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZCA9IDA7Ci0KLSAgICAgICAgYm9v bCBiZW5jaG1hcmtOb0FuYWx5c2lzID0gZmFsc2U7Ci0gICAgICAgIHVuc2lnbmVkIGludCBiZW5j aG1hcmtTYW1wbGVzID0gMTAwOwotICAgICAgICBkb3VibGUgYmVuY2htYXJrQ29uZmlkZW5jZUlu dGVydmFsID0gMC45NTsKLSAgICAgICAgdW5zaWduZWQgaW50IGJlbmNobWFya1Jlc2FtcGxlcyA9 IDEwMDAwMDsKLSAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczo6cmVwIGJlbmNobWFy a1dhcm11cFRpbWUgPSAxMDA7Ci0KLSAgICAgICAgVmVyYm9zaXR5IHZlcmJvc2l0eSA9IFZlcmJv c2l0eTo6Tm9ybWFsOwotICAgICAgICBXYXJuQWJvdXQ6OldoYXQgd2FybmluZ3MgPSBXYXJuQWJv dXQ6Ok5vdGhpbmc7Ci0gICAgICAgIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnMg PSBTaG93RHVyYXRpb25zOjpEZWZhdWx0Rm9yUmVwb3J0ZXI7Ci0gICAgICAgIGRvdWJsZSBtaW5E dXJhdGlvbiA9IC0xOwotICAgICAgICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIgPSBS dW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOwotICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8g dXNlQ29sb3VyID0gVXNlQ29sb3VyOjpBdXRvOwotICAgICAgICBXYWl0Rm9yS2V5cHJlc3M6Oldo ZW4gd2FpdEZvcktleXByZXNzID0gV2FpdEZvcktleXByZXNzOjpOZXZlcjsKLQotICAgICAgICBz dGQ6OnN0cmluZyBvdXRwdXRGaWxlbmFtZTsKLSAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAg ICAgICAgc3RkOjpzdHJpbmcgcHJvY2Vzc05hbWU7Ci0jaWZuZGVmIENBVENIX0NPTkZJR19ERUZB VUxUX1JFUE9SVEVSCi0jZGVmaW5lIENBVENIX0NPTkZJR19ERUZBVUxUX1JFUE9SVEVSICJjb25z b2xlIgotI2VuZGlmCi0gICAgICAgIHN0ZDo6c3RyaW5nIHJlcG9ydGVyTmFtZSA9IENBVENIX0NP TkZJR19ERUZBVUxUX1JFUE9SVEVSOwotI3VuZGVmIENBVENIX0NPTkZJR19ERUZBVUxUX1JFUE9S VEVSCi0KLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRlc3RzT3JUYWdzOwotICAg ICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2VjdGlvbnNUb1J1bjsKLSAgICB9OwotCi0g ICAgY2xhc3MgQ29uZmlnIDogcHVibGljIElDb25maWcgewotICAgIHB1YmxpYzoKLQotICAgICAg ICBDb25maWcoKSA9IGRlZmF1bHQ7Ci0gICAgICAgIENvbmZpZyggQ29uZmlnRGF0YSBjb25zdCYg ZGF0YSApOwotICAgICAgICB2aXJ0dWFsIH5Db25maWcoKSA9IGRlZmF1bHQ7Ci0KLSAgICAgICAg c3RkOjpzdHJpbmcgY29uc3QmIGdldEZpbGVuYW1lKCkgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCBs aXN0VGVzdHMoKSBjb25zdDsKLSAgICAgICAgYm9vbCBsaXN0VGVzdE5hbWVzT25seSgpIGNvbnN0 OwotICAgICAgICBib29sIGxpc3RUYWdzKCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgbGlzdFJlcG9y dGVycygpIGNvbnN0OwotCi0gICAgICAgIHN0ZDo6c3RyaW5nIGdldFByb2Nlc3NOYW1lKCkgY29u c3Q7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBnZXRSZXBvcnRlck5hbWUoKSBjb25zdDsK LQotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFRlc3RzT3JUYWdz KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25z dCYgZ2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIFRlc3RTcGVj IGNvbnN0JiB0ZXN0U3BlYygpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBib29sIGhhc1Rlc3RG aWx0ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgYm9vbCBzaG93SGVscCgpIGNvbnN0 OwotCi0gICAgICAgIC8vIElDb25maWcgaW50ZXJmYWNlCi0gICAgICAgIGJvb2wgYWxsb3dUaHJv d3MoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25z dCBvdmVycmlkZTsKLSAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IG92ZXJyaWRlOwot ICAgICAgICBib29sIGluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0IG92ZXJyaWRlOwot ICAgICAgICBib29sIHdhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3Qgb3ZlcnJpZGU7 Ci0gICAgICAgIGJvb2wgd2FybkFib3V0Tm9UZXN0cygpIGNvbnN0IG92ZXJyaWRlOwotICAgICAg ICBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zKCkgY29uc3Qgb3ZlcnJpZGU7Ci0g ICAgICAgIGRvdWJsZSBtaW5EdXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBSdW5U ZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgdW5z aWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgVXNlQ29sb3VyOjpZ ZXNPck5vIHVzZUNvbG91cigpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBib29sIHNob3VsZERl YnVnQnJlYWsoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgaW50IGFib3J0QWZ0ZXIoKSBjb25z dCBvdmVycmlkZTsKLSAgICAgICAgYm9vbCBzaG93SW52aXNpYmxlcygpIGNvbnN0IG92ZXJyaWRl OwotICAgICAgICBWZXJib3NpdHkgdmVyYm9zaXR5KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAg IGJvb2wgYmVuY2htYXJrTm9BbmFseXNpcygpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBpbnQg YmVuY2htYXJrU2FtcGxlcygpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBkb3VibGUgYmVuY2ht YXJrQ29uZmlkZW5jZUludGVydmFsKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgIHVuc2lnbmVk IGludCBiZW5jaG1hcmtSZXNhbXBsZXMoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgc3RkOjpj aHJvbm86Om1pbGxpc2Vjb25kcyBiZW5jaG1hcmtXYXJtdXBUaW1lKCkgY29uc3Qgb3ZlcnJpZGU7 Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgIElTdHJlYW0gY29uc3QqIG9wZW5TdHJlYW0oKTsK LSAgICAgICAgQ29uZmlnRGF0YSBtX2RhdGE7Ci0KLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElT dHJlYW0gY29uc3Q+IG1fc3RyZWFtOwotICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOwotICAg ICAgICBib29sIG1faGFzVGVzdEZpbHRlcnMgPSBmYWxzZTsKLSAgICB9OwotCi19IC8vIGVuZCBu YW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX2NvbmZpZy5ocHAKLS8vIHN0YXJ0IGNhdGNo X2Fzc2VydGlvbnJlc3VsdC5oCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBDYXRj aCB7Ci0KLSAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVzdWx0RGF0YQotICAgIHsKLSAgICAgICAgQXNz ZXJ0aW9uUmVzdWx0RGF0YSgpID0gZGVsZXRlOwotCi0gICAgICAgIEFzc2VydGlvblJlc3VsdERh dGEoIFJlc3VsdFdhczo6T2ZUeXBlIF9yZXN1bHRUeXBlLCBMYXp5RXhwcmVzc2lvbiBjb25zdCYg X2xhenlFeHByZXNzaW9uICk7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKLSAgICAg ICAgbXV0YWJsZSBzdGQ6OnN0cmluZyByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKLSAgICAgICAg TGF6eUV4cHJlc3Npb24gbGF6eUV4cHJlc3Npb247Ci0gICAgICAgIFJlc3VsdFdhczo6T2ZUeXBl IHJlc3VsdFR5cGU7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgcmVjb25zdHJ1Y3RFeHByZXNzaW9u KCkgY29uc3Q7Ci0gICAgfTsKLQotICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdCB7Ci0gICAgcHVi bGljOgotICAgICAgICBBc3NlcnRpb25SZXN1bHQoKSA9IGRlbGV0ZTsKLSAgICAgICAgQXNzZXJ0 aW9uUmVzdWx0KCBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRh IGNvbnN0JiBkYXRhICk7Ci0KLSAgICAgICAgYm9vbCBpc09rKCkgY29uc3Q7Ci0gICAgICAgIGJv b2wgc3VjY2VlZGVkKCkgY29uc3Q7Ci0gICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIGdldFJlc3Vs dFR5cGUoKSBjb25zdDsKLSAgICAgICAgYm9vbCBoYXNFeHByZXNzaW9uKCkgY29uc3Q7Ci0gICAg ICAgIGJvb2wgaGFzTWVzc2FnZSgpIGNvbnN0OwotICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHBy ZXNzaW9uKCkgY29uc3Q7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb25Jbk1hY3Jv KCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7Ci0g ICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0OwotICAgICAg ICBzdGQ6OnN0cmluZyBnZXRNZXNzYWdlKCkgY29uc3Q7Ci0gICAgICAgIFNvdXJjZUxpbmVJbmZv IGdldFNvdXJjZUluZm8oKSBjb25zdDsKLSAgICAgICAgU3RyaW5nUmVmIGdldFRlc3RNYWNyb05h bWUoKSBjb25zdDsKLQotICAgIC8vcHJvdGVjdGVkOgotICAgICAgICBBc3NlcnRpb25JbmZvIG1f aW5mbzsKLSAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX3Jlc3VsdERhdGE7Ci0gICAgfTsK LQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9hc3NlcnRpb25yZXN1 bHQuaAotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCi0vLyBz dGFydCBjYXRjaF9lc3RpbWF0ZS5ocHAKLQotIC8vIFN0YXRpc3RpY3MgZXN0aW1hdGVzCi0KLQot bmFtZXNwYWNlIENhdGNoIHsKLSAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKLSAgICAgICAgdGVt cGxhdGUgPHR5cGVuYW1lIER1cmF0aW9uPgotICAgICAgICBzdHJ1Y3QgRXN0aW1hdGUgewotICAg ICAgICAgICAgRHVyYXRpb24gcG9pbnQ7Ci0gICAgICAgICAgICBEdXJhdGlvbiBsb3dlcl9ib3Vu ZDsKLSAgICAgICAgICAgIER1cmF0aW9uIHVwcGVyX2JvdW5kOwotICAgICAgICAgICAgZG91Ymxl IGNvbmZpZGVuY2VfaW50ZXJ2YWw7Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBE dXJhdGlvbjI+Ci0gICAgICAgICAgICBvcGVyYXRvciBFc3RpbWF0ZTxEdXJhdGlvbjI+KCkgY29u c3QgewotICAgICAgICAgICAgICAgIHJldHVybiB7IHBvaW50LCBsb3dlcl9ib3VuZCwgdXBwZXJf Ym91bmQsIGNvbmZpZGVuY2VfaW50ZXJ2YWwgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsK LSAgICB9IC8vIG5hbWVzcGFjZSBCZW5jaG1hcmsKLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0KLS8v IGVuZCBjYXRjaF9lc3RpbWF0ZS5ocHAKLS8vIHN0YXJ0IGNhdGNoX291dGxpZXJfY2xhc3NpZmlj YXRpb24uaHBwCi0KLS8vIE91dGxpZXIgaW5mb3JtYXRpb24KLQotbmFtZXNwYWNlIENhdGNoIHsK LSAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKLSAgICAgICAgc3RydWN0IE91dGxpZXJDbGFzc2lm aWNhdGlvbiB7Ci0gICAgICAgICAgICBpbnQgc2FtcGxlc19zZWVuID0gMDsKLSAgICAgICAgICAg IGludCBsb3dfc2V2ZXJlID0gMDsgICAgIC8vIG1vcmUgdGhhbiAzIHRpbWVzIElRUiBiZWxvdyBR MQotICAgICAgICAgICAgaW50IGxvd19taWxkID0gMDsgICAgICAgLy8gMS41IHRvIDMgdGltZXMg SVFSIGJlbG93IFExCi0gICAgICAgICAgICBpbnQgaGlnaF9taWxkID0gMDsgICAgICAvLyAxLjUg dG8gMyB0aW1lcyBJUVIgYWJvdmUgUTMKLSAgICAgICAgICAgIGludCBoaWdoX3NldmVyZSA9IDA7 ICAgIC8vIG1vcmUgdGhhbiAzIHRpbWVzIElRUiBhYm92ZSBRMwotCi0gICAgICAgICAgICBpbnQg dG90YWwoKSBjb25zdCB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvd19zZXZlcmUgKyBsb3df bWlsZCArIGhpZ2hfbWlsZCArIGhpZ2hfc2V2ZXJlOwotICAgICAgICAgICAgfQotICAgICAgICB9 OwotICAgIH0gLy8gbmFtZXNwYWNlIEJlbmNobWFyawotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQot Ly8gZW5kIGNhdGNoX291dGxpZXJfY2xhc3NpZmljYXRpb24uaHBwCi0KLSNpbmNsdWRlIDxpdGVy YXRvcj4KLSNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORwotCi0jaW5j bHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc2Z3ZD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVk ZSA8c2V0PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLW5hbWVz cGFjZSBDYXRjaCB7Ci0KLSAgICBzdHJ1Y3QgUmVwb3J0ZXJDb25maWcgewotICAgICAgICBleHBs aWNpdCBSZXBvcnRlckNvbmZpZyggSUNvbmZpZ1B0ciBjb25zdCYgX2Z1bGxDb25maWcgKTsKLQot ICAgICAgICBSZXBvcnRlckNvbmZpZyggSUNvbmZpZ1B0ciBjb25zdCYgX2Z1bGxDb25maWcsIHN0 ZDo6b3N0cmVhbSYgX3N0cmVhbSApOwotCi0gICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkg Y29uc3Q7Ci0gICAgICAgIElDb25maWdQdHIgZnVsbENvbmZpZygpIGNvbnN0OwotCi0gICAgcHJp dmF0ZToKLSAgICAgICAgc3RkOjpvc3RyZWFtKiBtX3N0cmVhbTsKLSAgICAgICAgSUNvbmZpZ1B0 ciBtX2Z1bGxDb25maWc7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBSZXBvcnRlclByZWZlcmVuY2Vz IHsKLSAgICAgICAgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOwotICAgICAgICBi b29sIHNob3VsZFJlcG9ydEFsbEFzc2VydGlvbnMgPSBmYWxzZTsKLSAgICB9OwotCi0gICAgdGVt cGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdHJ1Y3QgTGF6eVN0YXQgOiBPcHRpb248VD4gewotICAg ICAgICBMYXp5U3RhdCYgb3BlcmF0b3I9KCBUIGNvbnN0JiBfdmFsdWUgKSB7Ci0gICAgICAgICAg ICBPcHRpb248VD46Om9wZXJhdG9yPSggX3ZhbHVlICk7Ci0gICAgICAgICAgICB1c2VkID0gZmFs c2U7Ci0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBy ZXNldCgpIHsKLSAgICAgICAgICAgIE9wdGlvbjxUPjo6cmVzZXQoKTsKLSAgICAgICAgICAgIHVz ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBib29sIHVzZWQgPSBmYWxzZTsKLSAgICB9 OwotCi0gICAgc3RydWN0IFRlc3RSdW5JbmZvIHsKLSAgICAgICAgVGVzdFJ1bkluZm8oIHN0ZDo6 c3RyaW5nIGNvbnN0JiBfbmFtZSApOwotICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwotICAgIH07 Ci0gICAgc3RydWN0IEdyb3VwSW5mbyB7Ci0gICAgICAgIEdyb3VwSW5mbyggIHN0ZDo6c3RyaW5n IGNvbnN0JiBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3VwSW5k ZXgsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IF9ncm91cHNDb3VudCApOwotCi0g ICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXg7 Ci0gICAgICAgIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50czsKLSAgICB9OwotCi0gICAgc3RydWN0 IEFzc2VydGlvblN0YXRzIHsKLSAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblJlc3Vs dCBjb25zdCYgX2Fzc2VydGlvblJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6 dmVjdG9yPE1lc3NhZ2VJbmZvPiBjb25zdCYgX2luZm9NZXNzYWdlcywKLSAgICAgICAgICAgICAg ICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscyApOwotCi0gICAgICAgIEFzc2VydGlvblN0 YXRzKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OwotICAg ICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAg ID0gZGVmYXVsdDsKLSAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRp b25TdGF0cyBjb25zdCYgKSA9IGRlbGV0ZTsKLSAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJh dG9yID0gKCBBc3NlcnRpb25TdGF0cyAmJiApICAgICA9IGRlbGV0ZTsKLSAgICAgICAgdmlydHVh bCB+QXNzZXJ0aW9uU3RhdHMoKTsKLQotICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9u UmVzdWx0OwotICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gaW5mb01lc3NhZ2VzOwot ICAgICAgICBUb3RhbHMgdG90YWxzOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2VjdGlvblN0YXRz IHsKLSAgICAgICAgU2VjdGlvblN0YXRzKCAgIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbklu Zm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMgY29uc3QmIF9hc3NlcnRpb25zLAot ICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcywKLSAgICAg ICAgICAgICAgICAgICAgICAgIGJvb2wgX21pc3NpbmdBc3NlcnRpb25zICk7Ci0gICAgICAgIFNl Y3Rpb25TdGF0cyggU2VjdGlvblN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7 Ci0gICAgICAgIFNlY3Rpb25TdGF0cyggU2VjdGlvblN0YXRzICYmICkgICAgICAgICAgICAgICAg ICA9IGRlZmF1bHQ7Ci0gICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3IgPSAoIFNlY3Rpb25T dGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7Ci0gICAgICAgIFNlY3Rpb25TdGF0cyYgb3BlcmF0b3Ig PSAoIFNlY3Rpb25TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7Ci0gICAgICAgIHZpcnR1YWwgflNl Y3Rpb25TdGF0cygpOwotCi0gICAgICAgIFNlY3Rpb25JbmZvIHNlY3Rpb25JbmZvOwotICAgICAg ICBDb3VudHMgYXNzZXJ0aW9uczsKLSAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOwot ICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVGVz dENhc2VTdGF0cyB7Ci0gICAgICAgIFRlc3RDYXNlU3RhdHMoICBUZXN0Q2FzZUluZm8gY29uc3Qm IF90ZXN0SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFs cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkT3V0LAot ICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRFcnIsCi0gICAg ICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApOwotCi0gICAgICAgIFRlc3RDYXNl U3RhdHMoIFRlc3RDYXNlU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKLSAg ICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyAmJiApICAgICAgICAgICAgICAgICAg PSBkZWZhdWx0OwotICAgICAgICBUZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VT dGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7Ci0gICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9y ID0gKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKLSAgICAgICAgdmlydHVhbCB+ VGVzdENhc2VTdGF0cygpOwotCi0gICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbzsKLSAgICAg ICAgVG90YWxzIHRvdGFsczsKLSAgICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OwotICAgICAgICBz dGQ6OnN0cmluZyBzdGRFcnI7Ci0gICAgICAgIGJvb2wgYWJvcnRpbmc7Ci0gICAgfTsKLQotICAg IHN0cnVjdCBUZXN0R3JvdXBTdGF0cyB7Ci0gICAgICAgIFRlc3RHcm91cFN0YXRzKCBHcm91cElu Zm8gY29uc3QmIF9ncm91cEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29u c3QmIF90b3RhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApOwot ICAgICAgICBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvICk7Ci0K LSAgICAgICAgVGVzdEdyb3VwU3RhdHMoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiApICAgICAgICAg ICAgICA9IGRlZmF1bHQ7Ci0gICAgICAgIFRlc3RHcm91cFN0YXRzKCBUZXN0R3JvdXBTdGF0cyAm JiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OwotICAgICAgICBUZXN0R3JvdXBTdGF0cyYg b3BlcmF0b3IgPSAoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKLSAgICAgICAg VGVzdEdyb3VwU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0R3JvdXBTdGF0cyAmJiApICAgICA9IGRl ZmF1bHQ7Ci0gICAgICAgIHZpcnR1YWwgflRlc3RHcm91cFN0YXRzKCk7Ci0KLSAgICAgICAgR3Jv dXBJbmZvIGdyb3VwSW5mbzsKLSAgICAgICAgVG90YWxzIHRvdGFsczsKLSAgICAgICAgYm9vbCBh Ym9ydGluZzsKLSAgICB9OwotCi0gICAgc3RydWN0IFRlc3RSdW5TdGF0cyB7Ci0gICAgICAgIFRl c3RSdW5TdGF0cyggICBUZXN0UnVuSW5mbyBjb25zdCYgX3J1bkluZm8sCi0gICAgICAgICAgICAg ICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCi0gICAgICAgICAgICAgICAgICAgICAg ICBib29sIF9hYm9ydGluZyApOwotCi0gICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRz IGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7Ci0gICAgICAgIFRlc3RSdW5TdGF0cygg VGVzdFJ1blN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7Ci0gICAgICAgIFRl c3RSdW5TdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RSdW5TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7 Ci0gICAgICAgIFRlc3RSdW5TdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RSdW5TdGF0cyAmJiApICAg ICA9IGRlZmF1bHQ7Ci0gICAgICAgIHZpcnR1YWwgflRlc3RSdW5TdGF0cygpOwotCi0gICAgICAg IFRlc3RSdW5JbmZvIHJ1bkluZm87Ci0gICAgICAgIFRvdGFscyB0b3RhbHM7Ci0gICAgICAgIGJv b2wgYWJvcnRpbmc7Ci0gICAgfTsKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9C RU5DSE1BUktJTkcpCi0gICAgc3RydWN0IEJlbmNobWFya0luZm8gewotICAgICAgICBzdGQ6OnN0 cmluZyBuYW1lOwotICAgICAgICBkb3VibGUgZXN0aW1hdGVkRHVyYXRpb247Ci0gICAgICAgIGlu dCBpdGVyYXRpb25zOwotICAgICAgICBpbnQgc2FtcGxlczsKLSAgICAgICAgdW5zaWduZWQgaW50 IHJlc2FtcGxlczsKLSAgICAgICAgZG91YmxlIGNsb2NrUmVzb2x1dGlvbjsKLSAgICAgICAgZG91 YmxlIGNsb2NrQ29zdDsKLSAgICB9OwotCi0gICAgdGVtcGxhdGUgPGNsYXNzIER1cmF0aW9uPgot ICAgIHN0cnVjdCBCZW5jaG1hcmtTdGF0cyB7Ci0gICAgICAgIEJlbmNobWFya0luZm8gaW5mbzsK LQotICAgICAgICBzdGQ6OnZlY3RvcjxEdXJhdGlvbj4gc2FtcGxlczsKLSAgICAgICAgQmVuY2ht YXJrOjpFc3RpbWF0ZTxEdXJhdGlvbj4gbWVhbjsKLSAgICAgICAgQmVuY2htYXJrOjpFc3RpbWF0 ZTxEdXJhdGlvbj4gc3RhbmRhcmREZXZpYXRpb247Ci0gICAgICAgIEJlbmNobWFyazo6T3V0bGll ckNsYXNzaWZpY2F0aW9uIG91dGxpZXJzOwotICAgICAgICBkb3VibGUgb3V0bGllclZhcmlhbmNl OwotCi0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEdXJhdGlvbjI+Ci0gICAgICAgIG9wZXJh dG9yIEJlbmNobWFya1N0YXRzPER1cmF0aW9uMj4oKSBjb25zdCB7Ci0gICAgICAgICAgICBzdGQ6 OnZlY3RvcjxEdXJhdGlvbjI+IHNhbXBsZXMyOwotICAgICAgICAgICAgc2FtcGxlczIucmVzZXJ2 ZShzYW1wbGVzLnNpemUoKSk7Ci0gICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybShzYW1wbGVzLmJl Z2luKCksIHNhbXBsZXMuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihzYW1wbGVzMiksIFtdKER1 cmF0aW9uIGQpIHsgcmV0dXJuIER1cmF0aW9uMihkKTsgfSk7Ci0gICAgICAgICAgICByZXR1cm4g ewotICAgICAgICAgICAgICAgIGluZm8sCi0gICAgICAgICAgICAgICAgc3RkOjptb3ZlKHNhbXBs ZXMyKSwKLSAgICAgICAgICAgICAgICBtZWFuLAotICAgICAgICAgICAgICAgIHN0YW5kYXJkRGV2 aWF0aW9uLAotICAgICAgICAgICAgICAgIG91dGxpZXJzLAotICAgICAgICAgICAgICAgIG91dGxp ZXJWYXJpYW5jZSwKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9OwotI2VuZGlmIC8v IENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCi0KLSAgICBzdHJ1Y3QgSVN0cmVhbWlu Z1JlcG9ydGVyIHsKLSAgICAgICAgdmlydHVhbCB+SVN0cmVhbWluZ1JlcG9ydGVyKCkgPSBkZWZh dWx0OwotCi0gICAgICAgIC8vIEltcGxlbWVudGluZyBjbGFzcyBtdXN0IGFsc28gcHJvdmlkZSB0 aGUgZm9sbG93aW5nIHN0YXRpYyBtZXRob2RzOgotICAgICAgICAvLyBzdGF0aWMgc3RkOjpzdHJp bmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgLy8gc3RhdGljIHN0ZDo6c2V0PFZlcmJvc2l0 eT4gZ2V0U3VwcG9ydGVkVmVyYm9zaXRpZXMoKQotCi0gICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQ cmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0ID0gMDsKLQotICAgICAgICB2aXJ0dWFs IHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSA9IDA7 Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHJlcG9ydEludmFsaWRBcmd1bWVudHMoc3RkOjpzdHJp bmcgY29uc3QmKSB7fQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRl c3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lk IHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApID0gMDsKLQot ICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0 JiB0ZXN0SW5mbyApID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZygg U2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgPSAwOwotCi0jaWYgZGVmaW5lZChDQVRD SF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORykKLSAgICAgICAgdmlydHVhbCB2b2lkIGJlbmNo bWFya1ByZXBhcmluZyggc3RkOjpzdHJpbmcgY29uc3QmICkge30KLSAgICAgICAgdmlydHVhbCB2 b2lkIGJlbmNobWFya1N0YXJ0aW5nKCBCZW5jaG1hcmtJbmZvIGNvbnN0JiApIHt9Ci0gICAgICAg IHZpcnR1YWwgdm9pZCBiZW5jaG1hcmtFbmRlZCggQmVuY2htYXJrU3RhdHM8PiBjb25zdCYgKSB7 fQotICAgICAgICB2aXJ0dWFsIHZvaWQgYmVuY2htYXJrRmFpbGVkKCBzdGQ6OnN0cmluZyBjb25z dCYgKSB7fQotI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCi0KLSAg ICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0 JiBhc3NlcnRpb25JbmZvICkgPSAwOwotCi0gICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5k aWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQ6Ci0gICAgICAg IHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2Vy dGlvblN0YXRzICkgPSAwOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNl Y3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZv aWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApID0g MDsKLSAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBj b25zdCYgdGVzdEdyb3VwU3RhdHMgKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVu RW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgPSAwOwotCi0gICAgICAg IHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0g MDsKLQotICAgICAgICAvLyBEZWZhdWx0IGVtcHR5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkCi0g ICAgICAgIHZpcnR1YWwgdm9pZCBmYXRhbEVycm9yRW5jb3VudGVyZWQoIFN0cmluZ1JlZiBuYW1l ICk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIGlzTXVsdGkoKSBjb25zdDsKLSAgICB9OwotICAg IHVzaW5nIElTdHJlYW1pbmdSZXBvcnRlclB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxJU3RyZWFtaW5n UmVwb3J0ZXI+OwotCi0gICAgc3RydWN0IElSZXBvcnRlckZhY3RvcnkgewotICAgICAgICB2aXJ0 dWFsIH5JUmVwb3J0ZXJGYWN0b3J5KCk7Ci0gICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9y dGVyUHRyIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsK LSAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0ID0gMDsK LSAgICB9OwotICAgIHVzaW5nIElSZXBvcnRlckZhY3RvcnlQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8 SVJlcG9ydGVyRmFjdG9yeT47Ci0KLSAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnkgewotICAg ICAgICB1c2luZyBGYWN0b3J5TWFwID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIElSZXBvcnRlckZh Y3RvcnlQdHI+OwotICAgICAgICB1c2luZyBMaXN0ZW5lcnMgPSBzdGQ6OnZlY3RvcjxJUmVwb3J0 ZXJGYWN0b3J5UHRyPjsKLQotICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJSZWdpc3RyeSgpOwot ICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlclB0ciBjcmVhdGUoIHN0ZDo6c3RyaW5n IGNvbnN0JiBuYW1lLCBJQ29uZmlnUHRyIGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7Ci0gICAg ICAgIHZpcnR1YWwgRmFjdG9yeU1hcCBjb25zdCYgZ2V0RmFjdG9yaWVzKCkgY29uc3QgPSAwOwot ICAgICAgICB2aXJ0dWFsIExpc3RlbmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgPSAw OwotICAgIH07Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfaW50 ZXJmYWNlc19yZXBvcnRlci5oCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdHJp bmc+Ci0jaW5jbHVkZSA8Y2Zsb2F0PgotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjYXNz ZXJ0PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxvc3RyZWFtPgotCi1uYW1lc3BhY2Ug Q2F0Y2ggewotICAgIHZvaWQgcHJlcGFyZUV4cGFuZGVkRXhwcmVzc2lvbihBc3NlcnRpb25SZXN1 bHQmIHJlc3VsdCk7Ci0KLSAgICAvLyBSZXR1cm5zIGRvdWJsZSBmb3JtYXR0ZWQgYXMgJS4zZiAo Zm9ybWF0IGV4cGVjdGVkIG9uIG91dHB1dCkKLSAgICBzdGQ6OnN0cmluZyBnZXRGb3JtYXR0ZWRE dXJhdGlvbiggZG91YmxlIGR1cmF0aW9uICk7Ci0KLSAgICAvLyEgU2hvdWxkIHRoZSByZXBvcnRl ciBzaG93Ci0gICAgYm9vbCBzaG91bGRTaG93RHVyYXRpb24oIElDb25maWcgY29uc3QmIGNvbmZp ZywgZG91YmxlIGR1cmF0aW9uICk7Ci0KLSAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVGaWx0ZXJz KCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGNvbnRhaW5lciApOwotCi0gICAgdGVt cGxhdGU8dHlwZW5hbWUgRGVyaXZlZFQ+Ci0gICAgc3RydWN0IFN0cmVhbWluZ1JlcG9ydGVyQmFz ZSA6IElTdHJlYW1pbmdSZXBvcnRlciB7Ci0KLSAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNl KCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCi0gICAgICAgIDogICBtX2NvbmZpZygg X2NvbmZpZy5mdWxsQ29uZmlnKCkgKSwKLSAgICAgICAgICAgIHN0cmVhbSggX2NvbmZpZy5zdHJl YW0oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRp cmVjdFN0ZE91dCA9IGZhbHNlOwotICAgICAgICAgICAgaWYoICFEZXJpdmVkVDo6Z2V0U3VwcG9y dGVkVmVyYm9zaXRpZXMoKS5jb3VudCggbV9jb25maWctPnZlcmJvc2l0eSgpICkgKQotICAgICAg ICAgICAgICAgIENBVENIX0VSUk9SKCAiVmVyYm9zaXR5IGxldmVsIG5vdCBzdXBwb3J0ZWQgYnkg dGhpcyByZXBvcnRlciIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9ydGVyUHJlZmVyZW5j ZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICByZXR1cm4g bV9yZXBvcnRlclByZWZzOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIHN0ZDo6c2V0PFZl cmJvc2l0eT4gZ2V0U3VwcG9ydGVkVmVyYm9zaXRpZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4g eyBWZXJib3NpdHk6Ok5vcm1hbCB9OwotICAgICAgICB9Ci0KLSAgICAgICAgflN0cmVhbWluZ1Jl cG9ydGVyQmFzZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKLQotICAgICAgICB2b2lkIG5vTWF0Y2hp bmdUZXN0Q2FzZXMoc3RkOjpzdHJpbmcgY29uc3QmKSBvdmVycmlkZSB7fQotCi0gICAgICAgIHZv aWQgcmVwb3J0SW52YWxpZEFyZ3VtZW50cyhzdGQ6OnN0cmluZyBjb25zdCYpIG92ZXJyaWRlIHt9 Ci0KLSAgICAgICAgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoVGVzdFJ1bkluZm8gY29uc3QmIF90ZXN0 UnVuSW5mbykgb3ZlcnJpZGUgewotICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvID0gX3Rl c3RSdW5JbmZvOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyhH cm91cEluZm8gY29uc3QmIF9ncm91cEluZm8pIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGN1cnJl bnRHcm91cEluZm8gPSBfZ3JvdXBJbmZvOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0ZXN0 Q2FzZVN0YXJ0aW5nKFRlc3RDYXNlSW5mbyBjb25zdCYgX3Rlc3RJbmZvKSBvdmVycmlkZSAgewot ICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mbyA9IF90ZXN0SW5mbzsKLSAgICAgICAgfQot ICAgICAgICB2b2lkIHNlY3Rpb25TdGFydGluZyhTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25J bmZvKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soX3Nl Y3Rpb25JbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VjdGlvbkVuZGVkKFNlY3Rp b25TdGF0cyBjb25zdCYgLyogX3NlY3Rpb25TdGF0cyAqLykgb3ZlcnJpZGUgewotICAgICAgICAg ICAgbV9zZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHRl c3RDYXNlRW5kZWQoVGVzdENhc2VTdGF0cyBjb25zdCYgLyogX3Rlc3RDYXNlU3RhdHMgKi8pIG92 ZXJyaWRlIHsKLSAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKLSAgICAg ICAgfQotICAgICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKFRlc3RHcm91cFN0YXRzIGNvbnN0JiAv KiBfdGVzdEdyb3VwU3RhdHMgKi8pIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGN1cnJlbnRHcm91 cEluZm8ucmVzZXQoKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0 UnVuU3RhdHMgY29uc3QmIC8qIF90ZXN0UnVuU3RhdHMgKi8pIG92ZXJyaWRlIHsKLSAgICAgICAg ICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKLSAgICAgICAgICAgIGN1cnJlbnRHcm91 cEluZm8ucmVzZXQoKTsKLSAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby5yZXNldCgpOwot ICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBza2lwVGVzdChUZXN0Q2FzZUluZm8gY29uc3QmKSBv dmVycmlkZSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgYnkg ZGVmYXVsdC4KLSAgICAgICAgICAgIC8vIEl0IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4g aW4gdGhlIGRlcml2ZWQgY2xhc3MuCi0gICAgICAgIH0KLQotICAgICAgICBJQ29uZmlnUHRyIG1f Y29uZmlnOwotICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKLQotICAgICAgICBMYXp5U3Rh dDxUZXN0UnVuSW5mbz4gY3VycmVudFRlc3RSdW5JbmZvOwotICAgICAgICBMYXp5U3RhdDxHcm91 cEluZm8+IGN1cnJlbnRHcm91cEluZm87Ci0gICAgICAgIExhenlTdGF0PFRlc3RDYXNlSW5mbz4g Y3VycmVudFRlc3RDYXNlSW5mbzsKLQotICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uSW5mbz4g bV9zZWN0aW9uU3RhY2s7Ci0gICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclBy ZWZzOwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkVD4KLSAgICBzdHJ1 Y3QgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSA6IElTdHJlYW1pbmdSZXBvcnRlciB7Ci0gICAgICAg IHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoaWxkTm9kZVQ+Ci0gICAgICAgIHN0cnVj dCBOb2RlIHsKLSAgICAgICAgICAgIGV4cGxpY2l0IE5vZGUoIFQgY29uc3QmIF92YWx1ZSApIDog dmFsdWUoIF92YWx1ZSApIHt9Ci0gICAgICAgICAgICB2aXJ0dWFsIH5Ob2RlKCkge30KLQotICAg ICAgICAgICAgdXNpbmcgQ2hpbGROb2RlcyA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxD aGlsZE5vZGVUPj47Ci0gICAgICAgICAgICBUIHZhbHVlOwotICAgICAgICAgICAgQ2hpbGROb2Rl cyBjaGlsZHJlbjsKLSAgICAgICAgfTsKLSAgICAgICAgc3RydWN0IFNlY3Rpb25Ob2RlIHsKLSAg ICAgICAgICAgIGV4cGxpY2l0IFNlY3Rpb25Ob2RlKFNlY3Rpb25TdGF0cyBjb25zdCYgX3N0YXRz KSA6IHN0YXRzKF9zdGF0cykge30KLSAgICAgICAgICAgIHZpcnR1YWwgflNlY3Rpb25Ob2RlKCkg PSBkZWZhdWx0OwotCi0gICAgICAgICAgICBib29sIG9wZXJhdG9yID09IChTZWN0aW9uTm9kZSBj b25zdCYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHMuc2VjdGlv bkluZm8ubGluZUluZm8gPT0gb3RoZXIuc3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm87Ci0gICAg ICAgICAgICB9Ci0gICAgICAgICAgICBib29sIG9wZXJhdG9yID09IChzdGQ6OnNoYXJlZF9wdHI8 U2VjdGlvbk5vZGU+IGNvbnN0JiBvdGhlcikgY29uc3QgewotICAgICAgICAgICAgICAgIHJldHVy biBvcGVyYXRvcj09KCpvdGhlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNlY3Rp b25TdGF0cyBzdGF0czsKLSAgICAgICAgICAgIHVzaW5nIENoaWxkU2VjdGlvbnMgPSBzdGQ6OnZl Y3RvcjxzdGQ6OnNoYXJlZF9wdHI8U2VjdGlvbk5vZGU+PjsKLSAgICAgICAgICAgIHVzaW5nIEFz c2VydGlvbnMgPSBzdGQ6OnZlY3RvcjxBc3NlcnRpb25TdGF0cz47Ci0gICAgICAgICAgICBDaGls ZFNlY3Rpb25zIGNoaWxkU2VjdGlvbnM7Ci0gICAgICAgICAgICBBc3NlcnRpb25zIGFzc2VydGlv bnM7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7Ci0gICAgICAgICAgICBzdGQ6OnN0 cmluZyBzdGRFcnI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IEJ5U2VjdGlvbkluZm8g ewotICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggU2VjdGlvbkluZm8gY29uc3QmIG90aGVyICkg OiBtX290aGVyKCBvdGhlciApIHt9Ci0gICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBCeVNlY3Rp b25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIubV9vdGhlciApIHt9Ci0gICAg ICAgICAgICBib29sIG9wZXJhdG9yKCkgKHN0ZDo6c2hhcmVkX3B0cjxTZWN0aW9uTm9kZT4gY29u c3QmIG5vZGUpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChub2RlLT5zdGF0cy5z ZWN0aW9uSW5mby5uYW1lID09IG1fb3RoZXIubmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAg ICAgIChub2RlLT5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBtX290aGVyLmxpbmVJbmZv KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2b2lkIG9wZXJhdG9yPShCeVNlY3Rpb25J bmZvIGNvbnN0JikgPSBkZWxldGU7Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIFNl Y3Rpb25JbmZvIGNvbnN0JiBtX290aGVyOwotICAgICAgICB9OwotCi0gICAgICAgIHVzaW5nIFRl c3RDYXNlTm9kZSA9IE5vZGU8VGVzdENhc2VTdGF0cywgU2VjdGlvbk5vZGU+OwotICAgICAgICB1 c2luZyBUZXN0R3JvdXBOb2RlID0gTm9kZTxUZXN0R3JvdXBTdGF0cywgVGVzdENhc2VOb2RlPjsK LSAgICAgICAgdXNpbmcgVGVzdFJ1bk5vZGUgPSBOb2RlPFRlc3RSdW5TdGF0cywgVGVzdEdyb3Vw Tm9kZT47Ci0KLSAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSggUmVwb3J0ZXJDb25maWcg Y29uc3QmIF9jb25maWcgKQotICAgICAgICA6ICAgbV9jb25maWcoIF9jb25maWcuZnVsbENvbmZp ZygpICksCi0gICAgICAgICAgICBzdHJlYW0oIF9jb25maWcuc3RyZWFtKCkgKQotICAgICAgICB7 Ci0gICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxz ZTsKLSAgICAgICAgICAgIGlmKCAhRGVyaXZlZFQ6OmdldFN1cHBvcnRlZFZlcmJvc2l0aWVzKCku Y291bnQoIG1fY29uZmlnLT52ZXJib3NpdHkoKSApICkKLSAgICAgICAgICAgICAgICBDQVRDSF9F UlJPUiggIlZlcmJvc2l0eSBsZXZlbCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3J0ZXIiICk7 Ci0gICAgICAgIH0KLSAgICAgICAgfkN1bXVsYXRpdmVSZXBvcnRlckJhc2UoKSBvdmVycmlkZSA9 IGRlZmF1bHQ7Ci0KLSAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygp IGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUHJlZnM7Ci0g ICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgc3RkOjpzZXQ8VmVyYm9zaXR5PiBnZXRTdXBwb3J0 ZWRWZXJib3NpdGllcygpIHsKLSAgICAgICAgICAgIHJldHVybiB7IFZlcmJvc2l0eTo6Tm9ybWFs IH07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bklu Zm8gY29uc3QmICkgb3ZlcnJpZGUge30KLSAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZygg R3JvdXBJbmZvIGNvbnN0JiApIG92ZXJyaWRlIHt9Ci0KLSAgICAgICAgdm9pZCB0ZXN0Q2FzZVN0 YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmICkgb3ZlcnJpZGUge30KLQotICAgICAgICB2b2lk IHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgb3ZlcnJp ZGUgewotICAgICAgICAgICAgU2VjdGlvblN0YXRzIGluY29tcGxldGVTdGF0cyggc2VjdGlvbklu Zm8sIENvdW50cygpLCAwLCBmYWxzZSApOwotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNl Y3Rpb25Ob2RlPiBub2RlOwotICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLmVtcHR5KCkg KSB7Ci0gICAgICAgICAgICAgICAgaWYoICFtX3Jvb3RTZWN0aW9uICkKLSAgICAgICAgICAgICAg ICAgICAgbV9yb290U2VjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8U2VjdGlvbk5vZGU+KCBpbmNv bXBsZXRlU3RhdHMgKTsKLSAgICAgICAgICAgICAgICBub2RlID0gbV9yb290U2VjdGlvbjsKLSAg ICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFNlY3Rpb25O b2RlJiBwYXJlbnROb2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKLSAgICAgICAgICAgICAg ICBhdXRvIGl0ID0KLSAgICAgICAgICAgICAgICAgICAgc3RkOjpmaW5kX2lmKCAgIHBhcmVudE5v ZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggc2VjdGlvbkluZm8gKSApOwotICAgICAg ICAgICAgICAgIGlmKCBpdCA9PSBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuZW5kKCkgKSB7Ci0g ICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNlY3Rpb25Ob2RlPigg aW5jb21wbGV0ZVN0YXRzICk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRT ZWN0aW9ucy5wdXNoX2JhY2soIG5vZGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg ICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBub2RlID0gKml0OwotICAgICAgICAgICAg fQotICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucHVzaF9iYWNrKCBub2RlICk7Ci0gICAgICAg ICAgICBtX2RlZXBlc3RTZWN0aW9uID0gc3RkOjptb3ZlKG5vZGUpOwotICAgICAgICB9Ci0KLSAg ICAgICAgdm9pZCBhc3NlcnRpb25TdGFydGluZyhBc3NlcnRpb25JbmZvIGNvbnN0Jikgb3ZlcnJp ZGUge30KLQotICAgICAgICBib29sIGFzc2VydGlvbkVuZGVkKEFzc2VydGlvblN0YXRzIGNvbnN0 JiBhc3NlcnRpb25TdGF0cykgb3ZlcnJpZGUgewotICAgICAgICAgICAgYXNzZXJ0KCFtX3NlY3Rp b25TdGFjay5lbXB0eSgpKTsKLSAgICAgICAgICAgIC8vIEFzc2VydGlvblJlc3VsdCBob2xkcyBh IHBvaW50ZXIgdG8gYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sCi0gICAgICAgICAg ICAvLyB3aGljaCBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjYWxscyB0byBidWlsZCB0aGUgZXhw cmVzc2lvbiBzdHJpbmcuCi0gICAgICAgICAgICAvLyBPdXIgc2VjdGlvbiBzdGFjayBjb3B5IG9m IHRoZSBhc3NlcnRpb25SZXN1bHQgd2lsbCBsaWtlbHkgb3V0bGl2ZSB0aGUKLSAgICAgICAgICAg IC8vIHRlbXBvcmFyeSwgc28gaXQgbXVzdCBiZSBleHBhbmRlZCBvciBkaXNjYXJkZWQgbm93IHRv IGF2b2lkIGNhbGxpbmcKLSAgICAgICAgICAgIC8vIGEgZGVzdHJveWVkIG9iamVjdCBsYXRlci4K LSAgICAgICAgICAgIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oY29uc3RfY2FzdDxBc3NlcnRp b25SZXN1bHQmPiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0ICkgKTsKLSAgICAgICAg ICAgIFNlY3Rpb25Ob2RlJiBzZWN0aW9uTm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7Ci0g ICAgICAgICAgICBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLnB1c2hfYmFjayhhc3NlcnRpb25TdGF0 cyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHNl Y3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cykgb3ZlcnJpZGUgewot ICAgICAgICAgICAgYXNzZXJ0KCFtX3NlY3Rpb25TdGFjay5lbXB0eSgpKTsKLSAgICAgICAgICAg IFNlY3Rpb25Ob2RlJiBub2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKLSAgICAgICAgICAg IG5vZGUuc3RhdHMgPSBzZWN0aW9uU3RhdHM7Ci0gICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5w b3BfYmFjaygpOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgdGVzdENhc2VFbmRlZChUZXN0Q2Fz ZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBhdXRv IG5vZGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYXNlTm9kZT4odGVzdENhc2VTdGF0cyk7Ci0g ICAgICAgICAgICBhc3NlcnQobV9zZWN0aW9uU3RhY2suc2l6ZSgpID09IDApOwotICAgICAgICAg ICAgbm9kZS0+Y2hpbGRyZW4ucHVzaF9iYWNrKG1fcm9vdFNlY3Rpb24pOwotICAgICAgICAgICAg bV90ZXN0Q2FzZXMucHVzaF9iYWNrKG5vZGUpOwotICAgICAgICAgICAgbV9yb290U2VjdGlvbi5y ZXNldCgpOwotCi0gICAgICAgICAgICBhc3NlcnQobV9kZWVwZXN0U2VjdGlvbik7Ci0gICAgICAg ICAgICBtX2RlZXBlc3RTZWN0aW9uLT5zdGRPdXQgPSB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKLSAg ICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZEVyciA9IHRlc3RDYXNlU3RhdHMuc3RkRXJy OwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgdGVzdEdyb3VwRW5kZWQoVGVzdEdyb3VwU3RhdHMg Y29uc3QmIHRlc3RHcm91cFN0YXRzKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBhdXRvIG5vZGUg PSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RHcm91cE5vZGU+KHRlc3RHcm91cFN0YXRzKTsKLSAgICAg ICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAobV90ZXN0Q2FzZXMpOwotICAgICAgICAgICAgbV90 ZXN0R3JvdXBzLnB1c2hfYmFjayhub2RlKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHRlc3RS dW5FbmRlZChUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cykgb3ZlcnJpZGUgewotICAg ICAgICAgICAgYXV0byBub2RlID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0UnVuTm9kZT4odGVzdFJ1 blN0YXRzKTsKLSAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAobV90ZXN0R3JvdXBzKTsK LSAgICAgICAgICAgIG1fdGVzdFJ1bnMucHVzaF9iYWNrKG5vZGUpOwotICAgICAgICAgICAgdGVz dFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCB0 ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgPSAwOwotCi0gICAgICAgIHZvaWQgc2tpcFRlc3QoVGVz dENhc2VJbmZvIGNvbnN0Jikgb3ZlcnJpZGUge30KLQotICAgICAgICBJQ29uZmlnUHRyIG1fY29u ZmlnOwotICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8 QXNzZXJ0aW9uU3RhdHM+IG1fYXNzZXJ0aW9uczsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2 ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFNlY3Rpb25Ob2RlPj4+IG1fc2VjdGlvbnM7Ci0gICAgICAg IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2FzZU5vZGU+PiBtX3Rlc3RDYXNlczsK LSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRlc3RHcm91cE5vZGU+PiBtX3Rl c3RHcm91cHM7Ci0KLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRlc3RSdW5O b2RlPj4gbV90ZXN0UnVuczsKLQotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VjdGlvbk5vZGU+ IG1fcm9vdFNlY3Rpb247Ci0gICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWN0aW9uTm9kZT4gbV9k ZWVwZXN0U2VjdGlvbjsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFNlY3Rp b25Ob2RlPj4gbV9zZWN0aW9uU3RhY2s7Ci0gICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9y ZXBvcnRlclByZWZzOwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTxjaGFyIEM+Ci0gICAgY2hhciBj b25zdCogZ2V0TGluZU9mQ2hhcnMoKSB7Ci0gICAgICAgIHN0YXRpYyBjaGFyIGxpbmVbQ0FUQ0hf Q09ORklHX0NPTlNPTEVfV0lEVEhdID0gezB9OwotICAgICAgICBpZiggISpsaW5lICkgewotICAg ICAgICAgICAgc3RkOjptZW1zZXQoIGxpbmUsIEMsIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRI LTEgKTsKLSAgICAgICAgICAgIGxpbmVbQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMV0gPSAw OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaW5lOwotICAgIH0KLQotICAgIHN0cnVjdCBU ZXN0RXZlbnRMaXN0ZW5lckJhc2UgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2U8VGVzdEV2ZW50TGlz dGVuZXJCYXNlPiB7Ci0gICAgICAgIFRlc3RFdmVudExpc3RlbmVyQmFzZSggUmVwb3J0ZXJDb25m aWcgY29uc3QmIF9jb25maWcgKTsKLQotICAgICAgICBzdGF0aWMgc3RkOjpzZXQ8VmVyYm9zaXR5 PiBnZXRTdXBwb3J0ZWRWZXJib3NpdGllcygpOwotCi0gICAgICAgIHZvaWQgYXNzZXJ0aW9uU3Rh cnRpbmcoQXNzZXJ0aW9uSW5mbyBjb25zdCYpIG92ZXJyaWRlOwotICAgICAgICBib29sIGFzc2Vy dGlvbkVuZGVkKEFzc2VydGlvblN0YXRzIGNvbnN0Jikgb3ZlcnJpZGU7Ci0gICAgfTsKLQotfSAv LyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9yZXBvcnRlcl9iYXNlcy5ocHAK LS8vIHN0YXJ0IGNhdGNoX2NvbnNvbGVfY29sb3VyLmgKLQotbmFtZXNwYWNlIENhdGNoIHsKLQot ICAgIHN0cnVjdCBDb2xvdXIgewotICAgICAgICBlbnVtIENvZGUgewotICAgICAgICAgICAgTm9u ZSA9IDAsCi0KLSAgICAgICAgICAgIFdoaXRlLAotICAgICAgICAgICAgUmVkLAotICAgICAgICAg ICAgR3JlZW4sCi0gICAgICAgICAgICBCbHVlLAotICAgICAgICAgICAgQ3lhbiwKLSAgICAgICAg ICAgIFllbGxvdywKLSAgICAgICAgICAgIEdyZXksCi0KLSAgICAgICAgICAgIEJyaWdodCA9IDB4 MTAsCi0KLSAgICAgICAgICAgIEJyaWdodFJlZCA9IEJyaWdodCB8IFJlZCwKLSAgICAgICAgICAg IEJyaWdodEdyZWVuID0gQnJpZ2h0IHwgR3JlZW4sCi0gICAgICAgICAgICBMaWdodEdyZXkgPSBC cmlnaHQgfCBHcmV5LAotICAgICAgICAgICAgQnJpZ2h0V2hpdGUgPSBCcmlnaHQgfCBXaGl0ZSwK LSAgICAgICAgICAgIEJyaWdodFllbGxvdyA9IEJyaWdodCB8IFllbGxvdywKLQotICAgICAgICAg ICAgLy8gQnkgaW50ZW50aW9uCi0gICAgICAgICAgICBGaWxlTmFtZSA9IExpZ2h0R3JleSwKLSAg ICAgICAgICAgIFdhcm5pbmcgPSBCcmlnaHRZZWxsb3csCi0gICAgICAgICAgICBSZXN1bHRFcnJv ciA9IEJyaWdodFJlZCwKLSAgICAgICAgICAgIFJlc3VsdFN1Y2Nlc3MgPSBCcmlnaHRHcmVlbiwK LSAgICAgICAgICAgIFJlc3VsdEV4cGVjdGVkRmFpbHVyZSA9IFdhcm5pbmcsCi0KLSAgICAgICAg ICAgIEVycm9yID0gQnJpZ2h0UmVkLAotICAgICAgICAgICAgU3VjY2VzcyA9IEdyZWVuLAotCi0g ICAgICAgICAgICBPcmlnaW5hbEV4cHJlc3Npb24gPSBDeWFuLAotICAgICAgICAgICAgUmVjb25z dHJ1Y3RlZEV4cHJlc3Npb24gPSBCcmlnaHRZZWxsb3csCi0KLSAgICAgICAgICAgIFNlY29uZGFy eVRleHQgPSBMaWdodEdyZXksCi0gICAgICAgICAgICBIZWFkZXJzID0gV2hpdGUKLSAgICAgICAg fTsKLQotICAgICAgICAvLyBVc2UgY29uc3RydWN0ZWQgb2JqZWN0IGZvciBSQUlJIGd1YXJkCi0g ICAgICAgIENvbG91ciggQ29kZSBfY29sb3VyQ29kZSApOwotICAgICAgICBDb2xvdXIoIENvbG91 ciYmIG90aGVyICkgbm9leGNlcHQ7Ci0gICAgICAgIENvbG91ciYgb3BlcmF0b3I9KCBDb2xvdXIm JiBvdGhlciApIG5vZXhjZXB0OwotICAgICAgICB+Q29sb3VyKCk7Ci0KLSAgICAgICAgLy8gVXNl IHN0YXRpYyBtZXRob2QgZm9yIG9uZS1zaG90IGNoYW5nZXMKLSAgICAgICAgc3RhdGljIHZvaWQg dXNlKCBDb2RlIF9jb2xvdXJDb2RlICk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBib29sIG1f bW92ZWQgPSBmYWxzZTsKLSAgICB9OwotCi0gICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAo IHN0ZDo6b3N0cmVhbSYgb3MsIENvbG91ciBjb25zdCYgKTsKLQotfSAvLyBlbmQgbmFtZXNwYWNl IENhdGNoCi0KLS8vIGVuZCBjYXRjaF9jb25zb2xlX2NvbG91ci5oCi0vLyBzdGFydCBjYXRjaF9y ZXBvcnRlcl9yZWdpc3RyYXJzLmhwcAotCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBUPgotICAgIGNsYXNzIFJlcG9ydGVyUmVnaXN0cmFyIHsKLQotICAgICAg ICBjbGFzcyBSZXBvcnRlckZhY3RvcnkgOiBwdWJsaWMgSVJlcG9ydGVyRmFjdG9yeSB7Ci0KLSAg ICAgICAgICAgIElTdHJlYW1pbmdSZXBvcnRlclB0ciBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNv bnN0JiBjb25maWcgKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0 ZDo6dW5pcXVlX3B0cjxUPiggbmV3IFQoIGNvbmZpZyApICk7Ci0gICAgICAgICAgICB9Ci0KLSAg ICAgICAgICAgIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgewot ICAgICAgICAgICAgICAgIHJldHVybiBUOjpnZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAg fQotICAgICAgICB9OwotCi0gICAgcHVibGljOgotCi0gICAgICAgIGV4cGxpY2l0IFJlcG9ydGVy UmVnaXN0cmFyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKLSAgICAgICAgICAgIGdldE11 dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIHN0ZDo6bWFrZV9zaGFy ZWQ8UmVwb3J0ZXJGYWN0b3J5PigpICk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgdGVtcGxh dGU8dHlwZW5hbWUgVD4KLSAgICBjbGFzcyBMaXN0ZW5lclJlZ2lzdHJhciB7Ci0KLSAgICAgICAg Y2xhc3MgTGlzdGVuZXJGYWN0b3J5IDogcHVibGljIElSZXBvcnRlckZhY3RvcnkgewotCi0gICAg ICAgICAgICBJU3RyZWFtaW5nUmVwb3J0ZXJQdHIgY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25z dCYgY29uZmlnICkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6 OnVuaXF1ZV9wdHI8VD4oIG5ldyBUKCBjb25maWcgKSApOwotICAgICAgICAgICAgfQotICAgICAg ICAgICAgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCBvdmVycmlkZSB7Ci0gICAg ICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg IH07Ci0KLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgTGlzdGVuZXJSZWdpc3RyYXIoKSB7Ci0gICAg ICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3Rlckxpc3RlbmVyKCBzdGQ6Om1h a2Vfc2hhcmVkPExpc3RlbmVyRmFjdG9yeT4oKSApOwotICAgICAgICB9Ci0gICAgfTsKLX0KLQot I2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFKQotCi0jZGVmaW5lIENBVENIX1JFR0lT VEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCi0gICAgQ0FUQ0hfSU5URVJOQUxf U1RBUlRfV0FSTklOR1NfU1VQUFJFU1NJT04gICAgICAgICBcCi0gICAgQ0FUQ0hfSU5URVJOQUxf U1VQUFJFU1NfR0xPQkFMU19XQVJOSU5HUyAgICAgICAgICBcCi0gICAgbmFtZXNwYWNleyBDYXRj aDo6UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3Ry YXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9IFwKLSAgICBDQVRDSF9JTlRFUk5BTF9TVE9Q X1dBUk5JTkdTX1NVUFBSRVNTSU9OCi0KLSNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIo IGxpc3RlbmVyVHlwZSApIFwKLSAgICBDQVRDSF9JTlRFUk5BTF9TVEFSVF9XQVJOSU5HU19TVVBQ UkVTU0lPTiAgIFwKLSAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19HTE9CQUxTX1dBUk5JTkdT ICAgIFwKLSAgICBuYW1lc3BhY2V7IENhdGNoOjpMaXN0ZW5lclJlZ2lzdHJhcjxsaXN0ZW5lclR5 cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjbGlzdGVuZXJUeXBlOyB9IFwKLSAgICBD QVRDSF9JTlRFUk5BTF9TVE9QX1dBUk5JTkdTX1NVUFBSRVNTSU9OCi0jZWxzZSAvLyBDQVRDSF9D T05GSUdfRElTQUJMRQotCi0jZGVmaW5lIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKG5hbWUsIHJl cG9ydGVyVHlwZSkKLSNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTElTVEVORVIobGlzdGVuZXJUeXBl KQotCi0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEUKLQotLy8gZW5kIGNhdGNoX3JlcG9y dGVyX3JlZ2lzdHJhcnMuaHBwCi0vLyBBbGxvdyB1c2VycyB0byBiYXNlIHRoZWlyIHdvcmsgb2Zm IGV4aXN0aW5nIHJlcG9ydGVycwotLy8gc3RhcnQgY2F0Y2hfcmVwb3J0ZXJfY29tcGFjdC5oCi0K LW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBzdHJ1Y3QgQ29tcGFjdFJlcG9ydGVyIDogU3RyZWFt aW5nUmVwb3J0ZXJCYXNlPENvbXBhY3RSZXBvcnRlcj4gewotCi0gICAgICAgIHVzaW5nIFN0cmVh bWluZ1JlcG9ydGVyQmFzZTo6U3RyZWFtaW5nUmVwb3J0ZXJCYXNlOwotCi0gICAgICAgIH5Db21w YWN0UmVwb3J0ZXIoKSBvdmVycmlkZTsKLQotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0 RGVzY3JpcHRpb24oKTsKLQotICAgICAgICB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoc3RkOjpz dHJpbmcgY29uc3QmIHNwZWMpIG92ZXJyaWRlOwotCi0gICAgICAgIHZvaWQgYXNzZXJ0aW9uU3Rh cnRpbmcoQXNzZXJ0aW9uSW5mbyBjb25zdCYpIG92ZXJyaWRlOwotCi0gICAgICAgIGJvb2wgYXNz ZXJ0aW9uRW5kZWQoQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cykgb3ZlcnJp ZGU7Ci0KLSAgICAgICAgdm9pZCBzZWN0aW9uRW5kZWQoU2VjdGlvblN0YXRzIGNvbnN0JiBfc2Vj dGlvblN0YXRzKSBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0UnVu U3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMpIG92ZXJyaWRlOwotCi0gICAgfTsKLQotfSAvLyBl bmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9yZXBvcnRlcl9jb21wYWN0LmgKLS8v IHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2NvbnNvbGUuaAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikK LSNwcmFnbWEgd2FybmluZyhwdXNoKQotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDA2MSkgLy8g Tm90IGFsbCBsYWJlbHMgYXJlIEVYUExJQ0lUTFkgaGFuZGxlZCBpbiBzd2l0Y2gKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCA0MDYyIChub3QgYWxsIGxhYmVscyBh cmUgaGFuZGxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRlZmF1bHQg aXMgbWlzc2luZykgaXMgZW5hYmxlZAotI2VuZGlmCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAg Ly8gRndkIGRlY2xzCi0gICAgc3RydWN0IFN1bW1hcnlDb2x1bW47Ci0gICAgY2xhc3MgVGFibGVQ cmludGVyOwotCi0gICAgc3RydWN0IENvbnNvbGVSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVy QmFzZTxDb25zb2xlUmVwb3J0ZXI+IHsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRhYmxlUHJp bnRlcj4gbV90YWJsZVByaW50ZXI7Ci0KLSAgICAgICAgQ29uc29sZVJlcG9ydGVyKFJlcG9ydGVy Q29uZmlnIGNvbnN0JiBjb25maWcpOwotICAgICAgICB+Q29uc29sZVJlcG9ydGVyKCkgb3ZlcnJp ZGU7Ci0gICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAg ICAgIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyhzdGQ6OnN0cmluZyBjb25zdCYgc3BlYykgb3Zl cnJpZGU7Ci0KLSAgICAgICAgdm9pZCByZXBvcnRJbnZhbGlkQXJndW1lbnRzKHN0ZDo6c3RyaW5n IGNvbnN0JmFyZykgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCBhc3NlcnRpb25TdGFydGluZyhB c3NlcnRpb25JbmZvIGNvbnN0Jikgb3ZlcnJpZGU7Ci0KLSAgICAgICAgYm9vbCBhc3NlcnRpb25F bmRlZChBc3NlcnRpb25TdGF0cyBjb25zdCYgX2Fzc2VydGlvblN0YXRzKSBvdmVycmlkZTsKLQot ICAgICAgICB2b2lkIHNlY3Rpb25TdGFydGluZyhTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25J bmZvKSBvdmVycmlkZTsKLSAgICAgICAgdm9pZCBzZWN0aW9uRW5kZWQoU2VjdGlvblN0YXRzIGNv bnN0JiBfc2VjdGlvblN0YXRzKSBvdmVycmlkZTsKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklH X0VOQUJMRV9CRU5DSE1BUktJTkcpCi0gICAgICAgIHZvaWQgYmVuY2htYXJrUHJlcGFyaW5nKHN0 ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSBvdmVycmlkZTsKLSAgICAgICAgdm9pZCBiZW5jaG1hcmtT dGFydGluZyhCZW5jaG1hcmtJbmZvIGNvbnN0JiBpbmZvKSBvdmVycmlkZTsKLSAgICAgICAgdm9p ZCBiZW5jaG1hcmtFbmRlZChCZW5jaG1hcmtTdGF0czw+IGNvbnN0JiBzdGF0cykgb3ZlcnJpZGU7 Ci0gICAgICAgIHZvaWQgYmVuY2htYXJrRmFpbGVkKHN0ZDo6c3RyaW5nIGNvbnN0JiBlcnJvcikg b3ZlcnJpZGU7Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcKLQot ICAgICAgICB2b2lkIHRlc3RDYXNlRW5kZWQoVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNl U3RhdHMpIG92ZXJyaWRlOwotICAgICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKFRlc3RHcm91cFN0 YXRzIGNvbnN0JiBfdGVzdEdyb3VwU3RhdHMpIG92ZXJyaWRlOwotICAgICAgICB2b2lkIHRlc3RS dW5FbmRlZChUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMpIG92ZXJyaWRlOwotICAg ICAgICB2b2lkIHRlc3RSdW5TdGFydGluZyhUZXN0UnVuSW5mbyBjb25zdCYgX3Rlc3RSdW5JbmZv KSBvdmVycmlkZTsKLSAgICBwcml2YXRlOgotCi0gICAgICAgIHZvaWQgbGF6eVByaW50KCk7Ci0K LSAgICAgICAgdm9pZCBsYXp5UHJpbnRXaXRob3V0Q2xvc2luZ0JlbmNobWFya1RhYmxlKCk7Ci0g ICAgICAgIHZvaWQgbGF6eVByaW50UnVuSW5mbygpOwotICAgICAgICB2b2lkIGxhenlQcmludEdy b3VwSW5mbygpOwotICAgICAgICB2b2lkIHByaW50VGVzdENhc2VBbmRTZWN0aW9uSGVhZGVyKCk7 Ci0KLSAgICAgICAgdm9pZCBwcmludENsb3NlZEhlYWRlcihzdGQ6OnN0cmluZyBjb25zdCYgX25h bWUpOwotICAgICAgICB2b2lkIHByaW50T3BlbkhlYWRlcihzdGQ6OnN0cmluZyBjb25zdCYgX25h bWUpOwotCi0gICAgICAgIC8vIGlmIHN0cmluZyBoYXMgYSA6IGluIGZpcnN0IGxpbmUgd2lsbCBz ZXQgaW5kZW50IHRvIGZvbGxvdyBpdCBvbgotICAgICAgICAvLyBzdWJzZXF1ZW50IGxpbmVzCi0g ICAgICAgIHZvaWQgcHJpbnRIZWFkZXJTdHJpbmcoc3RkOjpzdHJpbmcgY29uc3QmIF9zdHJpbmcs IHN0ZDo6c2l6ZV90IGluZGVudCA9IDApOwotCi0gICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoVG90 YWxzIGNvbnN0JiB0b3RhbHMpOwotICAgICAgICB2b2lkIHByaW50U3VtbWFyeVJvdyhzdGQ6OnN0 cmluZyBjb25zdCYgbGFiZWwsIHN0ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+IGNvbnN0JiBjb2xz LCBzdGQ6OnNpemVfdCByb3cpOwotCi0gICAgICAgIHZvaWQgcHJpbnRUb3RhbHNEaXZpZGVyKFRv dGFscyBjb25zdCYgdG90YWxzKTsKLSAgICAgICAgdm9pZCBwcmludFN1bW1hcnlEaXZpZGVyKCk7 Ci0gICAgICAgIHZvaWQgcHJpbnRUZXN0RmlsdGVycygpOwotCi0gICAgcHJpdmF0ZToKLSAgICAg ICAgYm9vbCBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKLSAgICB9OwotCi19IC8vIGVuZCBuYW1l c3BhY2UgQ2F0Y2gKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jcHJhZ21hIHdhcm5pbmcocG9w KQotI2VuZGlmCi0KLS8vIGVuZCBjYXRjaF9yZXBvcnRlcl9jb25zb2xlLmgKLS8vIHN0YXJ0IGNh dGNoX3JlcG9ydGVyX2p1bml0LmgKLQotLy8gc3RhcnQgY2F0Y2hfeG1sd3JpdGVyLmgKLQotI2lu Y2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBlbnVtIGNsYXNzIFhtbEZv cm1hdHRpbmcgewotICAgICAgICBOb25lID0gMHgwMCwKLSAgICAgICAgSW5kZW50ID0gMHgwMSwK LSAgICAgICAgTmV3bGluZSA9IDB4MDIsCi0gICAgfTsKLQotICAgIFhtbEZvcm1hdHRpbmcgb3Bl cmF0b3IgfCAoWG1sRm9ybWF0dGluZyBsaHMsIFhtbEZvcm1hdHRpbmcgcmhzKTsKLSAgICBYbWxG b3JtYXR0aW5nIG9wZXJhdG9yICYgKFhtbEZvcm1hdHRpbmcgbGhzLCBYbWxGb3JtYXR0aW5nIHJo cyk7Ci0KLSAgICBjbGFzcyBYbWxFbmNvZGUgewotICAgIHB1YmxpYzoKLSAgICAgICAgZW51bSBG b3JXaGF0IHsgRm9yVGV4dE5vZGVzLCBGb3JBdHRyaWJ1dGVzIH07Ci0KLSAgICAgICAgWG1sRW5j b2RlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBGb3JXaGF0IGZvcldoYXQgPSBGb3JUZXh0Tm9k ZXMgKTsKLQotICAgICAgICB2b2lkIGVuY29kZVRvKCBzdGQ6Om9zdHJlYW0mIG9zICkgY29uc3Q7 Ci0KLSAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJl YW0mIG9zLCBYbWxFbmNvZGUgY29uc3QmIHhtbEVuY29kZSApOwotCi0gICAgcHJpdmF0ZToKLSAg ICAgICAgc3RkOjpzdHJpbmcgbV9zdHI7Ci0gICAgICAgIEZvcldoYXQgbV9mb3JXaGF0OwotICAg IH07Ci0KLSAgICBjbGFzcyBYbWxXcml0ZXIgewotICAgIHB1YmxpYzoKLQotICAgICAgICBjbGFz cyBTY29wZWRFbGVtZW50IHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU2NvcGVkRWxl bWVudCggWG1sV3JpdGVyKiB3cml0ZXIsIFhtbEZvcm1hdHRpbmcgZm10ICk7Ci0KLSAgICAgICAg ICAgIFNjb3BlZEVsZW1lbnQoIFNjb3BlZEVsZW1lbnQmJiBvdGhlciApIG5vZXhjZXB0OwotICAg ICAgICAgICAgU2NvcGVkRWxlbWVudCYgb3BlcmF0b3I9KCBTY29wZWRFbGVtZW50JiYgb3RoZXIg KSBub2V4Y2VwdDsKLQotICAgICAgICAgICAgflNjb3BlZEVsZW1lbnQoKTsKLQotICAgICAgICAg ICAgU2NvcGVkRWxlbWVudCYgd3JpdGVUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCwgWG1s Rm9ybWF0dGluZyBmbXQgPSBYbWxGb3JtYXR0aW5nOjpOZXdsaW5lIHwgWG1sRm9ybWF0dGluZzo6 SW5kZW50ICk7Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgICAg ICBTY29wZWRFbGVtZW50JiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUs IFQgY29uc3QmIGF0dHJpYnV0ZSApIHsKLSAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVB dHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZSApOwotICAgICAgICAgICAgICAgIHJldHVybiAqdGhp czsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgbXV0YWJs ZSBYbWxXcml0ZXIqIG1fd3JpdGVyID0gbnVsbHB0cjsKLSAgICAgICAgICAgIFhtbEZvcm1hdHRp bmcgbV9mbXQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgWG1sV3JpdGVyKCBzdGQ6Om9zdHJlYW0m IG9zID0gQ2F0Y2g6OmNvdXQoKSApOwotICAgICAgICB+WG1sV3JpdGVyKCk7Ci0KLSAgICAgICAg WG1sV3JpdGVyKCBYbWxXcml0ZXIgY29uc3QmICkgPSBkZWxldGU7Ci0gICAgICAgIFhtbFdyaXRl ciYgb3BlcmF0b3I9KCBYbWxXcml0ZXIgY29uc3QmICkgPSBkZWxldGU7Ci0KLSAgICAgICAgWG1s V3JpdGVyJiBzdGFydEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBYbWxGb3JtYXR0 aW5nIGZtdCA9IFhtbEZvcm1hdHRpbmc6Ok5ld2xpbmUgfCBYbWxGb3JtYXR0aW5nOjpJbmRlbnQp OwotCi0gICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkRWxlbWVudCggc3RkOjpzdHJpbmcgY29u c3QmIG5hbWUsIFhtbEZvcm1hdHRpbmcgZm10ID0gWG1sRm9ybWF0dGluZzo6TmV3bGluZSB8IFht bEZvcm1hdHRpbmc6OkluZGVudCk7Ci0KLSAgICAgICAgWG1sV3JpdGVyJiBlbmRFbGVtZW50KFht bEZvcm1hdHRpbmcgZm10ID0gWG1sRm9ybWF0dGluZzo6TmV3bGluZSB8IFhtbEZvcm1hdHRpbmc6 OkluZGVudCk7Ci0KLSAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJp bmcgY29uc3QmIG5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhdHRyaWJ1dGUgKTsKLQotICAgICAg ICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgYm9v bCBhdHRyaWJ1dGUgKTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBY bWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25z dCYgYXR0cmlidXRlICkgewotICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwot ICAgICAgICAgICAgcnNzIDw8IGF0dHJpYnV0ZTsKLSAgICAgICAgICAgIHJldHVybiB3cml0ZUF0 dHJpYnV0ZSggbmFtZSwgcnNzLnN0cigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxXcml0 ZXImIHdyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIFhtbEZvcm1hdHRpbmcgZm10 ID0gWG1sRm9ybWF0dGluZzo6TmV3bGluZSB8IFhtbEZvcm1hdHRpbmc6OkluZGVudCk7Ci0KLSAg ICAgICAgWG1sV3JpdGVyJiB3cml0ZUNvbW1lbnQoc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIFht bEZvcm1hdHRpbmcgZm10ID0gWG1sRm9ybWF0dGluZzo6TmV3bGluZSB8IFhtbEZvcm1hdHRpbmc6 OkluZGVudCk7Ci0KLSAgICAgICAgdm9pZCB3cml0ZVN0eWxlc2hlZXRSZWYoIHN0ZDo6c3RyaW5n IGNvbnN0JiB1cmwgKTsKLQotICAgICAgICBYbWxXcml0ZXImIHdyaXRlQmxhbmtMaW5lKCk7Ci0K LSAgICAgICAgdm9pZCBlbnN1cmVUYWdDbG9zZWQoKTsKLQotICAgIHByaXZhdGU6Ci0KLSAgICAg ICAgdm9pZCBhcHBseUZvcm1hdHRpbmcoWG1sRm9ybWF0dGluZyBmbXQpOwotCi0gICAgICAgIHZv aWQgd3JpdGVEZWNsYXJhdGlvbigpOwotCi0gICAgICAgIHZvaWQgbmV3bGluZUlmTmVjZXNzYXJ5 KCk7Ci0KLSAgICAgICAgYm9vbCBtX3RhZ0lzT3BlbiA9IGZhbHNlOwotICAgICAgICBib29sIG1f bmVlZHNOZXdsaW5lID0gZmFsc2U7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBt X3RhZ3M7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG1faW5kZW50OwotICAgICAgICBzdGQ6Om9zdHJl YW0mIG1fb3M7Ci0gICAgfTsKLQotfQotCi0vLyBlbmQgY2F0Y2hfeG1sd3JpdGVyLmgKLW5hbWVz cGFjZSBDYXRjaCB7Ci0KLSAgICBjbGFzcyBKdW5pdFJlcG9ydGVyIDogcHVibGljIEN1bXVsYXRp dmVSZXBvcnRlckJhc2U8SnVuaXRSZXBvcnRlcj4gewotICAgIHB1YmxpYzoKLSAgICAgICAgSnVu aXRSZXBvcnRlcihSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyk7Ci0KLSAgICAgICAgfkp1 bml0UmVwb3J0ZXIoKSBvdmVycmlkZTsKLQotICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0 RGVzY3JpcHRpb24oKTsKLQotICAgICAgICB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoc3RkOjpz dHJpbmcgY29uc3QmIC8qc3BlYyovKSBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIHRlc3RSdW5T dGFydGluZyhUZXN0UnVuSW5mbyBjb25zdCYgcnVuSW5mbykgb3ZlcnJpZGU7Ci0KLSAgICAgICAg dm9pZCB0ZXN0R3JvdXBTdGFydGluZyhHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbykgb3ZlcnJp ZGU7Ci0KLSAgICAgICAgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKFRlc3RDYXNlSW5mbyBjb25zdCYg dGVzdENhc2VJbmZvKSBvdmVycmlkZTsKLSAgICAgICAgYm9vbCBhc3NlcnRpb25FbmRlZChBc3Nl cnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMpIG92ZXJyaWRlOwotCi0gICAgICAgIHZv aWQgdGVzdENhc2VFbmRlZChUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzKSBvdmVy cmlkZTsKLQotICAgICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKFRlc3RHcm91cFN0YXRzIGNvbnN0 JiB0ZXN0R3JvdXBTdGF0cykgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCB0ZXN0UnVuRW5kZWRD dW11bGF0aXZlKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCB3cml0ZUdyb3VwKFRlc3RHcm91 cE5vZGUgY29uc3QmIGdyb3VwTm9kZSwgZG91YmxlIHN1aXRlVGltZSk7Ci0KLSAgICAgICAgdm9p ZCB3cml0ZVRlc3RDYXNlKFRlc3RDYXNlTm9kZSBjb25zdCYgdGVzdENhc2VOb2RlKTsKLQotICAg ICAgICB2b2lkIHdyaXRlU2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzTmFtZSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByb290TmFtZSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGVzdE9rVG9GYWlsICk7Ci0KLSAgICAg ICAgdm9pZCB3cml0ZUFzc2VydGlvbnMoU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlKTsK LSAgICAgICAgdm9pZCB3cml0ZUFzc2VydGlvbihBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHMp OwotCi0gICAgICAgIFhtbFdyaXRlciB4bWw7Ci0gICAgICAgIFRpbWVyIHN1aXRlVGltZXI7Ci0g ICAgICAgIHN0ZDo6c3RyaW5nIHN0ZE91dEZvclN1aXRlOwotICAgICAgICBzdGQ6OnN0cmluZyBz dGRFcnJGb3JTdWl0ZTsKLSAgICAgICAgdW5zaWduZWQgaW50IHVuZXhwZWN0ZWRFeGNlcHRpb25z ID0gMDsKLSAgICAgICAgYm9vbCBtX29rVG9GYWlsID0gZmFsc2U7Ci0gICAgfTsKLQotfSAvLyBl bmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9yZXBvcnRlcl9qdW5pdC5oCi0vLyBz dGFydCBjYXRjaF9yZXBvcnRlcl94bWwuaAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIGNsYXNz IFhtbFJlcG9ydGVyIDogcHVibGljIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTxYbWxSZXBvcnRlcj4g ewotICAgIHB1YmxpYzoKLSAgICAgICAgWG1sUmVwb3J0ZXIoUmVwb3J0ZXJDb25maWcgY29uc3Qm IF9jb25maWcpOwotCi0gICAgICAgIH5YbWxSZXBvcnRlcigpIG92ZXJyaWRlOwotCi0gICAgICAg IHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIHZpcnR1YWwg c3RkOjpzdHJpbmcgZ2V0U3R5bGVzaGVldFJlZigpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgd3Jp dGVTb3VyY2VJbmZvKFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBzb3VyY2VJbmZvKTsKLQotICAgIHB1 YmxpYzogLy8gU3RyZWFtaW5nUmVwb3J0ZXJCYXNlCi0KLSAgICAgICAgdm9pZCBub01hdGNoaW5n VGVzdENhc2VzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzKSBvdmVycmlkZTsKLQotICAgICAgICB2b2lk IHRlc3RSdW5TdGFydGluZyhUZXN0UnVuSW5mbyBjb25zdCYgdGVzdEluZm8pIG92ZXJyaWRlOwot Ci0gICAgICAgIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoR3JvdXBJbmZvIGNvbnN0JiBncm91cElu Zm8pIG92ZXJyaWRlOwotCi0gICAgICAgIHZvaWQgdGVzdENhc2VTdGFydGluZyhUZXN0Q2FzZUlu Zm8gY29uc3QmIHRlc3RJbmZvKSBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIHNlY3Rpb25TdGFy dGluZyhTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8pIG92ZXJyaWRlOwotCi0gICAgICAg IHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoQXNzZXJ0aW9uSW5mbyBjb25zdCYpIG92ZXJyaWRlOwot Ci0gICAgICAgIGJvb2wgYXNzZXJ0aW9uRW5kZWQoQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2Vy dGlvblN0YXRzKSBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIHNlY3Rpb25FbmRlZChTZWN0aW9u U3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cykgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCB0ZXN0 Q2FzZUVuZGVkKFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMpIG92ZXJyaWRlOwot Ci0gICAgICAgIHZvaWQgdGVzdEdyb3VwRW5kZWQoVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RH cm91cFN0YXRzKSBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIHRlc3RSdW5FbmRlZChUZXN0UnVu U3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cykgb3ZlcnJpZGU7Ci0KLSNpZiBkZWZpbmVkKENBVENI X0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HKQotICAgICAgICB2b2lkIGJlbmNobWFya1ByZXBh cmluZyhzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSkgb3ZlcnJpZGU7Ci0gICAgICAgIHZvaWQgYmVu Y2htYXJrU3RhcnRpbmcoQmVuY2htYXJrSW5mbyBjb25zdCYpIG92ZXJyaWRlOwotICAgICAgICB2 b2lkIGJlbmNobWFya0VuZGVkKEJlbmNobWFya1N0YXRzPD4gY29uc3QmKSBvdmVycmlkZTsKLSAg ICAgICAgdm9pZCBiZW5jaG1hcmtGYWlsZWQoc3RkOjpzdHJpbmcgY29uc3QmKSBvdmVycmlkZTsK LSNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORwotCi0gICAgcHJpdmF0 ZToKLSAgICAgICAgVGltZXIgbV90ZXN0Q2FzZVRpbWVyOwotICAgICAgICBYbWxXcml0ZXIgbV94 bWw7Ci0gICAgICAgIGludCBtX3NlY3Rpb25EZXB0aCA9IDA7Ci0gICAgfTsKLQotfSAvLyBlbmQg bmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9yZXBvcnRlcl94bWwuaAotCi0vLyBlbmQg Y2F0Y2hfZXh0ZXJuYWxfaW50ZXJmYWNlcy5oCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ0FUQ0hf Q09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCi0vLyBzdGFydCBjYXRjaF9iZW5jaG1hcmtpbmdf YWxsLmhwcAotCi0vLyBBIHByb3h5IGhlYWRlciB0aGF0IGluY2x1ZGVzIGFsbCBvZiB0aGUgYmVu Y2htYXJraW5nIGhlYWRlcnMgdG8gYWxsb3cKLS8vIGNvbmNpc2UgaW5jbHVkZSBvZiB0aGUgYmVu Y2htYXJraW5nIGZlYXR1cmVzLiBZb3Ugc2hvdWxkIHByZWZlciB0aGUKLS8vIGluZGl2aWR1YWwg aW5jbHVkZXMgaW4gc3RhbmRhcmQgdXNlLgotCi0vLyBzdGFydCBjYXRjaF9iZW5jaG1hcmsuaHBw Ci0KLSAvLyBCZW5jaG1hcmsKLQotLy8gc3RhcnQgY2F0Y2hfY2hyb25vbWV0ZXIuaHBwCi0KLS8v IFVzZXItZmFjaW5nIGNocm9ub21ldGVyCi0KLQotLy8gc3RhcnQgY2F0Y2hfY2xvY2suaHBwCi0K LS8vIENsb2NrcwotCi0KLSNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8cmF0aW8+Ci0KLW5h bWVzcGFjZSBDYXRjaCB7Ci0gICAgbmFtZXNwYWNlIEJlbmNobWFyayB7Ci0gICAgICAgIHRlbXBs YXRlIDx0eXBlbmFtZSBDbG9jaz4KLSAgICAgICAgdXNpbmcgQ2xvY2tEdXJhdGlvbiA9IHR5cGVu YW1lIENsb2NrOjpkdXJhdGlvbjsKLSAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrPgot ICAgICAgICB1c2luZyBGbG9hdER1cmF0aW9uID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJs ZSwgdHlwZW5hbWUgQ2xvY2s6OnBlcmlvZD47Ci0KLSAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1l IENsb2NrPgotICAgICAgICB1c2luZyBUaW1lUG9pbnQgPSB0eXBlbmFtZSBDbG9jazo6dGltZV9w b2ludDsKLQotICAgICAgICB1c2luZyBkZWZhdWx0X2Nsb2NrID0gc3RkOjpjaHJvbm86OnN0ZWFk eV9jbG9jazsKLQotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2s+Ci0gICAgICAgIHN0 cnVjdCBub3cgewotICAgICAgICAgICAgVGltZVBvaW50PENsb2NrPiBvcGVyYXRvcigpKCkgY29u c3QgewotICAgICAgICAgICAgICAgIHJldHVybiBDbG9jazo6bm93KCk7Ci0gICAgICAgICAgICB9 Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdXNpbmcgZnBfc2Vjb25kcyA9IHN0ZDo6Y2hyb25vOjpk dXJhdGlvbjxkb3VibGUsIHN0ZDo6cmF0aW88MT4+OwotICAgIH0gLy8gbmFtZXNwYWNlIEJlbmNo bWFyawotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX2Nsb2NrLmhwcAotLy8g c3RhcnQgY2F0Y2hfb3B0aW1pemVyLmhwcAotCi0gLy8gSGludGluZyB0aGUgb3B0aW1pemVyCi0K LQotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jICAgaW5jbHVkZSA8YXRvbWljPiAvLyBhdG9taWNf dGhyZWFkX2ZlbmNlCi0jZW5kaWYKLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBuYW1lc3BhY2Ug QmVuY2htYXJrIHsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykK LSAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGlubGluZSB2b2lkIGtlZXBf bWVtb3J5KFQqIHApIHsKLSAgICAgICAgICAgIGFzbSB2b2xhdGlsZSgiIiA6IDogImciKHApIDog Im1lbW9yeSIpOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSB2b2lkIGtlZXBfbWVtb3J5KCkg ewotICAgICAgICAgICAgYXNtIHZvbGF0aWxlKCIiIDogOiA6ICJtZW1vcnkiKTsKLSAgICAgICAg fQotCi0gICAgICAgIG5hbWVzcGFjZSBEZXRhaWwgewotICAgICAgICAgICAgaW5saW5lIHZvaWQg b3B0aW1pemVyX2JhcnJpZXIoKSB7IGtlZXBfbWVtb3J5KCk7IH0KLSAgICAgICAgfSAvLyBuYW1l c3BhY2UgRGV0YWlsCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotCi0jcHJhZ21hIG9wdGltaXpl KCIiLCBvZmYpCi0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgICAgICBpbmxpbmUg dm9pZCBrZWVwX21lbW9yeShUKiBwKSB7Ci0gICAgICAgICAgICAvLyB0aGFua3MgQG1pbGxlbml1 bWJ1ZwotICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciB2b2xhdGlsZSo+KHApID0g KnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciBjb25zdCB2b2xhdGlsZSo+KHApOwotICAgICAgICB9Ci0g ICAgICAgIC8vIFRPRE8gZXF1aXZhbGVudCBrZWVwX21lbW9yeSgpCi0jcHJhZ21hIG9wdGltaXpl KCIiLCBvbikKLQotICAgICAgICBuYW1lc3BhY2UgRGV0YWlsIHsKLSAgICAgICAgICAgIGlubGlu ZSB2b2lkIG9wdGltaXplcl9iYXJyaWVyKCkgewotICAgICAgICAgICAgICAgIHN0ZDo6YXRvbWlj X3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgICAgIH0K LSAgICAgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCi0KLSNlbmRpZgotCi0gICAgICAgIHRlbXBs YXRlIDx0eXBlbmFtZSBUPgotICAgICAgICBpbmxpbmUgdm9pZCBkZW9wdGltaXplX3ZhbHVlKFQm JiB4KSB7Ci0gICAgICAgICAgICBrZWVwX21lbW9yeSgmeCk7Ci0gICAgICAgIH0KLQotICAgICAg ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRm4sIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gICAgICAgIGlubGlu ZSBhdXRvIGludm9rZV9kZW9wdGltaXplZChGbiYmIGZuLCBBcmdzJiYuLi4gYXJncykgLT4gdHlw ZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTx2b2lkLCBkZWNsdHlwZShmbihhcmdz Li4uKSk+Ojp2YWx1ZT46OnR5cGUgewotICAgICAgICAgICAgZGVvcHRpbWl6ZV92YWx1ZShzdGQ6 OmZvcndhcmQ8Rm4+KGZuKSAoc3RkOjpmb3J3YXJkPEFyZ3MuLi4+KGFyZ3MuLi4pKSk7Ci0gICAg ICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRm4sIHR5cGVuYW1lLi4uIEFyZ3M+ Ci0gICAgICAgIGlubGluZSBhdXRvIGludm9rZV9kZW9wdGltaXplZChGbiYmIGZuLCBBcmdzJiYu Li4gYXJncykgLT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPHZvaWQsIGRl Y2x0eXBlKGZuKGFyZ3MuLi4pKT46OnZhbHVlPjo6dHlwZSB7Ci0gICAgICAgICAgICBzdGQ6OmZv cndhcmQ8Rm4+KGZuKSAoc3RkOjpmb3J3YXJkPEFyZ3MuLi4+KGFyZ3MuLi4pKTsKLSAgICAgICAg fQotICAgIH0gLy8gbmFtZXNwYWNlIEJlbmNobWFyawotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQot Ly8gZW5kIGNhdGNoX29wdGltaXplci5ocHAKLS8vIHN0YXJ0IGNhdGNoX2NvbXBsZXRlX2ludm9r ZS5ocHAKLQotLy8gSW52b2tlIHdpdGggYSBzcGVjaWFsIGNhc2UgZm9yIHZvaWQKLQotCi0jaW5j bHVkZSA8dHlwZV90cmFpdHM+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotbmFtZXNwYWNlIENhdGNo IHsKLSAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKLSAgICAgICAgbmFtZXNwYWNlIERldGFpbCB7 Ci0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICAgICAgICAgIHN0cnVjdCBD b21wbGV0ZVR5cGUgeyB1c2luZyB0eXBlID0gVDsgfTsKLSAgICAgICAgICAgIHRlbXBsYXRlIDw+ Ci0gICAgICAgICAgICBzdHJ1Y3QgQ29tcGxldGVUeXBlPHZvaWQ+IHsgc3RydWN0IHR5cGUge307 IH07Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgICAgICAgICAgdXNp bmcgQ29tcGxldGVUeXBlX3QgPSB0eXBlbmFtZSBDb21wbGV0ZVR5cGU8VD46OnR5cGU7Ci0KLSAg ICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHQ+Ci0gICAgICAgICAgICBzdHJ1Y3Qg Q29tcGxldGVJbnZva2VyIHsKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVu LCB0eXBlbmFtZS4uLiBBcmdzPgotICAgICAgICAgICAgICAgIHN0YXRpYyBSZXN1bHQgaW52b2tl KEZ1biYmIGZ1biwgQXJncyYmLi4uIGFyZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu IHN0ZDo6Zm9yd2FyZDxGdW4+KGZ1bikoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAg ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdGVtcGxhdGUgPD4K LSAgICAgICAgICAgIHN0cnVjdCBDb21wbGV0ZUludm9rZXI8dm9pZD4gewotICAgICAgICAgICAg ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW4sIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gICAgICAgICAg ICAgICAgc3RhdGljIENvbXBsZXRlVHlwZV90PHZvaWQ+IGludm9rZShGdW4mJiBmdW4sIEFyZ3Mm Ji4uLiBhcmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxGdW4+KGZ1biko c3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu IHt9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8v IGludm9rZSBhbmQgbm90IHJldHVybiB2b2lkIDooCi0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgRnVuLCB0eXBlbmFtZS4uLiBBcmdzPgotICAgICAgICAgICAgQ29tcGxldGVUeXBlX3Q8 RnVuY3Rpb25SZXR1cm5UeXBlPEZ1biwgQXJncy4uLj4+IGNvbXBsZXRlX2ludm9rZShGdW4mJiBm dW4sIEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBsZXRlSW52 b2tlcjxGdW5jdGlvblJldHVyblR5cGU8RnVuLCBBcmdzLi4uPj46Omludm9rZShzdGQ6OmZvcndh cmQ8RnVuPihmdW4pLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwotICAgICAgICAgICAg fQotCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBiZW5jaG1hcmtFcnJvck1zZyA9ICJh IGJlbmNobWFyayBmYWlsZWQgdG8gcnVuIHN1Y2Nlc3NmdWxseSI7Ci0gICAgICAgIH0gLy8gbmFt ZXNwYWNlIERldGFpbAotCi0gICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW4+Ci0gICAgICAg IERldGFpbDo6Q29tcGxldGVUeXBlX3Q8RnVuY3Rpb25SZXR1cm5UeXBlPEZ1bj4+IHVzZXJfY29k ZShGdW4mJiBmdW4pIHsKLSAgICAgICAgICAgIENBVENIX1RSWXsKLSAgICAgICAgICAgICAgICBy ZXR1cm4gRGV0YWlsOjpjb21wbGV0ZV9pbnZva2Uoc3RkOjpmb3J3YXJkPEZ1bj4oZnVuKSk7Ci0g ICAgICAgICAgICB9IENBVENIX0NBVENIX0FMTHsKLSAgICAgICAgICAgICAgICBnZXRSZXN1bHRD YXB0dXJlKCkuYmVuY2htYXJrRmFpbGVkKHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpKTsKLSAg ICAgICAgICAgICAgICBDQVRDSF9SVU5USU1FX0VSUk9SKERldGFpbDo6YmVuY2htYXJrRXJyb3JN c2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvLyBuYW1lc3BhY2UgQmVuY2ht YXJrCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfY29tcGxldGVfaW52b2tl LmhwcAotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKLSAgICAg ICAgbmFtZXNwYWNlIERldGFpbCB7Ci0gICAgICAgICAgICBzdHJ1Y3QgQ2hyb25vbWV0ZXJDb25j ZXB0IHsKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7Ci0gICAgICAg ICAgICAgICAgdmlydHVhbCB2b2lkIGZpbmlzaCgpID0gMDsKLSAgICAgICAgICAgICAgICB2aXJ0 dWFsIH5DaHJvbm9tZXRlckNvbmNlcHQoKSA9IGRlZmF1bHQ7Ci0gICAgICAgICAgICB9OwotICAg ICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrPgotICAgICAgICAgICAgc3RydWN0IENo cm9ub21ldGVyTW9kZWwgZmluYWwgOiBwdWJsaWMgQ2hyb25vbWV0ZXJDb25jZXB0IHsKLSAgICAg ICAgICAgICAgICB2b2lkIHN0YXJ0KCkgb3ZlcnJpZGUgeyBzdGFydGVkID0gQ2xvY2s6Om5vdygp OyB9Ci0gICAgICAgICAgICAgICAgdm9pZCBmaW5pc2goKSBvdmVycmlkZSB7IGZpbmlzaGVkID0g Q2xvY2s6Om5vdygpOyB9Ci0KLSAgICAgICAgICAgICAgICBDbG9ja0R1cmF0aW9uPENsb2NrPiBl bGFwc2VkKCkgY29uc3QgeyByZXR1cm4gZmluaXNoZWQgLSBzdGFydGVkOyB9Ci0KLSAgICAgICAg ICAgICAgICBUaW1lUG9pbnQ8Q2xvY2s+IHN0YXJ0ZWQ7Ci0gICAgICAgICAgICAgICAgVGltZVBv aW50PENsb2NrPiBmaW5pc2hlZDsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0gLy8gbmFtZXNw YWNlIERldGFpbAotCi0gICAgICAgIHN0cnVjdCBDaHJvbm9tZXRlciB7Ci0gICAgICAgIHB1Ymxp YzoKLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW4+Ci0gICAgICAgICAgICB2b2lk IG1lYXN1cmUoRnVuJiYgZnVuKSB7IG1lYXN1cmUoc3RkOjpmb3J3YXJkPEZ1bj4oZnVuKSwgaXNf Y2FsbGFibGU8RnVuKGludCk+KCkpOyB9Ci0KLSAgICAgICAgICAgIGludCBydW5zKCkgY29uc3Qg eyByZXR1cm4gazsgfQotCi0gICAgICAgICAgICBDaHJvbm9tZXRlcihEZXRhaWw6OkNocm9ub21l dGVyQ29uY2VwdCYgbWV0ZXIsIGludCBrKQotICAgICAgICAgICAgICAgIDogaW1wbCgmbWV0ZXIp Ci0gICAgICAgICAgICAgICAgLCBrKGspIHt9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAg ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW4+Ci0gICAgICAgICAgICB2b2lkIG1lYXN1cmUoRnVu JiYgZnVuLCBzdGQ6OmZhbHNlX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBtZWFzdXJlKFsmZnVu XShpbnQpIHsgcmV0dXJuIGZ1bigpOyB9LCBzdGQ6OnRydWVfdHlwZSgpKTsKLSAgICAgICAgICAg IH0KLQotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bj4KLSAgICAgICAgICAgIHZv aWQgbWVhc3VyZShGdW4mJiBmdW4sIHN0ZDo6dHJ1ZV90eXBlKSB7Ci0gICAgICAgICAgICAgICAg RGV0YWlsOjpvcHRpbWl6ZXJfYmFycmllcigpOwotICAgICAgICAgICAgICAgIGltcGwtPnN0YXJ0 KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIGludm9rZV9k ZW9wdGltaXplZChmdW4sIGkpOwotICAgICAgICAgICAgICAgIGltcGwtPmZpbmlzaCgpOwotICAg ICAgICAgICAgICAgIERldGFpbDo6b3B0aW1pemVyX2JhcnJpZXIoKTsKLSAgICAgICAgICAgIH0K LQotICAgICAgICAgICAgRGV0YWlsOjpDaHJvbm9tZXRlckNvbmNlcHQqIGltcGw7Ci0gICAgICAg ICAgICBpbnQgazsKLSAgICAgICAgfTsKLSAgICB9IC8vIG5hbWVzcGFjZSBCZW5jaG1hcmsKLX0g Ly8gbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9jaHJvbm9tZXRlci5ocHAKLS8vIHN0 YXJ0IGNhdGNoX2Vudmlyb25tZW50LmhwcAotCi0vLyBFbnZpcm9ubWVudCBpbmZvcm1hdGlvbgot Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgbmFtZXNwYWNlIEJlbmNobWFyayB7Ci0gICAgICAg IHRlbXBsYXRlIDx0eXBlbmFtZSBEdXJhdGlvbj4KLSAgICAgICAgc3RydWN0IEVudmlyb25tZW50 RXN0aW1hdGUgewotICAgICAgICAgICAgRHVyYXRpb24gbWVhbjsKLSAgICAgICAgICAgIE91dGxp ZXJDbGFzc2lmaWNhdGlvbiBvdXRsaWVyczsKLQotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVu YW1lIER1cmF0aW9uMj4KLSAgICAgICAgICAgIG9wZXJhdG9yIEVudmlyb25tZW50RXN0aW1hdGU8 RHVyYXRpb24yPigpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4geyBtZWFuLCBvdXRs aWVycyB9OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgQ2xvY2s+Ci0gICAgICAgIHN0cnVjdCBFbnZpcm9ubWVudCB7Ci0gICAgICAgICAgICB1 c2luZyBjbG9ja190eXBlID0gQ2xvY2s7Ci0gICAgICAgICAgICBFbnZpcm9ubWVudEVzdGltYXRl PEZsb2F0RHVyYXRpb248Q2xvY2s+PiBjbG9ja19yZXNvbHV0aW9uOwotICAgICAgICAgICAgRW52 aXJvbm1lbnRFc3RpbWF0ZTxGbG9hdER1cmF0aW9uPENsb2NrPj4gY2xvY2tfY29zdDsKLSAgICAg ICAgfTsKLSAgICB9IC8vIG5hbWVzcGFjZSBCZW5jaG1hcmsKLX0gLy8gbmFtZXNwYWNlIENhdGNo Ci0KLS8vIGVuZCBjYXRjaF9lbnZpcm9ubWVudC5ocHAKLS8vIHN0YXJ0IGNhdGNoX2V4ZWN1dGlv bl9wbGFuLmhwcAotCi0gLy8gRXhlY3V0aW9uIHBsYW4KLQotCi0vLyBzdGFydCBjYXRjaF9iZW5j aG1hcmtfZnVuY3Rpb24uaHBwCi0KLSAvLyBEdW1iIHN0ZDo6ZnVuY3Rpb24gaW1wbGVtZW50YXRp b24gZm9yIGNvbnNpc3RlbnQgY2FsbCBvdmVyaGVhZAotCi0KLSNpbmNsdWRlIDxjYXNzZXJ0Pgot I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8bWVt b3J5PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgewotICAg ICAgICBuYW1lc3BhY2UgRGV0YWlsIHsKLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBU PgotICAgICAgICAgICAgdXNpbmcgRGVjYXkgPSB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBl OwotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci0gICAgICAg ICAgICBzdHJ1Y3QgaXNfcmVsYXRlZAotICAgICAgICAgICAgICAgIDogc3RkOjppc19zYW1lPERl Y2F5PFQ+LCBEZWNheTxVPj4ge307Ci0KLSAgICAgICAgICAgIC8vLyBXZSBuZWVkIHRvIHJlaW52 ZW50IHN0ZDo6ZnVuY3Rpb24gYmVjYXVzZSBldmVyeSBwaWVjZSBvZiBjb2RlIHRoYXQgbWlnaHQg YWRkIG92ZXJoZWFkCi0gICAgICAgICAgICAvLy8gaW4gYSBtZWFzdXJlbWVudCBjb250ZXh0IG5l ZWRzIHRvIGhhdmUgY29uc2lzdGVudCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgc28gdGhh dCB3ZQotICAgICAgICAgICAgLy8vIGNhbiBhY2NvdW50IGZvciBpdCBpbiB0aGUgbWVhc3VyZW1l bnQuCi0gICAgICAgICAgICAvLy8gSW1wbGVtZW50YXRpb25zIG9mIHN0ZDo6ZnVuY3Rpb24gd2l0 aCBvcHRpbWl6YXRpb25zIHRoYXQgYXJlbid0IGFsd2F5cyBhcHBsaWNhYmxlLCBsaWtlCi0gICAg ICAgICAgICAvLy8gc21hbGwgYnVmZmVyIG9wdGltaXphdGlvbnMsIGFyZSBub3QgdW5jb21tb24u Ci0gICAgICAgICAgICAvLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBhbiBpbXBsZW1lbnRhdGlvbiBv ZiBzdGQ6OmZ1bmN0aW9uIHdpdGhvdXQgYW55IHN1Y2ggb3B0aW1pemF0aW9uczsKLSAgICAgICAg ICAgIC8vLyBpdCBtYXkgYmUgc2xvdywgYnV0IGl0IGlzIGNvbnNpc3RlbnRseSBzbG93LgotICAg ICAgICAgICAgc3RydWN0IEJlbmNobWFya0Z1bmN0aW9uIHsKLSAgICAgICAgICAgIHByaXZhdGU6 Ci0gICAgICAgICAgICAgICAgc3RydWN0IGNhbGxhYmxlIHsKLSAgICAgICAgICAgICAgICAgICAg dmlydHVhbCB2b2lkIGNhbGwoQ2hyb25vbWV0ZXIgbWV0ZXIpIGNvbnN0ID0gMDsKLSAgICAgICAg ICAgICAgICAgICAgdmlydHVhbCBjYWxsYWJsZSogY2xvbmUoKSBjb25zdCA9IDA7Ci0gICAgICAg ICAgICAgICAgICAgIHZpcnR1YWwgfmNhbGxhYmxlKCkgPSBkZWZhdWx0OwotICAgICAgICAgICAg ICAgIH07Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bj4KLSAgICAgICAg ICAgICAgICBzdHJ1Y3QgbW9kZWwgOiBwdWJsaWMgY2FsbGFibGUgewotICAgICAgICAgICAgICAg ICAgICBtb2RlbChGdW4mJiBmdW4pIDogZnVuKHN0ZDo6bW92ZShmdW4pKSB7fQotICAgICAgICAg ICAgICAgICAgICBtb2RlbChGdW4gY29uc3QmIGZ1bikgOiBmdW4oZnVuKSB7fQotCi0gICAgICAg ICAgICAgICAgICAgIG1vZGVsPEZ1bj4qIGNsb25lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4g bmV3IG1vZGVsPEZ1bj4oKnRoaXMpOyB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCBjYWxs KENocm9ub21ldGVyIG1ldGVyKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgICAg ICAgICBjYWxsKG1ldGVyLCBpc19jYWxsYWJsZTxGdW4oQ2hyb25vbWV0ZXIpPigpKTsKLSAgICAg ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2b2lkIGNhbGwoQ2hyb25vbWV0 ZXIgbWV0ZXIsIHN0ZDo6dHJ1ZV90eXBlKSBjb25zdCB7Ci0gICAgICAgICAgICAgICAgICAgICAg ICBmdW4obWV0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg IHZvaWQgY2FsbChDaHJvbm9tZXRlciBtZXRlciwgc3RkOjpmYWxzZV90eXBlKSBjb25zdCB7Ci0g ICAgICAgICAgICAgICAgICAgICAgICBtZXRlci5tZWFzdXJlKGZ1bik7Ci0gICAgICAgICAgICAg ICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBGdW4gZnVuOwotICAgICAgICAgICAgICAg IH07Ci0KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZG9fbm90aGluZyB7IHZvaWQgb3BlcmF0b3Io KSgpIGNvbnN0IHt9IH07Ci0KLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4K LSAgICAgICAgICAgICAgICBCZW5jaG1hcmtGdW5jdGlvbihtb2RlbDxUPiogYykgOiBmKGMpIHt9 Ci0KLSAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICBCZW5jaG1hcmtGdW5jdGlv bigpCi0gICAgICAgICAgICAgICAgICAgIDogZihuZXcgbW9kZWw8ZG9fbm90aGluZz57IHt9IH0p IHt9Ci0KLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuLAotICAgICAgICAg ICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfcmVsYXRlZDxGdW4sIEJlbmNo bWFya0Z1bmN0aW9uPjo6dmFsdWUsIGludD46OnR5cGUgPSAwPgotICAgICAgICAgICAgICAgICAg ICBCZW5jaG1hcmtGdW5jdGlvbihGdW4mJiBmdW4pCi0gICAgICAgICAgICAgICAgICAgIDogZihu ZXcgbW9kZWw8dHlwZW5hbWUgc3RkOjpkZWNheTxGdW4+Ojp0eXBlPihzdGQ6OmZvcndhcmQ8RnVu PihmdW4pKSkge30KLQotICAgICAgICAgICAgICAgIEJlbmNobWFya0Z1bmN0aW9uKEJlbmNobWFy a0Z1bmN0aW9uJiYgdGhhdCkKLSAgICAgICAgICAgICAgICAgICAgOiBmKHN0ZDo6bW92ZSh0aGF0 LmYpKSB7fQotCi0gICAgICAgICAgICAgICAgQmVuY2htYXJrRnVuY3Rpb24oQmVuY2htYXJrRnVu Y3Rpb24gY29uc3QmIHRoYXQpCi0gICAgICAgICAgICAgICAgICAgIDogZih0aGF0LmYtPmNsb25l KCkpIHt9Ci0KLSAgICAgICAgICAgICAgICBCZW5jaG1hcmtGdW5jdGlvbiYgb3BlcmF0b3I9KEJl bmNobWFya0Z1bmN0aW9uJiYgdGhhdCkgewotICAgICAgICAgICAgICAgICAgICBmID0gc3RkOjpt b3ZlKHRoYXQuZik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAg ICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBCZW5jaG1hcmtGdW5jdGlvbiYgb3BlcmF0b3I9 KEJlbmNobWFya0Z1bmN0aW9uIGNvbnN0JiB0aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGYu cmVzZXQodGhhdC5mLT5jbG9uZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlz OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZvaWQgb3BlcmF0b3IoKShD aHJvbm9tZXRlciBtZXRlcikgY29uc3QgeyBmLT5jYWxsKG1ldGVyKTsgfQotCi0gICAgICAgICAg ICBwcml2YXRlOgotICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjYWxsYWJsZT4gZjsK LSAgICAgICAgICAgIH07Ci0gICAgICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAotICAgIH0gLy8g bmFtZXNwYWNlIEJlbmNobWFyawotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNo X2JlbmNobWFya19mdW5jdGlvbi5ocHAKLS8vIHN0YXJ0IGNhdGNoX3JlcGVhdC5ocHAKLQotLy8g cmVwZWF0IGFsZ29yaXRobQotCi0KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDx1 dGlsaXR5PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgewot ICAgICAgICBuYW1lc3BhY2UgRGV0YWlsIHsKLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFt ZSBGdW4+Ci0gICAgICAgICAgICBzdHJ1Y3QgcmVwZWF0ZXIgewotICAgICAgICAgICAgICAgIHZv aWQgb3BlcmF0b3IoKShpbnQgaykgY29uc3QgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGlu dCBpID0gMDsgaSA8IGs7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnVuKCk7Ci0g ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg RnVuIGZ1bjsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUg RnVuPgotICAgICAgICAgICAgcmVwZWF0ZXI8dHlwZW5hbWUgc3RkOjpkZWNheTxGdW4+Ojp0eXBl PiByZXBlYXQoRnVuJiYgZnVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RkOjpmb3J3 YXJkPEZ1bj4oZnVuKSB9OwotICAgICAgICAgICAgfQotICAgICAgICB9IC8vIG5hbWVzcGFjZSBE ZXRhaWwKLSAgICB9IC8vIG5hbWVzcGFjZSBCZW5jaG1hcmsKLX0gLy8gbmFtZXNwYWNlIENhdGNo Ci0KLS8vIGVuZCBjYXRjaF9yZXBlYXQuaHBwCi0vLyBzdGFydCBjYXRjaF9ydW5fZm9yX2F0X2xl YXN0LmhwcAotCi0vLyBSdW4gYSBmdW5jdGlvbiBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZiB0aW1l Ci0KLQotLy8gc3RhcnQgY2F0Y2hfbWVhc3VyZS5ocHAKLQotLy8gTWVhc3VyZQotCi0KLS8vIHN0 YXJ0IGNhdGNoX3RpbWluZy5ocHAKLQotLy8gVGltaW5nCi0KLQotI2luY2x1ZGUgPHR1cGxlPgot I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFj ZSBCZW5jaG1hcmsgewotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHVyYXRpb24sIHR5cGVu YW1lIFJlc3VsdD4KLSAgICAgICAgc3RydWN0IFRpbWluZyB7Ci0gICAgICAgICAgICBEdXJhdGlv biBlbGFwc2VkOwotICAgICAgICAgICAgUmVzdWx0IHJlc3VsdDsKLSAgICAgICAgICAgIGludCBp dGVyYXRpb25zOwotICAgICAgICB9OwotICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2ss IHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gICAgICAgIHVzaW5nIFRpbWluZ09m ID0gVGltaW5nPENsb2NrRHVyYXRpb248Q2xvY2s+LCBEZXRhaWw6OkNvbXBsZXRlVHlwZV90PEZ1 bmN0aW9uUmV0dXJuVHlwZTxGdW5jLCBBcmdzLi4uPj4+OwotICAgIH0gLy8gbmFtZXNwYWNlIEJl bmNobWFyawotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX3RpbWluZy5ocHAK LSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFjZSBC ZW5jaG1hcmsgewotICAgICAgICBuYW1lc3BhY2UgRGV0YWlsIHsKLSAgICAgICAgICAgIHRlbXBs YXRlIDx0eXBlbmFtZSBDbG9jaywgdHlwZW5hbWUgRnVuLCB0eXBlbmFtZS4uLiBBcmdzPgotICAg ICAgICAgICAgVGltaW5nT2Y8Q2xvY2ssIEZ1biwgQXJncy4uLj4gbWVhc3VyZShGdW4mJiBmdW4s IEFyZ3MmJi4uLiBhcmdzKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBzdGFydCA9IENsb2NrOjpu b3coKTsKLSAgICAgICAgICAgICAgICBhdXRvJiYgciA9IERldGFpbDo6Y29tcGxldGVfaW52b2tl KGZ1biwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKLSAgICAgICAgICAgICAgICBhdXRv IGVuZCA9IENsb2NrOjpub3coKTsKLSAgICAgICAgICAgICAgICBhdXRvIGRlbHRhID0gZW5kIC0g c3RhcnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVsdGEsIHN0ZDo6Zm9yd2FyZDxkZWNs dHlwZShyKT4ociksIDEgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvLyBuYW1lc3BhY2Ug RGV0YWlsCi0gICAgfSAvLyBuYW1lc3BhY2UgQmVuY2htYXJrCi19IC8vIG5hbWVzcGFjZSBDYXRj aAotCi0vLyBlbmQgY2F0Y2hfbWVhc3VyZS5ocHAKLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1 ZGUgPHR5cGVfdHJhaXRzPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFjZSBCZW5j aG1hcmsgewotICAgICAgICBuYW1lc3BhY2UgRGV0YWlsIHsKLSAgICAgICAgICAgIHRlbXBsYXRl IDx0eXBlbmFtZSBDbG9jaywgdHlwZW5hbWUgRnVuPgotICAgICAgICAgICAgVGltaW5nT2Y8Q2xv Y2ssIEZ1biwgaW50PiBtZWFzdXJlX29uZShGdW4mJiBmdW4sIGludCBpdGVycywgc3RkOjpmYWxz ZV90eXBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERldGFpbDo6bWVhc3VyZTxDbG9jaz4o ZnVuLCBpdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5h bWUgQ2xvY2ssIHR5cGVuYW1lIEZ1bj4KLSAgICAgICAgICAgIFRpbWluZ09mPENsb2NrLCBGdW4s IENocm9ub21ldGVyPiBtZWFzdXJlX29uZShGdW4mJiBmdW4sIGludCBpdGVycywgc3RkOjp0cnVl X3R5cGUpIHsKLSAgICAgICAgICAgICAgICBEZXRhaWw6OkNocm9ub21ldGVyTW9kZWw8Q2xvY2s+ IG1ldGVyOwotICAgICAgICAgICAgICAgIGF1dG8mJiByZXN1bHQgPSBEZXRhaWw6OmNvbXBsZXRl X2ludm9rZShmdW4sIENocm9ub21ldGVyKG1ldGVyLCBpdGVycykpOwotCi0gICAgICAgICAgICAg ICAgcmV0dXJuIHsgbWV0ZXIuZWxhcHNlZCgpLCBzdGQ6Om1vdmUocmVzdWx0KSwgaXRlcnMgfTsK LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrLCB0 eXBlbmFtZSBGdW4+Ci0gICAgICAgICAgICB1c2luZyBydW5fZm9yX2F0X2xlYXN0X2FyZ3VtZW50 X3QgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzX2NhbGxhYmxlPEZ1bihDaHJvbm9tZXRl cik+Ojp2YWx1ZSwgQ2hyb25vbWV0ZXIsIGludD46OnR5cGU7Ci0KLSAgICAgICAgICAgIHN0cnVj dCBvcHRpbWl6ZWRfYXdheV9lcnJvciA6IHN0ZDo6ZXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAg ICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgb3ZlcnJpZGUgewotICAgICAgICAg ICAgICAgICAgICByZXR1cm4gImNvdWxkIG5vdCBtZWFzdXJlIGJlbmNobWFyaywgbWF5YmUgaXQg d2FzIG9wdGltaXplZCBhd2F5IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Owot Ci0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2ssIHR5cGVuYW1lIEZ1bj4KLSAg ICAgICAgICAgIFRpbWluZ09mPENsb2NrLCBGdW4sIHJ1bl9mb3JfYXRfbGVhc3RfYXJndW1lbnRf dDxDbG9jaywgRnVuPj4gcnVuX2Zvcl9hdF9sZWFzdChDbG9ja0R1cmF0aW9uPENsb2NrPiBob3df bG9uZywgaW50IHNlZWQsIEZ1biYmIGZ1bikgewotICAgICAgICAgICAgICAgIGF1dG8gaXRlcnMg PSBzZWVkOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVycyA8ICgxIDw8IDMwKSkgewotICAg ICAgICAgICAgICAgICAgICBhdXRvJiYgVGltaW5nID0gbWVhc3VyZV9vbmU8Q2xvY2s+KGZ1biwg aXRlcnMsIGlzX2NhbGxhYmxlPEZ1bihDaHJvbm9tZXRlcik+KCkpOwotCi0gICAgICAgICAgICAg ICAgICAgIGlmIChUaW1pbmcuZWxhcHNlZCA+PSBob3dfbG9uZykgewotICAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIHsgVGltaW5nLmVsYXBzZWQsIHN0ZDo6bW92ZShUaW1pbmcucmVzdWx0 KSwgaXRlcnMgfTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBp dGVycyAqPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDYXRjaDo6dGhy b3dfZXhjZXB0aW9uKG9wdGltaXplZF9hd2F5X2Vycm9ye30pOwotICAgICAgICAgICAgfQotICAg ICAgICB9IC8vIG5hbWVzcGFjZSBEZXRhaWwKLSAgICB9IC8vIG5hbWVzcGFjZSBCZW5jaG1hcmsK LX0gLy8gbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9ydW5fZm9yX2F0X2xlYXN0Lmhw cAotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLQotbmFtZXNwYWNl IENhdGNoIHsKLSAgICBuYW1lc3BhY2UgQmVuY2htYXJrIHsKLSAgICAgICAgdGVtcGxhdGUgPHR5 cGVuYW1lIER1cmF0aW9uPgotICAgICAgICBzdHJ1Y3QgRXhlY3V0aW9uUGxhbiB7Ci0gICAgICAg ICAgICBpbnQgaXRlcmF0aW9uc19wZXJfc2FtcGxlOwotICAgICAgICAgICAgRHVyYXRpb24gZXN0 aW1hdGVkX2R1cmF0aW9uOwotICAgICAgICAgICAgRGV0YWlsOjpCZW5jaG1hcmtGdW5jdGlvbiBi ZW5jaG1hcms7Ci0gICAgICAgICAgICBEdXJhdGlvbiB3YXJtdXBfdGltZTsKLSAgICAgICAgICAg IGludCB3YXJtdXBfaXRlcmF0aW9uczsKLQotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1l IER1cmF0aW9uMj4KLSAgICAgICAgICAgIG9wZXJhdG9yIEV4ZWN1dGlvblBsYW48RHVyYXRpb24y PigpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4geyBpdGVyYXRpb25zX3Blcl9zYW1w bGUsIGVzdGltYXRlZF9kdXJhdGlvbiwgYmVuY2htYXJrLCB3YXJtdXBfdGltZSwgd2FybXVwX2l0 ZXJhdGlvbnMgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVu YW1lIENsb2NrPgotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RmxvYXREdXJhdGlvbjxDbG9jaz4+ IHJ1bihjb25zdCBJQ29uZmlnICZjZmcsIEVudmlyb25tZW50PEZsb2F0RHVyYXRpb248Q2xvY2s+ PiBlbnYpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICAvLyB3YXJtdXAgYSBiaXQKLSAgICAgICAg ICAgICAgICBEZXRhaWw6OnJ1bl9mb3JfYXRfbGVhc3Q8Q2xvY2s+KHN0ZDo6Y2hyb25vOjpkdXJh dGlvbl9jYXN0PENsb2NrRHVyYXRpb248Q2xvY2s+Pih3YXJtdXBfdGltZSksIHdhcm11cF9pdGVy YXRpb25zLCBEZXRhaWw6OnJlcGVhdChub3c8Q2xvY2s+e30pKTsKLQotICAgICAgICAgICAgICAg IHN0ZDo6dmVjdG9yPEZsb2F0RHVyYXRpb248Q2xvY2s+PiB0aW1lczsKLSAgICAgICAgICAgICAg ICB0aW1lcy5yZXNlcnZlKGNmZy5iZW5jaG1hcmtTYW1wbGVzKCkpOwotICAgICAgICAgICAgICAg IHN0ZDo6Z2VuZXJhdGVfbihzdGQ6OmJhY2tfaW5zZXJ0ZXIodGltZXMpLCBjZmcuYmVuY2htYXJr U2FtcGxlcygpLCBbdGhpcywgZW52XSB7Ci0gICAgICAgICAgICAgICAgICAgIERldGFpbDo6Q2hy b25vbWV0ZXJNb2RlbDxDbG9jaz4gbW9kZWw7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMtPmJl bmNobWFyayhDaHJvbm9tZXRlcihtb2RlbCwgaXRlcmF0aW9uc19wZXJfc2FtcGxlKSk7Ci0gICAg ICAgICAgICAgICAgICAgIGF1dG8gc2FtcGxlX3RpbWUgPSBtb2RlbC5lbGFwc2VkKCkgLSBlbnYu Y2xvY2tfY29zdC5tZWFuOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlX3RpbWUgPCBG bG9hdER1cmF0aW9uPENsb2NrPjo6emVybygpKSBzYW1wbGVfdGltZSA9IEZsb2F0RHVyYXRpb248 Q2xvY2s+Ojp6ZXJvKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzYW1wbGVfdGltZSAv IGl0ZXJhdGlvbnNfcGVyX3NhbXBsZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAg ICAgICByZXR1cm4gdGltZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfSAvLyBu YW1lc3BhY2UgQmVuY2htYXJrCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hf ZXhlY3V0aW9uX3BsYW4uaHBwCi0vLyBzdGFydCBjYXRjaF9lc3RpbWF0ZV9jbG9jay5ocHAKLQot IC8vIEVudmlyb25tZW50IG1lYXN1cmVtZW50Ci0KLQotLy8gc3RhcnQgY2F0Y2hfc3RhdHMuaHBw Ci0KLS8vIFN0YXRpc3RpY2FsIGFuYWx5c2lzIHRvb2xzCi0KLQotI2luY2x1ZGUgPGFsZ29yaXRo bT4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxp dGVyYXRvcj4KLSNpbmNsdWRlIDxudW1lcmljPgotI2luY2x1ZGUgPHR1cGxlPgotI2luY2x1ZGUg PGNtYXRoPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRl IDxyYW5kb20+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgbmFtZXNwYWNlIEJlbmNobWFyayB7 Ci0gICAgICAgIG5hbWVzcGFjZSBEZXRhaWwgewotICAgICAgICAgICAgdXNpbmcgc2FtcGxlID0g c3RkOjp2ZWN0b3I8ZG91YmxlPjsKLQotICAgICAgICAgICAgZG91YmxlIHdlaWdodGVkX2F2ZXJh Z2VfcXVhbnRpbGUoaW50IGssIGludCBxLCBzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciBm aXJzdCwgc3RkOjp2ZWN0b3I8ZG91YmxlPjo6aXRlcmF0b3IgbGFzdCk7Ci0KLSAgICAgICAgICAg IHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KLSAgICAgICAgICAgIE91dGxpZXJDbGFzc2lm aWNhdGlvbiBjbGFzc2lmeV9vdXRsaWVycyhJdGVyYXRvciBmaXJzdCwgSXRlcmF0b3IgbGFzdCkg ewotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gY29weShmaXJzdCwgbGFzdCk7 Ci0KLSAgICAgICAgICAgICAgICBhdXRvIHExID0gd2VpZ2h0ZWRfYXZlcmFnZV9xdWFudGlsZSgx LCA0LCBjb3B5LmJlZ2luKCksIGNvcHkuZW5kKCkpOwotICAgICAgICAgICAgICAgIGF1dG8gcTMg PSB3ZWlnaHRlZF9hdmVyYWdlX3F1YW50aWxlKDMsIDQsIGNvcHkuYmVnaW4oKSwgY29weS5lbmQo KSk7Ci0gICAgICAgICAgICAgICAgYXV0byBpcXIgPSBxMyAtIHExOwotICAgICAgICAgICAgICAg IGF1dG8gbG9zID0gcTEgLSAoaXFyICogMy4pOwotICAgICAgICAgICAgICAgIGF1dG8gbG9tID0g cTEgLSAoaXFyICogMS41KTsKLSAgICAgICAgICAgICAgICBhdXRvIGhpbSA9IHEzICsgKGlxciAq IDEuNSk7Ci0gICAgICAgICAgICAgICAgYXV0byBoaXMgPSBxMyArIChpcXIgKiAzLik7Ci0KLSAg ICAgICAgICAgICAgICBPdXRsaWVyQ2xhc3NpZmljYXRpb24gbzsKLSAgICAgICAgICAgICAgICBm b3IgKDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBhdXRv JiYgdCA9ICpmaXJzdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQgPCBsb3MpICsrby5sb3df c2V2ZXJlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0IDwgbG9tKSArK28ubG93X21p bGQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQgPiBoaXMpICsrby5oaWdoX3NldmVy ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodCA+IGhpbSkgKytvLmhpZ2hfbWlsZDsK LSAgICAgICAgICAgICAgICAgICAgKytvLnNhbXBsZXNfc2VlbjsKLSAgICAgICAgICAgICAgICB9 Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg IHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KLSAgICAgICAgICAgIGRvdWJsZSBtZWFuKEl0 ZXJhdG9yIGZpcnN0LCBJdGVyYXRvciBsYXN0KSB7Ci0gICAgICAgICAgICAgICAgYXV0byBjb3Vu dCA9IGxhc3QgLSBmaXJzdDsKLSAgICAgICAgICAgICAgICBkb3VibGUgc3VtID0gc3RkOjphY2N1 bXVsYXRlKGZpcnN0LCBsYXN0LCAwLik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1bSAvIGNv dW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVVJu ZywgdHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIEVzdGltYXRvcj4KLSAgICAgICAgICAgIHNh bXBsZSByZXNhbXBsZShVUm5nJiBybmcsIGludCByZXNhbXBsZXMsIEl0ZXJhdG9yIGZpcnN0LCBJ dGVyYXRvciBsYXN0LCBFc3RpbWF0b3ImIGVzdGltYXRvcikgewotICAgICAgICAgICAgICAgIGF1 dG8gbiA9IGxhc3QgLSBmaXJzdDsKLSAgICAgICAgICAgICAgICBzdGQ6OnVuaWZvcm1faW50X2Rp c3RyaWJ1dGlvbjxkZWNsdHlwZShuKT4gZGlzdCgwLCBuIC0gMSk7Ci0KLSAgICAgICAgICAgICAg ICBzYW1wbGUgb3V0OwotICAgICAgICAgICAgICAgIG91dC5yZXNlcnZlKHJlc2FtcGxlcyk7Ci0g ICAgICAgICAgICAgICAgc3RkOjpnZW5lcmF0ZV9uKHN0ZDo6YmFja19pbnNlcnRlcihvdXQpLCBy ZXNhbXBsZXMsIFtuLCBmaXJzdCwgJmVzdGltYXRvciwgJmRpc3QsICZybmddIHsKLSAgICAgICAg ICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiByZXNhbXBsZWQ7Ci0gICAgICAgICAgICAg ICAgICAgIHJlc2FtcGxlZC5yZXNlcnZlKG4pOwotICAgICAgICAgICAgICAgICAgICBzdGQ6Omdl bmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKHJlc2FtcGxlZCksIG4sIFtmaXJzdCwgJmRpc3Qs ICZybmddIHsgcmV0dXJuIGZpcnN0W2Rpc3Qocm5nKV07IH0pOwotICAgICAgICAgICAgICAgICAg ICByZXR1cm4gZXN0aW1hdG9yKHJlc2FtcGxlZC5iZWdpbigpLCByZXNhbXBsZWQuZW5kKCkpOwot ICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIHN0ZDo6c29ydChvdXQuYmVnaW4o KSwgb3V0LmVuZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAg fQotCi0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXN0aW1hdG9yLCB0eXBlbmFtZSBJ dGVyYXRvcj4KLSAgICAgICAgICAgIHNhbXBsZSBqYWNra25pZmUoRXN0aW1hdG9yJiYgZXN0aW1h dG9yLCBJdGVyYXRvciBmaXJzdCwgSXRlcmF0b3IgbGFzdCkgewotICAgICAgICAgICAgICAgIGF1 dG8gbiA9IGxhc3QgLSBmaXJzdDsKLSAgICAgICAgICAgICAgICBhdXRvIHNlY29uZCA9IHN0ZDo6 bmV4dChmaXJzdCk7Ci0gICAgICAgICAgICAgICAgc2FtcGxlIHJlc3VsdHM7Ci0gICAgICAgICAg ICAgICAgcmVzdWx0cy5yZXNlcnZlKG4pOwotCi0gICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0 ID0gZmlyc3Q7IGl0ICE9IGxhc3Q7ICsraXQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpp dGVyX3N3YXAoaXQsIGZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoX2Jh Y2soZXN0aW1hdG9yKHNlY29uZCwgbGFzdCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAg ICAgICAgICAgIHJldHVybiByZXN1bHRzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBp bmxpbmUgZG91YmxlIG5vcm1hbF9jZGYoZG91YmxlIHgpIHsKLSAgICAgICAgICAgICAgICByZXR1 cm4gc3RkOjplcmZjKC14IC8gc3RkOjpzcXJ0KDIuMCkpIC8gMi4wOwotICAgICAgICAgICAgfQot Ci0gICAgICAgICAgICBkb3VibGUgZXJmY19pbnYoZG91YmxlIHgpOwotCi0gICAgICAgICAgICBk b3VibGUgbm9ybWFsX3F1YW50aWxlKGRvdWJsZSBwKTsKLQotICAgICAgICAgICAgdGVtcGxhdGUg PHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBFc3RpbWF0b3I+Ci0gICAgICAgICAgICBFc3Rp bWF0ZTxkb3VibGU+IGJvb3RzdHJhcChkb3VibGUgY29uZmlkZW5jZV9sZXZlbCwgSXRlcmF0b3Ig Zmlyc3QsIEl0ZXJhdG9yIGxhc3QsIHNhbXBsZSBjb25zdCYgcmVzYW1wbGUsIEVzdGltYXRvciYm IGVzdGltYXRvcikgewotICAgICAgICAgICAgICAgIGF1dG8gbl9zYW1wbGVzID0gbGFzdCAtIGZp cnN0OwotCi0gICAgICAgICAgICAgICAgZG91YmxlIHBvaW50ID0gZXN0aW1hdG9yKGZpcnN0LCBs YXN0KTsKLSAgICAgICAgICAgICAgICAvLyBEZWdlbmVyYXRlIGNhc2Ugd2l0aCBhIHNpbmdsZSBz YW1wbGUKLSAgICAgICAgICAgICAgICBpZiAobl9zYW1wbGVzID09IDEpIHJldHVybiB7IHBvaW50 LCBwb2ludCwgcG9pbnQsIGNvbmZpZGVuY2VfbGV2ZWwgfTsKLQotICAgICAgICAgICAgICAgIHNh bXBsZSBqYWNrID0gamFja2tuaWZlKGVzdGltYXRvciwgZmlyc3QsIGxhc3QpOwotICAgICAgICAg ICAgICAgIGRvdWJsZSBqYWNrX21lYW4gPSBtZWFuKGphY2suYmVnaW4oKSwgamFjay5lbmQoKSk7 Ci0gICAgICAgICAgICAgICAgZG91YmxlIHN1bV9zcXVhcmVzLCBzdW1fY3ViZXM7Ci0gICAgICAg ICAgICAgICAgc3RkOjp0aWUoc3VtX3NxdWFyZXMsIHN1bV9jdWJlcykgPSBzdGQ6OmFjY3VtdWxh dGUoamFjay5iZWdpbigpLCBqYWNrLmVuZCgpLCBzdGQ6Om1ha2VfcGFpcigwLiwgMC4pLCBbamFj a19tZWFuXShzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+IHNxY2IsIGRvdWJsZSB4KSAtPiBzdGQ6 OnBhaXI8ZG91YmxlLCBkb3VibGU+IHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBkID0gamFj a19tZWFuIC0geDsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBkMiA9IGQgKiBkOwotICAgICAg ICAgICAgICAgICAgICBhdXRvIGQzID0gZDIgKiBkOwotICAgICAgICAgICAgICAgICAgICByZXR1 cm4geyBzcWNiLmZpcnN0ICsgZDIsIHNxY2Iuc2Vjb25kICsgZDMgfTsKLSAgICAgICAgICAgICAg ICB9KTsKLQotICAgICAgICAgICAgICAgIGRvdWJsZSBhY2NlbCA9IHN1bV9jdWJlcyAvICg2ICog c3RkOjpwb3coc3VtX3NxdWFyZXMsIDEuNSkpOwotICAgICAgICAgICAgICAgIGludCBuID0gc3Rh dGljX2Nhc3Q8aW50PihyZXNhbXBsZS5zaXplKCkpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBw cm9iX24gPSBzdGQ6OmNvdW50X2lmKHJlc2FtcGxlLmJlZ2luKCksIHJlc2FtcGxlLmVuZCgpLCBb cG9pbnRdKGRvdWJsZSB4KSB7IHJldHVybiB4IDwgcG9pbnQ7IH0pIC8gKGRvdWJsZSluOwotICAg ICAgICAgICAgICAgIC8vIGRlZ2VuZXJhdGUgY2FzZSB3aXRoIHVuaWZvcm0gc2FtcGxlcwotICAg ICAgICAgICAgICAgIGlmIChwcm9iX24gPT0gMCkgcmV0dXJuIHsgcG9pbnQsIHBvaW50LCBwb2lu dCwgY29uZmlkZW5jZV9sZXZlbCB9OwotCi0gICAgICAgICAgICAgICAgZG91YmxlIGJpYXMgPSBu b3JtYWxfcXVhbnRpbGUocHJvYl9uKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgejEgPSBub3Jt YWxfcXVhbnRpbGUoKDEuIC0gY29uZmlkZW5jZV9sZXZlbCkgLyAyLik7Ci0KLSAgICAgICAgICAg ICAgICBhdXRvIGN1bW4gPSBbbl0oZG91YmxlIHgpIC0+IGludCB7Ci0gICAgICAgICAgICAgICAg ICAgIHJldHVybiBzdGQ6Omxyb3VuZChub3JtYWxfY2RmKHgpICogbik7IH07Ci0gICAgICAgICAg ICAgICAgYXV0byBhID0gW2JpYXMsIGFjY2VsXShkb3VibGUgYikgeyByZXR1cm4gYmlhcyArIGIg LyAoMS4gLSBhY2NlbCAqIGIpOyB9OwotICAgICAgICAgICAgICAgIGRvdWJsZSBiMSA9IGJpYXMg KyB6MTsKLSAgICAgICAgICAgICAgICBkb3VibGUgYjIgPSBiaWFzIC0gejE7Ci0gICAgICAgICAg ICAgICAgZG91YmxlIGExID0gYShiMSk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGEyID0gYShi Mik7Ci0gICAgICAgICAgICAgICAgYXV0byBsbyA9IChzdGQ6Om1heCkoY3VtbihhMSksIDApOwot ICAgICAgICAgICAgICAgIGF1dG8gaGkgPSAoc3RkOjptaW4pKGN1bW4oYTIpLCBuIC0gMSk7Ci0K LSAgICAgICAgICAgICAgICByZXR1cm4geyBwb2ludCwgcmVzYW1wbGVbbG9dLCByZXNhbXBsZVto aV0sIGNvbmZpZGVuY2VfbGV2ZWwgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZG91 YmxlIG91dGxpZXJfdmFyaWFuY2UoRXN0aW1hdGU8ZG91YmxlPiBtZWFuLCBFc3RpbWF0ZTxkb3Vi bGU+IHN0ZGRldiwgaW50IG4pOwotCi0gICAgICAgICAgICBzdHJ1Y3QgYm9vdHN0cmFwX2FuYWx5 c2lzIHsKLSAgICAgICAgICAgICAgICBFc3RpbWF0ZTxkb3VibGU+IG1lYW47Ci0gICAgICAgICAg ICAgICAgRXN0aW1hdGU8ZG91YmxlPiBzdGFuZGFyZF9kZXZpYXRpb247Ci0gICAgICAgICAgICAg ICAgZG91YmxlIG91dGxpZXJfdmFyaWFuY2U7Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAg ICBib290c3RyYXBfYW5hbHlzaXMgYW5hbHlzZV9zYW1wbGVzKGRvdWJsZSBjb25maWRlbmNlX2xl dmVsLCBpbnQgbl9yZXNhbXBsZXMsIHN0ZDo6dmVjdG9yPGRvdWJsZT46Oml0ZXJhdG9yIGZpcnN0 LCBzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciBsYXN0KTsKLSAgICAgICAgfSAvLyBuYW1l c3BhY2UgRGV0YWlsCi0gICAgfSAvLyBuYW1lc3BhY2UgQmVuY2htYXJrCi19IC8vIG5hbWVzcGFj ZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfc3RhdHMuaHBwCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgot I2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPHR1cGxlPgotI2luY2x1ZGUgPHZlY3Rvcj4K LSNpbmNsdWRlIDxjbWF0aD4KLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBuYW1lc3BhY2UgQmVu Y2htYXJrIHsKLSAgICAgICAgbmFtZXNwYWNlIERldGFpbCB7Ci0gICAgICAgICAgICB0ZW1wbGF0 ZSA8dHlwZW5hbWUgQ2xvY2s+Ci0gICAgICAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHJlc29s dXRpb24oaW50IGspIHsKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUaW1lUG9pbnQ8Q2xv Y2s+PiB0aW1lczsKLSAgICAgICAgICAgICAgICB0aW1lcy5yZXNlcnZlKGsgKyAxKTsKLSAgICAg ICAgICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKHRpbWVzKSwgayAr IDEsIG5vdzxDbG9jaz57fSk7Ci0KLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+ IGRlbHRhczsKLSAgICAgICAgICAgICAgICBkZWx0YXMucmVzZXJ2ZShrKTsKLSAgICAgICAgICAg ICAgICBzdGQ6OnRyYW5zZm9ybShzdGQ6Om5leHQodGltZXMuYmVnaW4oKSksIHRpbWVzLmVuZCgp LCB0aW1lcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIo ZGVsdGFzKSwKLSAgICAgICAgICAgICAgICAgICAgW10oVGltZVBvaW50PENsb2NrPiBhLCBUaW1l UG9pbnQ8Q2xvY2s+IGIpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oKGEgLSBiKS5jb3Vu dCgpKTsgfSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGVsdGFzOwotICAgICAgICAgICAg fQotCi0gICAgICAgICAgICBjb25zdCBhdXRvIHdhcm11cF9pdGVyYXRpb25zID0gMTAwMDA7Ci0g ICAgICAgICAgICBjb25zdCBhdXRvIHdhcm11cF90aW1lID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vj b25kcygxMDApOwotICAgICAgICAgICAgY29uc3QgYXV0byBtaW5pbXVtX3RpY2tzID0gMTAwMDsK LSAgICAgICAgICAgIGNvbnN0IGF1dG8gd2FybXVwX3NlZWQgPSAxMDAwMDsKLSAgICAgICAgICAg IGNvbnN0IGF1dG8gY2xvY2tfcmVzb2x1dGlvbl9lc3RpbWF0aW9uX3RpbWUgPSBzdGQ6OmNocm9u bzo6bWlsbGlzZWNvbmRzKDUwMCk7Ci0gICAgICAgICAgICBjb25zdCBhdXRvIGNsb2NrX2Nvc3Rf ZXN0aW1hdGlvbl90aW1lX2xpbWl0ID0gc3RkOjpjaHJvbm86OnNlY29uZHMoMSk7Ci0gICAgICAg ICAgICBjb25zdCBhdXRvIGNsb2NrX2Nvc3RfZXN0aW1hdGlvbl90aWNrX2xpbWl0ID0gMTAwMDAw OwotICAgICAgICAgICAgY29uc3QgYXV0byBjbG9ja19jb3N0X2VzdGltYXRpb25fdGltZSA9IHN0 ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTApOwotICAgICAgICAgICAgY29uc3QgYXV0byBjbG9j a19jb3N0X2VzdGltYXRpb25faXRlcmF0aW9ucyA9IDEwMDAwOwotCi0gICAgICAgICAgICB0ZW1w bGF0ZSA8dHlwZW5hbWUgQ2xvY2s+Ci0gICAgICAgICAgICBpbnQgd2FybXVwKCkgewotICAgICAg ICAgICAgICAgIHJldHVybiBydW5fZm9yX2F0X2xlYXN0PENsb2NrPihzdGQ6OmNocm9ubzo6ZHVy YXRpb25fY2FzdDxDbG9ja0R1cmF0aW9uPENsb2NrPj4od2FybXVwX3RpbWUpLCB3YXJtdXBfc2Vl ZCwgJnJlc29sdXRpb248Q2xvY2s+KQotICAgICAgICAgICAgICAgICAgICAuaXRlcmF0aW9uczsK LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaz4KLSAg ICAgICAgICAgIEVudmlyb25tZW50RXN0aW1hdGU8RmxvYXREdXJhdGlvbjxDbG9jaz4+IGVzdGlt YXRlX2Nsb2NrX3Jlc29sdXRpb24oaW50IGl0ZXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBh dXRvIHIgPSBydW5fZm9yX2F0X2xlYXN0PENsb2NrPihzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2Fz dDxDbG9ja0R1cmF0aW9uPENsb2NrPj4oY2xvY2tfcmVzb2x1dGlvbl9lc3RpbWF0aW9uX3RpbWUp LCBpdGVyYXRpb25zLCAmcmVzb2x1dGlvbjxDbG9jaz4pCi0gICAgICAgICAgICAgICAgICAgIC5y ZXN1bHQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgRmxv YXREdXJhdGlvbjxDbG9jaz4obWVhbihyLmJlZ2luKCksIHIuZW5kKCkpKSwKLSAgICAgICAgICAg ICAgICAgICAgY2xhc3NpZnlfb3V0bGllcnMoci5iZWdpbigpLCByLmVuZCgpKSwKLSAgICAgICAg ICAgICAgICB9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1l IENsb2NrPgotICAgICAgICAgICAgRW52aXJvbm1lbnRFc3RpbWF0ZTxGbG9hdER1cmF0aW9uPENs b2NrPj4gZXN0aW1hdGVfY2xvY2tfY29zdChGbG9hdER1cmF0aW9uPENsb2NrPiByZXNvbHV0aW9u KSB7Ci0gICAgICAgICAgICAgICAgYXV0byB0aW1lX2xpbWl0ID0gKHN0ZDo6bWluKSgKLSAgICAg ICAgICAgICAgICAgICAgcmVzb2x1dGlvbiAqIGNsb2NrX2Nvc3RfZXN0aW1hdGlvbl90aWNrX2xp bWl0LAotICAgICAgICAgICAgICAgICAgICBGbG9hdER1cmF0aW9uPENsb2NrPihjbG9ja19jb3N0 X2VzdGltYXRpb25fdGltZV9saW1pdCkpOwotICAgICAgICAgICAgICAgIGF1dG8gdGltZV9jbG9j ayA9IFtdKGludCBrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXRhaWw6Om1lYXN1 cmU8Q2xvY2s+KFtrXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsg aSA8IGs7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIGF1dG8g aWdub3JlZCA9IENsb2NrOjpub3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9p ZClpZ25vcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAg ICB9KS5lbGFwc2VkOwotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgdGltZV9j bG9jaygxKTsKLSAgICAgICAgICAgICAgICBpbnQgaXRlcnMgPSBjbG9ja19jb3N0X2VzdGltYXRp b25faXRlcmF0aW9uczsKLSAgICAgICAgICAgICAgICBhdXRvJiYgciA9IHJ1bl9mb3JfYXRfbGVh c3Q8Q2xvY2s+KHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PENsb2NrRHVyYXRpb248Q2xvY2s+ PihjbG9ja19jb3N0X2VzdGltYXRpb25fdGltZSksIGl0ZXJzLCB0aW1lX2Nsb2NrKTsKLSAgICAg ICAgICAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHRpbWVzOwotICAgICAgICAgICAgICAgIGlu dCBuc2FtcGxlcyA9IHN0YXRpY19jYXN0PGludD4oc3RkOjpjZWlsKHRpbWVfbGltaXQgLyByLmVs YXBzZWQpKTsKLSAgICAgICAgICAgICAgICB0aW1lcy5yZXNlcnZlKG5zYW1wbGVzKTsKLSAgICAg ICAgICAgICAgICBzdGQ6OmdlbmVyYXRlX24oc3RkOjpiYWNrX2luc2VydGVyKHRpbWVzKSwgbnNh bXBsZXMsIFt0aW1lX2Nsb2NrLCAmcl0gewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Rh dGljX2Nhc3Q8ZG91YmxlPigodGltZV9jbG9jayhyLml0ZXJhdGlvbnMpIC8gci5pdGVyYXRpb25z KS5jb3VudCgpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICByZXR1cm4g ewotICAgICAgICAgICAgICAgICAgICBGbG9hdER1cmF0aW9uPENsb2NrPihtZWFuKHRpbWVzLmJl Z2luKCksIHRpbWVzLmVuZCgpKSksCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzaWZ5X291dGxp ZXJzKHRpbWVzLmJlZ2luKCksIHRpbWVzLmVuZCgpKSwKLSAgICAgICAgICAgICAgICB9OwotICAg ICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2s+Ci0gICAg ICAgICAgICBFbnZpcm9ubWVudDxGbG9hdER1cmF0aW9uPENsb2NrPj4gbWVhc3VyZV9lbnZpcm9u bWVudCgpIHsKLSAgICAgICAgICAgICAgICBzdGF0aWMgRW52aXJvbm1lbnQ8RmxvYXREdXJhdGlv bjxDbG9jaz4+KiBlbnYgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIGlmIChlbnYpIHsKLSAg ICAgICAgICAgICAgICAgICAgcmV0dXJuICplbnY7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAg ICAgICAgICAgICAgYXV0byBpdGVycyA9IERldGFpbDo6d2FybXVwPENsb2NrPigpOwotICAgICAg ICAgICAgICAgIGF1dG8gcmVzb2x1dGlvbiA9IERldGFpbDo6ZXN0aW1hdGVfY2xvY2tfcmVzb2x1 dGlvbjxDbG9jaz4oaXRlcnMpOwotICAgICAgICAgICAgICAgIGF1dG8gY29zdCA9IERldGFpbDo6 ZXN0aW1hdGVfY2xvY2tfY29zdDxDbG9jaz4ocmVzb2x1dGlvbi5tZWFuKTsKLQotICAgICAgICAg ICAgICAgIGVudiA9IG5ldyBFbnZpcm9ubWVudDxGbG9hdER1cmF0aW9uPENsb2NrPj57IHJlc29s dXRpb24sIGNvc3QgfTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKmVudjsKLSAgICAgICAgICAg IH0KLSAgICAgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCi0gICAgfSAvLyBuYW1lc3BhY2UgQmVu Y2htYXJrCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfZXN0aW1hdGVfY2xv Y2suaHBwCi0vLyBzdGFydCBjYXRjaF9hbmFseXNlLmhwcAotCi0gLy8gUnVuIGFuZCBhbmFseXNl IG9uZSBiZW5jaG1hcmsKLQotCi0vLyBzdGFydCBjYXRjaF9zYW1wbGVfYW5hbHlzaXMuaHBwCi0K LS8vIEJlbmNobWFyayByZXN1bHRzCi0KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRl IDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotCi1uYW1l c3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgewotICAgICAgICB0ZW1wbGF0 ZSA8dHlwZW5hbWUgRHVyYXRpb24+Ci0gICAgICAgIHN0cnVjdCBTYW1wbGVBbmFseXNpcyB7Ci0g ICAgICAgICAgICBzdGQ6OnZlY3RvcjxEdXJhdGlvbj4gc2FtcGxlczsKLSAgICAgICAgICAgIEVz dGltYXRlPER1cmF0aW9uPiBtZWFuOwotICAgICAgICAgICAgRXN0aW1hdGU8RHVyYXRpb24+IHN0 YW5kYXJkX2RldmlhdGlvbjsKLSAgICAgICAgICAgIE91dGxpZXJDbGFzc2lmaWNhdGlvbiBvdXRs aWVyczsKLSAgICAgICAgICAgIGRvdWJsZSBvdXRsaWVyX3ZhcmlhbmNlOwotCi0gICAgICAgICAg ICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHVyYXRpb24yPgotICAgICAgICAgICAgb3BlcmF0b3IgU2Ft cGxlQW5hbHlzaXM8RHVyYXRpb24yPigpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICBzdGQ6OnZl Y3RvcjxEdXJhdGlvbjI+IHNhbXBsZXMyOwotICAgICAgICAgICAgICAgIHNhbXBsZXMyLnJlc2Vy dmUoc2FtcGxlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIHN0ZDo6dHJhbnNmb3JtKHNhbXBs ZXMuYmVnaW4oKSwgc2FtcGxlcy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHNhbXBsZXMyKSwg W10oRHVyYXRpb24gZCkgeyByZXR1cm4gRHVyYXRpb24yKGQpOyB9KTsKLSAgICAgICAgICAgICAg ICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoc2FtcGxlczIpLAotICAg ICAgICAgICAgICAgICAgICBtZWFuLAotICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZF9kZXZp YXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG91dGxpZXJzLAotICAgICAgICAgICAgICAgICAg ICBvdXRsaWVyX3ZhcmlhbmNlLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0g ICAgICAgIH07Ci0gICAgfSAvLyBuYW1lc3BhY2UgQmVuY2htYXJrCi19IC8vIG5hbWVzcGFjZSBD YXRjaAotCi0vLyBlbmQgY2F0Y2hfc2FtcGxlX2FuYWx5c2lzLmhwcAotI2luY2x1ZGUgPGFsZ29y aXRobT4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFj ZSBDYXRjaCB7Ci0gICAgbmFtZXNwYWNlIEJlbmNobWFyayB7Ci0gICAgICAgIG5hbWVzcGFjZSBE ZXRhaWwgewotICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIER1cmF0aW9uLCB0eXBlbmFt ZSBJdGVyYXRvcj4KLSAgICAgICAgICAgIFNhbXBsZUFuYWx5c2lzPER1cmF0aW9uPiBhbmFseXNl KGNvbnN0IElDb25maWcgJmNmZywgRW52aXJvbm1lbnQ8RHVyYXRpb24+LCBJdGVyYXRvciBmaXJz dCwgSXRlcmF0b3IgbGFzdCkgewotICAgICAgICAgICAgICAgIGlmICghY2ZnLmJlbmNobWFya05v QW5hbHlzaXMoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHNh bXBsZXM7Ci0gICAgICAgICAgICAgICAgICAgIHNhbXBsZXMucmVzZXJ2ZShsYXN0IC0gZmlyc3Qp OwotICAgICAgICAgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybShmaXJzdCwgbGFzdCwgc3RkOjpi YWNrX2luc2VydGVyKHNhbXBsZXMpLCBbXShEdXJhdGlvbiBkKSB7IHJldHVybiBkLmNvdW50KCk7 IH0pOwotCi0gICAgICAgICAgICAgICAgICAgIGF1dG8gYW5hbHlzaXMgPSBDYXRjaDo6QmVuY2ht YXJrOjpEZXRhaWw6OmFuYWx5c2Vfc2FtcGxlcyhjZmcuYmVuY2htYXJrQ29uZmlkZW5jZUludGVy dmFsKCksIGNmZy5iZW5jaG1hcmtSZXNhbXBsZXMoKSwgc2FtcGxlcy5iZWdpbigpLCBzYW1wbGVz LmVuZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBvdXRsaWVycyA9IENhdGNoOjpCZW5j aG1hcms6OkRldGFpbDo6Y2xhc3NpZnlfb3V0bGllcnMoc2FtcGxlcy5iZWdpbigpLCBzYW1wbGVz LmVuZCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBhdXRvIHdyYXBfZXN0aW1hdGUgPSBbXShF c3RpbWF0ZTxkb3VibGU+IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFc3Rp bWF0ZTxEdXJhdGlvbj4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uKGUu cG9pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbihlLmxvd2Vy X2JvdW5kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24oZS51cHBl cl9ib3VuZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29uZmlkZW5jZV9p bnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAg IH07Ci0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPER1cmF0aW9uPiBzYW1wbGVzMjsK LSAgICAgICAgICAgICAgICAgICAgc2FtcGxlczIucmVzZXJ2ZShzYW1wbGVzLnNpemUoKSk7Ci0g ICAgICAgICAgICAgICAgICAgIHN0ZDo6dHJhbnNmb3JtKHNhbXBsZXMuYmVnaW4oKSwgc2FtcGxl cy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHNhbXBsZXMyKSwgW10oZG91YmxlIGQpIHsgcmV0 dXJuIER1cmF0aW9uKGQpOyB9KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAg ICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzYW1wbGVzMiksCi0gICAgICAgICAgICAgICAg ICAgICAgICB3cmFwX2VzdGltYXRlKGFuYWx5c2lzLm1lYW4pLAotICAgICAgICAgICAgICAgICAg ICAgICAgd3JhcF9lc3RpbWF0ZShhbmFseXNpcy5zdGFuZGFyZF9kZXZpYXRpb24pLAotICAgICAg ICAgICAgICAgICAgICAgICAgb3V0bGllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmFs eXNpcy5vdXRsaWVyX3ZhcmlhbmNlLAotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAg ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPER1cmF0aW9u PiBzYW1wbGVzOwotICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLnJlc2VydmUobGFzdCAtIGZp cnN0KTsKLQotICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBtZWFuID0gRHVyYXRpb24oMCk7 Ci0gICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9y IChhdXRvIGl0ID0gZmlyc3Q7IGl0IDwgbGFzdDsgKytpdCwgKytpKSB7Ci0gICAgICAgICAgICAg ICAgICAgICAgICBzYW1wbGVzLnB1c2hfYmFjayhEdXJhdGlvbigqaXQpKTsKLSAgICAgICAgICAg ICAgICAgICAgICAgIG1lYW4gKz0gRHVyYXRpb24oKml0KTsKLSAgICAgICAgICAgICAgICAgICAg fQotICAgICAgICAgICAgICAgICAgICBtZWFuIC89IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAg cmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzYW1wbGVzKSwKLSAg ICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRlPER1cmF0aW9uPnttZWFuLCBtZWFuLCBtZWFu LCAwLjB9LAotICAgICAgICAgICAgICAgICAgICAgICAgRXN0aW1hdGU8RHVyYXRpb24+e0R1cmF0 aW9uKDApLCBEdXJhdGlvbigwKSwgRHVyYXRpb24oMCksIDAuMH0sCi0gICAgICAgICAgICAgICAg ICAgICAgICBPdXRsaWVyQ2xhc3NpZmljYXRpb257fSwKLSAgICAgICAgICAgICAgICAgICAgICAg IDAuMAotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg ICAgIH0KLSAgICAgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCi0gICAgfSAvLyBuYW1lc3BhY2Ug QmVuY2htYXJrCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfYW5hbHlzZS5o cHAKLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRl IDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNtYXRoPgotCi1uYW1lc3Bh Y2UgQ2F0Y2ggewotICAgIG5hbWVzcGFjZSBCZW5jaG1hcmsgewotICAgICAgICBzdHJ1Y3QgQmVu Y2htYXJrIHsKLSAgICAgICAgICAgIEJlbmNobWFyayhzdGQ6OnN0cmluZyAmJm5hbWUpCi0gICAg ICAgICAgICAgICAgOiBuYW1lKHN0ZDo6bW92ZShuYW1lKSkge30KLQotICAgICAgICAgICAgdGVt cGxhdGUgPGNsYXNzIEZVTj4KLSAgICAgICAgICAgIEJlbmNobWFyayhzdGQ6OnN0cmluZyAmJm5h bWUsIEZVTiAmJmZ1bmMpCi0gICAgICAgICAgICAgICAgOiBmdW4oc3RkOjptb3ZlKGZ1bmMpKSwg bmFtZShzdGQ6Om1vdmUobmFtZSkpIHt9Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFt ZSBDbG9jaz4KLSAgICAgICAgICAgIEV4ZWN1dGlvblBsYW48RmxvYXREdXJhdGlvbjxDbG9jaz4+ IHByZXBhcmUoY29uc3QgSUNvbmZpZyAmY2ZnLCBFbnZpcm9ubWVudDxGbG9hdER1cmF0aW9uPENs b2NrPj4gZW52KSBjb25zdCB7Ci0gICAgICAgICAgICAgICAgYXV0byBtaW5fdGltZSA9IGVudi5j bG9ja19yZXNvbHV0aW9uLm1lYW4gKiBEZXRhaWw6Om1pbmltdW1fdGlja3M7Ci0gICAgICAgICAg ICAgICAgYXV0byBydW5fdGltZSA9IHN0ZDo6bWF4KG1pbl90aW1lLCBzdGQ6OmNocm9ubzo6ZHVy YXRpb25fY2FzdDxkZWNsdHlwZShtaW5fdGltZSk+KGNmZy5iZW5jaG1hcmtXYXJtdXBUaW1lKCkp KTsKLSAgICAgICAgICAgICAgICBhdXRvJiYgdGVzdCA9IERldGFpbDo6cnVuX2Zvcl9hdF9sZWFz dDxDbG9jaz4oc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Q2xvY2tEdXJhdGlvbjxDbG9jaz4+ KHJ1bl90aW1lKSwgMSwgZnVuKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV3X2l0ZXJzID0gc3Rh dGljX2Nhc3Q8aW50PihzdGQ6OmNlaWwobWluX3RpbWUgKiB0ZXN0Lml0ZXJhdGlvbnMgLyB0ZXN0 LmVsYXBzZWQpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4geyBuZXdfaXRlcnMsIHRlc3QuZWxh cHNlZCAvIHRlc3QuaXRlcmF0aW9ucyAqIG5ld19pdGVycyAqIGNmZy5iZW5jaG1hcmtTYW1wbGVz KCksIGZ1biwgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8RmxvYXREdXJhdGlvbjxDbG9jaz4+ KGNmZy5iZW5jaG1hcmtXYXJtdXBUaW1lKCkpLCBEZXRhaWw6Ondhcm11cF9pdGVyYXRpb25zIH07 Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jayA9 IGRlZmF1bHRfY2xvY2s+Ci0gICAgICAgICAgICB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAg ICBJQ29uZmlnUHRyIGNmZyA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7Ci0KLSAg ICAgICAgICAgICAgICBhdXRvIGVudiA9IERldGFpbDo6bWVhc3VyZV9lbnZpcm9ubWVudDxDbG9j az4oKTsKLQotICAgICAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5iZW5jaG1hcmtQcmVw YXJpbmcobmFtZSk7Ci0gICAgICAgICAgICAgICAgQ0FUQ0hfVFJZewotICAgICAgICAgICAgICAg ICAgICBhdXRvIHBsYW4gPSB1c2VyX2NvZGUoWyZdIHsKLSAgICAgICAgICAgICAgICAgICAgICAg IHJldHVybiBwcmVwYXJlPENsb2NrPigqY2ZnLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICB9 KTsKLQotICAgICAgICAgICAgICAgICAgICBCZW5jaG1hcmtJbmZvIGluZm8gewotICAgICAgICAg ICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBsYW4uZXN0aW1h dGVkX2R1cmF0aW9uLmNvdW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGFuLml0ZXJh dGlvbnNfcGVyX3NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+YmVuY2htYXJr U2FtcGxlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5iZW5jaG1hcmtSZXNhbXBs ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudi5jbG9ja19yZXNvbHV0aW9uLm1lYW4u Y291bnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudi5jbG9ja19jb3N0Lm1lYW4uY291 bnQoKQotICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgICAgIGdldFJl c3VsdENhcHR1cmUoKS5iZW5jaG1hcmtTdGFydGluZyhpbmZvKTsKLQotICAgICAgICAgICAgICAg ICAgICBhdXRvIHNhbXBsZXMgPSB1c2VyX2NvZGUoWyZdIHsKLSAgICAgICAgICAgICAgICAgICAg ICAgIHJldHVybiBwbGFuLnRlbXBsYXRlIHJ1bjxDbG9jaz4oKmNmZywgZW52KTsKLSAgICAgICAg ICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXV0byBhbmFseXNpcyA9IERl dGFpbDo6YW5hbHlzZSgqY2ZnLCBlbnYsIHNhbXBsZXMuYmVnaW4oKSwgc2FtcGxlcy5lbmQoKSk7 Ci0gICAgICAgICAgICAgICAgICAgIEJlbmNobWFya1N0YXRzPEZsb2F0RHVyYXRpb248Q2xvY2s+ PiBzdGF0c3sgaW5mbywgYW5hbHlzaXMuc2FtcGxlcywgYW5hbHlzaXMubWVhbiwgYW5hbHlzaXMu c3RhbmRhcmRfZGV2aWF0aW9uLCBhbmFseXNpcy5vdXRsaWVycywgYW5hbHlzaXMub3V0bGllcl92 YXJpYW5jZSB9OwotICAgICAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuYmVuY2ht YXJrRW5kZWQoc3RhdHMpOwotCi0gICAgICAgICAgICAgICAgfSBDQVRDSF9DQVRDSF9BTEx7Ci0g ICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSAhPSBEZXRh aWw6OmJlbmNobWFya0Vycm9yTXNnKSAvLyBiZW5jaG1hcmsgZXJyb3JzIGhhdmUgYmVlbiByZXBv cnRlZCwgb3RoZXJ3aXNlIHJldGhyb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJl dGhyb3dfZXhjZXB0aW9uKHN0ZDo6Y3VycmVudF9leGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAg ICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXRzIGxhbWJkYSB0byBiZSB1 c2VkIGluIGZ1biAqYW5kKiBleGVjdXRlcyBiZW5jaG1hcmshCi0gICAgICAgICAgICB0ZW1wbGF0 ZSA8dHlwZW5hbWUgRnVuLAotICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lm PCFEZXRhaWw6OmlzX3JlbGF0ZWQ8RnVuLCBCZW5jaG1hcms+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9 IDA+Ci0gICAgICAgICAgICAgICAgQmVuY2htYXJrICYgb3BlcmF0b3I9KEZ1biBmdW5jKSB7Ci0g ICAgICAgICAgICAgICAgZnVuID0gRGV0YWlsOjpCZW5jaG1hcmtGdW5jdGlvbihmdW5jKTsKLSAg ICAgICAgICAgICAgICBydW4oKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAg ICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7Ci0gICAg ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0 ZToKLSAgICAgICAgICAgIERldGFpbDo6QmVuY2htYXJrRnVuY3Rpb24gZnVuOwotICAgICAgICAg ICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgfTsKLSAgICB9Ci19IC8vIG5hbWVzcGFjZSBD YXRjaAotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0dFVF8xX0FSRyhhcmcxLCBhcmcyLCAuLi4p IGFyZzEKLSNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfR0VUXzJfQVJHKGFyZzEsIGFyZzIsIC4uLikg YXJnMgotCi0jZGVmaW5lIElOVEVSTkFMX0NBVENIX0JFTkNITUFSSyhCZW5jaG1hcmtOYW1lLCBu YW1lLCBiZW5jaG1hcmtJbmRleClcCi0gICAgaWYoIENhdGNoOjpCZW5jaG1hcms6OkJlbmNobWFy ayBCZW5jaG1hcmtOYW1le25hbWV9ICkgXAotICAgICAgICBCZW5jaG1hcmtOYW1lID0gWyZdKGlu dCBiZW5jaG1hcmtJbmRleCkKLQotI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9CRU5DSE1BUktfQURW QU5DRUQoQmVuY2htYXJrTmFtZSwgbmFtZSlcCi0gICAgaWYoIENhdGNoOjpCZW5jaG1hcms6OkJl bmNobWFyayBCZW5jaG1hcmtOYW1le25hbWV9ICkgXAotICAgICAgICBCZW5jaG1hcmtOYW1lID0g WyZdCi0KLS8vIGVuZCBjYXRjaF9iZW5jaG1hcmsuaHBwCi0vLyBzdGFydCBjYXRjaF9jb25zdHJ1 Y3Rvci5ocHAKLQotLy8gQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgaGVscGVycwotCi0KLSNp bmNsdWRlIDx0eXBlX3RyYWl0cz4KLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBuYW1lc3BhY2Ug QmVuY2htYXJrIHsKLSAgICAgICAgbmFtZXNwYWNlIERldGFpbCB7Ci0gICAgICAgICAgICB0ZW1w bGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCBEZXN0cnVjdD4KLSAgICAgICAgICAgIHN0cnVjdCBPYmpl Y3RTdG9yYWdlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXNpbmcgVFN0b3JhZ2Ug PSB0eXBlbmFtZSBzdGQ6OmFsaWduZWRfc3RvcmFnZTxzaXplb2YoVCksIHN0ZDo6YWxpZ25tZW50 X29mPFQ+Ojp2YWx1ZT46OnR5cGU7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3RTdG9yYWdlKCkg OiBkYXRhKCkge30KLQotICAgICAgICAgICAgICAgIE9iamVjdFN0b3JhZ2UoY29uc3QgT2JqZWN0 U3RvcmFnZSYgb3RoZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBu ZXcoJmRhdGEpIFQob3RoZXIuc3RvcmVkX29iamVjdCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0K LSAgICAgICAgICAgICAgICBPYmplY3RTdG9yYWdlKE9iamVjdFN0b3JhZ2UmJiBvdGhlcikKLSAg ICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ldygmZGF0YSkgVChzdGQ6Om1v dmUob3RoZXIuc3RvcmVkX29iamVjdCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg ICAgICAgICAgfk9iamVjdFN0b3JhZ2UoKSB7IGRlc3RydWN0X29uX2V4aXQ8VD4oKTsgfQotCi0g ICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Ci0gICAgICAgICAgICAg ICAgdm9pZCBjb25zdHJ1Y3QoQXJncyYmLi4uIGFyZ3MpCi0gICAgICAgICAgICAgICAgewotICAg ICAgICAgICAgICAgICAgICBuZXcgKCZkYXRhKSBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4u Lik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGVtcGxhdGUgPGJvb2wg QWxsb3dNYW51YWxEZXN0cnVjdGlvbiA9ICFEZXN0cnVjdD4KLSAgICAgICAgICAgICAgICB0eXBl bmFtZSBzdGQ6OmVuYWJsZV9pZjxBbGxvd01hbnVhbERlc3RydWN0aW9uPjo6dHlwZSBkZXN0cnVj dCgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdG9yZWRfb2JqZWN0 KCkuflQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGU6Ci0gICAg ICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnN0cnVjdG9yIGJlbmNobWFyaywgZGVzdHJ1 Y3QgdGhlIHVuZGVybHlpbmcgb2JqZWN0Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVu YW1lIFU+Ci0gICAgICAgICAgICAgICAgdm9pZCBkZXN0cnVjdF9vbl9leGl0KHR5cGVuYW1lIHN0 ZDo6ZW5hYmxlX2lmPERlc3RydWN0LCBVPjo6dHlwZSogPSAwKSB7IGRlc3RydWN0PHRydWU+KCk7 IH0KLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvbid0Ci0gICAgICAgICAgICAgICAg dGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gICAgICAgICAgICAgICAgdm9pZCBkZXN0cnVjdF9vbl9l eGl0KHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFEZXN0cnVjdCwgVT46OnR5cGUqID0gMCkgeyB9 Ci0KLSAgICAgICAgICAgICAgICBUJiBzdG9yZWRfb2JqZWN0KCkgewotICAgICAgICAgICAgICAg ICAgICByZXR1cm4gKnN0YXRpY19jYXN0PFQqPihzdGF0aWNfY2FzdDx2b2lkKj4oJmRhdGEpKTsK LSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBUIGNvbnN0JiBzdG9yZWRfb2Jq ZWN0KCkgY29uc3QgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PFQq PihzdGF0aWNfY2FzdDx2b2lkKj4oJmRhdGEpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAg ICAgICAgICAgICBUU3RvcmFnZSBkYXRhOwotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0g ICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgICAgICB1c2luZyBzdG9yYWdlX2ZvciA9 IERldGFpbDo6T2JqZWN0U3RvcmFnZTxULCB0cnVlPjsKLQotICAgICAgICB0ZW1wbGF0ZSA8dHlw ZW5hbWUgVD4KLSAgICAgICAgdXNpbmcgZGVzdHJ1Y3RhYmxlX29iamVjdCA9IERldGFpbDo6T2Jq ZWN0U3RvcmFnZTxULCBmYWxzZT47Ci0gICAgfQotfQotCi0vLyBlbmQgY2F0Y2hfY29uc3RydWN0 b3IuaHBwCi0vLyBlbmQgY2F0Y2hfYmVuY2htYXJraW5nX2FsbC5ocHAKLSNlbmRpZgotCi0jZW5k aWYgLy8gISBDQVRDSF9DT05GSUdfSU1QTF9PTkxZCi0KLSNpZmRlZiBDQVRDSF9JTVBMCi0vLyBz dGFydCBjYXRjaF9pbXBsLmhwcAotCi0jaWZkZWYgX19jbGFuZ19fCi0jcHJhZ21hIGNsYW5nIGRp YWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xd2Vhay12 dGFibGVzIgotI2VuZGlmCi0KLS8vIEtlZXAgdGhlc2UgaGVyZSBmb3IgZXh0ZXJuYWwgcmVwb3J0 ZXJzCi0vLyBzdGFydCBjYXRjaF90ZXN0X2Nhc2VfdHJhY2tlci5oCi0KLSNpbmNsdWRlIDxzdHJp bmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIENh dGNoIHsKLW5hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nIHsKLQotICAgIHN0cnVjdCBOYW1lQW5k TG9jYXRpb24gewotICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwotICAgICAgICBTb3VyY2VMaW5l SW5mbyBsb2NhdGlvbjsKLQotICAgICAgICBOYW1lQW5kTG9jYXRpb24oIHN0ZDo6c3RyaW5nIGNv bnN0JiBfbmFtZSwgU291cmNlTGluZUluZm8gY29uc3QmIF9sb2NhdGlvbiApOwotICAgICAgICBm cmllbmQgYm9vbCBvcGVyYXRvcj09KE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbGhzLCBOYW1lQW5k TG9jYXRpb24gY29uc3QmIHJocykgewotICAgICAgICAgICAgcmV0dXJuIGxocy5uYW1lID09IHJo cy5uYW1lCi0gICAgICAgICAgICAgICAgJiYgbGhzLmxvY2F0aW9uID09IHJocy5sb2NhdGlvbjsK LSAgICAgICAgfQotICAgIH07Ci0KLSAgICBjbGFzcyBJVHJhY2tlcjsKLQotICAgIHVzaW5nIElU cmFja2VyUHRyID0gc3RkOjpzaGFyZWRfcHRyPElUcmFja2VyPjsKLQotICAgIGNsYXNzICBJVHJh Y2tlciB7Ci0gICAgICAgIE5hbWVBbmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKLQotICAg IHB1YmxpYzoKLSAgICAgICAgSVRyYWNrZXIoTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5k TG9jKSA6Ci0gICAgICAgICAgICBtX25hbWVBbmRMb2NhdGlvbihuYW1lQW5kTG9jKQotICAgICAg ICB7fQotCi0gICAgICAgIC8vIHN0YXRpYyBxdWVyaWVzCi0gICAgICAgIE5hbWVBbmRMb2NhdGlv biBjb25zdCYgbmFtZUFuZExvY2F0aW9uKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1f bmFtZUFuZExvY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB+SVRyYWNrZXIo KTsKLQotICAgICAgICAvLyBkeW5hbWljIHF1ZXJpZXMKLSAgICAgICAgdmlydHVhbCBib29sIGlz Q29tcGxldGUoKSBjb25zdCA9IDA7IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb3IgZmFpbGVk Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0ID0g MDsKLSAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0ID0gMDsgLy8gU3RhcnRlZCBi dXQgbm90IGNvbXBsZXRlCi0gICAgICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0 ID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sIGhhc1N0YXJ0ZWQoKSBjb25zdCA9IDA7Ci0KLSAg ICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgPSAwOwotCi0gICAgICAgIC8vIGFjdGlv bnMKLSAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOyAvLyBTdWNjZXNzZnVsbHkgY29t cGxldGUKLSAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwg dm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpID0gMDsKLQotICAgICAgICB2aXJ0dWFsIHZv aWQgYWRkQ2hpbGQoIElUcmFja2VyUHRyIGNvbnN0JiBjaGlsZCApID0gMDsKLSAgICAgICAgdmly dHVhbCBJVHJhY2tlclB0ciBmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFu ZExvY2F0aW9uICkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgb3BlbkNoaWxkKCkgPSAwOwot Ci0gICAgICAgIC8vIERlYnVnLyBjaGVja2luZwotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0 aW9uVHJhY2tlcigpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sIGlzR2VuZXJhdG9y VHJhY2tlcigpIGNvbnN0ID0gMDsKLSAgICB9OwotCi0gICAgY2xhc3MgVHJhY2tlckNvbnRleHQg ewotCi0gICAgICAgIGVudW0gUnVuU3RhdGUgewotICAgICAgICAgICAgTm90U3RhcnRlZCwKLSAg ICAgICAgICAgIEV4ZWN1dGluZywKLSAgICAgICAgICAgIENvbXBsZXRlZEN5Y2xlCi0gICAgICAg IH07Ci0KLSAgICAgICAgSVRyYWNrZXJQdHIgbV9yb290VHJhY2tlcjsKLSAgICAgICAgSVRyYWNr ZXIqIG1fY3VycmVudFRyYWNrZXIgPSBudWxscHRyOwotICAgICAgICBSdW5TdGF0ZSBtX3J1blN0 YXRlID0gTm90U3RhcnRlZDsKLQotICAgIHB1YmxpYzoKLQotICAgICAgICBJVHJhY2tlciYgc3Rh cnRSdW4oKTsKLSAgICAgICAgdm9pZCBlbmRSdW4oKTsKLQotICAgICAgICB2b2lkIHN0YXJ0Q3lj bGUoKTsKLSAgICAgICAgdm9pZCBjb21wbGV0ZUN5Y2xlKCk7Ci0KLSAgICAgICAgYm9vbCBjb21w bGV0ZWRDeWNsZSgpIGNvbnN0OwotICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIoKTsK LSAgICAgICAgdm9pZCBzZXRDdXJyZW50VHJhY2tlciggSVRyYWNrZXIqIHRyYWNrZXIgKTsKLSAg ICB9OwotCi0gICAgY2xhc3MgVHJhY2tlckJhc2UgOiBwdWJsaWMgSVRyYWNrZXIgewotICAgIHBy b3RlY3RlZDoKLSAgICAgICAgZW51bSBDeWNsZVN0YXRlIHsKLSAgICAgICAgICAgIE5vdFN0YXJ0 ZWQsCi0gICAgICAgICAgICBFeGVjdXRpbmcsCi0gICAgICAgICAgICBFeGVjdXRpbmdDaGlsZHJl biwKLSAgICAgICAgICAgIE5lZWRzQW5vdGhlclJ1biwKLSAgICAgICAgICAgIENvbXBsZXRlZFN1 Y2Nlc3NmdWxseSwKLSAgICAgICAgICAgIEZhaWxlZAotICAgICAgICB9OwotCi0gICAgICAgIHVz aW5nIENoaWxkcmVuID0gc3RkOjp2ZWN0b3I8SVRyYWNrZXJQdHI+OwotICAgICAgICBUcmFja2Vy Q29udGV4dCYgbV9jdHg7Ci0gICAgICAgIElUcmFja2VyKiBtX3BhcmVudDsKLSAgICAgICAgQ2hp bGRyZW4gbV9jaGlsZHJlbjsKLSAgICAgICAgQ3ljbGVTdGF0ZSBtX3J1blN0YXRlID0gTm90U3Rh cnRlZDsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgVHJhY2tlckJhc2UoIE5hbWVBbmRMb2NhdGlv biBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciog cGFyZW50ICk7Ci0KLSAgICAgICAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0g ICAgICAgIGJvb2wgaXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSBjb25zdCBvdmVycmlkZTsKLSAg ICAgICAgYm9vbCBpc09wZW4oKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgYm9vbCBoYXNDaGls ZHJlbigpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBib29sIGhhc1N0YXJ0ZWQoKSBjb25zdCBv dmVycmlkZSB7Ci0gICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSAhPSBOb3RTdGFydGVkOwot ICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRDaGlsZCggSVRyYWNrZXJQdHIgY29uc3QmIGNo aWxkICkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgSVRyYWNrZXJQdHIgZmluZENoaWxkKCBOYW1lQW5k TG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIG92ZXJyaWRlOwotICAgICAgICBJVHJh Y2tlciYgcGFyZW50KCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCBvcGVuQ2hpbGQoKSBvdmVy cmlkZTsKLQotICAgICAgICBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCBvdmVycmlkZTsK LSAgICAgICAgYm9vbCBpc0dlbmVyYXRvclRyYWNrZXIoKSBjb25zdCBvdmVycmlkZTsKLQotICAg ICAgICB2b2lkIG9wZW4oKTsKLQotICAgICAgICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7Ci0gICAg ICAgIHZvaWQgZmFpbCgpIG92ZXJyaWRlOwotICAgICAgICB2b2lkIG1hcmtBc05lZWRpbmdBbm90 aGVyUnVuKCkgb3ZlcnJpZGU7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIG1vdmVUb1Bh cmVudCgpOwotICAgICAgICB2b2lkIG1vdmVUb1RoaXMoKTsKLSAgICB9OwotCi0gICAgY2xhc3Mg U2VjdGlvblRyYWNrZXIgOiBwdWJsaWMgVHJhY2tlckJhc2UgewotICAgICAgICBzdGQ6OnZlY3Rv cjxzdGQ6OnN0cmluZz4gbV9maWx0ZXJzOwotICAgICAgICBzdGQ6OnN0cmluZyBtX3RyaW1tZWRf bmFtZTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRp b24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIq IHBhcmVudCApOwotCi0gICAgICAgIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IG92ZXJy aWRlOwotCi0gICAgICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAg ICAgIHN0YXRpYyBTZWN0aW9uVHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwg TmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKTsKLQotICAgICAgICB2b2lk IHRyeU9wZW4oKTsKLQotICAgICAgICB2b2lkIGFkZEluaXRpYWxGaWx0ZXJzKCBzdGQ6OnZlY3Rv cjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKTsKLSAgICAgICAgdm9pZCBhZGROZXh0Rmls dGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICk7Ci0gICAgICAg IC8vISBSZXR1cm5zIGZpbHRlcnMgYWN0aXZlIGluIHRoaXMgdHJhY2tlcgotICAgICAgICBzdGQ6 OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldEZpbHRlcnMoKSBjb25zdDsKLSAgICAgICAg Ly8hIFJldHVybnMgd2hpdGVzcGFjZS10cmltbWVkIG5hbWUgb2YgdGhlIHRyYWNrZWQgc2VjdGlv bgotICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgdHJpbW1lZE5hbWUoKSBjb25zdDsKLSAgICB9 OwotCi19IC8vIG5hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nCi0KLXVzaW5nIFRlc3RDYXNlVHJh Y2tpbmc6OklUcmFja2VyOwotdXNpbmcgVGVzdENhc2VUcmFja2luZzo6VHJhY2tlckNvbnRleHQ7 Ci11c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpTZWN0aW9uVHJhY2tlcjsKLQotfSAvLyBuYW1lc3Bh Y2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX3Rlc3RfY2FzZV90cmFja2VyLmgKLQotLy8gc3RhcnQg Y2F0Y2hfbGVha19kZXRlY3Rvci5oCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBzdHJ1Y3Qg TGVha0RldGVjdG9yIHsKLSAgICAgICAgTGVha0RldGVjdG9yKCk7Ci0gICAgICAgIH5MZWFrRGV0 ZWN0b3IoKTsKLSAgICB9OwotCi19Ci0vLyBlbmQgY2F0Y2hfbGVha19kZXRlY3Rvci5oCi0vLyBD cHAgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc2luZ2xlLWhlYWRlciBmaWxlIGhlcmUK LS8vIHN0YXJ0IGNhdGNoX3N0YXRzLmNwcAotCi0vLyBTdGF0aXN0aWNhbCBhbmFseXNpcyB0b29s cwotCi0jaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORykKLQotI2lu Y2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8cmFuZG9tPgotCi0jaWYgZGVmaW5lZChDQVRDSF9D T05GSUdfVVNFX0FTWU5DKQotI2luY2x1ZGUgPGZ1dHVyZT4KLSNlbmRpZgotCi1uYW1lc3BhY2Ug ewotICAgIGRvdWJsZSBlcmZfaW52KGRvdWJsZSB4KSB7Ci0gICAgICAgIC8vIENvZGUgYWNjb21w YW55aW5nIHRoZSBhcnRpY2xlICJBcHByb3hpbWF0aW5nIHRoZSBlcmZpbnYgZnVuY3Rpb24iIGlu IEdQVSBDb21wdXRpbmcgR2VtcywgVm9sdW1lIDIKLSAgICAgICAgZG91YmxlIHcsIHA7Ci0KLSAg ICAgICAgdyA9IC1sb2coKDEuMCAtIHgpICogKDEuMCArIHgpKTsKLQotICAgICAgICBpZiAodyA8 IDYuMjUwMDAwKSB7Ci0gICAgICAgICAgICB3ID0gdyAtIDMuMTI1MDAwOwotICAgICAgICAgICAg cCA9IC0zLjY0NDQxMjA2NDAxNzgxOTY5OTZlLTIxOwotICAgICAgICAgICAgcCA9IC0xLjY4NTA1 OTEzODE4MjAxNjU4OWUtMTkgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAxLjI4NTg0ODA3MTUy NTY0MDAxNjdlLTE4ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gMS4xMTU3ODc3Njc4MDI1MTgw OTZlLTE3ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gLTEuMzMzMTcxNjYyODU0NjIwOTA2ZS0x NiArIHAgKiB3OwotICAgICAgICAgICAgcCA9IDIuMDk3Mjc2Nzg3NTk2ODU2MTYzN2UtMTcgKyBw ICogdzsKLSAgICAgICAgICAgIHAgPSA2LjYzNzYzODEzNDM1ODMyMzgzMjVlLTE1ICsgcCAqIHc7 Ci0gICAgICAgICAgICBwID0gLTQuMDU0NTY2MjcyOTc1MjA2ODYzOWUtMTQgKyBwICogdzsKLSAg ICAgICAgICAgIHAgPSAtOC4xNTE5MzQxOTc2MDU0NzIxNTIyZS0xNCArIHAgKiB3OwotICAgICAg ICAgICAgcCA9IDIuNjMzNTA5MzE1MzA4MjMyMjk3N2UtMTIgKyBwICogdzsKLSAgICAgICAgICAg IHAgPSAtMS4yOTc1MTMzMjUzNDUzNTMyNDk4ZS0xMSArIHAgKiB3OwotICAgICAgICAgICAgcCA9 IC01LjQxNTQxMjA1NDI5NDYyNzkzMTdlLTExICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gMS4w NTEyMTIyNzMzMjE1MzIyODVlLTA5ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gLTQuMTEyNjMz OTgwMzQ2OTgzNjk3NmUtMDkgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAtMi45MDcwMzY5OTU3 ODgyMDA1MDg2ZS0wOCArIHAgKiB3OwotICAgICAgICAgICAgcCA9IDQuMjM0Nzg3NzgyNzkzMjQw MzUxOGUtMDcgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAtMS4zNjU0NjkyMDAwODM0Njc4NjQ1 ZS0wNiArIHAgKiB3OwotICAgICAgICAgICAgcCA9IC0xLjM4ODI1MjMzNjI3ODY0Njg3MTllLTA1 ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gMC4wMDAxODY3MzQyMDgwMzQwNTcxMzUyICsgcCAq IHc7Ci0gICAgICAgICAgICBwID0gLTAuMDAwNzQwNzAyNTM0MTY2MjY2OTc1MTIgKyBwICogdzsK LSAgICAgICAgICAgIHAgPSAtMC4wMDYwMzM2NzA4NzE0MzAxNDkwNTMzICsgcCAqIHc7Ci0gICAg ICAgICAgICBwID0gMC4yNDAxNTgxODI0MjU1ODk2MTY5MyArIHAgKiB3OwotICAgICAgICAgICAg cCA9IDEuNjUzNjU0NTYyNjgzMTAyNzM1NiArIHAgKiB3OwotICAgICAgICB9IGVsc2UgaWYgKHcg PCAxNi4wMDAwMDApIHsKLSAgICAgICAgICAgIHcgPSBzcXJ0KHcpIC0gMy4yNTAwMDA7Ci0gICAg ICAgICAgICBwID0gMi4yMTM3Mzc2OTIxNzc1Nzg3MDQ5ZS0wOTsKLSAgICAgICAgICAgIHAgPSA5 LjA3NTY1NjE5Mzg4ODUzOTA5NzllLTA4ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gLTIuNzUx NzQwNjI5NzA2NDU0NTQyOGUtMDcgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAxLjgyMzk2Mjky MTQzODkyMjc3NTVlLTA4ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gMS41MDI3NDAzOTY4OTA5 ODI3NjI3ZS0wNiArIHAgKiB3OwotICAgICAgICAgICAgcCA9IC00LjAxMzg2NzUyNjk4MTU0NTk2 OWUtMDYgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAyLjkyMzQ0NDkwODk5NTU0NDYwNDRlLTA2 ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gMS4yNDc1MzA0NDgxNjcxNzc4NzIzZS0wNSArIHAg KiB3OwotICAgICAgICAgICAgcCA9IC00LjczMTgyMjkwMDkwNTU3MzM5ODFlLTA1ICsgcCAqIHc7 Ci0gICAgICAgICAgICBwID0gNi44Mjg0ODUxNDU5NTczMTc1NDQ4ZS0wNSArIHAgKiB3OwotICAg ICAgICAgICAgcCA9IDIuNDAzMTExMDM4NzA5Nzg5Mzk5OWUtMDUgKyBwICogdzsKLSAgICAgICAg ICAgIHAgPSAtMC4wMDAzNTUwMzc1MjAzNjI4NDc0Nzk2ICsgcCAqIHc7Ci0gICAgICAgICAgICBw ID0gMC4wMDA5NTMyODkzNzk3MzczODA0OTcwMyArIHAgKiB3OwotICAgICAgICAgICAgcCA9IC0w LjAwMTY4ODI3NTU1NjAyMzUwNDczMTMgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAwLjAwMjQ5 MTQ0MjA5NjEwNzg1MDgwNjYgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAtMC4wMDM3NTEyMDg1 MDc1NjkyNDEyMTA3ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gMC4wMDUzNzA5MTQ1NTM1OTAw NjM2MTcgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAxLjAwNTI1ODk2NzY5NDE1OTIzMzQgKyBw ICogdzsKLSAgICAgICAgICAgIHAgPSAzLjA4Mzg4NTYxMDQ5MjIyMDc2MzUgKyBwICogdzsKLSAg ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHcgPSBzcXJ0KHcpIC0gNS4wMDAwMDA7Ci0gICAg ICAgICAgICBwID0gLTIuNzEwOTkyMDYxNjQzODU3MzI0M2UtMTE7Ci0gICAgICAgICAgICBwID0g LTIuNTU1NjQxODE2OTk2NTI1MjA1NWUtMTAgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAxLjUw NzY1NzI2OTM1MDA1NDgwODNlLTA5ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gLTMuNzg5NDY1 NDQwMTI2NzM2OTkzN2UtMDkgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSA3LjYxNTcwMTIwODA3 ODMzOTM4MDRlLTA5ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gLTEuNDk2MDAyNjYyNzE0OTI0 MDQ3OGUtMDggKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAyLjkxNDc5NTM0NTA5MDEwODA4MjZl LTA4ICsgcCAqIHc7Ci0gICAgICAgICAgICBwID0gLTYuNzcxMTk5Nzc1ODQ1MjMzOTQ5OGUtMDgg KyBwICogdzsKLSAgICAgICAgICAgIHAgPSAyLjI5MDA0ODIyMjgwMjY2NTQ3MTdlLTA3ICsgcCAq IHc7Ci0gICAgICAgICAgICBwID0gLTkuOTI5ODI3Mjk0MjMxNzAwMjUzOWUtMDcgKyBwICogdzsK LSAgICAgICAgICAgIHAgPSA0LjUyNjA2MjU5NzIyMzE1MzcwMzllLTA2ICsgcCAqIHc7Ci0gICAg ICAgICAgICBwID0gLTEuOTY4MTc3ODEwNTUzMTY3MDU2N2UtMDUgKyBwICogdzsKLSAgICAgICAg ICAgIHAgPSA3LjU5OTUyNzcwMzAwMTc3NjExMzllLTA1ICsgcCAqIHc7Ci0gICAgICAgICAgICBw ID0gLTAuMDAwMjE1MDMwMTE5MzAwNDQ0NzczNDcgKyBwICogdzsKLSAgICAgICAgICAgIHAgPSAt MC4wMDAxMzg3MTkzMTgzMzYyMzEyMjAyNiArIHAgKiB3OwotICAgICAgICAgICAgcCA9IDEuMDEw MzAwNDY0ODY0NTM0Mzk3NyArIHAgKiB3OwotICAgICAgICAgICAgcCA9IDQuODQ5OTA2NDAxNDA4 NTg0NDIyMSArIHAgKiB3OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwICogeDsKLSAgICB9 Ci0KLSAgICBkb3VibGUgc3RhbmRhcmRfZGV2aWF0aW9uKHN0ZDo6dmVjdG9yPGRvdWJsZT46Oml0 ZXJhdG9yIGZpcnN0LCBzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciBsYXN0KSB7Ci0gICAg ICAgIGF1dG8gbSA9IENhdGNoOjpCZW5jaG1hcms6OkRldGFpbDo6bWVhbihmaXJzdCwgbGFzdCk7 Ci0gICAgICAgIGRvdWJsZSB2YXJpYW5jZSA9IHN0ZDo6YWNjdW11bGF0ZShmaXJzdCwgbGFzdCwg MC4sIFttXShkb3VibGUgYSwgZG91YmxlIGIpIHsKLSAgICAgICAgICAgIGRvdWJsZSBkaWZmID0g YiAtIG07Ci0gICAgICAgICAgICByZXR1cm4gYSArIGRpZmYgKiBkaWZmOwotICAgICAgICAgICAg fSkgLyAobGFzdCAtIGZpcnN0KTsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OnNxcnQodmFyaWFu Y2UpOwotICAgIH0KLQotfQotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFjZSBCZW5j aG1hcmsgewotICAgICAgICBuYW1lc3BhY2UgRGV0YWlsIHsKLQotICAgICAgICAgICAgZG91Ymxl IHdlaWdodGVkX2F2ZXJhZ2VfcXVhbnRpbGUoaW50IGssIGludCBxLCBzdGQ6OnZlY3Rvcjxkb3Vi bGU+OjppdGVyYXRvciBmaXJzdCwgc3RkOjp2ZWN0b3I8ZG91YmxlPjo6aXRlcmF0b3IgbGFzdCkg ewotICAgICAgICAgICAgICAgIGF1dG8gY291bnQgPSBsYXN0IC0gZmlyc3Q7Ci0gICAgICAgICAg ICAgICAgZG91YmxlIGlkeCA9IChjb3VudCAtIDEpICogayAvIHN0YXRpY19jYXN0PGRvdWJsZT4o cSk7Ci0gICAgICAgICAgICAgICAgaW50IGogPSBzdGF0aWNfY2FzdDxpbnQ+KGlkeCk7Ci0gICAg ICAgICAgICAgICAgZG91YmxlIGcgPSBpZHggLSBqOwotICAgICAgICAgICAgICAgIHN0ZDo6bnRo X2VsZW1lbnQoZmlyc3QsIGZpcnN0ICsgaiwgbGFzdCk7Ci0gICAgICAgICAgICAgICAgYXV0byB4 aiA9IGZpcnN0W2pdOwotICAgICAgICAgICAgICAgIGlmIChnID09IDApIHJldHVybiB4ajsKLQot ICAgICAgICAgICAgICAgIGF1dG8geGoxID0gKnN0ZDo6bWluX2VsZW1lbnQoZmlyc3QgKyAoaiAr IDEpLCBsYXN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4geGogKyBnICogKHhqMSAtIHhqKTsK LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZG91YmxlIGVyZmNfaW52KGRvdWJsZSB4KSB7 Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVyZl9pbnYoMS4wIC0geCk7Ci0gICAgICAgICAgICB9 Ci0KLSAgICAgICAgICAgIGRvdWJsZSBub3JtYWxfcXVhbnRpbGUoZG91YmxlIHApIHsKLSAgICAg ICAgICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIFJPT1RfVFdPID0gc3RkOjpzcXJ0KDIuMCk7 Ci0KLSAgICAgICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gMC4wOwotICAgICAgICAgICAgICAg IGFzc2VydChwID49IDAgJiYgcCA8PSAxKTsKLSAgICAgICAgICAgICAgICBpZiAocCA8IDAgfHwg cCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAg ICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSAtZXJmY19pbnYoMi4wICogcCk7Ci0g ICAgICAgICAgICAgICAgLy8gcmVzdWx0ICo9IG5vcm1hbCBkaXN0cmlidXRpb24gc3RhbmRhcmQg ZGV2aWF0aW9uICgxLjApICogc3FydCgyKQotICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAvKnNk ICogKi8gUk9PVF9UV087Ci0gICAgICAgICAgICAgICAgLy8gcmVzdWx0ICs9IG5vcm1hbCBkaXN0 dHJpYnV0aW9uIG1lYW4gKDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAg ICAgICAgIH0KLQotICAgICAgICAgICAgZG91YmxlIG91dGxpZXJfdmFyaWFuY2UoRXN0aW1hdGU8 ZG91YmxlPiBtZWFuLCBFc3RpbWF0ZTxkb3VibGU+IHN0ZGRldiwgaW50IG4pIHsKLSAgICAgICAg ICAgICAgICBkb3VibGUgc2IgPSBzdGRkZXYucG9pbnQ7Ci0gICAgICAgICAgICAgICAgZG91Ymxl IG1uID0gbWVhbi5wb2ludCAvIG47Ci0gICAgICAgICAgICAgICAgZG91YmxlIG1nX21pbiA9IG1u IC8gMi47Ci0gICAgICAgICAgICAgICAgZG91YmxlIHNnID0gKHN0ZDo6bWluKShtZ19taW4gLyA0 Liwgc2IgLyBzdGQ6OnNxcnQobikpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBzZzIgPSBzZyAq IHNnOwotICAgICAgICAgICAgICAgIGRvdWJsZSBzYjIgPSBzYiAqIHNiOwotCi0gICAgICAgICAg ICAgICAgYXV0byBjX21heCA9IFtuLCBtbiwgc2IyLCBzZzJdKGRvdWJsZSB4KSAtPiBkb3VibGUg ewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgayA9IG1uIC0geDsKLSAgICAgICAgICAgICAg ICAgICAgZG91YmxlIGQgPSBrICogazsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIG5kID0g biAqIGQ7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBrMCA9IC1uICogbmQ7Ci0gICAgICAg ICAgICAgICAgICAgIGRvdWJsZSBrMSA9IHNiMiAtIG4gKiBzZzIgKyBuZDsKLSAgICAgICAgICAg ICAgICAgICAgZG91YmxlIGRldCA9IGsxICogazEgLSA0ICogc2cyICogazA7Ci0gICAgICAgICAg ICAgICAgICAgIHJldHVybiAoaW50KSgtMi4gKiBrMCAvIChrMSArIHN0ZDo6c3FydChkZXQpKSk7 Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIGF1dG8gdmFyX291dCA9IFtu LCBzYjIsIHNnMl0oZG91YmxlIGMpIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIG5jID0g biAtIGM7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobmMgLyBuKSAqIChzYjIgLSBuYyAq IHNnMik7Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIHJldHVybiAoc3Rk OjptaW4pKHZhcl9vdXQoMSksIHZhcl9vdXQoKHN0ZDo6bWluKShjX21heCgwLiksIGNfbWF4KG1n X21pbikpKSkgLyBzYjI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb3RzdHJhcF9h bmFseXNpcyBhbmFseXNlX3NhbXBsZXMoZG91YmxlIGNvbmZpZGVuY2VfbGV2ZWwsIGludCBuX3Jl c2FtcGxlcywgc3RkOjp2ZWN0b3I8ZG91YmxlPjo6aXRlcmF0b3IgZmlyc3QsIHN0ZDo6dmVjdG9y PGRvdWJsZT46Oml0ZXJhdG9yIGxhc3QpIHsKLSAgICAgICAgICAgICAgICBDQVRDSF9JTlRFUk5B TF9TVEFSVF9XQVJOSU5HU19TVVBQUkVTU0lPTgotICAgICAgICAgICAgICAgIENBVENIX0lOVEVS TkFMX1NVUFBSRVNTX0dMT0JBTFNfV0FSTklOR1MKLSAgICAgICAgICAgICAgICBzdGF0aWMgc3Rk OjpyYW5kb21fZGV2aWNlIGVudHJvcHk7Ci0gICAgICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxf U1RPUF9XQVJOSU5HU19TVVBQUkVTU0lPTgotCi0gICAgICAgICAgICAgICAgYXV0byBuID0gc3Rh dGljX2Nhc3Q8aW50PihsYXN0IC0gZmlyc3QpOyAvLyBzZXJpb3VzbHksIG9uZSBjYW4ndCB1c2Ug aW50ZWdyYWwgdHlwZXMgd2l0aG91dCBoZWxsIGluIEMrKwotCi0gICAgICAgICAgICAgICAgYXV0 byBtZWFuID0gJkRldGFpbDo6bWVhbjxzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvcj47Ci0g ICAgICAgICAgICAgICAgYXV0byBzdGRkZXYgPSAmc3RhbmRhcmRfZGV2aWF0aW9uOwotCi0jaWYg ZGVmaW5lZChDQVRDSF9DT05GSUdfVVNFX0FTWU5DKQotICAgICAgICAgICAgICAgIGF1dG8gRXN0 aW1hdGUgPSBbPV0oZG91YmxlKCpmKShzdGQ6OnZlY3Rvcjxkb3VibGU+OjppdGVyYXRvciwgc3Rk Ojp2ZWN0b3I8ZG91YmxlPjo6aXRlcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8g c2VlZCA9IGVudHJvcHkoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXN5bmMo c3RkOjpsYXVuY2g6OmFzeW5jLCBbPV0gewotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpt dDE5OTM3IHJuZyhzZWVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzYW1wbGVk ID0gcmVzYW1wbGUocm5nLCBuX3Jlc2FtcGxlcywgZmlyc3QsIGxhc3QsIGYpOwotICAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIGJvb3RzdHJhcChjb25maWRlbmNlX2xldmVsLCBmaXJzdCwg bGFzdCwgcmVzYW1wbGVkLCBmKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAg ICAgICAgfTsKLQotICAgICAgICAgICAgICAgIGF1dG8gbWVhbl9mdXR1cmUgPSBFc3RpbWF0ZSht ZWFuKTsKLSAgICAgICAgICAgICAgICBhdXRvIHN0ZGRldl9mdXR1cmUgPSBFc3RpbWF0ZShzdGRk ZXYpOwotCi0gICAgICAgICAgICAgICAgYXV0byBtZWFuX2VzdGltYXRlID0gbWVhbl9mdXR1cmUu Z2V0KCk7Ci0gICAgICAgICAgICAgICAgYXV0byBzdGRkZXZfZXN0aW1hdGUgPSBzdGRkZXZfZnV0 dXJlLmdldCgpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBhdXRvIEVzdGltYXRlID0gWz1dKGRv dWJsZSgqZikoc3RkOjp2ZWN0b3I8ZG91YmxlPjo6aXRlcmF0b3IsIHN0ZDo6dmVjdG9yPGRvdWJs ZT46Oml0ZXJhdG9yKSkgewotICAgICAgICAgICAgICAgICAgICBhdXRvIHNlZWQgPSBlbnRyb3B5 KCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0ZDo6bXQxOTkzNyBybmcoc2VlZCk7Ci0gICAgICAg ICAgICAgICAgICAgIGF1dG8gcmVzYW1wbGVkID0gcmVzYW1wbGUocm5nLCBuX3Jlc2FtcGxlcywg Zmlyc3QsIGxhc3QsIGYpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9vdHN0cmFwKGNv bmZpZGVuY2VfbGV2ZWwsIGZpcnN0LCBsYXN0LCByZXNhbXBsZWQsIGYpOwotICAgICAgICAgICAg ICAgIH07Ci0KLSAgICAgICAgICAgICAgICBhdXRvIG1lYW5fZXN0aW1hdGUgPSBFc3RpbWF0ZSht ZWFuKTsKLSAgICAgICAgICAgICAgICBhdXRvIHN0ZGRldl9lc3RpbWF0ZSA9IEVzdGltYXRlKHN0 ZGRldik7Ci0jZW5kaWYgLy8gQ0FUQ0hfVVNFX0FTWU5DCi0KLSAgICAgICAgICAgICAgICBkb3Vi bGUgb3V0bGllcl92YXJpYW5jZSA9IERldGFpbDo6b3V0bGllcl92YXJpYW5jZShtZWFuX2VzdGlt YXRlLCBzdGRkZXZfZXN0aW1hdGUsIG4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVh bl9lc3RpbWF0ZSwgc3RkZGV2X2VzdGltYXRlLCBvdXRsaWVyX3ZhcmlhbmNlIH07Ci0gICAgICAg ICAgICB9Ci0gICAgICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAotICAgIH0gLy8gbmFtZXNwYWNl IEJlbmNobWFyawotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotI2VuZGlmIC8vIENBVENIX0NPTkZJ R19FTkFCTEVfQkVOQ0hNQVJLSU5HCi0vLyBlbmQgY2F0Y2hfc3RhdHMuY3BwCi0vLyBzdGFydCBj YXRjaF9hcHByb3guY3BwCi0KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0K LW5hbWVzcGFjZSB7Ci0KLS8vIFBlcmZvcm1zIGVxdWl2YWxlbnQgY2hlY2sgb2Ygc3RkOjpmYWJz KGxocyAtIHJocykgPD0gbWFyZ2luCi0vLyBCdXQgd2l0aG91dCB0aGUgc3VidHJhY3Rpb24gdG8g YWxsb3cgZm9yIElORklOSVRZIGluIGNvbXBhcmlzb24KLWJvb2wgbWFyZ2luQ29tcGFyaXNvbihk b3VibGUgbGhzLCBkb3VibGUgcmhzLCBkb3VibGUgbWFyZ2luKSB7Ci0gICAgcmV0dXJuIChsaHMg KyBtYXJnaW4gPj0gcmhzKSAmJiAocmhzICsgbWFyZ2luID49IGxocyk7Ci19Ci0KLX0KLQotbmFt ZXNwYWNlIENhdGNoIHsKLW5hbWVzcGFjZSBEZXRhaWwgewotCi0gICAgQXBwcm94OjpBcHByb3gg KCBkb3VibGUgdmFsdWUgKQotICAgIDogICBtX2Vwc2lsb24oIHN0ZDo6bnVtZXJpY19saW1pdHM8 ZmxvYXQ+OjplcHNpbG9uKCkqMTAwICksCi0gICAgICAgIG1fbWFyZ2luKCAwLjAgKSwKLSAgICAg ICAgbV9zY2FsZSggMC4wICksCi0gICAgICAgIG1fdmFsdWUoIHZhbHVlICkKLSAgICB7fQotCi0g ICAgQXBwcm94IEFwcHJveDo6Y3VzdG9tKCkgewotICAgICAgICByZXR1cm4gQXBwcm94KCAwICk7 Ci0gICAgfQotCi0gICAgQXBwcm94IEFwcHJveDo6b3BlcmF0b3ItKCkgY29uc3QgewotICAgICAg ICBhdXRvIHRlbXAoKnRoaXMpOwotICAgICAgICB0ZW1wLm1fdmFsdWUgPSAtdGVtcC5tX3ZhbHVl OwotICAgICAgICByZXR1cm4gdGVtcDsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBBcHByb3g6 OnRvU3RyaW5nKCkgY29uc3QgewotICAgICAgICBSZXVzYWJsZVN0cmluZ1N0cmVhbSByc3M7Ci0g ICAgICAgIHJzcyA8PCAiQXBwcm94KCAiIDw8IDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCBt X3ZhbHVlICkgPDwgIiApIjsKLSAgICAgICAgcmV0dXJuIHJzcy5zdHIoKTsKLSAgICB9Ci0KLSAg ICBib29sIEFwcHJveDo6ZXF1YWxpdHlDb21wYXJpc29uSW1wbChjb25zdCBkb3VibGUgb3RoZXIp IGNvbnN0IHsKLSAgICAgICAgLy8gRmlyc3QgdHJ5IHdpdGggZml4ZWQgbWFyZ2luLCB0aGVuIGNv bXB1dGUgbWFyZ2luIGJhc2VkIG9uIGVwc2lsb24sIHNjYWxlIGFuZCBBcHByb3gncyB2YWx1ZQot ICAgICAgICAvLyBUaGFua3MgdG8gUmljaGFyZCBIYXJyaXMgZm9yIGhpcyBoZWxwIHJlZmluaW5n IHRoZSBzY2FsZWQgbWFyZ2luIHZhbHVlCi0gICAgICAgIHJldHVybiBtYXJnaW5Db21wYXJpc29u KG1fdmFsdWUsIG90aGVyLCBtX21hcmdpbikKLSAgICAgICAgICAgIHx8IG1hcmdpbkNvbXBhcmlz b24obV92YWx1ZSwgb3RoZXIsIG1fZXBzaWxvbiAqIChtX3NjYWxlICsgc3RkOjpmYWJzKHN0ZDo6 aXNpbmYobV92YWx1ZSk/IDAgOiBtX3ZhbHVlKSkpOwotICAgIH0KLQotICAgIHZvaWQgQXBwcm94 OjpzZXRNYXJnaW4oZG91YmxlIG5ld01hcmdpbikgewotICAgICAgICBDQVRDSF9FTkZPUkNFKG5l d01hcmdpbiA+PSAwLAotICAgICAgICAgICAgIkludmFsaWQgQXBwcm94OjptYXJnaW46ICIgPDwg bmV3TWFyZ2luIDw8ICcuJwotICAgICAgICAgICAgPDwgIiBBcHByb3g6Ok1hcmdpbiBoYXMgdG8g YmUgbm9uLW5lZ2F0aXZlLiIpOwotICAgICAgICBtX21hcmdpbiA9IG5ld01hcmdpbjsKLSAgICB9 Ci0KLSAgICB2b2lkIEFwcHJveDo6c2V0RXBzaWxvbihkb3VibGUgbmV3RXBzaWxvbikgewotICAg ICAgICBDQVRDSF9FTkZPUkNFKG5ld0Vwc2lsb24gPj0gMCAmJiBuZXdFcHNpbG9uIDw9IDEuMCwK LSAgICAgICAgICAgICJJbnZhbGlkIEFwcHJveDo6ZXBzaWxvbjogIiA8PCBuZXdFcHNpbG9uIDw8 ICcuJwotICAgICAgICAgICAgPDwgIiBBcHByb3g6OmVwc2lsb24gaGFzIHRvIGJlIGluIFswLCAx XSIpOwotICAgICAgICBtX2Vwc2lsb24gPSBuZXdFcHNpbG9uOwotICAgIH0KLQotfSAvLyBlbmQg bmFtZXNwYWNlIERldGFpbAotCi1uYW1lc3BhY2UgbGl0ZXJhbHMgewotICAgIERldGFpbDo6QXBw cm94IG9wZXJhdG9yICIiIF9hKGxvbmcgZG91YmxlIHZhbCkgewotICAgICAgICByZXR1cm4gRGV0 YWlsOjpBcHByb3godmFsKTsKLSAgICB9Ci0gICAgRGV0YWlsOjpBcHByb3ggb3BlcmF0b3IgIiIg X2EodW5zaWduZWQgbG9uZyBsb25nIHZhbCkgewotICAgICAgICByZXR1cm4gRGV0YWlsOjpBcHBy b3godmFsKTsKLSAgICB9Ci19IC8vIGVuZCBuYW1lc3BhY2UgbGl0ZXJhbHMKLQotc3RkOjpzdHJp bmcgU3RyaW5nTWFrZXI8Q2F0Y2g6OkRldGFpbDo6QXBwcm94Pjo6Y29udmVydChDYXRjaDo6RGV0 YWlsOjpBcHByb3ggY29uc3QmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7 Ci19Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotLy8gZW5kIGNhdGNoX2FwcHJveC5jcHAK LS8vIHN0YXJ0IGNhdGNoX2Fzc2VydGlvbmhhbmRsZXIuY3BwCi0KLS8vIHN0YXJ0IGNhdGNoX2Rl YnVnZ2VyLmgKLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBib29sIGlzRGVidWdnZXJBY3RpdmUo KTsKLX0KLQotI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQwotCi0gICAgI2lmIGRlZmluZWQoX19p Mzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLSAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQ KCkgX19hc21fXygiaW50ICQzXG4iIDogOiApIC8qIE5PTElOVCAqLwotICAgICNlbGlmIGRlZmlu ZWQoX19hYXJjaDY0X18pCi0gICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpICBfX2FzbV9fKCIu aW5zdCAweGQ0MjAwMDAwIikKLSAgICAjZW5kaWYKLQotI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFU Rk9STV9JUEhPTkUpCi0KLSAgICAvLyB1c2UgaW5saW5lIGFzc2VtYmxlcgotICAgICNpZiBkZWZp bmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgICAgICNkZWZpbmUgQ0FU Q0hfVFJBUCgpICBfX2FzbV9fKCJpbnQgJDMiKQotICAgICNlbGlmIGRlZmluZWQoX19hYXJjaDY0 X18pCi0gICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpICBfX2FzbV9fKCIuaW5zdCAweGQ0MjAw MDAwIikKLSAgICAjZWxpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykK LSAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgIF9fYXNtX18oIi5pbnN0IDB4ZTdmMDAxZjAi KQotICAgICNlbGlmIGRlZmluZWQoX19hcm1fXykgJiYgIGRlZmluZWQoX190aHVtYl9fKQotICAg ICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSAgX19hc21fXygiLmluc3QgMHhkZTAxIikKLSAgICAj ZW5kaWYKLQotI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKLSAgICAvLyBJZiB3 ZSBjYW4gdXNlIGlubGluZSBhc3NlbWJsZXIsIGRvIGl0IGJlY2F1c2UgdGhpcyBhbGxvd3MgdXMg dG8gYnJlYWsKLSAgICAvLyBkaXJlY3RseSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGZhaWxpbmcg Y2hlY2sgaW5zdGVhZCBvZiBicmVha2luZyBpbnNpZGUKLSAgICAvLyByYWlzZSgpIGNhbGxlZCBm cm9tIGl0LCBpLmUuIG9uZSBzdGFjayBmcmFtZSBiZWxvdy4KLSAgICAjaWYgZGVmaW5lZChfX0dO VUNfXykgJiYgKGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9feDg2XzY0KSkKLSAgICAgICAg I2RlZmluZSBDQVRDSF9UUkFQKCkgYXNtIHZvbGF0aWxlICgiaW50ICQzIikgLyogTk9MSU5UICov Ci0gICAgI2Vsc2UgLy8gRmFsbCBiYWNrIHRvIHRoZSBnZW5lcmljIHdheS4KLSAgICAgICAgI2lu Y2x1ZGUgPHNpZ25hbC5oPgotCi0gICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIHJhaXNlKFNJ R1RSQVApCi0gICAgI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgICNkZWZpbmUg Q0FUQ0hfVFJBUCgpIF9fZGVidWdicmVhaygpCi0jZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQot ICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgX19zdGRjYWxsIERlYnVn QnJlYWsoKTsKLSAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBEZWJ1Z0JyZWFrKCkKLSNlbmRpZgot Ci0jaWZuZGVmIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIKLSAgICAjaWZkZWYgQ0FUQ0hfVFJB UAotICAgICAgICAjZGVmaW5lIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBbXXsgaWYoIENh dGNoOjppc0RlYnVnZ2VyQWN0aXZlKCkgKSB7IENBVENIX1RSQVAoKTsgfSB9KCkKLSAgICAjZWxz ZQotICAgICAgICAjZGVmaW5lIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBbXXt9KCkKLSAg ICAjZW5kaWYKLSNlbmRpZgotCi0vLyBlbmQgY2F0Y2hfZGVidWdnZXIuaAotLy8gc3RhcnQgY2F0 Y2hfcnVuX2NvbnRleHQuaAotCi0vLyBzdGFydCBjYXRjaF9mYXRhbF9jb25kaXRpb24uaAotCi0j aW5jbHVkZSA8Y2Fzc2VydD4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIC8vIFdyYXBwZXIg Zm9yIHBsYXRmb3JtLXNwZWNpZmljIGZhdGFsIGVycm9yIChzaWduYWxzL1NFSCkgaGFuZGxlcnMK LSAgICAvLwotICAgIC8vIFRyaWVzIHRvIGJlIGNvb3BlcmF0aXZlIHdpdGggb3RoZXIgaGFuZGxl cnMsIGFuZCBub3Qgc3RlcCBvdmVyCi0gICAgLy8gb3RoZXIgaGFuZGxlcnMuIFRoaXMgbWVhbnMg dGhhdCB1bmtub3duIHN0cnVjdHVyZWQgZXhjZXB0aW9ucwotICAgIC8vIGFyZSBwYXNzZWQgb24s IHByZXZpb3VzIHNpZ25hbCBoYW5kbGVycyBhcmUgY2FsbGVkLCBhbmQgc28gb24uCi0gICAgLy8K LSAgICAvLyBDYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgb25jZSwgYW5kIGFzc3VtZXMgdGhhdCBv bmNlIGEgc2lnbmFsCi0gICAgLy8gaXMgY2F1Z2h0LCB0aGUgYmluYXJ5IHdpbGwgZW5kIHVwIHRl cm1pbmF0aW5nLiBUaHVzLCB0aGVyZQotICAgIGNsYXNzIEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7 Ci0gICAgICAgIGJvb2wgbV9zdGFydGVkID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gSW5zdGFsbC9k aXNlbmdhZ2UgaW1wbGVtZW50YXRpb24gZm9yIHNwZWNpZmljIHBsYXRmb3JtLgotICAgICAgICAv LyBTaG91bGQgYmUgaWYtZGVmZWQgdG8gd29yayBvbiBjdXJyZW50IHBsYXRmb3JtLCBjYW4gYXNz dW1lCi0gICAgICAgIC8vIGVuZ2FnZS1kaXNlbmdhZ2UgMToxIHBhaXJpbmcuCi0gICAgICAgIHZv aWQgZW5nYWdlX3BsYXRmb3JtKCk7Ci0gICAgICAgIHZvaWQgZGlzZW5nYWdlX3BsYXRmb3JtKCk7 Ci0gICAgcHVibGljOgotICAgICAgICAvLyBTaG91bGQgYWxzbyBoYXZlIHBsYXRmb3JtLXNwZWNp ZmljIGltcGxlbWVudGF0aW9ucyBhcyBuZWVkZWQKLSAgICAgICAgRmF0YWxDb25kaXRpb25IYW5k bGVyKCk7Ci0gICAgICAgIH5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKTsKLQotICAgICAgICB2b2lk IGVuZ2FnZSgpIHsKLSAgICAgICAgICAgIGFzc2VydCghbV9zdGFydGVkICYmICJIYW5kbGVyIGNh bm5vdCBiZSBpbnN0YWxsZWQgdHdpY2UuIik7Ci0gICAgICAgICAgICBtX3N0YXJ0ZWQgPSB0cnVl OwotICAgICAgICAgICAgZW5nYWdlX3BsYXRmb3JtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2 b2lkIGRpc2VuZ2FnZSgpIHsKLSAgICAgICAgICAgIGFzc2VydChtX3N0YXJ0ZWQgJiYgIkhhbmRs ZXIgY2Fubm90IGJlIHVuaW5zdGFsbGVkIHdpdGhvdXQgYmVpbmcgaW5zdGFsbGVkIGZpcnN0Iik7 Ci0gICAgICAgICAgICBtX3N0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGRpc2VuZ2FnZV9w bGF0Zm9ybSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vISBTaW1wbGUgUkFJSSBndWFy ZCBmb3IgKGRpcyllbmdhZ2luZyB0aGUgRmF0YWxDb25kaXRpb25IYW5kbGVyCi0gICAgY2xhc3Mg RmF0YWxDb25kaXRpb25IYW5kbGVyR3VhcmQgewotICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRs ZXIqIG1faGFuZGxlcjsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxl ckd1YXJkKEZhdGFsQ29uZGl0aW9uSGFuZGxlciogaGFuZGxlcik6Ci0gICAgICAgICAgICBtX2hh bmRsZXIoaGFuZGxlcikgewotICAgICAgICAgICAgbV9oYW5kbGVyLT5lbmdhZ2UoKTsKLSAgICAg ICAgfQotICAgICAgICB+RmF0YWxDb25kaXRpb25IYW5kbGVyR3VhcmQoKSB7Ci0gICAgICAgICAg ICBtX2hhbmRsZXItPmRpc2VuZ2FnZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotfSAvLyBlbmQg bmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9mYXRhbF9jb25kaXRpb24uaAotI2luY2x1 ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBJTXV0YWJsZUNv bnRleHQ7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIGNsYXNzIFJ1bkNvbnRleHQg OiBwdWJsaWMgSVJlc3VsdENhcHR1cmUsIHB1YmxpYyBJUnVubmVyIHsKLQotICAgIHB1YmxpYzoK LSAgICAgICAgUnVuQ29udGV4dCggUnVuQ29udGV4dCBjb25zdCYgKSA9IGRlbGV0ZTsKLSAgICAg ICAgUnVuQ29udGV4dCYgb3BlcmF0b3IgPSggUnVuQ29udGV4dCBjb25zdCYgKSA9IGRlbGV0ZTsK LQotICAgICAgICBleHBsaWNpdCBSdW5Db250ZXh0KCBJQ29uZmlnUHRyIGNvbnN0JiBfY29uZmln LCBJU3RyZWFtaW5nUmVwb3J0ZXJQdHImJiByZXBvcnRlciApOwotCi0gICAgICAgIH5SdW5Db250 ZXh0KCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggc3RkOjpz dHJpbmcgY29uc3QmIHRlc3RTcGVjLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVf dCBncm91cHNDb3VudCApOwotICAgICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmlu ZyBjb25zdCYgdGVzdFNwZWMsIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnNpemVfdCBncm91 cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApOwotCi0gICAgICAgIFRvdGFscyBydW5U ZXN0KFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSk7Ci0KLSAgICAgICAgSUNvbmZpZ1B0ciBjb25m aWcoKSBjb25zdDsKLSAgICAgICAgSVN0cmVhbWluZ1JlcG9ydGVyJiByZXBvcnRlcigpIGNvbnN0 OwotCi0gICAgcHVibGljOiAvLyBJUmVzdWx0Q2FwdHVyZQotCi0gICAgICAgIC8vIEFzc2VydGlv biBoYW5kbGVycwotICAgICAgICB2b2lkIGhhbmRsZUV4cHIKLSAgICAgICAgICAgICAgICAoICAg QXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywKLSAgICAgICAgICAgICAgICAgICAgSVRyYW5zaWVu dEV4cHJlc3Npb24gY29uc3QmIGV4cHIsCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJl YWN0aW9uJiByZWFjdGlvbiApIG92ZXJyaWRlOwotICAgICAgICB2b2lkIGhhbmRsZU1lc3NhZ2UK LSAgICAgICAgICAgICAgICAoICAgQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywKLSAgICAgICAg ICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSwKLSAgICAgICAgICAgICAg ICAgICAgU3RyaW5nUmVmIGNvbnN0JiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBBc3Nl cnRpb25SZWFjdGlvbiYgcmVhY3Rpb24gKSBvdmVycmlkZTsKLSAgICAgICAgdm9pZCBoYW5kbGVV bmV4cGVjdGVkRXhjZXB0aW9uTm90VGhyb3duCi0gICAgICAgICAgICAgICAgKCAgIEFzc2VydGlv bkluZm8gY29uc3QmIGluZm8sCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9u JiByZWFjdGlvbiApIG92ZXJyaWRlOwotICAgICAgICB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRJbmZs aWdodEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0JiBp bmZvLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwKLSAg ICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVhY3Rpb24mIHJlYWN0aW9uICkgb3ZlcnJpZGU7 Ci0gICAgICAgIHZvaWQgaGFuZGxlSW5jb21wbGV0ZQotICAgICAgICAgICAgICAgICggICBBc3Nl cnRpb25JbmZvIGNvbnN0JiBpbmZvICkgb3ZlcnJpZGU7Ci0gICAgICAgIHZvaWQgaGFuZGxlTm9u RXhwcgotICAgICAgICAgICAgICAgICggICBBc3NlcnRpb25JbmZvIGNvbnN0ICZpbmZvLAotICAg ICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlLAotICAgICAgICAg ICAgICAgICAgICBBc3NlcnRpb25SZWFjdGlvbiAmcmVhY3Rpb24gKSBvdmVycmlkZTsKLQotICAg ICAgICBib29sIHNlY3Rpb25TdGFydGVkKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8s IENvdW50cyYgYXNzZXJ0aW9ucyApIG92ZXJyaWRlOwotCi0gICAgICAgIHZvaWQgc2VjdGlvbkVu ZGVkKCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIG92ZXJyaWRlOwotICAgICAgICB2 b2lkIHNlY3Rpb25FbmRlZEVhcmx5KCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIG92 ZXJyaWRlOwotCi0gICAgICAgIGF1dG8gYWNxdWlyZUdlbmVyYXRvclRyYWNrZXIoIFN0cmluZ1Jl ZiBnZW5lcmF0b3JOYW1lLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSAtPiBJR2Vu ZXJhdG9yVHJhY2tlciYgb3ZlcnJpZGU7Ci0KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFC TEVfQkVOQ0hNQVJLSU5HKQotICAgICAgICB2b2lkIGJlbmNobWFya1ByZXBhcmluZyggc3RkOjpz dHJpbmcgY29uc3QmIG5hbWUgKSBvdmVycmlkZTsKLSAgICAgICAgdm9pZCBiZW5jaG1hcmtTdGFy dGluZyggQmVuY2htYXJrSW5mbyBjb25zdCYgaW5mbyApIG92ZXJyaWRlOwotICAgICAgICB2b2lk IGJlbmNobWFya0VuZGVkKCBCZW5jaG1hcmtTdGF0czw+IGNvbnN0JiBzdGF0cyApIG92ZXJyaWRl OwotICAgICAgICB2b2lkIGJlbmNobWFya0ZhaWxlZCggc3RkOjpzdHJpbmcgY29uc3QmIGVycm9y ICkgb3ZlcnJpZGU7Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcK LQotICAgICAgICB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVz c2FnZSApIG92ZXJyaWRlOwotICAgICAgICB2b2lkIHBvcFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJ bmZvIGNvbnN0JiBtZXNzYWdlICkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCBlbXBsYWNlVW5z Y29wZWRNZXNzYWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciApIG92ZXJyaWRlOwot Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0IG92ZXJyaWRl OwotCi0gICAgICAgIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0 IG92ZXJyaWRlOwotCi0gICAgICAgIHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpIG92ZXJy aWRlOwotCi0gICAgICAgIHZvaWQgaGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggU3RyaW5nUmVm IG1lc3NhZ2UgKSBvdmVycmlkZTsKLQotICAgICAgICBib29sIGxhc3RBc3NlcnRpb25QYXNzZWQo KSBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIGFzc2VydGlvblBhc3NlZCgpIG92ZXJyaWRlOwot Ci0gICAgcHVibGljOgotICAgICAgICAvLyAhVEJEIFdlIG5lZWQgdG8gZG8gdGhpcyBhbm90aGVy IHdheSEKLSAgICAgICAgYm9vbCBhYm9ydGluZygpIGNvbnN0IGZpbmFsOwotCi0gICAgcHJpdmF0 ZToKLQotICAgICAgICB2b2lkIHJ1bkN1cnJlbnRUZXN0KCBzdGQ6OnN0cmluZyYgcmVkaXJlY3Rl ZENvdXQsIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ2VyciApOwotICAgICAgICB2b2lkIGludm9r ZUFjdGl2ZVRlc3RDYXNlKCk7Ci0KLSAgICAgICAgdm9pZCByZXNldEFzc2VydGlvbkluZm8oKTsK LSAgICAgICAgYm9vbCB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIENvdW50cyYgYXNzZXJ0aW9u cyApOwotCi0gICAgICAgIHZvaWQgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblJlc3VsdCBjb25z dCYgcmVzdWx0ICk7Ci0gICAgICAgIHZvaWQgcmVwb3J0RXhwcgotICAgICAgICAgICAgICAgICgg ICBBc3NlcnRpb25JbmZvIGNvbnN0ICZpbmZvLAotICAgICAgICAgICAgICAgICAgICBSZXN1bHRX YXM6Ok9mVHlwZSByZXN1bHRUeXBlLAotICAgICAgICAgICAgICAgICAgICBJVHJhbnNpZW50RXhw cmVzc2lvbiBjb25zdCAqZXhwciwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWdhdGVkICk7 Ci0KLSAgICAgICAgdm9pZCBwb3B1bGF0ZVJlYWN0aW9uKCBBc3NlcnRpb25SZWFjdGlvbiYgcmVh Y3Rpb24gKTsKLQotICAgIHByaXZhdGU6Ci0KLSAgICAgICAgdm9pZCBoYW5kbGVVbmZpbmlzaGVk U2VjdGlvbnMoKTsKLQotICAgICAgICBUZXN0UnVuSW5mbyBtX3J1bkluZm87Ci0gICAgICAgIElN dXRhYmxlQ29udGV4dCYgbV9jb250ZXh0OwotICAgICAgICBUZXN0Q2FzZSBjb25zdCogbV9hY3Rp dmVUZXN0Q2FzZSA9IG51bGxwdHI7Ci0gICAgICAgIElUcmFja2VyKiBtX3Rlc3RDYXNlVHJhY2tl ciA9IG51bGxwdHI7Ci0gICAgICAgIE9wdGlvbjxBc3NlcnRpb25SZXN1bHQ+IG1fbGFzdFJlc3Vs dDsKLQotICAgICAgICBJQ29uZmlnUHRyIG1fY29uZmlnOwotICAgICAgICBUb3RhbHMgbV90b3Rh bHM7Ci0gICAgICAgIElTdHJlYW1pbmdSZXBvcnRlclB0ciBtX3JlcG9ydGVyOwotICAgICAgICBz dGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbV9tZXNzYWdlczsKLSAgICAgICAgc3RkOjp2ZWN0b3I8 U2NvcGVkTWVzc2FnZT4gbV9tZXNzYWdlU2NvcGVzOyAvKiBLZWVwcyBvd25lcnMgb2Ygc28tY2Fs bGVkIHVuc2NvcGVkIG1lc3NhZ2VzLiAqLwotICAgICAgICBBc3NlcnRpb25JbmZvIG1fbGFzdEFz c2VydGlvbkluZm87Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPiBtX3VuZmlu aXNoZWRTZWN0aW9uczsKLSAgICAgICAgc3RkOjp2ZWN0b3I8SVRyYWNrZXIqPiBtX2FjdGl2ZVNl Y3Rpb25zOwotICAgICAgICBUcmFja2VyQ29udGV4dCBtX3RyYWNrZXJDb250ZXh0OwotICAgICAg ICBGYXRhbENvbmRpdGlvbkhhbmRsZXIgbV9mYXRhbENvbmRpdGlvbmhhbmRsZXI7Ci0gICAgICAg IGJvb2wgbV9sYXN0QXNzZXJ0aW9uUGFzc2VkID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgbV9zaG91 bGRSZXBvcnRVbmV4cGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgYm9vbCBtX2luY2x1ZGVTdWNjZXNz ZnVsUmVzdWx0czsKLSAgICB9OwotCi0gICAgdm9pZCBzZWVkUm5nKElDb25maWcgY29uc3QmIGNv bmZpZyk7Ci0gICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKTsKLX0gLy8gZW5kIG5hbWVzcGFjZSBD YXRjaAotCi0vLyBlbmQgY2F0Y2hfcnVuX2NvbnRleHQuaAotbmFtZXNwYWNlIENhdGNoIHsKLQot ICAgIG5hbWVzcGFjZSB7Ci0gICAgICAgIGF1dG8gb3BlcmF0b3IgPDwoIHN0ZDo6b3N0cmVhbSYg b3MsIElUcmFuc2llbnRFeHByZXNzaW9uIGNvbnN0JiBleHByICkgLT4gc3RkOjpvc3RyZWFtJiB7 Ci0gICAgICAgICAgICBleHByLnN0cmVhbVJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCBvcyApOwot ICAgICAgICAgICAgcmV0dXJuIG9zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTGF6eUV4cHJl c3Npb246OkxhenlFeHByZXNzaW9uKCBib29sIGlzTmVnYXRlZCApCi0gICAgOiAgIG1faXNOZWdh dGVkKCBpc05lZ2F0ZWQgKQotICAgIHt9Ci0KLSAgICBMYXp5RXhwcmVzc2lvbjo6TGF6eUV4cHJl c3Npb24oIExhenlFeHByZXNzaW9uIGNvbnN0JiBvdGhlciApIDogbV9pc05lZ2F0ZWQoIG90aGVy Lm1faXNOZWdhdGVkICkge30KLQotICAgIExhenlFeHByZXNzaW9uOjpvcGVyYXRvciBib29sKCkg Y29uc3QgewotICAgICAgICByZXR1cm4gbV90cmFuc2llbnRFeHByZXNzaW9uICE9IG51bGxwdHI7 Ci0gICAgfQotCi0gICAgYXV0byBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIExhenlF eHByZXNzaW9uIGNvbnN0JiBsYXp5RXhwciApIC0+IHN0ZDo6b3N0cmVhbSYgewotICAgICAgICBp ZiggbGF6eUV4cHIubV9pc05lZ2F0ZWQgKQotICAgICAgICAgICAgb3MgPDwgIiEiOwotCi0gICAg ICAgIGlmKCBsYXp5RXhwciApIHsKLSAgICAgICAgICAgIGlmKCBsYXp5RXhwci5tX2lzTmVnYXRl ZCAmJiBsYXp5RXhwci5tX3RyYW5zaWVudEV4cHJlc3Npb24tPmlzQmluYXJ5RXhwcmVzc2lvbigp ICkKLSAgICAgICAgICAgICAgICBvcyA8PCAiKCIgPDwgKmxhenlFeHByLm1fdHJhbnNpZW50RXhw cmVzc2lvbiA8PCAiKSI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3MgPDwg KmxhenlFeHByLm1fdHJhbnNpZW50RXhwcmVzc2lvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNl IHsKLSAgICAgICAgICAgIG9zIDw8ICJ7KiogZXJyb3IgLSB1bmNoZWNrZWQgZW1wdHkgZXhwcmVz c2lvbiByZXF1ZXN0ZWQgKip9IjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3M7Ci0gICAg fQotCi0gICAgQXNzZXJ0aW9uSGFuZGxlcjo6QXNzZXJ0aW9uSGFuZGxlcgotICAgICAgICAoICAg U3RyaW5nUmVmIGNvbnN0JiBtYWNyb05hbWUsCi0gICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBj b25zdCYgbGluZUluZm8sCi0gICAgICAgICAgICBTdHJpbmdSZWYgY2FwdHVyZWRFeHByZXNzaW9u LAotICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9u ICkKLSAgICA6ICAgbV9hc3NlcnRpb25JbmZveyBtYWNyb05hbWUsIGxpbmVJbmZvLCBjYXB0dXJl ZEV4cHJlc3Npb24sIHJlc3VsdERpc3Bvc2l0aW9uIH0sCi0gICAgICAgIG1fcmVzdWx0Q2FwdHVy ZSggZ2V0UmVzdWx0Q2FwdHVyZSgpICkKLSAgICB7fQotCi0gICAgdm9pZCBBc3NlcnRpb25IYW5k bGVyOjpoYW5kbGVFeHByKCBJVHJhbnNpZW50RXhwcmVzc2lvbiBjb25zdCYgZXhwciApIHsKLSAg ICAgICAgbV9yZXN1bHRDYXB0dXJlLmhhbmRsZUV4cHIoIG1fYXNzZXJ0aW9uSW5mbywgZXhwciwg bV9yZWFjdGlvbiApOwotICAgIH0KLSAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZU1l c3NhZ2UoUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSwgU3RyaW5nUmVmIGNvbnN0JiBtZXNz YWdlKSB7Ci0gICAgICAgIG1fcmVzdWx0Q2FwdHVyZS5oYW5kbGVNZXNzYWdlKCBtX2Fzc2VydGlv bkluZm8sIHJlc3VsdFR5cGUsIG1lc3NhZ2UsIG1fcmVhY3Rpb24gKTsKLSAgICB9Ci0KLSAgICBh dXRvIEFzc2VydGlvbkhhbmRsZXI6OmFsbG93VGhyb3dzKCkgY29uc3QgLT4gYm9vbCB7Ci0gICAg ICAgIHJldHVybiBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5hbGxvd1Rocm93cygp OwotICAgIH0KLQotICAgIHZvaWQgQXNzZXJ0aW9uSGFuZGxlcjo6Y29tcGxldGUoKSB7Ci0gICAg ICAgIHNldENvbXBsZXRlZCgpOwotICAgICAgICBpZiggbV9yZWFjdGlvbi5zaG91bGREZWJ1Z0Jy ZWFrICkgewotCi0gICAgICAgICAgICAvLyBJZiB5b3UgZmluZCB5b3VyIGRlYnVnZ2VyIHN0b3Bw aW5nIHlvdSBoZXJlIHRoZW4gZ28gb25lIGxldmVsIHVwIG9uIHRoZQotICAgICAgICAgICAgLy8g Y2FsbC1zdGFjayBmb3IgdGhlIGNvZGUgdGhhdCBjYXVzZWQgaXQgKHR5cGljYWxseSBhIGZhaWxl ZCBhc3NlcnRpb24pCi0KLSAgICAgICAgICAgIC8vIChUbyBnbyBiYWNrIHRvIHRoZSB0ZXN0IGFu ZCBjaGFuZ2UgZXhlY3V0aW9uLCBqdW1wIG92ZXIgdGhlIHRocm93LCBuZXh0KQotICAgICAgICAg ICAgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICht X3JlYWN0aW9uLnNob3VsZFRocm93KSB7Ci0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FC TEVfRVhDRVBUSU9OUykKLSAgICAgICAgICAgIHRocm93IENhdGNoOjpUZXN0RmFpbHVyZUV4Y2Vw dGlvbigpOwotI2Vsc2UKLSAgICAgICAgICAgIENBVENIX0VSUk9SKCAiVGVzdCBmYWlsdXJlIHJl cXVpcmVzIGFib3J0aW5nIHRlc3QhIiApOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0gICAg dm9pZCBBc3NlcnRpb25IYW5kbGVyOjpzZXRDb21wbGV0ZWQoKSB7Ci0gICAgICAgIG1fY29tcGxl dGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZVVu ZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbigpIHsKLSAgICAgICAgbV9yZXN1bHRDYXB0dXJlLmhh bmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlvbiggbV9hc3NlcnRpb25JbmZvLCBDYXRjaDo6 dHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCksIG1fcmVhY3Rpb24gKTsKLSAgICB9Ci0KLSAgICB2 b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZUV4Y2VwdGlvblRocm93bkFzRXhwZWN0ZWQoKSB7 Ci0gICAgICAgIG1fcmVzdWx0Q2FwdHVyZS5oYW5kbGVOb25FeHByKG1fYXNzZXJ0aW9uSW5mbywg UmVzdWx0V2FzOjpPaywgbV9yZWFjdGlvbik7Ci0gICAgfQotICAgIHZvaWQgQXNzZXJ0aW9uSGFu ZGxlcjo6aGFuZGxlRXhjZXB0aW9uTm90VGhyb3duQXNFeHBlY3RlZCgpIHsKLSAgICAgICAgbV9y ZXN1bHRDYXB0dXJlLmhhbmRsZU5vbkV4cHIobV9hc3NlcnRpb25JbmZvLCBSZXN1bHRXYXM6Ok9r LCBtX3JlYWN0aW9uKTsKLSAgICB9Ci0KLSAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRs ZVVuZXhwZWN0ZWRFeGNlcHRpb25Ob3RUaHJvd24oKSB7Ci0gICAgICAgIG1fcmVzdWx0Q2FwdHVy ZS5oYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uTm90VGhyb3duKCBtX2Fzc2VydGlvbkluZm8sIG1f cmVhY3Rpb24gKTsKLSAgICB9Ci0KLSAgICB2b2lkIEFzc2VydGlvbkhhbmRsZXI6OmhhbmRsZVRo cm93aW5nQ2FsbFNraXBwZWQoKSB7Ci0gICAgICAgIG1fcmVzdWx0Q2FwdHVyZS5oYW5kbGVOb25F eHByKG1fYXNzZXJ0aW9uSW5mbywgUmVzdWx0V2FzOjpPaywgbV9yZWFjdGlvbik7Ci0gICAgfQot Ci0gICAgLy8gVGhpcyBpcyB0aGUgb3ZlcmxvYWQgdGhhdCB0YWtlcyBhIHN0cmluZyBhbmQgaW5m ZXJzIHRoZSBFcXVhbHMgbWF0Y2hlciBmcm9tIGl0Ci0gICAgLy8gVGhlIG1vcmUgZ2VuZXJhbCBv dmVybG9hZCwgdGhhdCB0YWtlcyBhbnkgc3RyaW5nIG1hdGNoZXIsIGlzIGluIGNhdGNoX2NhcHR1 cmVfbWF0Y2hlcnMuY3BwCi0gICAgdm9pZCBoYW5kbGVFeGNlcHRpb25NYXRjaEV4cHIoIEFzc2Vy dGlvbkhhbmRsZXImIGhhbmRsZXIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIFN0cmluZ1JlZiBj b25zdCYgbWF0Y2hlclN0cmluZyAgKSB7Ci0gICAgICAgIGhhbmRsZUV4Y2VwdGlvbk1hdGNoRXhw ciggaGFuZGxlciwgTWF0Y2hlcnM6OkVxdWFscyggc3RyICksIG1hdGNoZXJTdHJpbmcgKTsKLSAg ICB9Ci0KLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfYXNzZXJ0aW9uaGFuZGxl ci5jcHAKLS8vIHN0YXJ0IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5jcHAKLQotbmFtZXNwYWNlIENh dGNoIHsKLSAgICBBc3NlcnRpb25SZXN1bHREYXRhOjpBc3NlcnRpb25SZXN1bHREYXRhKFJlc3Vs dFdhczo6T2ZUeXBlIF9yZXN1bHRUeXBlLCBMYXp5RXhwcmVzc2lvbiBjb25zdCAmIF9sYXp5RXhw cmVzc2lvbik6Ci0gICAgICAgIGxhenlFeHByZXNzaW9uKF9sYXp5RXhwcmVzc2lvbiksCi0gICAg ICAgIHJlc3VsdFR5cGUoX3Jlc3VsdFR5cGUpIHt9Ci0KLSAgICBzdGQ6OnN0cmluZyBBc3NlcnRp b25SZXN1bHREYXRhOjpyZWNvbnN0cnVjdEV4cHJlc3Npb24oKSBjb25zdCB7Ci0KLSAgICAgICAg aWYoIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmVtcHR5KCkgKSB7Ci0gICAgICAgICAgICBpZigg bGF6eUV4cHJlc3Npb24gKSB7Ci0gICAgICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0g cnNzOwotICAgICAgICAgICAgICAgIHJzcyA8PCBsYXp5RXhwcmVzc2lvbjsKLSAgICAgICAgICAg ICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IHJzcy5zdHIoKTsKLSAgICAgICAgICAgIH0K LSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb247Ci0gICAg fQotCi0gICAgQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8g Y29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKQotICAgIDogICBt X2luZm8oIGluZm8gKSwKLSAgICAgICAgbV9yZXN1bHREYXRhKCBkYXRhICkKLSAgICB7fQotCi0g ICAgLy8gUmVzdWx0IHdhcyBhIHN1Y2Nlc3MKLSAgICBib29sIEFzc2VydGlvblJlc3VsdDo6c3Vj Y2VlZGVkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0 YS5yZXN1bHRUeXBlICk7Ci0gICAgfQotCi0gICAgLy8gUmVzdWx0IHdhcyBhIHN1Y2Nlc3MsIG9y IGZhaWx1cmUgaXMgc3VwcHJlc3NlZAotICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0Ojppc09rKCkg Y29uc3QgewotICAgICAgICByZXR1cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0YS5yZXN1bHRU eXBlICkgfHwgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24g KTsKLSAgICB9Ci0KLSAgICBSZXN1bHRXYXM6Ok9mVHlwZSBBc3NlcnRpb25SZXN1bHQ6OmdldFJl c3VsdFR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEucmVzdWx0VHlw ZTsKLSAgICB9Ci0KLSAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzRXhwcmVzc2lvbigpIGNv bnN0IHsKLSAgICAgICAgcmV0dXJuICFtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uLmVtcHR5KCk7 Ci0gICAgfQotCi0gICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc01lc3NhZ2UoKSBjb25zdCB7 Ci0gICAgICAgIHJldHVybiAhbV9yZXN1bHREYXRhLm1lc3NhZ2UuZW1wdHkoKTsKLSAgICB9Ci0K LSAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cHJlc3Npb24oKSBjb25zdCB7 Ci0gICAgICAgIC8vIFBvc3NpYmx5IG92ZXJhbGxvY2F0aW5nIGJ5IDMgY2hhcmFjdGVycyBzaG91 bGQgYmUgYmFzaWNhbGx5IGZyZWUKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwcjsgZXhwci5yZXNl cnZlKG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24uc2l6ZSgpICsgMyk7Ci0gICAgICAgIGlmIChp c0ZhbHNlVGVzdChtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBleHBy ICs9ICIhKCI7Ci0gICAgICAgIH0KLSAgICAgICAgZXhwciArPSBtX2luZm8uY2FwdHVyZWRFeHBy ZXNzaW9uOwotICAgICAgICBpZiAoaXNGYWxzZVRlc3QobV9pbmZvLnJlc3VsdERpc3Bvc2l0aW9u KSkgewotICAgICAgICAgICAgZXhwciArPSAnKSc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJu IGV4cHI7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHBy ZXNzaW9uSW5NYWNybygpIGNvbnN0IHsKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhwcjsKLSAgICAg ICAgaWYoIG1faW5mby5tYWNyb05hbWUuZW1wdHkoKSApCi0gICAgICAgICAgICBleHByID0gc3Rh dGljX2Nhc3Q8c3RkOjpzdHJpbmc+KG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb24pOwotICAgICAg ICBlbHNlIHsKLSAgICAgICAgICAgIGV4cHIucmVzZXJ2ZSggbV9pbmZvLm1hY3JvTmFtZS5zaXpl KCkgKyBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uLnNpemUoKSArIDQgKTsKLSAgICAgICAgICAg IGV4cHIgKz0gbV9pbmZvLm1hY3JvTmFtZTsKLSAgICAgICAgICAgIGV4cHIgKz0gIiggIjsKLSAg ICAgICAgICAgIGV4cHIgKz0gbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKLSAgICAgICAgICAg IGV4cHIgKz0gIiApIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXhwcjsKLSAgICB9Ci0K LSAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Qg ewotICAgICAgICByZXR1cm4gaGFzRXhwcmVzc2lvbigpICYmIGdldEV4cGFuZGVkRXhwcmVzc2lv bigpICE9IGdldEV4cHJlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBBc3NlcnRp b25SZXN1bHQ6OmdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKLSAgICAgICAgc3RkOjpz dHJpbmcgZXhwciA9IG1fcmVzdWx0RGF0YS5yZWNvbnN0cnVjdEV4cHJlc3Npb24oKTsKLSAgICAg ICAgcmV0dXJuIGV4cHIuZW1wdHkoKQotICAgICAgICAgICAgICAgID8gZ2V0RXhwcmVzc2lvbigp Ci0gICAgICAgICAgICAgICAgOiBleHByOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIEFzc2Vy dGlvblJlc3VsdDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1fcmVzdWx0 RGF0YS5tZXNzYWdlOwotICAgIH0KLSAgICBTb3VyY2VMaW5lSW5mbyBBc3NlcnRpb25SZXN1bHQ6 OmdldFNvdXJjZUluZm8oKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtX2luZm8ubGluZUluZm87 Ci0gICAgfQotCi0gICAgU3RyaW5nUmVmIEFzc2VydGlvblJlc3VsdDo6Z2V0VGVzdE1hY3JvTmFt ZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1faW5mby5tYWNyb05hbWU7Ci0gICAgfQotCi19 IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLS8vIGVuZCBjYXRjaF9hc3NlcnRpb25yZXN1bHQuY3Bw Ci0vLyBzdGFydCBjYXRjaF9jYXB0dXJlX21hdGNoZXJzLmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2gg ewotCi0gICAgdXNpbmcgU3RyaW5nTWF0Y2hlciA9IE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFz ZTxzdGQ6OnN0cmluZz47Ci0KLSAgICAvLyBUaGlzIGlzIHRoZSBnZW5lcmFsIG92ZXJsb2FkIHRo YXQgdGFrZXMgYSBhbnkgc3RyaW5nIG1hdGNoZXIKLSAgICAvLyBUaGVyZSBpcyBhbm90aGVyIG92 ZXJsb2FkLCBpbiBjYXRjaF9hc3NlcnRpb25oYW5kbGVyLmgvLmNwcCwgdGhhdCBvbmx5IHRha2Vz IGEgc3RyaW5nIGFuZCBpbmZlcnMKLSAgICAvLyB0aGUgRXF1YWxzIG1hdGNoZXIgKHNvIHRoZSBo ZWFkZXIgZG9lcyBub3QgbWVudGlvbiBtYXRjaGVycykKLSAgICB2b2lkIGhhbmRsZUV4Y2VwdGlv bk1hdGNoRXhwciggQXNzZXJ0aW9uSGFuZGxlciYgaGFuZGxlciwgU3RyaW5nTWF0Y2hlciBjb25z dCYgbWF0Y2hlciwgU3RyaW5nUmVmIGNvbnN0JiBtYXRjaGVyU3RyaW5nICApIHsKLSAgICAgICAg c3RkOjpzdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSA9IENhdGNoOjp0cmFuc2xhdGVBY3RpdmVFeGNl cHRpb24oKTsKLSAgICAgICAgTWF0Y2hFeHByPHN0ZDo6c3RyaW5nLCBTdHJpbmdNYXRjaGVyIGNv bnN0Jj4gZXhwciggZXhjZXB0aW9uTWVzc2FnZSwgbWF0Y2hlciwgbWF0Y2hlclN0cmluZyApOwot ICAgICAgICBoYW5kbGVyLmhhbmRsZUV4cHIoIGV4cHIgKTsKLSAgICB9Ci0KLX0gLy8gbmFtZXNw YWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfY2FwdHVyZV9tYXRjaGVycy5jcHAKLS8vIHN0YXJ0IGNh dGNoX2NvbW1hbmRsaW5lLmNwcAotCi0vLyBzdGFydCBjYXRjaF9jb21tYW5kbGluZS5oCi0KLS8v IHN0YXJ0IGNhdGNoX2NsYXJhLmgKLQotLy8gVXNlIENhdGNoJ3MgdmFsdWUgZm9yIGNvbnNvbGUg d2lkdGggKHN0b3JlIENsYXJhJ3Mgb2ZmIHRvIHRoZSBzaWRlLCBpZiBwcmVzZW50KQotI2lmZGVm IENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICi0jZGVmaW5lIENBVENIX1RFTVBfQ0xBUkFfQ09O RklHX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ0xBUkFfVEVYVEZMT1dfQ09ORklHX0NPTlNPTEVfV0lE VEgKLSN1bmRlZiBDQVRDSF9DTEFSQV9URVhURkxPV19DT05GSUdfQ09OU09MRV9XSURUSAotI2Vu ZGlmCi0jZGVmaW5lIENBVENIX0NMQVJBX1RFWFRGTE9XX0NPTkZJR19DT05TT0xFX1dJRFRIIENB VENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEKLQotI2lmZGVmIF9fY2xhbmdfXwotI3ByYWdtYSBj bGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICIt V3dlYWstdnRhYmxlcyIKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2V4aXQt dGltZS1kZXN0cnVjdG9ycyIKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3No YWRvdyIKLSNlbmRpZgotCi0vLyBzdGFydCBjbGFyYS5ocHAKLS8vIENvcHlyaWdodCAyMDE3IFR3 byBCbHVlIEN1YmVzIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBEaXN0cmlidXRl ZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNj b21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cu Ym9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29t L3BoaWxzcXVhcmVkL0NsYXJhIGZvciBtb3JlIGRldGFpbHMKLQotLy8gQ2xhcmEgdjEuMS41Ci0K LQotI2lmbmRlZiBDQVRDSF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAotI2RlZmluZSBDQVRD SF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCA4MAotI2VuZGlmCi0KLSNpZm5kZWYgQ0FUQ0hf Q0xBUkFfVEVYVEZMT1dfQ09ORklHX0NPTlNPTEVfV0lEVEgKLSNkZWZpbmUgQ0FUQ0hfQ0xBUkFf VEVYVEZMT1dfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ0xBUkFfQ09ORklHX0NPTlNPTEVf V0lEVEgKLSNlbmRpZgotCi0jaWZuZGVmIENMQVJBX0NPTkZJR19PUFRJT05BTF9UWVBFCi0jaWZk ZWYgX19oYXNfaW5jbHVkZQotI2lmIF9faGFzX2luY2x1ZGUoPG9wdGlvbmFsPikgJiYgX19jcGx1 c3BsdXMgPj0gMjAxNzAzTAotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2RlZmluZSBDTEFSQV9DT05G SUdfT1BUSU9OQUxfVFlQRSBzdGQ6Om9wdGlvbmFsCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0K LS8vIC0tLS0tLS0tLS0tICNpbmNsdWRlZCBmcm9tIGNsYXJhX3RleHRmbG93LmhwcCAtLS0tLS0t LS0tLQotCi0vLyBUZXh0Rmxvd0NwcAotLy8KLS8vIEEgc2luZ2xlLWhlYWRlciBsaWJyYXJ5IGZv ciB3cmFwcGluZyBhbmQgbGF5aW5nIG91dCBiYXNpYyB0ZXh0LCBieSBQaGlsIE5hc2gKLS8vCi0v LyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAx LjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0UudHh0IG9yIGNvcHkgYXQgaHR0 cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLS8vIFRoaXMgcHJvamVjdCBp cyBob3N0ZWQgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BoaWxzcXVhcmVkL3RleHRmbG93Y3BwCi0K LQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlIDxzc3Ry ZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2lmbmRlZiBDQVRDSF9DTEFSQV9URVhURkxPV19D T05GSUdfQ09OU09MRV9XSURUSAotI2RlZmluZSBDQVRDSF9DTEFSQV9URVhURkxPV19DT05GSUdf Q09OU09MRV9XSURUSCA4MAotI2VuZGlmCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci1uYW1lc3BhY2Ug Y2xhcmEgewotbmFtZXNwYWNlIFRleHRGbG93IHsKLQotaW5saW5lIGF1dG8gaXNXaGl0ZXNwYWNl KGNoYXIgYykgLT4gYm9vbCB7Ci0Jc3RhdGljIHN0ZDo6c3RyaW5nIGNoYXJzID0gIiBcdFxuXHIi OwotCXJldHVybiBjaGFycy5maW5kKGMpICE9IHN0ZDo6c3RyaW5nOjpucG9zOwotfQotaW5saW5l IGF1dG8gaXNCcmVha2FibGVCZWZvcmUoY2hhciBjKSAtPiBib29sIHsKLQlzdGF0aWMgc3RkOjpz dHJpbmcgY2hhcnMgPSAiWyh7PHwiOwotCXJldHVybiBjaGFycy5maW5kKGMpICE9IHN0ZDo6c3Ry aW5nOjpucG9zOwotfQotaW5saW5lIGF1dG8gaXNCcmVha2FibGVBZnRlcihjaGFyIGMpIC0+IGJv b2wgewotCXN0YXRpYyBzdGQ6OnN0cmluZyBjaGFycyA9ICJdKX0+Liw6OyorLT0mL1xcIjsKLQly ZXR1cm4gY2hhcnMuZmluZChjKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKLX0KLQotY2xhc3MgQ29s dW1uczsKLQotY2xhc3MgQ29sdW1uIHsKLQlzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9zdHJp bmdzOwotCXNpemVfdCBtX3dpZHRoID0gQ0FUQ0hfQ0xBUkFfVEVYVEZMT1dfQ09ORklHX0NPTlNP TEVfV0lEVEg7Ci0Jc2l6ZV90IG1faW5kZW50ID0gMDsKLQlzaXplX3QgbV9pbml0aWFsSW5kZW50 ID0gc3RkOjpzdHJpbmc6Om5wb3M7Ci0KLXB1YmxpYzoKLQljbGFzcyBpdGVyYXRvciB7Ci0JCWZy aWVuZCBDb2x1bW47Ci0KLQkJQ29sdW1uIGNvbnN0JiBtX2NvbHVtbjsKLQkJc2l6ZV90IG1fc3Ry aW5nSW5kZXggPSAwOwotCQlzaXplX3QgbV9wb3MgPSAwOwotCi0JCXNpemVfdCBtX2xlbiA9IDA7 Ci0JCXNpemVfdCBtX2VuZCA9IDA7Ci0JCWJvb2wgbV9zdWZmaXggPSBmYWxzZTsKLQotCQlpdGVy YXRvcihDb2x1bW4gY29uc3QmIGNvbHVtbiwgc2l6ZV90IHN0cmluZ0luZGV4KQotCQkJOiBtX2Nv bHVtbihjb2x1bW4pLAotCQkJbV9zdHJpbmdJbmRleChzdHJpbmdJbmRleCkge30KLQotCQlhdXRv IGxpbmUoKSBjb25zdCAtPiBzdGQ6OnN0cmluZyBjb25zdCYgeyByZXR1cm4gbV9jb2x1bW4ubV9z dHJpbmdzW21fc3RyaW5nSW5kZXhdOyB9Ci0KLQkJYXV0byBpc0JvdW5kYXJ5KHNpemVfdCBhdCkg Y29uc3QgLT4gYm9vbCB7Ci0JCQlhc3NlcnQoYXQgPiAwKTsKLQkJCWFzc2VydChhdCA8PSBsaW5l KCkuc2l6ZSgpKTsKLQotCQkJcmV0dXJuIGF0ID09IGxpbmUoKS5zaXplKCkgfHwKLQkJCQkoaXNX aGl0ZXNwYWNlKGxpbmUoKVthdF0pICYmICFpc1doaXRlc3BhY2UobGluZSgpW2F0IC0gMV0pKSB8 fAotCQkJCWlzQnJlYWthYmxlQmVmb3JlKGxpbmUoKVthdF0pIHx8Ci0JCQkJaXNCcmVha2FibGVB ZnRlcihsaW5lKClbYXQgLSAxXSk7Ci0JCX0KLQotCQl2b2lkIGNhbGNMZW5ndGgoKSB7Ci0JCQlh c3NlcnQobV9zdHJpbmdJbmRleCA8IG1fY29sdW1uLm1fc3RyaW5ncy5zaXplKCkpOwotCi0JCQlt X3N1ZmZpeCA9IGZhbHNlOwotCQkJYXV0byB3aWR0aCA9IG1fY29sdW1uLm1fd2lkdGggLSBpbmRl bnQoKTsKLQkJCW1fZW5kID0gbV9wb3M7Ci0JCQlpZiAobGluZSgpW21fcG9zXSA9PSAnXG4nKSB7 Ci0JCQkJKyttX2VuZDsKLQkJCX0KLQkJCXdoaWxlIChtX2VuZCA8IGxpbmUoKS5zaXplKCkgJiYg bGluZSgpW21fZW5kXSAhPSAnXG4nKQotCQkJCSsrbV9lbmQ7Ci0KLQkJCWlmIChtX2VuZCA8IG1f cG9zICsgd2lkdGgpIHsKLQkJCQltX2xlbiA9IG1fZW5kIC0gbV9wb3M7Ci0JCQl9IGVsc2Ugewot CQkJCXNpemVfdCBsZW4gPSB3aWR0aDsKLQkJCQl3aGlsZSAobGVuID4gMCAmJiAhaXNCb3VuZGFy eShtX3BvcyArIGxlbikpCi0JCQkJCS0tbGVuOwotCQkJCXdoaWxlIChsZW4gPiAwICYmIGlzV2hp dGVzcGFjZShsaW5lKClbbV9wb3MgKyBsZW4gLSAxXSkpCi0JCQkJCS0tbGVuOwotCi0JCQkJaWYg KGxlbiA+IDApIHsKLQkJCQkJbV9sZW4gPSBsZW47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbV9zdWZm aXggPSB0cnVlOwotCQkJCQltX2xlbiA9IHdpZHRoIC0gMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQot CQlhdXRvIGluZGVudCgpIGNvbnN0IC0+IHNpemVfdCB7Ci0JCQlhdXRvIGluaXRpYWwgPSBtX3Bv cyA9PSAwICYmIG1fc3RyaW5nSW5kZXggPT0gMCA/IG1fY29sdW1uLm1faW5pdGlhbEluZGVudCA6 IHN0ZDo6c3RyaW5nOjpucG9zOwotCQkJcmV0dXJuIGluaXRpYWwgPT0gc3RkOjpzdHJpbmc6Om5w b3MgPyBtX2NvbHVtbi5tX2luZGVudCA6IGluaXRpYWw7Ci0JCX0KLQotCQlhdXRvIGFkZEluZGVu dEFuZFN1ZmZpeChzdGQ6OnN0cmluZyBjb25zdCAmcGxhaW4pIGNvbnN0IC0+IHN0ZDo6c3RyaW5n IHsKLQkJCXJldHVybiBzdGQ6OnN0cmluZyhpbmRlbnQoKSwgJyAnKSArIChtX3N1ZmZpeCA/IHBs YWluICsgIi0iIDogcGxhaW4pOwotCQl9Ci0KLQlwdWJsaWM6Ci0JCXVzaW5nIGRpZmZlcmVuY2Vf dHlwZSA9IHN0ZDo6cHRyZGlmZl90OwotCQl1c2luZyB2YWx1ZV90eXBlID0gc3RkOjpzdHJpbmc7 Ci0JCXVzaW5nIHBvaW50ZXIgPSB2YWx1ZV90eXBlICogOwotCQl1c2luZyByZWZlcmVuY2UgPSB2 YWx1ZV90eXBlICYgOwotCQl1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9p dGVyYXRvcl90YWc7Ci0KLQkJZXhwbGljaXQgaXRlcmF0b3IoQ29sdW1uIGNvbnN0JiBjb2x1bW4p IDogbV9jb2x1bW4oY29sdW1uKSB7Ci0JCQlhc3NlcnQobV9jb2x1bW4ubV93aWR0aCA+IG1fY29s dW1uLm1faW5kZW50KTsKLQkJCWFzc2VydChtX2NvbHVtbi5tX2luaXRpYWxJbmRlbnQgPT0gc3Rk OjpzdHJpbmc6Om5wb3MgfHwgbV9jb2x1bW4ubV93aWR0aCA+IG1fY29sdW1uLm1faW5pdGlhbElu ZGVudCk7Ci0JCQljYWxjTGVuZ3RoKCk7Ci0JCQlpZiAobV9sZW4gPT0gMCkKLQkJCQltX3N0cmlu Z0luZGV4Kys7IC8vIEVtcHR5IHN0cmluZwotCQl9Ci0KLQkJYXV0byBvcGVyYXRvciAqKCkgY29u c3QgLT4gc3RkOjpzdHJpbmcgewotCQkJYXNzZXJ0KG1fc3RyaW5nSW5kZXggPCBtX2NvbHVtbi5t X3N0cmluZ3Muc2l6ZSgpKTsKLQkJCWFzc2VydChtX3BvcyA8PSBtX2VuZCk7Ci0JCQlyZXR1cm4g YWRkSW5kZW50QW5kU3VmZml4KGxpbmUoKS5zdWJzdHIobV9wb3MsIG1fbGVuKSk7Ci0JCX0KLQot CQlhdXRvIG9wZXJhdG9yICsrKCkgLT4gaXRlcmF0b3ImIHsKLQkJCW1fcG9zICs9IG1fbGVuOwot CQkJaWYgKG1fcG9zIDwgbGluZSgpLnNpemUoKSAmJiBsaW5lKClbbV9wb3NdID09ICdcbicpCi0J CQkJbV9wb3MgKz0gMTsKLQkJCWVsc2UKLQkJCQl3aGlsZSAobV9wb3MgPCBsaW5lKCkuc2l6ZSgp ICYmIGlzV2hpdGVzcGFjZShsaW5lKClbbV9wb3NdKSkKLQkJCQkJKyttX3BvczsKLQotCQkJaWYg KG1fcG9zID09IGxpbmUoKS5zaXplKCkpIHsKLQkJCQltX3BvcyA9IDA7Ci0JCQkJKyttX3N0cmlu Z0luZGV4OwotCQkJfQotCQkJaWYgKG1fc3RyaW5nSW5kZXggPCBtX2NvbHVtbi5tX3N0cmluZ3Mu c2l6ZSgpKQotCQkJCWNhbGNMZW5ndGgoKTsKLQkJCXJldHVybiAqdGhpczsKLQkJfQotCQlhdXRv IG9wZXJhdG9yICsrKGludCkgLT4gaXRlcmF0b3IgewotCQkJaXRlcmF0b3IgcHJldigqdGhpcyk7 Ci0JCQlvcGVyYXRvcisrKCk7Ci0JCQlyZXR1cm4gcHJldjsKLQkJfQotCi0JCWF1dG8gb3BlcmF0 b3IgPT0oaXRlcmF0b3IgY29uc3QmIG90aGVyKSBjb25zdCAtPiBib29sIHsKLQkJCXJldHVybgot CQkJCW1fcG9zID09IG90aGVyLm1fcG9zICYmCi0JCQkJbV9zdHJpbmdJbmRleCA9PSBvdGhlci5t X3N0cmluZ0luZGV4ICYmCi0JCQkJJm1fY29sdW1uID09ICZvdGhlci5tX2NvbHVtbjsKLQkJfQot CQlhdXRvIG9wZXJhdG9yICE9KGl0ZXJhdG9yIGNvbnN0JiBvdGhlcikgY29uc3QgLT4gYm9vbCB7 Ci0JCQlyZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOwotCQl9Ci0JfTsKLQl1c2luZyBjb25zdF9p dGVyYXRvciA9IGl0ZXJhdG9yOwotCi0JZXhwbGljaXQgQ29sdW1uKHN0ZDo6c3RyaW5nIGNvbnN0 JiB0ZXh0KSB7IG1fc3RyaW5ncy5wdXNoX2JhY2sodGV4dCk7IH0KLQotCWF1dG8gd2lkdGgoc2l6 ZV90IG5ld1dpZHRoKSAtPiBDb2x1bW4mIHsKLQkJYXNzZXJ0KG5ld1dpZHRoID4gMCk7Ci0JCW1f d2lkdGggPSBuZXdXaWR0aDsKLQkJcmV0dXJuICp0aGlzOwotCX0KLQlhdXRvIGluZGVudChzaXpl X3QgbmV3SW5kZW50KSAtPiBDb2x1bW4mIHsKLQkJbV9pbmRlbnQgPSBuZXdJbmRlbnQ7Ci0JCXJl dHVybiAqdGhpczsKLQl9Ci0JYXV0byBpbml0aWFsSW5kZW50KHNpemVfdCBuZXdJbmRlbnQpIC0+ IENvbHVtbiYgewotCQltX2luaXRpYWxJbmRlbnQgPSBuZXdJbmRlbnQ7Ci0JCXJldHVybiAqdGhp czsKLQl9Ci0KLQlhdXRvIHdpZHRoKCkgY29uc3QgLT4gc2l6ZV90IHsgcmV0dXJuIG1fd2lkdGg7 IH0KLQlhdXRvIGJlZ2luKCkgY29uc3QgLT4gaXRlcmF0b3IgeyByZXR1cm4gaXRlcmF0b3IoKnRo aXMpOyB9Ci0JYXV0byBlbmQoKSBjb25zdCAtPiBpdGVyYXRvciB7IHJldHVybiB7ICp0aGlzLCBt X3N0cmluZ3Muc2l6ZSgpIH07IH0KLQotCWlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVy YXRvciA8PCAoc3RkOjpvc3RyZWFtJiBvcywgQ29sdW1uIGNvbnN0JiBjb2wpIHsKLQkJYm9vbCBm aXJzdCA9IHRydWU7Ci0JCWZvciAoYXV0byBsaW5lIDogY29sKSB7Ci0JCQlpZiAoZmlyc3QpCi0J CQkJZmlyc3QgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlvcyA8PCAiXG4iOwotCQkJb3MgPDwgbGlu ZTsKLQkJfQotCQlyZXR1cm4gb3M7Ci0JfQotCi0JYXV0byBvcGVyYXRvciArIChDb2x1bW4gY29u c3QmIG90aGVyKS0+Q29sdW1uczsKLQotCWF1dG8gdG9TdHJpbmcoKSBjb25zdCAtPiBzdGQ6OnN0 cmluZyB7Ci0JCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0JCW9zcyA8PCAqdGhpczsKLQkJcmV0 dXJuIG9zcy5zdHIoKTsKLQl9Ci19OwotCi1jbGFzcyBTcGFjZXIgOiBwdWJsaWMgQ29sdW1uIHsK LQotcHVibGljOgotCWV4cGxpY2l0IFNwYWNlcihzaXplX3Qgc3BhY2VXaWR0aCkgOiBDb2x1bW4o IiIpIHsKLQkJd2lkdGgoc3BhY2VXaWR0aCk7Ci0JfQotfTsKLQotY2xhc3MgQ29sdW1ucyB7Ci0J c3RkOjp2ZWN0b3I8Q29sdW1uPiBtX2NvbHVtbnM7Ci0KLXB1YmxpYzoKLQotCWNsYXNzIGl0ZXJh dG9yIHsKLQkJZnJpZW5kIENvbHVtbnM7Ci0JCXN0cnVjdCBFbmRUYWcge307Ci0KLQkJc3RkOjp2 ZWN0b3I8Q29sdW1uPiBjb25zdCYgbV9jb2x1bW5zOwotCQlzdGQ6OnZlY3RvcjxDb2x1bW46Oml0 ZXJhdG9yPiBtX2l0ZXJhdG9yczsKLQkJc2l6ZV90IG1fYWN0aXZlSXRlcmF0b3JzOwotCi0JCWl0 ZXJhdG9yKENvbHVtbnMgY29uc3QmIGNvbHVtbnMsIEVuZFRhZykKLQkJCTogbV9jb2x1bW5zKGNv bHVtbnMubV9jb2x1bW5zKSwKLQkJCW1fYWN0aXZlSXRlcmF0b3JzKDApIHsKLQkJCW1faXRlcmF0 b3JzLnJlc2VydmUobV9jb2x1bW5zLnNpemUoKSk7Ci0KLQkJCWZvciAoYXV0byBjb25zdCYgY29s IDogbV9jb2x1bW5zKQotCQkJCW1faXRlcmF0b3JzLnB1c2hfYmFjayhjb2wuZW5kKCkpOwotCQl9 Ci0KLQlwdWJsaWM6Ci0JCXVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90Owot CQl1c2luZyB2YWx1ZV90eXBlID0gc3RkOjpzdHJpbmc7Ci0JCXVzaW5nIHBvaW50ZXIgPSB2YWx1 ZV90eXBlICogOwotCQl1c2luZyByZWZlcmVuY2UgPSB2YWx1ZV90eXBlICYgOwotCQl1c2luZyBp dGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7Ci0KLQkJZXhwbGlj aXQgaXRlcmF0b3IoQ29sdW1ucyBjb25zdCYgY29sdW1ucykKLQkJCTogbV9jb2x1bW5zKGNvbHVt bnMubV9jb2x1bW5zKSwKLQkJCW1fYWN0aXZlSXRlcmF0b3JzKG1fY29sdW1ucy5zaXplKCkpIHsK LQkJCW1faXRlcmF0b3JzLnJlc2VydmUobV9jb2x1bW5zLnNpemUoKSk7Ci0KLQkJCWZvciAoYXV0 byBjb25zdCYgY29sIDogbV9jb2x1bW5zKQotCQkJCW1faXRlcmF0b3JzLnB1c2hfYmFjayhjb2wu YmVnaW4oKSk7Ci0JCX0KLQotCQlhdXRvIG9wZXJhdG9yID09KGl0ZXJhdG9yIGNvbnN0JiBvdGhl cikgY29uc3QgLT4gYm9vbCB7Ci0JCQlyZXR1cm4gbV9pdGVyYXRvcnMgPT0gb3RoZXIubV9pdGVy YXRvcnM7Ci0JCX0KLQkJYXV0byBvcGVyYXRvciAhPShpdGVyYXRvciBjb25zdCYgb3RoZXIpIGNv bnN0IC0+IGJvb2wgewotCQkJcmV0dXJuIG1faXRlcmF0b3JzICE9IG90aGVyLm1faXRlcmF0b3Jz OwotCQl9Ci0JCWF1dG8gb3BlcmF0b3IgKigpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsKLQkJCXN0 ZDo6c3RyaW5nIHJvdywgcGFkZGluZzsKLQotCQkJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2Nv bHVtbnMuc2l6ZSgpOyArK2kpIHsKLQkJCQlhdXRvIHdpZHRoID0gbV9jb2x1bW5zW2ldLndpZHRo KCk7Ci0JCQkJaWYgKG1faXRlcmF0b3JzW2ldICE9IG1fY29sdW1uc1tpXS5lbmQoKSkgewotCQkJ CQlzdGQ6OnN0cmluZyBjb2wgPSAqbV9pdGVyYXRvcnNbaV07Ci0JCQkJCXJvdyArPSBwYWRkaW5n ICsgY29sOwotCQkJCQlpZiAoY29sLnNpemUoKSA8IHdpZHRoKQotCQkJCQkJcGFkZGluZyA9IHN0 ZDo6c3RyaW5nKHdpZHRoIC0gY29sLnNpemUoKSwgJyAnKTsKLQkJCQkJZWxzZQotCQkJCQkJcGFk ZGluZyA9ICIiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhZGRpbmcgKz0gc3RkOjpzdHJpbmcod2lk dGgsICcgJyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJvdzsKLQkJfQotCQlhdXRvIG9wZXJh dG9yICsrKCkgLT4gaXRlcmF0b3ImIHsKLQkJCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jb2x1 bW5zLnNpemUoKTsgKytpKSB7Ci0JCQkJaWYgKG1faXRlcmF0b3JzW2ldICE9IG1fY29sdW1uc1tp XS5lbmQoKSkKLQkJCQkJKyttX2l0ZXJhdG9yc1tpXTsKLQkJCX0KLQkJCXJldHVybiAqdGhpczsK LQkJfQotCQlhdXRvIG9wZXJhdG9yICsrKGludCkgLT4gaXRlcmF0b3IgewotCQkJaXRlcmF0b3Ig cHJldigqdGhpcyk7Ci0JCQlvcGVyYXRvcisrKCk7Ci0JCQlyZXR1cm4gcHJldjsKLQkJfQotCX07 Ci0JdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQotCWF1dG8gYmVnaW4oKSBjb25z dCAtPiBpdGVyYXRvciB7IHJldHVybiBpdGVyYXRvcigqdGhpcyk7IH0KLQlhdXRvIGVuZCgpIGNv bnN0IC0+IGl0ZXJhdG9yIHsgcmV0dXJuIHsgKnRoaXMsIGl0ZXJhdG9yOjpFbmRUYWcoKSB9OyB9 Ci0KLQlhdXRvIG9wZXJhdG9yICs9IChDb2x1bW4gY29uc3QmIGNvbCkgLT4gQ29sdW1ucyYgewot CQltX2NvbHVtbnMucHVzaF9iYWNrKGNvbCk7Ci0JCXJldHVybiAqdGhpczsKLQl9Ci0JYXV0byBv cGVyYXRvciArIChDb2x1bW4gY29uc3QmIGNvbCkgLT4gQ29sdW1ucyB7Ci0JCUNvbHVtbnMgY29t YmluZWQgPSAqdGhpczsKLQkJY29tYmluZWQgKz0gY29sOwotCQlyZXR1cm4gY29tYmluZWQ7Ci0J fQotCi0JaW5saW5lIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJl YW0mIG9zLCBDb2x1bW5zIGNvbnN0JiBjb2xzKSB7Ci0KLQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0J CWZvciAoYXV0byBsaW5lIDogY29scykgewotCQkJaWYgKGZpcnN0KQotCQkJCWZpcnN0ID0gZmFs c2U7Ci0JCQllbHNlCi0JCQkJb3MgPDwgIlxuIjsKLQkJCW9zIDw8IGxpbmU7Ci0JCX0KLQkJcmV0 dXJuIG9zOwotCX0KLQotCWF1dG8gdG9TdHJpbmcoKSBjb25zdCAtPiBzdGQ6OnN0cmluZyB7Ci0J CXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0JCW9zcyA8PCAqdGhpczsKLQkJcmV0dXJuIG9zcy5z dHIoKTsKLQl9Ci19OwotCi1pbmxpbmUgYXV0byBDb2x1bW46Om9wZXJhdG9yICsgKENvbHVtbiBj b25zdCYgb3RoZXIpIC0+IENvbHVtbnMgewotCUNvbHVtbnMgY29sczsKLQljb2xzICs9ICp0aGlz OwotCWNvbHMgKz0gb3RoZXI7Ci0JcmV0dXJuIGNvbHM7Ci19Ci19Ci0KLX0KLX0KLQotLy8gLS0t LS0tLS0tLS0gZW5kIG9mICNpbmNsdWRlIGZyb20gY2xhcmFfdGV4dGZsb3cuaHBwIC0tLS0tLS0t LS0tCi0vLyAuLi4uLi4uLi4uLiBiYWNrIGluIGNsYXJhLmhwcAotCi0jaW5jbHVkZSA8Y2N0eXBl PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c2V0Pgot I2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2lmICFkZWZpbmVkKENBVENIX1BMQVRGT1JNX1dJTkRP V1MpICYmICggZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQo X1dJTjMyKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSApCi0jZGVmaW5lIENBVENIX1BMQVRGT1JNX1dJ TkRPV1MKLSNlbmRpZgotCi1uYW1lc3BhY2UgQ2F0Y2ggeyBuYW1lc3BhY2UgY2xhcmEgewotbmFt ZXNwYWNlIGRldGFpbCB7Ci0KLSAgICAvLyBUcmFpdHMgZm9yIGV4dHJhY3RpbmcgYXJnIGFuZCBy ZXR1cm4gdHlwZSBvZiBsYW1iZGFzIChmb3Igc2luZ2xlIGFyZ3VtZW50IGxhbWJkYXMpCi0gICAg dGVtcGxhdGU8dHlwZW5hbWUgTD4KLSAgICBzdHJ1Y3QgVW5hcnlMYW1iZGFUcmFpdHMgOiBVbmFy eUxhbWJkYVRyYWl0czxkZWNsdHlwZSggJkw6Om9wZXJhdG9yKCkgKT4ge307Ci0KLSAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBDbGFzc1QsIHR5cGVuYW1lIFJldHVyblQsIHR5cGVuYW1lLi4uIEFyZ3M+ Ci0gICAgc3RydWN0IFVuYXJ5TGFtYmRhVHJhaXRzPFJldHVyblQoIENsYXNzVDo6KiApKCBBcmdz Li4uICkgY29uc3Q+IHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNWYWxpZCA9IGZhbHNl OwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbGFzc1QsIHR5cGVuYW1lIFJldHVy blQsIHR5cGVuYW1lIEFyZ1Q+Ci0gICAgc3RydWN0IFVuYXJ5TGFtYmRhVHJhaXRzPFJldHVyblQo IENsYXNzVDo6KiApKCBBcmdUICkgY29uc3Q+IHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg aXNWYWxpZCA9IHRydWU7Ci0gICAgICAgIHVzaW5nIEFyZ1R5cGUgPSB0eXBlbmFtZSBzdGQ6OnJl bW92ZV9jb25zdDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8QXJnVD46OnR5cGU+Ojp0 eXBlOwotICAgICAgICB1c2luZyBSZXR1cm5UeXBlID0gUmV0dXJuVDsKLSAgICB9OwotCi0gICAg Y2xhc3MgVG9rZW5TdHJlYW07Ci0KLSAgICAvLyBUcmFuc3BvcnQgZm9yIHJhdyBhcmdzIChjb3Bp ZWQgZnJvbSBtYWluIGFyZ3MsIG9yIHN1cHBsaWVkIHZpYSBpbml0IGxpc3QgZm9yIHRlc3Rpbmcp Ci0gICAgY2xhc3MgQXJncyB7Ci0gICAgICAgIGZyaWVuZCBUb2tlblN0cmVhbTsKLSAgICAgICAg c3RkOjpzdHJpbmcgbV9leGVOYW1lOwotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4g bV9hcmdzOwotCi0gICAgcHVibGljOgotICAgICAgICBBcmdzKCBpbnQgYXJnYywgY2hhciBjb25z dCogY29uc3QqIGFyZ3YgKQotICAgICAgICAgICAgOiBtX2V4ZU5hbWUoYXJndlswXSksCi0gICAg ICAgICAgICAgIG1fYXJncyhhcmd2ICsgMSwgYXJndiArIGFyZ2MpIHt9Ci0KLSAgICAgICAgQXJn cyggc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nPiBhcmdzICkKLSAgICAgICAgOiAg IG1fZXhlTmFtZSggKmFyZ3MuYmVnaW4oKSApLAotICAgICAgICAgICAgbV9hcmdzKCBhcmdzLmJl Z2luKCkrMSwgYXJncy5lbmQoKSApCi0gICAgICAgIHt9Ci0KLSAgICAgICAgYXV0byBleGVOYW1l KCkgY29uc3QgLT4gc3RkOjpzdHJpbmcgewotICAgICAgICAgICAgcmV0dXJuIG1fZXhlTmFtZTsK LSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyBXcmFwcyBhIHRva2VuIGNvbWluZyBmcm9tIGEg dG9rZW4gc3RyZWFtLiBUaGVzZSBtYXkgbm90IGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8gc3RyaW5n cyBhcyBhIHNpbmdsZSBzdHJpbmcKLSAgICAvLyBtYXkgZW5jb2RlIGFuIG9wdGlvbiArIGl0cyBh cmd1bWVudCBpZiB0aGUgOiBvciA9IGZvcm0gaXMgdXNlZAotICAgIGVudW0gY2xhc3MgVG9rZW5U eXBlIHsKLSAgICAgICAgT3B0aW9uLCBBcmd1bWVudAotICAgIH07Ci0gICAgc3RydWN0IFRva2Vu IHsKLSAgICAgICAgVG9rZW5UeXBlIHR5cGU7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHRva2VuOwot ICAgIH07Ci0KLSAgICBpbmxpbmUgYXV0byBpc09wdFByZWZpeCggY2hhciBjICkgLT4gYm9vbCB7 Ci0gICAgICAgIHJldHVybiBjID09ICctJwotI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MK LSAgICAgICAgICAgIHx8IGMgPT0gJy8nCi0jZW5kaWYKLSAgICAgICAgOwotICAgIH0KLQotICAg IC8vIEFic3RyYWN0cyBpdGVyYXRvcnMgaW50byBhcmdzIGFzIGEgc3RyZWFtIG9mIHRva2Vucywg d2l0aCBvcHRpb24gYXJndW1lbnRzIHVuaWZvcm1seSBoYW5kbGVkCi0gICAgY2xhc3MgVG9rZW5T dHJlYW0gewotICAgICAgICB1c2luZyBJdGVyYXRvciA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5n Pjo6Y29uc3RfaXRlcmF0b3I7Ci0gICAgICAgIEl0ZXJhdG9yIGl0OwotICAgICAgICBJdGVyYXRv ciBpdEVuZDsKLSAgICAgICAgc3RkOjp2ZWN0b3I8VG9rZW4+IG1fdG9rZW5CdWZmZXI7Ci0KLSAg ICAgICAgdm9pZCBsb2FkQnVmZmVyKCkgewotICAgICAgICAgICAgbV90b2tlbkJ1ZmZlci5yZXNp emUoIDAgKTsKLQotICAgICAgICAgICAgLy8gU2tpcCBhbnkgZW1wdHkgc3RyaW5ncwotICAgICAg ICAgICAgd2hpbGUoIGl0ICE9IGl0RW5kICYmIGl0LT5lbXB0eSgpICkKLSAgICAgICAgICAgICAg ICArK2l0OwotCi0gICAgICAgICAgICBpZiggaXQgIT0gaXRFbmQgKSB7Ci0gICAgICAgICAgICAg ICAgYXV0byBjb25zdCAmbmV4dCA9ICppdDsKLSAgICAgICAgICAgICAgICBpZiggaXNPcHRQcmVm aXgoIG5leHRbMF0gKSApIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0byBkZWxpbWl0ZXJQb3Mg PSBuZXh0LmZpbmRfZmlyc3Rfb2YoICIgOj0iICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBk ZWxpbWl0ZXJQb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7Ci0gICAgICAgICAgICAgICAgICAg ICAgICBtX3Rva2VuQnVmZmVyLnB1c2hfYmFjayggeyBUb2tlblR5cGU6Ok9wdGlvbiwgbmV4dC5z dWJzdHIoIDAsIGRlbGltaXRlclBvcyApIH0gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1f dG9rZW5CdWZmZXIucHVzaF9iYWNrKCB7IFRva2VuVHlwZTo6QXJndW1lbnQsIG5leHQuc3Vic3Ry KCBkZWxpbWl0ZXJQb3MgKyAxICkgfSApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewot ICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG5leHRbMV0gIT0gJy0nICYmIG5leHQuc2l6ZSgp ID4gMiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcHQgPSAi LSAiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggc2l6ZV90IGkgPSAxOyBpIDwg bmV4dC5zaXplKCk7ICsraSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0 WzFdID0gbmV4dFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90b2tlbkJ1 ZmZlci5wdXNoX2JhY2soIHsgVG9rZW5UeXBlOjpPcHRpb24sIG9wdCB9ICk7Ci0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Rva2VuQnVmZmVyLnB1c2hfYmFjayggeyBUb2tl blR5cGU6Ok9wdGlvbiwgbmV4dCB9ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg ICAgICAgICBtX3Rva2VuQnVmZmVyLnB1c2hfYmFjayggeyBUb2tlblR5cGU6OkFyZ3VtZW50LCBu ZXh0IH0gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQot ICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgVG9rZW5TdHJlYW0oIEFyZ3MgY29uc3QgJmFy Z3MgKSA6IFRva2VuU3RyZWFtKCBhcmdzLm1fYXJncy5iZWdpbigpLCBhcmdzLm1fYXJncy5lbmQo KSApIHt9Ci0KLSAgICAgICAgVG9rZW5TdHJlYW0oIEl0ZXJhdG9yIGl0LCBJdGVyYXRvciBpdEVu ZCApIDogaXQoIGl0ICksIGl0RW5kKCBpdEVuZCApIHsKLSAgICAgICAgICAgIGxvYWRCdWZmZXIo KTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7 Ci0gICAgICAgICAgICByZXR1cm4gIW1fdG9rZW5CdWZmZXIuZW1wdHkoKSB8fCBpdCAhPSBpdEVu ZDsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gY291bnQoKSBjb25zdCAtPiBzaXplX3QgeyBy ZXR1cm4gbV90b2tlbkJ1ZmZlci5zaXplKCkgKyAoaXRFbmQgLSBpdCk7IH0KLQotICAgICAgICBh dXRvIG9wZXJhdG9yKigpIGNvbnN0IC0+IFRva2VuIHsKLSAgICAgICAgICAgIGFzc2VydCggIW1f dG9rZW5CdWZmZXIuZW1wdHkoKSApOwotICAgICAgICAgICAgcmV0dXJuIG1fdG9rZW5CdWZmZXIu ZnJvbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gb3BlcmF0b3ItPigpIGNvbnN0IC0+ IFRva2VuIGNvbnN0ICogewotICAgICAgICAgICAgYXNzZXJ0KCAhbV90b2tlbkJ1ZmZlci5lbXB0 eSgpICk7Ci0gICAgICAgICAgICByZXR1cm4gJm1fdG9rZW5CdWZmZXIuZnJvbnQoKTsKLSAgICAg ICAgfQotCi0gICAgICAgIGF1dG8gb3BlcmF0b3IrKygpIC0+IFRva2VuU3RyZWFtICYgewotICAg ICAgICAgICAgaWYoIG1fdG9rZW5CdWZmZXIuc2l6ZSgpID49IDIgKSB7Ci0gICAgICAgICAgICAg ICAgbV90b2tlbkJ1ZmZlci5lcmFzZSggbV90b2tlbkJ1ZmZlci5iZWdpbigpICk7Ci0gICAgICAg ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBpdEVuZCApCi0gICAgICAg ICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICAgICAgbG9hZEJ1ZmZlcigpOwotICAgICAg ICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgfTsKLQot ICAgIGNsYXNzIFJlc3VsdEJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgZW51bSBUeXBlIHsK LSAgICAgICAgICAgIE9rLCBMb2dpY0Vycm9yLCBSdW50aW1lRXJyb3IKLSAgICAgICAgfTsKLQot ICAgIHByb3RlY3RlZDoKLSAgICAgICAgUmVzdWx0QmFzZSggVHlwZSB0eXBlICkgOiBtX3R5cGUo IHR5cGUgKSB7fQotICAgICAgICB2aXJ0dWFsIH5SZXN1bHRCYXNlKCkgPSBkZWZhdWx0OwotCi0g ICAgICAgIHZpcnR1YWwgdm9pZCBlbmZvcmNlT2soKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgVHlw ZSBtX3R5cGU7Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgY2xhc3Mg UmVzdWx0VmFsdWVCYXNlIDogcHVibGljIFJlc3VsdEJhc2UgewotICAgIHB1YmxpYzoKLSAgICAg ICAgYXV0byB2YWx1ZSgpIGNvbnN0IC0+IFQgY29uc3QgJiB7Ci0gICAgICAgICAgICBlbmZvcmNl T2soKTsKLSAgICAgICAgICAgIHJldHVybiBtX3ZhbHVlOwotICAgICAgICB9Ci0KLSAgICBwcm90 ZWN0ZWQ6Ci0gICAgICAgIFJlc3VsdFZhbHVlQmFzZSggVHlwZSB0eXBlICkgOiBSZXN1bHRCYXNl KCB0eXBlICkge30KLQotICAgICAgICBSZXN1bHRWYWx1ZUJhc2UoIFJlc3VsdFZhbHVlQmFzZSBj b25zdCAmb3RoZXIgKSA6IFJlc3VsdEJhc2UoIG90aGVyICkgewotICAgICAgICAgICAgaWYoIG1f dHlwZSA9PSBSZXN1bHRCYXNlOjpPayApCi0gICAgICAgICAgICAgICAgbmV3KCAmbV92YWx1ZSAp IFQoIG90aGVyLm1fdmFsdWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc3VsdFZhbHVlQmFz ZSggVHlwZSwgVCBjb25zdCAmdmFsdWUgKSA6IFJlc3VsdEJhc2UoIE9rICkgewotICAgICAgICAg ICAgbmV3KCAmbV92YWx1ZSApIFQoIHZhbHVlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRv IG9wZXJhdG9yPSggUmVzdWx0VmFsdWVCYXNlIGNvbnN0ICZvdGhlciApIC0+IFJlc3VsdFZhbHVl QmFzZSAmIHsKLSAgICAgICAgICAgIGlmKCBtX3R5cGUgPT0gUmVzdWx0QmFzZTo6T2sgKQotICAg ICAgICAgICAgICAgIG1fdmFsdWUuflQoKTsKLSAgICAgICAgICAgIFJlc3VsdEJhc2U6Om9wZXJh dG9yPShvdGhlcik7Ci0gICAgICAgICAgICBpZiggbV90eXBlID09IFJlc3VsdEJhc2U6Ok9rICkK LSAgICAgICAgICAgICAgICBuZXcoICZtX3ZhbHVlICkgVCggb3RoZXIubV92YWx1ZSApOwotICAg ICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgflJlc3VsdFZhbHVl QmFzZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGlmKCBtX3R5cGUgPT0gT2sgKQotICAgICAg ICAgICAgICAgIG1fdmFsdWUuflQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVuaW9uIHsKLSAg ICAgICAgICAgIFQgbV92YWx1ZTsKLSAgICAgICAgfTsKLSAgICB9OwotCi0gICAgdGVtcGxhdGU8 PgotICAgIGNsYXNzIFJlc3VsdFZhbHVlQmFzZTx2b2lkPiA6IHB1YmxpYyBSZXN1bHRCYXNlIHsK LSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHVzaW5nIFJlc3VsdEJhc2U6OlJlc3VsdEJhc2U7Ci0g ICAgfTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSB2b2lkPgotICAgIGNsYXNzIEJhc2lj UmVzdWx0IDogcHVibGljIFJlc3VsdFZhbHVlQmFzZTxUPiB7Ci0gICAgcHVibGljOgotICAgICAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotICAgICAgICBleHBsaWNpdCBCYXNpY1Jlc3VsdCggQmFz aWNSZXN1bHQ8VT4gY29uc3QgJm90aGVyICkKLSAgICAgICAgOiAgIFJlc3VsdFZhbHVlQmFzZTxU Piggb3RoZXIudHlwZSgpICksCi0gICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSggb3RoZXIuZXJy b3JNZXNzYWdlKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQoIHR5cGUoKSAhPSBS ZXN1bHRCYXNlOjpPayApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg VT4KLSAgICAgICAgc3RhdGljIGF1dG8gb2soIFUgY29uc3QgJnZhbHVlICkgLT4gQmFzaWNSZXN1 bHQgeyByZXR1cm4geyBSZXN1bHRCYXNlOjpPaywgdmFsdWUgfTsgfQotICAgICAgICBzdGF0aWMg YXV0byBvaygpIC0+IEJhc2ljUmVzdWx0IHsgcmV0dXJuIHsgUmVzdWx0QmFzZTo6T2sgfTsgfQot ICAgICAgICBzdGF0aWMgYXV0byBsb2dpY0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCAmbWVzc2Fn ZSApIC0+IEJhc2ljUmVzdWx0IHsgcmV0dXJuIHsgUmVzdWx0QmFzZTo6TG9naWNFcnJvciwgbWVz c2FnZSB9OyB9Ci0gICAgICAgIHN0YXRpYyBhdXRvIHJ1bnRpbWVFcnJvciggc3RkOjpzdHJpbmcg Y29uc3QgJm1lc3NhZ2UgKSAtPiBCYXNpY1Jlc3VsdCB7IHJldHVybiB7IFJlc3VsdEJhc2U6OlJ1 bnRpbWVFcnJvciwgbWVzc2FnZSB9OyB9Ci0KLSAgICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9v bCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZSA9PSBSZXN1bHRCYXNlOjpPazsgfQotICAgICAgICBh dXRvIHR5cGUoKSBjb25zdCAtPiBSZXN1bHRCYXNlOjpUeXBlIHsgcmV0dXJuIG1fdHlwZTsgfQot ICAgICAgICBhdXRvIGVycm9yTWVzc2FnZSgpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsgcmV0dXJu IG1fZXJyb3JNZXNzYWdlOyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZvaWQgZW5mb3Jj ZU9rKCkgY29uc3Qgb3ZlcnJpZGUgewotCi0gICAgICAgICAgICAvLyBFcnJvcnMgc2hvdWxkbid0 IHJlYWNoIHRoaXMgcG9pbnQsIGJ1dCBpZiB0aGV5IGRvCi0gICAgICAgICAgICAvLyB0aGUgYWN0 dWFsIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBpbiBtX2Vycm9yTWVzc2FnZQotICAgICAgICAgICAg YXNzZXJ0KCBtX3R5cGUgIT0gUmVzdWx0QmFzZTo6TG9naWNFcnJvciApOwotICAgICAgICAgICAg YXNzZXJ0KCBtX3R5cGUgIT0gUmVzdWx0QmFzZTo6UnVudGltZUVycm9yICk7Ci0gICAgICAgICAg ICBpZiggbV90eXBlICE9IFJlc3VsdEJhc2U6Ok9rICkKLSAgICAgICAgICAgICAgICBzdGQ6OmFi b3J0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGQ6OnN0cmluZyBtX2Vycm9yTWVzc2FnZTsg Ly8gT25seSBwb3B1bGF0ZWQgaWYgcmVzdWx0VHlwZSBpcyBhbiBlcnJvcgotCi0gICAgICAgIEJh c2ljUmVzdWx0KCBSZXN1bHRCYXNlOjpUeXBlIHR5cGUsIHN0ZDo6c3RyaW5nIGNvbnN0ICZtZXNz YWdlICkKLSAgICAgICAgOiAgIFJlc3VsdFZhbHVlQmFzZTxUPih0eXBlKSwKLSAgICAgICAgICAg IG1fZXJyb3JNZXNzYWdlKG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCgg bV90eXBlICE9IFJlc3VsdEJhc2U6Ok9rICk7Ci0gICAgICAgIH0KLQotICAgICAgICB1c2luZyBS ZXN1bHRWYWx1ZUJhc2U8VD46OlJlc3VsdFZhbHVlQmFzZTsKLSAgICAgICAgdXNpbmcgUmVzdWx0 QmFzZTo6bV90eXBlOwotICAgIH07Ci0KLSAgICBlbnVtIGNsYXNzIFBhcnNlUmVzdWx0VHlwZSB7 Ci0gICAgICAgIE1hdGNoZWQsIE5vTWF0Y2gsIFNob3J0Q2lyY3VpdEFsbCwgU2hvcnRDaXJjdWl0 U2FtZQotICAgIH07Ci0KLSAgICBjbGFzcyBQYXJzZVN0YXRlIHsKLSAgICBwdWJsaWM6Ci0KLSAg ICAgICAgUGFyc2VTdGF0ZSggUGFyc2VSZXN1bHRUeXBlIHR5cGUsIFRva2VuU3RyZWFtIGNvbnN0 ICZyZW1haW5pbmdUb2tlbnMgKQotICAgICAgICA6IG1fdHlwZSh0eXBlKSwKLSAgICAgICAgICBt X3JlbWFpbmluZ1Rva2VucyggcmVtYWluaW5nVG9rZW5zICkKLSAgICAgICAge30KLQotICAgICAg ICBhdXRvIHR5cGUoKSBjb25zdCAtPiBQYXJzZVJlc3VsdFR5cGUgeyByZXR1cm4gbV90eXBlOyB9 Ci0gICAgICAgIGF1dG8gcmVtYWluaW5nVG9rZW5zKCkgY29uc3QgLT4gVG9rZW5TdHJlYW0geyBy ZXR1cm4gbV9yZW1haW5pbmdUb2tlbnM7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFBhcnNl UmVzdWx0VHlwZSBtX3R5cGU7Ci0gICAgICAgIFRva2VuU3RyZWFtIG1fcmVtYWluaW5nVG9rZW5z OwotICAgIH07Ci0KLSAgICB1c2luZyBSZXN1bHQgPSBCYXNpY1Jlc3VsdDx2b2lkPjsKLSAgICB1 c2luZyBQYXJzZXJSZXN1bHQgPSBCYXNpY1Jlc3VsdDxQYXJzZVJlc3VsdFR5cGU+OwotICAgIHVz aW5nIEludGVybmFsUGFyc2VSZXN1bHQgPSBCYXNpY1Jlc3VsdDxQYXJzZVN0YXRlPjsKLQotICAg IHN0cnVjdCBIZWxwQ29sdW1ucyB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGxlZnQ7Ci0gICAgICAg IHN0ZDo6c3RyaW5nIHJpZ2h0OwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgot ICAgIGlubGluZSBhdXRvIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCAmc291cmNlLCBU JiB0YXJnZXQgKSAtPiBQYXJzZXJSZXN1bHQgewotICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBz czsKLSAgICAgICAgc3MgPDwgc291cmNlOwotICAgICAgICBzcyA+PiB0YXJnZXQ7Ci0gICAgICAg IGlmKCBzcy5mYWlsKCkgKQotICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6cnVudGlt ZUVycm9yKCAiVW5hYmxlIHRvIGNvbnZlcnQgJyIgKyBzb3VyY2UgKyAiJyB0byBkZXN0aW5hdGlv biB0eXBlIiApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0 OjpvayggUGFyc2VSZXN1bHRUeXBlOjpNYXRjaGVkICk7Ci0gICAgfQotICAgIGlubGluZSBhdXRv IGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCAmc291cmNlLCBzdGQ6OnN0cmluZyYgdGFy Z2V0ICkgLT4gUGFyc2VyUmVzdWx0IHsKLSAgICAgICAgdGFyZ2V0ID0gc291cmNlOwotICAgICAg ICByZXR1cm4gUGFyc2VyUmVzdWx0OjpvayggUGFyc2VSZXN1bHRUeXBlOjpNYXRjaGVkICk7Ci0g ICAgfQotICAgIGlubGluZSBhdXRvIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCAmc291 cmNlLCBib29sICZ0YXJnZXQgKSAtPiBQYXJzZXJSZXN1bHQgewotICAgICAgICBzdGQ6OnN0cmlu ZyBzcmNMQyA9IHNvdXJjZTsKLSAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHNyY0xDLmJlZ2luKCks IHNyY0xDLmVuZCgpLCBzcmNMQy5iZWdpbigpLCBbXSggdW5zaWduZWQgY2hhciBjICkgeyByZXR1 cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oIHN0ZDo6dG9sb3dlcihjKSApOyB9ICk7Ci0gICAgICAgIGlm IChzcmNMQyA9PSAieSIgfHwgc3JjTEMgPT0gIjEiIHx8IHNyY0xDID09ICJ0cnVlIiB8fCBzcmNM QyA9PSAieWVzIiB8fCBzcmNMQyA9PSAib24iKQotICAgICAgICAgICAgdGFyZ2V0ID0gdHJ1ZTsK LSAgICAgICAgZWxzZSBpZiAoc3JjTEMgPT0gIm4iIHx8IHNyY0xDID09ICIwIiB8fCBzcmNMQyA9 PSAiZmFsc2UiIHx8IHNyY0xDID09ICJubyIgfHwgc3JjTEMgPT0gIm9mZiIpCi0gICAgICAgICAg ICB0YXJnZXQgPSBmYWxzZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFBhcnNl clJlc3VsdDo6cnVudGltZUVycm9yKCAiRXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlIGJ1dCBkaWQg bm90IHJlY29nbmlzZTogJyIgKyBzb3VyY2UgKyAiJyIgKTsKLSAgICAgICAgcmV0dXJuIFBhcnNl clJlc3VsdDo6b2soIFBhcnNlUmVzdWx0VHlwZTo6TWF0Y2hlZCApOwotICAgIH0KLSNpZmRlZiBD TEFSQV9DT05GSUdfT1BUSU9OQUxfVFlQRQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAg aW5saW5lIGF1dG8gY29udmVydEludG8oIHN0ZDo6c3RyaW5nIGNvbnN0ICZzb3VyY2UsIENMQVJB X0NPTkZJR19PUFRJT05BTF9UWVBFPFQ+JiB0YXJnZXQgKSAtPiBQYXJzZXJSZXN1bHQgewotICAg ICAgICBUIHRlbXA7Ci0gICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydEludG8oIHNvdXJjZSwg dGVtcCApOwotICAgICAgICBpZiggcmVzdWx0ICkKLSAgICAgICAgICAgIHRhcmdldCA9IHN0ZDo6 bW92ZSh0ZW1wKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0jZW5kaWYgLy8gQ0xB UkFfQ09ORklHX09QVElPTkFMX1RZUEUKLQotICAgIHN0cnVjdCBOb25Db3B5YWJsZSB7Ci0gICAg ICAgIE5vbkNvcHlhYmxlKCkgPSBkZWZhdWx0OwotICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29w eWFibGUgY29uc3QgJiApID0gZGVsZXRlOwotICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFi bGUgJiYgKSA9IGRlbGV0ZTsKLSAgICAgICAgTm9uQ29weWFibGUgJm9wZXJhdG9yPSggTm9uQ29w eWFibGUgY29uc3QgJiApID0gZGVsZXRlOwotICAgICAgICBOb25Db3B5YWJsZSAmb3BlcmF0b3I9 KCBOb25Db3B5YWJsZSAmJiApID0gZGVsZXRlOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQm91bmRS ZWYgOiBOb25Db3B5YWJsZSB7Ci0gICAgICAgIHZpcnR1YWwgfkJvdW5kUmVmKCkgPSBkZWZhdWx0 OwotICAgICAgICB2aXJ0dWFsIGF1dG8gaXNDb250YWluZXIoKSBjb25zdCAtPiBib29sIHsgcmV0 dXJuIGZhbHNlOyB9Ci0gICAgICAgIHZpcnR1YWwgYXV0byBpc0ZsYWcoKSBjb25zdCAtPiBib29s IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgfTsKLSAgICBzdHJ1Y3QgQm91bmRWYWx1ZVJlZkJhc2Ug OiBCb3VuZFJlZiB7Ci0gICAgICAgIHZpcnR1YWwgYXV0byBzZXRWYWx1ZSggc3RkOjpzdHJpbmcg Y29uc3QgJmFyZyApIC0+IFBhcnNlclJlc3VsdCA9IDA7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgQm91 bmRGbGFnUmVmQmFzZSA6IEJvdW5kUmVmIHsKLSAgICAgICAgdmlydHVhbCBhdXRvIHNldEZsYWco IGJvb2wgZmxhZyApIC0+IFBhcnNlclJlc3VsdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYXV0byBp c0ZsYWcoKSBjb25zdCAtPiBib29sIHsgcmV0dXJuIHRydWU7IH0KLSAgICB9OwotCi0gICAgdGVt cGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdHJ1Y3QgQm91bmRWYWx1ZVJlZiA6IEJvdW5kVmFsdWVS ZWZCYXNlIHsKLSAgICAgICAgVCAmbV9yZWY7Ci0KLSAgICAgICAgZXhwbGljaXQgQm91bmRWYWx1 ZVJlZiggVCAmcmVmICkgOiBtX3JlZiggcmVmICkge30KLQotICAgICAgICBhdXRvIHNldFZhbHVl KCBzdGQ6OnN0cmluZyBjb25zdCAmYXJnICkgLT4gUGFyc2VyUmVzdWx0IG92ZXJyaWRlIHsKLSAg ICAgICAgICAgIHJldHVybiBjb252ZXJ0SW50byggYXJnLCBtX3JlZiApOwotICAgICAgICB9Ci0g ICAgfTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RydWN0IEJvdW5kVmFsdWVS ZWY8c3RkOjp2ZWN0b3I8VD4+IDogQm91bmRWYWx1ZVJlZkJhc2UgewotICAgICAgICBzdGQ6OnZl Y3RvcjxUPiAmbV9yZWY7Ci0KLSAgICAgICAgZXhwbGljaXQgQm91bmRWYWx1ZVJlZiggc3RkOjp2 ZWN0b3I8VD4gJnJlZiApIDogbV9yZWYoIHJlZiApIHt9Ci0KLSAgICAgICAgYXV0byBpc0NvbnRh aW5lcigpIGNvbnN0IC0+IGJvb2wgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgICAg IGF1dG8gc2V0VmFsdWUoIHN0ZDo6c3RyaW5nIGNvbnN0ICZhcmcgKSAtPiBQYXJzZXJSZXN1bHQg b3ZlcnJpZGUgewotICAgICAgICAgICAgVCB0ZW1wOwotICAgICAgICAgICAgYXV0byByZXN1bHQg PSBjb252ZXJ0SW50byggYXJnLCB0ZW1wICk7Ci0gICAgICAgICAgICBpZiggcmVzdWx0ICkKLSAg ICAgICAgICAgICAgICBtX3JlZi5wdXNoX2JhY2soIHRlbXAgKTsKLSAgICAgICAgICAgIHJldHVy biByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3RydWN0IEJvdW5kRmxhZ1JlZiA6 IEJvdW5kRmxhZ1JlZkJhc2UgewotICAgICAgICBib29sICZtX3JlZjsKLQotICAgICAgICBleHBs aWNpdCBCb3VuZEZsYWdSZWYoIGJvb2wgJnJlZiApIDogbV9yZWYoIHJlZiApIHt9Ci0KLSAgICAg ICAgYXV0byBzZXRGbGFnKCBib29sIGZsYWcgKSAtPiBQYXJzZXJSZXN1bHQgb3ZlcnJpZGUgewot ICAgICAgICAgICAgbV9yZWYgPSBmbGFnOwotICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3Vs dDo6b2soIFBhcnNlUmVzdWx0VHlwZTo6TWF0Y2hlZCApOwotICAgICAgICB9Ci0gICAgfTsKLQot ICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJldHVyblR5cGU+Ci0gICAgc3RydWN0IExhbWJkYUludm9r ZXIgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3NhbWU8UmV0dXJuVHlwZSwgUGFy c2VyUmVzdWx0Pjo6dmFsdWUsICJMYW1iZGEgbXVzdCByZXR1cm4gdm9pZCBvciBjbGFyYTo6UGFy c2VyUmVzdWx0IiApOwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEwsIHR5cGVuYW1lIEFy Z1R5cGU+Ci0gICAgICAgIHN0YXRpYyBhdXRvIGludm9rZSggTCBjb25zdCAmbGFtYmRhLCBBcmdU eXBlIGNvbnN0ICZhcmcgKSAtPiBQYXJzZXJSZXN1bHQgewotICAgICAgICAgICAgcmV0dXJuIGxh bWJkYSggYXJnICk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgdGVtcGxhdGU8PgotICAgIHN0 cnVjdCBMYW1iZGFJbnZva2VyPHZvaWQ+IHsKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTCwg dHlwZW5hbWUgQXJnVHlwZT4KLSAgICAgICAgc3RhdGljIGF1dG8gaW52b2tlKCBMIGNvbnN0ICZs YW1iZGEsIEFyZ1R5cGUgY29uc3QgJmFyZyApIC0+IFBhcnNlclJlc3VsdCB7Ci0gICAgICAgICAg ICBsYW1iZGEoIGFyZyApOwotICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6b2soIFBh cnNlUmVzdWx0VHlwZTo6TWF0Y2hlZCApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHRlbXBs YXRlPHR5cGVuYW1lIEFyZ1R5cGUsIHR5cGVuYW1lIEw+Ci0gICAgaW5saW5lIGF1dG8gaW52b2tl TGFtYmRhKCBMIGNvbnN0ICZsYW1iZGEsIHN0ZDo6c3RyaW5nIGNvbnN0ICZhcmcgKSAtPiBQYXJz ZXJSZXN1bHQgewotICAgICAgICBBcmdUeXBlIHRlbXB7fTsKLSAgICAgICAgYXV0byByZXN1bHQg PSBjb252ZXJ0SW50byggYXJnLCB0ZW1wICk7Ci0gICAgICAgIHJldHVybiAhcmVzdWx0Ci0gICAg ICAgICAgID8gcmVzdWx0Ci0gICAgICAgICAgIDogTGFtYmRhSW52b2tlcjx0eXBlbmFtZSBVbmFy eUxhbWJkYVRyYWl0czxMPjo6UmV0dXJuVHlwZT46Omludm9rZSggbGFtYmRhLCB0ZW1wICk7Ci0g ICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgTD4KLSAgICBzdHJ1Y3QgQm91bmRMYW1iZGEg OiBCb3VuZFZhbHVlUmVmQmFzZSB7Ci0gICAgICAgIEwgbV9sYW1iZGE7Ci0KLSAgICAgICAgc3Rh dGljX2Fzc2VydCggVW5hcnlMYW1iZGFUcmFpdHM8TD46OmlzVmFsaWQsICJTdXBwbGllZCBsYW1i ZGEgbXVzdCB0YWtlIGV4YWN0bHkgb25lIGFyZ3VtZW50IiApOwotICAgICAgICBleHBsaWNpdCBC b3VuZExhbWJkYSggTCBjb25zdCAmbGFtYmRhICkgOiBtX2xhbWJkYSggbGFtYmRhICkge30KLQot ICAgICAgICBhdXRvIHNldFZhbHVlKCBzdGQ6OnN0cmluZyBjb25zdCAmYXJnICkgLT4gUGFyc2Vy UmVzdWx0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VMYW1iZGE8dHlwZW5h bWUgVW5hcnlMYW1iZGFUcmFpdHM8TD46OkFyZ1R5cGU+KCBtX2xhbWJkYSwgYXJnICk7Ci0gICAg ICAgIH0KLSAgICB9OwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgTD4KLSAgICBzdHJ1Y3QgQm91 bmRGbGFnTGFtYmRhIDogQm91bmRGbGFnUmVmQmFzZSB7Ci0gICAgICAgIEwgbV9sYW1iZGE7Ci0K LSAgICAgICAgc3RhdGljX2Fzc2VydCggVW5hcnlMYW1iZGFUcmFpdHM8TD46OmlzVmFsaWQsICJT dXBwbGllZCBsYW1iZGEgbXVzdCB0YWtlIGV4YWN0bHkgb25lIGFyZ3VtZW50IiApOwotICAgICAg ICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgVW5hcnlMYW1iZGFUcmFpdHM8 TD46OkFyZ1R5cGUsIGJvb2w+Ojp2YWx1ZSwgImZsYWdzIG11c3QgYmUgYm9vbGVhbiIgKTsKLQot ICAgICAgICBleHBsaWNpdCBCb3VuZEZsYWdMYW1iZGEoIEwgY29uc3QgJmxhbWJkYSApIDogbV9s YW1iZGEoIGxhbWJkYSApIHt9Ci0KLSAgICAgICAgYXV0byBzZXRGbGFnKCBib29sIGZsYWcgKSAt PiBQYXJzZXJSZXN1bHQgb3ZlcnJpZGUgewotICAgICAgICAgICAgcmV0dXJuIExhbWJkYUludm9r ZXI8dHlwZW5hbWUgVW5hcnlMYW1iZGFUcmFpdHM8TD46OlJldHVyblR5cGU+OjppbnZva2UoIG1f bGFtYmRhLCBmbGFnICk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgZW51bSBjbGFzcyBPcHRp b25hbGl0eSB7IE9wdGlvbmFsLCBSZXF1aXJlZCB9OwotCi0gICAgc3RydWN0IFBhcnNlcjsKLQot ICAgIGNsYXNzIFBhcnNlckJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+UGFy c2VyQmFzZSgpID0gZGVmYXVsdDsKLSAgICAgICAgdmlydHVhbCBhdXRvIHZhbGlkYXRlKCkgY29u c3QgLT4gUmVzdWx0IHsgcmV0dXJuIFJlc3VsdDo6b2soKTsgfQotICAgICAgICB2aXJ0dWFsIGF1 dG8gcGFyc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBleGVOYW1lLCBUb2tlblN0cmVhbSBjb25zdCAm dG9rZW5zKSBjb25zdCAtPiBJbnRlcm5hbFBhcnNlUmVzdWx0ICA9IDA7Ci0gICAgICAgIHZpcnR1 YWwgYXV0byBjYXJkaW5hbGl0eSgpIGNvbnN0IC0+IHNpemVfdCB7IHJldHVybiAxOyB9Ci0KLSAg ICAgICAgYXV0byBwYXJzZSggQXJncyBjb25zdCAmYXJncyApIGNvbnN0IC0+IEludGVybmFsUGFy c2VSZXN1bHQgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlKCBhcmdzLmV4ZU5hbWUoKSwgVG9r ZW5TdHJlYW0oIGFyZ3MgKSApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5 cGVuYW1lIERlcml2ZWRUPgotICAgIGNsYXNzIENvbXBvc2FibGVQYXJzZXJJbXBsIDogcHVibGlj IFBhcnNlckJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4K LSAgICAgICAgYXV0byBvcGVyYXRvcnwoIFQgY29uc3QgJm90aGVyICkgY29uc3QgLT4gUGFyc2Vy OwotCi0JCXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGF1dG8gb3BlcmF0b3IrKCBUIGNv bnN0ICZvdGhlciApIGNvbnN0IC0+IFBhcnNlcjsKLSAgICB9OwotCi0gICAgLy8gQ29tbW9uIGNv ZGUgYW5kIHN0YXRlIGZvciBBcmdzIGFuZCBPcHRzCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVy aXZlZFQ+Ci0gICAgY2xhc3MgUGFyc2VyUmVmSW1wbCA6IHB1YmxpYyBDb21wb3NhYmxlUGFyc2Vy SW1wbDxEZXJpdmVkVD4gewotICAgIHByb3RlY3RlZDoKLSAgICAgICAgT3B0aW9uYWxpdHkgbV9v cHRpb25hbGl0eSA9IE9wdGlvbmFsaXR5OjpPcHRpb25hbDsKLSAgICAgICAgc3RkOjpzaGFyZWRf cHRyPEJvdW5kUmVmPiBtX3JlZjsKLSAgICAgICAgc3RkOjpzdHJpbmcgbV9oaW50OwotICAgICAg ICBzdGQ6OnN0cmluZyBtX2Rlc2NyaXB0aW9uOwotCi0gICAgICAgIGV4cGxpY2l0IFBhcnNlclJl ZkltcGwoIHN0ZDo6c2hhcmVkX3B0cjxCb3VuZFJlZj4gY29uc3QgJnJlZiApIDogbV9yZWYoIHJl ZiApIHt9Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAg ICAgIFBhcnNlclJlZkltcGwoIFQgJnJlZiwgc3RkOjpzdHJpbmcgY29uc3QgJmhpbnQgKQotICAg ICAgICA6ICAgbV9yZWYoIHN0ZDo6bWFrZV9zaGFyZWQ8Qm91bmRWYWx1ZVJlZjxUPj4oIHJlZiAp ICksCi0gICAgICAgICAgICBtX2hpbnQoIGhpbnQgKQotICAgICAgICB7fQotCi0gICAgICAgIHRl bXBsYXRlPHR5cGVuYW1lIExhbWJkYVQ+Ci0gICAgICAgIFBhcnNlclJlZkltcGwoIExhbWJkYVQg Y29uc3QgJnJlZiwgc3RkOjpzdHJpbmcgY29uc3QgJmhpbnQgKQotICAgICAgICA6ICAgbV9yZWYo IHN0ZDo6bWFrZV9zaGFyZWQ8Qm91bmRMYW1iZGE8TGFtYmRhVD4+KCByZWYgKSApLAotICAgICAg ICAgICAgbV9oaW50KGhpbnQpCi0gICAgICAgIHt9Ci0KLSAgICAgICAgYXV0byBvcGVyYXRvcigp KCBzdGQ6OnN0cmluZyBjb25zdCAmZGVzY3JpcHRpb24gKSAtPiBEZXJpdmVkVCAmIHsKLSAgICAg ICAgICAgIG1fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICAgICAgICAgIHJldHVybiBz dGF0aWNfY2FzdDxEZXJpdmVkVCAmPiggKnRoaXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1 dG8gb3B0aW9uYWwoKSAtPiBEZXJpdmVkVCAmIHsKLSAgICAgICAgICAgIG1fb3B0aW9uYWxpdHkg PSBPcHRpb25hbGl0eTo6T3B0aW9uYWw7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8 RGVyaXZlZFQgJj4oICp0aGlzICk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgYXV0byByZXF1aXJl ZCgpIC0+IERlcml2ZWRUICYgewotICAgICAgICAgICAgbV9vcHRpb25hbGl0eSA9IE9wdGlvbmFs aXR5OjpSZXF1aXJlZDsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAm PiggKnRoaXMgKTsKLSAgICAgICAgfTsKLQotICAgICAgICBhdXRvIGlzT3B0aW9uYWwoKSBjb25z dCAtPiBib29sIHsKLSAgICAgICAgICAgIHJldHVybiBtX29wdGlvbmFsaXR5ID09IE9wdGlvbmFs aXR5OjpPcHRpb25hbDsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gY2FyZGluYWxpdHkoKSBj b25zdCAtPiBzaXplX3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgaWYoIG1fcmVmLT5pc0NvbnRh aW5lcigpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGVsc2UKLSAg ICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaGludCgp IGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsgcmV0dXJuIG1faGludDsgfQotICAgIH07Ci0KLSAgICBj bGFzcyBFeGVOYW1lIDogcHVibGljIENvbXBvc2FibGVQYXJzZXJJbXBsPEV4ZU5hbWU+IHsKLSAg ICAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6c3RyaW5nPiBtX25hbWU7Ci0gICAgICAgIHN0ZDo6 c2hhcmVkX3B0cjxCb3VuZFZhbHVlUmVmQmFzZT4gbV9yZWY7Ci0KLSAgICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgTGFtYmRhVD4KLSAgICAgICAgc3RhdGljIGF1dG8gbWFrZVJlZihMYW1iZGFUIGNv bnN0ICZsYW1iZGEpIC0+IHN0ZDo6c2hhcmVkX3B0cjxCb3VuZFZhbHVlUmVmQmFzZT4gewotICAg ICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Qm91bmRMYW1iZGE8TGFtYmRhVD4+KCBs YW1iZGEpIDsKLSAgICAgICAgfQotCi0gICAgcHVibGljOgotICAgICAgICBFeGVOYW1lKCkgOiBt X25hbWUoIHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjpzdHJpbmc+KCAiPGV4ZWN1dGFibGU+IiApICkg e30KLQotICAgICAgICBleHBsaWNpdCBFeGVOYW1lKCBzdGQ6OnN0cmluZyAmcmVmICkgOiBFeGVO YW1lKCkgewotICAgICAgICAgICAgbV9yZWYgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJvdW5kVmFsdWVS ZWY8c3RkOjpzdHJpbmc+PiggcmVmICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZTx0 eXBlbmFtZSBMYW1iZGFUPgotICAgICAgICBleHBsaWNpdCBFeGVOYW1lKCBMYW1iZGFUIGNvbnN0 JiBsYW1iZGEgKSA6IEV4ZU5hbWUoKSB7Ci0gICAgICAgICAgICBtX3JlZiA9IHN0ZDo6bWFrZV9z aGFyZWQ8Qm91bmRMYW1iZGE8TGFtYmRhVD4+KCBsYW1iZGEgKTsKLSAgICAgICAgfQotCi0gICAg ICAgIC8vIFRoZSBleGUgbmFtZSBpcyBub3QgcGFyc2VkIG91dCBvZiB0aGUgbm9ybWFsIHRva2Vu cywgYnV0IGlzIGhhbmRsZWQgc3BlY2lhbGx5Ci0gICAgICAgIGF1dG8gcGFyc2UoIHN0ZDo6c3Ry aW5nIGNvbnN0JiwgVG9rZW5TdHJlYW0gY29uc3QgJnRva2VucyApIGNvbnN0IC0+IEludGVybmFs UGFyc2VSZXN1bHQgb3ZlcnJpZGUgewotICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VS ZXN1bHQ6Om9rKCBQYXJzZVN0YXRlKCBQYXJzZVJlc3VsdFR5cGU6Ok5vTWF0Y2gsIHRva2VucyAp ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIG5hbWUoKSBjb25zdCAtPiBzdGQ6OnN0cmlu ZyB7IHJldHVybiAqbV9uYW1lOyB9Ci0gICAgICAgIGF1dG8gc2V0KCBzdGQ6OnN0cmluZyBjb25z dCYgbmV3TmFtZSApIC0+IFBhcnNlclJlc3VsdCB7Ci0KLSAgICAgICAgICAgIGF1dG8gbGFzdFNs YXNoID0gbmV3TmFtZS5maW5kX2xhc3Rfb2YoICJcXC8iICk7Ci0gICAgICAgICAgICBhdXRvIGZp bGVuYW1lID0gKCBsYXN0U2xhc2ggPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQotICAgICAgICAgICAg ICAgICAgICA/IG5ld05hbWUKLSAgICAgICAgICAgICAgICAgICAgOiBuZXdOYW1lLnN1YnN0cigg bGFzdFNsYXNoKzEgKTsKLQotICAgICAgICAgICAgKm1fbmFtZSA9IGZpbGVuYW1lOwotICAgICAg ICAgICAgaWYoIG1fcmVmICkKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9yZWYtPnNldFZhbHVl KCBmaWxlbmFtZSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBQ YXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6Ok1hdGNoZWQgKTsKLSAgICAgICAgfQot ICAgIH07Ci0KLSAgICBjbGFzcyBBcmcgOiBwdWJsaWMgUGFyc2VyUmVmSW1wbDxBcmc+IHsKLSAg ICBwdWJsaWM6Ci0gICAgICAgIHVzaW5nIFBhcnNlclJlZkltcGw6OlBhcnNlclJlZkltcGw7Ci0K LSAgICAgICAgYXV0byBwYXJzZSggc3RkOjpzdHJpbmcgY29uc3QgJiwgVG9rZW5TdHJlYW0gY29u c3QgJnRva2VucyApIGNvbnN0IC0+IEludGVybmFsUGFyc2VSZXN1bHQgb3ZlcnJpZGUgewotICAg ICAgICAgICAgYXV0byB2YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGUoKTsKLSAgICAgICAgICAg IGlmKCAhdmFsaWRhdGlvblJlc3VsdCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVybmFs UGFyc2VSZXN1bHQoIHZhbGlkYXRpb25SZXN1bHQgKTsKLQotICAgICAgICAgICAgYXV0byByZW1h aW5pbmdUb2tlbnMgPSB0b2tlbnM7Ci0gICAgICAgICAgICBhdXRvIGNvbnN0ICZ0b2tlbiA9ICpy ZW1haW5pbmdUb2tlbnM7Ci0gICAgICAgICAgICBpZiggdG9rZW4udHlwZSAhPSBUb2tlblR5cGU6 OkFyZ3VtZW50ICkKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxQYXJzZVJlc3VsdDo6 b2soIFBhcnNlU3RhdGUoIFBhcnNlUmVzdWx0VHlwZTo6Tm9NYXRjaCwgcmVtYWluaW5nVG9rZW5z ICkgKTsKLQotICAgICAgICAgICAgYXNzZXJ0KCAhbV9yZWYtPmlzRmxhZygpICk7Ci0gICAgICAg ICAgICBhdXRvIHZhbHVlUmVmID0gc3RhdGljX2Nhc3Q8ZGV0YWlsOjpCb3VuZFZhbHVlUmVmQmFz ZSo+KCBtX3JlZi5nZXQoKSApOwotCi0gICAgICAgICAgICBhdXRvIHJlc3VsdCA9IHZhbHVlUmVm LT5zZXRWYWx1ZSggcmVtYWluaW5nVG9rZW5zLT50b2tlbiApOwotICAgICAgICAgICAgaWYoICFy ZXN1bHQgKQotICAgICAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbFBhcnNlUmVzdWx0KCByZXN1 bHQgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxQ YXJzZVJlc3VsdDo6b2soIFBhcnNlU3RhdGUoIFBhcnNlUmVzdWx0VHlwZTo6TWF0Y2hlZCwgKyty ZW1haW5pbmdUb2tlbnMgKSApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGlubGluZSBhdXRv IG5vcm1hbGlzZU9wdCggc3RkOjpzdHJpbmcgY29uc3QgJm9wdE5hbWUgKSAtPiBzdGQ6OnN0cmlu ZyB7Ci0jaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUwotICAgICAgICBpZiggb3B0TmFtZVsw XSA9PSAnLycgKQotICAgICAgICAgICAgcmV0dXJuICItIiArIG9wdE5hbWUuc3Vic3RyKCAxICk7 Ci0gICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIG9wdE5hbWU7Ci0gICAg fQotCi0gICAgY2xhc3MgT3B0IDogcHVibGljIFBhcnNlclJlZkltcGw8T3B0PiB7Ci0gICAgcHJv dGVjdGVkOgotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9vcHROYW1lczsKLQot ICAgIHB1YmxpYzoKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGFtYmRhVD4KLSAgICAgICAg ZXhwbGljaXQgT3B0KCBMYW1iZGFUIGNvbnN0ICZyZWYgKSA6IFBhcnNlclJlZkltcGwoIHN0ZDo6 bWFrZV9zaGFyZWQ8Qm91bmRGbGFnTGFtYmRhPExhbWJkYVQ+PiggcmVmICkgKSB7fQotCi0gICAg ICAgIGV4cGxpY2l0IE9wdCggYm9vbCAmcmVmICkgOiBQYXJzZXJSZWZJbXBsKCBzdGQ6Om1ha2Vf c2hhcmVkPEJvdW5kRmxhZ1JlZj4oIHJlZiApICkge30KLQotICAgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBMYW1iZGFUPgotICAgICAgICBPcHQoIExhbWJkYVQgY29uc3QgJnJlZiwgc3RkOjpzdHJp bmcgY29uc3QgJmhpbnQgKSA6IFBhcnNlclJlZkltcGwoIHJlZiwgaGludCApIHt9Ci0KLSAgICAg ICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgT3B0KCBUICZyZWYsIHN0ZDo6c3RyaW5n IGNvbnN0ICZoaW50ICkgOiBQYXJzZXJSZWZJbXBsKCByZWYsIGhpbnQgKSB7fQotCi0gICAgICAg IGF1dG8gb3BlcmF0b3JbXSggc3RkOjpzdHJpbmcgY29uc3QgJm9wdE5hbWUgKSAtPiBPcHQgJiB7 Ci0gICAgICAgICAgICBtX29wdE5hbWVzLnB1c2hfYmFjayggb3B0TmFtZSApOwotICAgICAgICAg ICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBnZXRIZWxwQ29sdW1u cygpIGNvbnN0IC0+IHN0ZDo6dmVjdG9yPEhlbHBDb2x1bW5zPiB7Ci0gICAgICAgICAgICBzdGQ6 Om9zdHJpbmdzdHJlYW0gb3NzOwotICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAg ICAgICAgICBmb3IoIGF1dG8gY29uc3QgJm9wdCA6IG1fb3B0TmFtZXMgKSB7Ci0gICAgICAgICAg ICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAg ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIsICI7Ci0gICAg ICAgICAgICAgICAgb3NzIDw8IG9wdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCAh bV9oaW50LmVtcHR5KCkgKQotICAgICAgICAgICAgICAgIG9zcyA8PCAiIDwiIDw8IG1faGludCA8 PCAiPiI7Ci0gICAgICAgICAgICByZXR1cm4geyB7IG9zcy5zdHIoKSwgbV9kZXNjcmlwdGlvbiB9 IH07Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIGlzTWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0 ICZvcHRUb2tlbiApIGNvbnN0IC0+IGJvb2wgewotICAgICAgICAgICAgYXV0byBub3JtYWxpc2Vk VG9rZW4gPSBub3JtYWxpc2VPcHQoIG9wdFRva2VuICk7Ci0gICAgICAgICAgICBmb3IoIGF1dG8g Y29uc3QgJm5hbWUgOiBtX29wdE5hbWVzICkgewotICAgICAgICAgICAgICAgIGlmKCBub3JtYWxp c2VPcHQoIG5hbWUgKSA9PSBub3JtYWxpc2VkVG9rZW4gKQotICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg ICAgICAgfQotCi0gICAgICAgIHVzaW5nIFBhcnNlckJhc2U6OnBhcnNlOwotCi0gICAgICAgIGF1 dG8gcGFyc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiwgVG9rZW5TdHJlYW0gY29uc3QgJnRva2VucyAp IGNvbnN0IC0+IEludGVybmFsUGFyc2VSZXN1bHQgb3ZlcnJpZGUgewotICAgICAgICAgICAgYXV0 byB2YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGlmKCAhdmFsaWRh dGlvblJlc3VsdCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQo IHZhbGlkYXRpb25SZXN1bHQgKTsKLQotICAgICAgICAgICAgYXV0byByZW1haW5pbmdUb2tlbnMg PSB0b2tlbnM7Ci0gICAgICAgICAgICBpZiggcmVtYWluaW5nVG9rZW5zICYmIHJlbWFpbmluZ1Rv a2Vucy0+dHlwZSA9PSBUb2tlblR5cGU6Ok9wdGlvbiApIHsKLSAgICAgICAgICAgICAgICBhdXRv IGNvbnN0ICZ0b2tlbiA9ICpyZW1haW5pbmdUb2tlbnM7Ci0gICAgICAgICAgICAgICAgaWYoIGlz TWF0Y2godG9rZW4udG9rZW4gKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIG1fcmVmLT5p c0ZsYWcoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmxhZ1JlZiA9IHN0YXRp Y19jYXN0PGRldGFpbDo6Qm91bmRGbGFnUmVmQmFzZSo+KCBtX3JlZi5nZXQoKSApOwotICAgICAg ICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBmbGFnUmVmLT5zZXRGbGFnKCB0cnVlICk7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggIXJlc3VsdCApCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQoIHJlc3VsdCApOwotICAgICAg ICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC52YWx1ZSgpID09IFBhcnNlUmVzdWx0VHlwZTo6 U2hvcnRDaXJjdWl0QWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50 ZXJuYWxQYXJzZVJlc3VsdDo6b2soIFBhcnNlU3RhdGUoIHJlc3VsdC52YWx1ZSgpLCByZW1haW5p bmdUb2tlbnMgKSApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg ICAgICAgICAgICAgYXV0byB2YWx1ZVJlZiA9IHN0YXRpY19jYXN0PGRldGFpbDo6Qm91bmRWYWx1 ZVJlZkJhc2UqPiggbV9yZWYuZ2V0KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrcmVt YWluaW5nVG9rZW5zOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFyZW1haW5pbmdUb2tl bnMgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbFBhcnNlUmVz dWx0OjpydW50aW1lRXJyb3IoICJFeHBlY3RlZCBhcmd1bWVudCBmb2xsb3dpbmcgIiArIHRva2Vu LnRva2VuICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNvbnN0ICZhcmdUb2tlbiA9 ICpyZW1haW5pbmdUb2tlbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggYXJnVG9rZW4u dHlwZSAhPSBUb2tlblR5cGU6OkFyZ3VtZW50ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXR1cm4gSW50ZXJuYWxQYXJzZVJlc3VsdDo6cnVudGltZUVycm9yKCAiRXhwZWN0ZWQgYXJn dW1lbnQgZm9sbG93aW5nICIgKyB0b2tlbi50b2tlbiApOwotICAgICAgICAgICAgICAgICAgICAg ICAgYXV0byByZXN1bHQgPSB2YWx1ZVJlZi0+c2V0VmFsdWUoIGFyZ1Rva2VuLnRva2VuICk7Ci0g ICAgICAgICAgICAgICAgICAgICAgICBpZiggIXJlc3VsdCApCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQoIHJlc3VsdCApOwotICAgICAgICAg ICAgICAgICAgICAgICAgaWYoIHJlc3VsdC52YWx1ZSgpID09IFBhcnNlUmVzdWx0VHlwZTo6U2hv cnRDaXJjdWl0QWxsICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJu YWxQYXJzZVJlc3VsdDo6b2soIFBhcnNlU3RhdGUoIHJlc3VsdC52YWx1ZSgpLCByZW1haW5pbmdU b2tlbnMgKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJl dHVybiBJbnRlcm5hbFBhcnNlUmVzdWx0OjpvayggUGFyc2VTdGF0ZSggUGFyc2VSZXN1bHRUeXBl OjpNYXRjaGVkLCArK3JlbWFpbmluZ1Rva2VucyApICk7Ci0gICAgICAgICAgICAgICAgfQotICAg ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VSZXN1bHQ6Om9rKCBQ YXJzZVN0YXRlKCBQYXJzZVJlc3VsdFR5cGU6Ok5vTWF0Y2gsIHJlbWFpbmluZ1Rva2VucyApICk7 Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIHZhbGlkYXRlKCkgY29uc3QgLT4gUmVzdWx0IG92 ZXJyaWRlIHsKLSAgICAgICAgICAgIGlmKCBtX29wdE5hbWVzLmVtcHR5KCkgKQotICAgICAgICAg ICAgICAgIHJldHVybiBSZXN1bHQ6OmxvZ2ljRXJyb3IoICJObyBvcHRpb25zIHN1cHBsaWVkIHRv IE9wdCIgKTsKLSAgICAgICAgICAgIGZvciggYXV0byBjb25zdCAmbmFtZSA6IG1fb3B0TmFtZXMg KSB7Ci0gICAgICAgICAgICAgICAgaWYoIG5hbWUuZW1wdHkoKSApCi0gICAgICAgICAgICAgICAg ICAgIHJldHVybiBSZXN1bHQ6OmxvZ2ljRXJyb3IoICJPcHRpb24gbmFtZSBjYW5ub3QgYmUgZW1w dHkiICk7Ci0jaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUwotICAgICAgICAgICAgICAgIGlm KCBuYW1lWzBdICE9ICctJyAmJiBuYW1lWzBdICE9ICcvJyApCi0gICAgICAgICAgICAgICAgICAg IHJldHVybiBSZXN1bHQ6OmxvZ2ljRXJyb3IoICJPcHRpb24gbmFtZSBtdXN0IGJlZ2luIHdpdGgg Jy0nIG9yICcvJyIgKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgaWYoIG5hbWVbMF0gIT0gJy0n ICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDo6bG9naWNFcnJvciggIk9wdGlv biBuYW1lIG11c3QgYmVnaW4gd2l0aCAnLSciICk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAg ICAgICAgICAgIHJldHVybiBQYXJzZXJSZWZJbXBsOjp2YWxpZGF0ZSgpOwotICAgICAgICB9Ci0g ICAgfTsKLQotICAgIHN0cnVjdCBIZWxwIDogT3B0IHsKLSAgICAgICAgSGVscCggYm9vbCAmc2hv d0hlbHBGbGFnICkKLSAgICAgICAgOiAgIE9wdChbJl0oIGJvb2wgZmxhZyApIHsKLSAgICAgICAg ICAgICAgICBzaG93SGVscEZsYWcgPSBmbGFnOwotICAgICAgICAgICAgICAgIHJldHVybiBQYXJz ZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6OlNob3J0Q2lyY3VpdEFsbCApOwotICAgICAg ICAgICAgfSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T3B0ICY+KCAqdGhp cyApCi0gICAgICAgICAgICAgICAgICAgICgiZGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiIpCi0g ICAgICAgICAgICAgICAgICAgIFsiLT8iXVsiLWgiXVsiLS1oZWxwIl0KLSAgICAgICAgICAgICAg ICAgICAgLm9wdGlvbmFsKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3RydWN0IFBhcnNl ciA6IFBhcnNlckJhc2UgewotCi0gICAgICAgIG11dGFibGUgRXhlTmFtZSBtX2V4ZU5hbWU7Ci0g ICAgICAgIHN0ZDo6dmVjdG9yPE9wdD4gbV9vcHRpb25zOwotICAgICAgICBzdGQ6OnZlY3RvcjxB cmc+IG1fYXJnczsKLQotICAgICAgICBhdXRvIG9wZXJhdG9yfD0oIEV4ZU5hbWUgY29uc3QgJmV4 ZU5hbWUgKSAtPiBQYXJzZXIgJiB7Ci0gICAgICAgICAgICBtX2V4ZU5hbWUgPSBleGVOYW1lOwot ICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBvcGVy YXRvcnw9KCBBcmcgY29uc3QgJmFyZyApIC0+IFBhcnNlciAmIHsKLSAgICAgICAgICAgIG1fYXJn cy5wdXNoX2JhY2soYXJnKTsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQot Ci0gICAgICAgIGF1dG8gb3BlcmF0b3J8PSggT3B0IGNvbnN0ICZvcHQgKSAtPiBQYXJzZXIgJiB7 Ci0gICAgICAgICAgICBtX29wdGlvbnMucHVzaF9iYWNrKG9wdCk7Ci0gICAgICAgICAgICByZXR1 cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIG9wZXJhdG9yfD0oIFBhcnNlciBj b25zdCAmb3RoZXIgKSAtPiBQYXJzZXIgJiB7Ci0gICAgICAgICAgICBtX29wdGlvbnMuaW5zZXJ0 KG1fb3B0aW9ucy5lbmQoKSwgb3RoZXIubV9vcHRpb25zLmJlZ2luKCksIG90aGVyLm1fb3B0aW9u cy5lbmQoKSk7Ci0gICAgICAgICAgICBtX2FyZ3MuaW5zZXJ0KG1fYXJncy5lbmQoKSwgb3RoZXIu bV9hcmdzLmJlZ2luKCksIG90aGVyLm1fYXJncy5lbmQoKSk7Ci0gICAgICAgICAgICByZXR1cm4g KnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAg ICBhdXRvIG9wZXJhdG9yfCggVCBjb25zdCAmb3RoZXIgKSBjb25zdCAtPiBQYXJzZXIgewotICAg ICAgICAgICAgcmV0dXJuIFBhcnNlciggKnRoaXMgKSB8PSBvdGhlcjsKLSAgICAgICAgfQotCi0g ICAgICAgIC8vIEZvcndhcmQgZGVwcmVjYXRlZCBpbnRlcmZhY2Ugd2l0aCAnKycgaW5zdGVhZCBv ZiAnfCcKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgYXV0byBvcGVyYXRv cis9KCBUIGNvbnN0ICZvdGhlciApIC0+IFBhcnNlciAmIHsgcmV0dXJuIG9wZXJhdG9yfD0oIG90 aGVyICk7IH0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgYXV0byBvcGVy YXRvcisoIFQgY29uc3QgJm90aGVyICkgY29uc3QgLT4gUGFyc2VyIHsgcmV0dXJuIG9wZXJhdG9y fCggb3RoZXIgKTsgfQotCi0gICAgICAgIGF1dG8gZ2V0SGVscENvbHVtbnMoKSBjb25zdCAtPiBz dGQ6OnZlY3RvcjxIZWxwQ29sdW1ucz4gewotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SGVscENv bHVtbnM+IGNvbHM7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QgJm8gOiBtX29wdGlvbnMp IHsKLSAgICAgICAgICAgICAgICBhdXRvIGNoaWxkQ29scyA9IG8uZ2V0SGVscENvbHVtbnMoKTsK LSAgICAgICAgICAgICAgICBjb2xzLmluc2VydCggY29scy5lbmQoKSwgY2hpbGRDb2xzLmJlZ2lu KCksIGNoaWxkQ29scy5lbmQoKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJu IGNvbHM7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVG9TdHJlYW0oIHN0ZDo6b3N0 cmVhbSAmb3MgKSBjb25zdCB7Ci0gICAgICAgICAgICBpZiAoIW1fZXhlTmFtZS5uYW1lKCkuZW1w dHkoKSkgewotICAgICAgICAgICAgICAgIG9zIDw8ICJ1c2FnZTpcbiIgPDwgIiAgIiA8PCBtX2V4 ZU5hbWUubmFtZSgpIDw8ICIgIjsKLSAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkID0gdHJ1 ZSwgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciggYXV0byBjb25zdCAmYXJnIDog bV9hcmdzICkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAg ICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAg ICAgICAgICAgICAgICAgICAgICBvcyA8PCAiICI7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBh cmcuaXNPcHRpb25hbCgpICYmIHJlcXVpcmVkICkgewotICAgICAgICAgICAgICAgICAgICAgICAg b3MgPDwgIlsiOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSBmYWxzZTsKLSAg ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgYXJn LmhpbnQoKSA8PCAiPiI7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBhcmcuY2FyZGluYWxpdHko KSA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgLi4uICI7Ci0gICAgICAg ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCAhcmVxdWlyZWQgKQotICAgICAgICAgICAg ICAgICAgICBvcyA8PCAiXSI7Ci0gICAgICAgICAgICAgICAgaWYoICFtX29wdGlvbnMuZW1wdHko KSApCi0gICAgICAgICAgICAgICAgICAgIG9zIDw8ICIgb3B0aW9ucyI7Ci0gICAgICAgICAgICAg ICAgb3MgPDwgIlxuXG53aGVyZSBvcHRpb25zIGFyZToiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAg ICAgIH0KLQotICAgICAgICAgICAgYXV0byByb3dzID0gZ2V0SGVscENvbHVtbnMoKTsKLSAgICAg ICAgICAgIHNpemVfdCBjb25zb2xlV2lkdGggPSBDQVRDSF9DTEFSQV9DT05GSUdfQ09OU09MRV9X SURUSDsKLSAgICAgICAgICAgIHNpemVfdCBvcHRXaWR0aCA9IDA7Ci0gICAgICAgICAgICBmb3Io IGF1dG8gY29uc3QgJmNvbHMgOiByb3dzICkKLSAgICAgICAgICAgICAgICBvcHRXaWR0aCA9IChz dGQ6Om1heCkob3B0V2lkdGgsIGNvbHMubGVmdC5zaXplKCkgKyAyKTsKLQotICAgICAgICAgICAg b3B0V2lkdGggPSAoc3RkOjptaW4pKG9wdFdpZHRoLCBjb25zb2xlV2lkdGgvMik7Ci0KLSAgICAg ICAgICAgIGZvciggYXV0byBjb25zdCAmY29scyA6IHJvd3MgKSB7Ci0gICAgICAgICAgICAgICAg YXV0byByb3cgPQotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZsb3c6OkNvbHVtbiggY29s cy5sZWZ0ICkud2lkdGgoIG9wdFdpZHRoICkuaW5kZW50KCAyICkgKwotICAgICAgICAgICAgICAg ICAgICAgICAgVGV4dEZsb3c6OlNwYWNlcig0KSArCi0gICAgICAgICAgICAgICAgICAgICAgICBU ZXh0Rmxvdzo6Q29sdW1uKCBjb2xzLnJpZ2h0ICkud2lkdGgoIGNvbnNvbGVXaWR0aCAtIDcgLSBv cHRXaWR0aCApOwotICAgICAgICAgICAgICAgIG9zIDw8IHJvdyA8PCBzdGQ6OmVuZGw7Ci0gICAg ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmcmllbmQgYXV0byBvcGVyYXRvcjw8KCBz dGQ6Om9zdHJlYW0gJm9zLCBQYXJzZXIgY29uc3QgJnBhcnNlciApIC0+IHN0ZDo6b3N0cmVhbSYg ewotICAgICAgICAgICAgcGFyc2VyLndyaXRlVG9TdHJlYW0oIG9zICk7Ci0gICAgICAgICAgICBy ZXR1cm4gb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIHZhbGlkYXRlKCkgY29uc3QgLT4g UmVzdWx0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIGZvciggYXV0byBjb25zdCAmb3B0IDogbV9v cHRpb25zICkgewotICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gb3B0LnZhbGlkYXRlKCk7 Ci0gICAgICAgICAgICAgICAgaWYoICFyZXN1bHQgKQotICAgICAgICAgICAgICAgICAgICByZXR1 cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKCBhdXRvIGNvbnN0ICZh cmcgOiBtX2FyZ3MgKSB7Ci0gICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBhcmcudmFsaWRh dGUoKTsKLSAgICAgICAgICAgICAgICBpZiggIXJlc3VsdCApCi0gICAgICAgICAgICAgICAgICAg IHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUmVzdWx0 OjpvaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdXNpbmcgUGFyc2VyQmFzZTo6cGFyc2U7Ci0K LSAgICAgICAgYXV0byBwYXJzZSggc3RkOjpzdHJpbmcgY29uc3QmIGV4ZU5hbWUsIFRva2VuU3Ry ZWFtIGNvbnN0ICZ0b2tlbnMgKSBjb25zdCAtPiBJbnRlcm5hbFBhcnNlUmVzdWx0IG92ZXJyaWRl IHsKLQotICAgICAgICAgICAgc3RydWN0IFBhcnNlckluZm8gewotICAgICAgICAgICAgICAgIFBh cnNlckJhc2UgY29uc3QqIHBhcnNlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgc2l6ZV90 IGNvdW50ID0gMDsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBjb25zdCBzaXplX3QgdG90 YWxQYXJzZXJzID0gbV9vcHRpb25zLnNpemUoKSArIG1fYXJncy5zaXplKCk7Ci0gICAgICAgICAg ICBhc3NlcnQoIHRvdGFsUGFyc2VycyA8IDUxMiApOwotICAgICAgICAgICAgLy8gUGFyc2VySW5m byBwYXJzZUluZm9zW3RvdGFsUGFyc2Vyc107IC8vIDwtLSB0aGlzIGlzIHdoYXQgd2UgcmVhbGx5 IHdhbnQgdG8gZG8KLSAgICAgICAgICAgIFBhcnNlckluZm8gcGFyc2VJbmZvc1s1MTJdOwotCi0g ICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOwotICAgICAgICAgICAg ICAgIGZvciAoYXV0byBjb25zdCAmb3B0IDogbV9vcHRpb25zKSBwYXJzZUluZm9zW2krK10ucGFy c2VyID0gJm9wdDsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QgJmFyZyA6IG1fYXJn cykgcGFyc2VJbmZvc1tpKytdLnBhcnNlciA9ICZhcmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg ICAgICAgIG1fZXhlTmFtZS5zZXQoIGV4ZU5hbWUgKTsKLQotICAgICAgICAgICAgYXV0byByZXN1 bHQgPSBJbnRlcm5hbFBhcnNlUmVzdWx0OjpvayggUGFyc2VTdGF0ZSggUGFyc2VSZXN1bHRUeXBl OjpOb01hdGNoLCB0b2tlbnMgKSApOwotICAgICAgICAgICAgd2hpbGUoIHJlc3VsdC52YWx1ZSgp LnJlbWFpbmluZ1Rva2VucygpICkgewotICAgICAgICAgICAgICAgIGJvb2wgdG9rZW5QYXJzZWQg PSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGZvciggc2l6ZV90IGkgPSAwOyBpIDwgdG90YWxQ YXJzZXJzOyArK2kgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mICBwYXJzZUluZm8gPSBw YXJzZUluZm9zW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiggcGFyc2VJbmZvLnBhcnNlci0+ Y2FyZGluYWxpdHkoKSA9PSAwIHx8IHBhcnNlSW5mby5jb3VudCA8IHBhcnNlSW5mby5wYXJzZXIt PmNhcmRpbmFsaXR5KCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJz ZUluZm8ucGFyc2VyLT5wYXJzZShleGVOYW1lLCByZXN1bHQudmFsdWUoKS5yZW1haW5pbmdUb2tl bnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAg aWYgKHJlc3VsdC52YWx1ZSgpLnR5cGUoKSAhPSBQYXJzZVJlc3VsdFR5cGU6Ok5vTWF0Y2gpIHsK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblBhcnNlZCA9IHRydWU7Ci0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgKytwYXJzZUluZm8uY291bnQ7Ci0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcmVz dWx0LnZhbHVlKCkudHlwZSgpID09IFBhcnNlUmVzdWx0VHlwZTo6U2hvcnRDaXJjdWl0QWxsICkK LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICBpZigg IXRva2VuUGFyc2VkICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVybmFsUGFyc2VS ZXN1bHQ6OnJ1bnRpbWVFcnJvciggIlVucmVjb2duaXNlZCB0b2tlbjogIiArIHJlc3VsdC52YWx1 ZSgpLnJlbWFpbmluZ1Rva2VucygpLT50b2tlbiApOwotICAgICAgICAgICAgfQotICAgICAgICAg ICAgLy8gIVRCRCBDaGVjayBtaXNzaW5nIHJlcXVpcmVkIG9wdGlvbnMKLSAgICAgICAgICAgIHJl dHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUg RGVyaXZlZFQ+Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBhdXRvIENvbXBvc2FibGVQ YXJzZXJJbXBsPERlcml2ZWRUPjo6b3BlcmF0b3J8KCBUIGNvbnN0ICZvdGhlciApIGNvbnN0IC0+ IFBhcnNlciB7Ci0gICAgICAgIHJldHVybiBQYXJzZXIoKSB8IHN0YXRpY19jYXN0PERlcml2ZWRU IGNvbnN0ICY+KCAqdGhpcyApIHwgb3RoZXI7Ci0gICAgfQotfSAvLyBuYW1lc3BhY2UgZGV0YWls Ci0KLS8vIEEgQ29tYmluZWQgcGFyc2VyCi11c2luZyBkZXRhaWw6OlBhcnNlcjsKLQotLy8gQSBw YXJzZXIgZm9yIG9wdGlvbnMKLXVzaW5nIGRldGFpbDo6T3B0OwotCi0vLyBBIHBhcnNlciBmb3Ig YXJndW1lbnRzCi11c2luZyBkZXRhaWw6OkFyZzsKLQotLy8gV3JhcHBlciBmb3IgYXJnYywgYXJn diBmcm9tIG1haW4oKQotdXNpbmcgZGV0YWlsOjpBcmdzOwotCi0vLyBTcGVjaWZpZXMgdGhlIG5h bWUgb2YgdGhlIGV4ZWN1dGFibGUKLXVzaW5nIGRldGFpbDo6RXhlTmFtZTsKLQotLy8gQ29udmVu aWVuY2Ugd3JhcHBlciBmb3Igb3B0aW9uIHBhcnNlciB0aGF0IHNwZWNpZmllcyB0aGUgaGVscCBv cHRpb24KLXVzaW5nIGRldGFpbDo6SGVscDsKLQotLy8gZW51bSBvZiByZXN1bHQgdHlwZXMgZnJv bSBhIHBhcnNlCi11c2luZyBkZXRhaWw6OlBhcnNlUmVzdWx0VHlwZTsKLQotLy8gUmVzdWx0IHR5 cGUgZm9yIHBhcnNlciBvcGVyYXRpb24KLXVzaW5nIGRldGFpbDo6UGFyc2VyUmVzdWx0OwotCi19 fSAvLyBuYW1lc3BhY2UgQ2F0Y2g6OmNsYXJhCi0KLS8vIGVuZCBjbGFyYS5ocHAKLSNpZmRlZiBf X2NsYW5nX18KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLSNlbmRpZgotCi0vLyBSZXN0 b3JlIENsYXJhJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGgsIGlmIHByZXNlbnQKLSNpZmRlZiBD QVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICi0jZGVmaW5lIENBVENIX0NMQVJB X1RFWFRGTE9XX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NP TlNPTEVfV0lEVEgKLSN1bmRlZiBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRI Ci0jZW5kaWYKLQotLy8gZW5kIGNhdGNoX2NsYXJhLmgKLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAg ICBjbGFyYTo6UGFyc2VyIG1ha2VDb21tYW5kTGluZVBhcnNlciggQ29uZmlnRGF0YSYgY29uZmln ICk7Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfY29tbWFuZGxp bmUuaAotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0KLW5hbWVzcGFjZSBD YXRjaCB7Ci0KLSAgICBjbGFyYTo6UGFyc2VyIG1ha2VDb21tYW5kTGluZVBhcnNlciggQ29uZmln RGF0YSYgY29uZmlnICkgewotCi0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSBjbGFyYTsKLQotICAg ICAgICBhdXRvIGNvbnN0IHNldFdhcm5pbmcgPSBbJl0oIHN0ZDo6c3RyaW5nIGNvbnN0JiB3YXJu aW5nICkgewotICAgICAgICAgICAgICAgIGF1dG8gd2FybmluZ1NldCA9IFsmXSgpIHsKLSAgICAg ICAgICAgICAgICAgICAgaWYoIHdhcm5pbmcgPT0gIk5vQXNzZXJ0aW9ucyIgKQotICAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zOwotCi0gICAgICAg ICAgICAgICAgICAgIGlmICggd2FybmluZyA9PSAiTm9UZXN0cyIgKQotICAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIFdhcm5BYm91dDo6Tm9UZXN0czsKLQotICAgICAgICAgICAgICAgICAg ICByZXR1cm4gV2FybkFib3V0OjpOb3RoaW5nOwotICAgICAgICAgICAgICAgIH0oKTsKLQotICAg ICAgICAgICAgICAgIGlmICh3YXJuaW5nU2V0ID09IFdhcm5BYm91dDo6Tm90aGluZykKLSAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6cnVudGltZUVycm9yKCAiVW5yZWNv Z25pc2VkIHdhcm5pbmc6ICciICsgd2FybmluZyArICInIiApOwotICAgICAgICAgICAgICAgIGNv bmZpZy53YXJuaW5ncyA9IHN0YXRpY19jYXN0PFdhcm5BYm91dDo6V2hhdD4oIGNvbmZpZy53YXJu aW5ncyB8IHdhcm5pbmdTZXQgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0 OjpvayggUGFyc2VSZXN1bHRUeXBlOjpNYXRjaGVkICk7Ci0gICAgICAgICAgICB9OwotICAgICAg ICBhdXRvIGNvbnN0IGxvYWRUZXN0TmFtZXNGcm9tRmlsZSA9IFsmXSggc3RkOjpzdHJpbmcgY29u c3QmIGZpbGVuYW1lICkgewotICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZiggZmlsZW5h bWUuY19zdHIoKSApOwotICAgICAgICAgICAgICAgIGlmKCAhZi5pc19vcGVuKCkgKQotICAgICAg ICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJVbmFibGUg dG8gbG9hZCBpbnB1dCBmaWxlOiAnIiArIGZpbGVuYW1lICsgIiciICk7Ci0KLSAgICAgICAgICAg ICAgICBzdGQ6OnN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIHdoaWxlKCBzdGQ6OmdldGxp bmUoIGYsIGxpbmUgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IHRyaW0obGluZSk7 Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhbGluZS5lbXB0eSgpICYmICFzdGFydHNXaXRoKCBs aW5lLCAnIycgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhc3RhcnRzV2l0aCgg bGluZSwgJyInICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnIicgKyBs aW5lICsgJyInOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRlc3RzT3JUYWdzLnB1 c2hfYmFjayggbGluZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRlc3RzT3JU YWdzLmVtcGxhY2VfYmFjayggIiwiICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9SZW1vdmUgY29tbWEgaW4gdGhlIGVuZAotICAg ICAgICAgICAgICAgIGlmKCFjb25maWcudGVzdHNPclRhZ3MuZW1wdHkoKSkKLSAgICAgICAgICAg ICAgICAgICAgY29uZmlnLnRlc3RzT3JUYWdzLmVyYXNlKCBjb25maWcudGVzdHNPclRhZ3MuZW5k KCktMSApOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6b2soIFBhcnNl UmVzdWx0VHlwZTo6TWF0Y2hlZCApOwotICAgICAgICAgICAgfTsKLSAgICAgICAgYXV0byBjb25z dCBzZXRUZXN0T3JkZXIgPSBbJl0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcmRlciApIHsKLSAgICAg ICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggImRlY2xhcmVkIiwgb3JkZXIgKSApCi0gICAgICAg ICAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3Jk ZXI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0aCggImxleGljYWwiLCBvcmRl ciApICkKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6Oklu TGV4aWNvZ3JhcGhpY2FsT3JkZXI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0 aCggInJhbmRvbSIsIG9yZGVyICkgKQotICAgICAgICAgICAgICAgICAgICBjb25maWcucnVuT3Jk ZXIgPSBSdW5UZXN0czo6SW5SYW5kb21PcmRlcjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAg ICAgICAgICAgICAgICAgIHJldHVybiBjbGFyYTo6UGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3Io ICJVbnJlY29nbmlzZWQgb3JkZXJpbmc6ICciICsgb3JkZXIgKyAiJyIgKTsKLSAgICAgICAgICAg ICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpvayggUGFyc2VSZXN1bHRUeXBlOjpNYXRjaGVkICk7 Ci0gICAgICAgICAgICB9OwotICAgICAgICBhdXRvIGNvbnN0IHNldFJuZ1NlZWQgPSBbJl0oIHN0 ZDo6c3RyaW5nIGNvbnN0JiBzZWVkICkgewotICAgICAgICAgICAgICAgIGlmKCBzZWVkICE9ICJ0 aW1lIiApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFyYTo6ZGV0YWlsOjpjb252ZXJ0 SW50byggc2VlZCwgY29uZmlnLnJuZ1NlZWQgKTsKLSAgICAgICAgICAgICAgICBjb25maWcucm5n U2VlZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHN0ZDo6dGltZShudWxscHRyKSApOwot ICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6 Ok1hdGNoZWQgKTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIGF1dG8gY29uc3Qgc2V0Q29sb3Vy VXNhZ2UgPSBbJl0oIHN0ZDo6c3RyaW5nIGNvbnN0JiB1c2VDb2xvdXIgKSB7Ci0gICAgICAgICAg ICAgICAgICAgIGF1dG8gbW9kZSA9IHRvTG93ZXIoIHVzZUNvbG91ciApOwotCi0gICAgICAgICAg ICAgICAgICAgIGlmKCBtb2RlID09ICJ5ZXMiICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNv bmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OlllczsKLSAgICAgICAgICAgICAgICAgICAgZWxz ZSBpZiggbW9kZSA9PSAibm8iICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy51c2VD b2xvdXIgPSBVc2VDb2xvdXI6Ok5vOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBtb2Rl ID09ICJhdXRvIiApCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0g VXNlQ29sb3VyOjpBdXRvOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJjb2xvdXIgbW9k ZSBtdXN0IGJlIG9uZSBvZjogYXV0bywgeWVzIG9yIG5vLiAnIiArIHVzZUNvbG91ciArICInIG5v dCByZWNvZ25pc2VkIiApOwotICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZXJSZXN1bHQ6Om9r KCBQYXJzZVJlc3VsdFR5cGU6Ok1hdGNoZWQgKTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIGF1 dG8gY29uc3Qgc2V0V2FpdEZvcktleXByZXNzID0gWyZdKCBzdGQ6OnN0cmluZyBjb25zdCYga2V5 cHJlc3MgKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBrZXlwcmVzc0xjID0gdG9Mb3dlcigga2V5 cHJlc3MgKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5cHJlc3NMYyA9PSAibmV2ZXIiKQotICAg ICAgICAgICAgICAgICAgICBjb25maWcud2FpdEZvcktleXByZXNzID0gV2FpdEZvcktleXByZXNz OjpOZXZlcjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBrZXlwcmVzc0xjID09ICJzdGFydCIg KQotICAgICAgICAgICAgICAgICAgICBjb25maWcud2FpdEZvcktleXByZXNzID0gV2FpdEZvcktl eXByZXNzOjpCZWZvcmVTdGFydDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBrZXlwcmVzc0xj ID09ICJleGl0IiApCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy53YWl0Rm9yS2V5cHJlc3Mg PSBXYWl0Rm9yS2V5cHJlc3M6OkJlZm9yZUV4aXQ7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZigg a2V5cHJlc3NMYyA9PSAiYm90aCIgKQotICAgICAgICAgICAgICAgICAgICBjb25maWcud2FpdEZv cktleXByZXNzID0gV2FpdEZvcktleXByZXNzOjpCZWZvcmVTdGFydEFuZEV4aXQ7Ci0gICAgICAg ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0Ojpy dW50aW1lRXJyb3IoICJrZXlwcmVzcyBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZjogbmV2ZXIsIHN0 YXJ0LCBleGl0IG9yIGJvdGguICciICsga2V5cHJlc3MgKyAiJyBub3QgcmVjb2duaXNlZCIgKTsK LSAgICAgICAgICAgIHJldHVybiBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6Ok1h dGNoZWQgKTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIGF1dG8gY29uc3Qgc2V0VmVyYm9zaXR5 ID0gWyZdKCBzdGQ6OnN0cmluZyBjb25zdCYgdmVyYm9zaXR5ICkgewotICAgICAgICAgICAgYXV0 byBsY1ZlcmJvc2l0eSA9IHRvTG93ZXIoIHZlcmJvc2l0eSApOwotICAgICAgICAgICAgaWYoIGxj VmVyYm9zaXR5ID09ICJxdWlldCIgKQotICAgICAgICAgICAgICAgIGNvbmZpZy52ZXJib3NpdHkg PSBWZXJib3NpdHk6OlF1aWV0OwotICAgICAgICAgICAgZWxzZSBpZiggbGNWZXJib3NpdHkgPT0g Im5vcm1hbCIgKQotICAgICAgICAgICAgICAgIGNvbmZpZy52ZXJib3NpdHkgPSBWZXJib3NpdHk6 Ok5vcm1hbDsKLSAgICAgICAgICAgIGVsc2UgaWYoIGxjVmVyYm9zaXR5ID09ICJoaWdoIiApCi0g ICAgICAgICAgICAgICAgY29uZmlnLnZlcmJvc2l0eSA9IFZlcmJvc2l0eTo6SGlnaDsKLSAgICAg ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VyUmVzdWx0OjpydW50aW1l RXJyb3IoICJVbnJlY29nbmlzZWQgdmVyYm9zaXR5LCAnIiArIHZlcmJvc2l0eSArICInIiApOwot ICAgICAgICAgICAgcmV0dXJuIFBhcnNlclJlc3VsdDo6b2soIFBhcnNlUmVzdWx0VHlwZTo6TWF0 Y2hlZCApOwotICAgICAgICB9OwotICAgICAgICBhdXRvIGNvbnN0IHNldFJlcG9ydGVyID0gWyZd KCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwb3J0ZXIgKSB7Ci0gICAgICAgICAgICBJUmVwb3J0ZXJS ZWdpc3RyeTo6RmFjdG9yeU1hcCBjb25zdCYgZmFjdG9yaWVzID0gZ2V0UmVnaXN0cnlIdWIoKS5n ZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0RmFjdG9yaWVzKCk7Ci0KLSAgICAgICAgICAgIGF1dG8g bGNSZXBvcnRlciA9IHRvTG93ZXIoIHJlcG9ydGVyICk7Ci0gICAgICAgICAgICBhdXRvIHJlc3Vs dCA9IGZhY3Rvcmllcy5maW5kKCBsY1JlcG9ydGVyICk7Ci0KLSAgICAgICAgICAgIGlmKCBmYWN0 b3JpZXMuZW5kKCkgIT0gcmVzdWx0ICkKLSAgICAgICAgICAgICAgICBjb25maWcucmVwb3J0ZXJO YW1lID0gbGNSZXBvcnRlcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1 cm4gUGFyc2VyUmVzdWx0OjpydW50aW1lRXJyb3IoICJVbnJlY29nbml6ZWQgcmVwb3J0ZXIsICci ICsgcmVwb3J0ZXIgKyAiJy4gQ2hlY2sgYXZhaWxhYmxlIHdpdGggLS1saXN0LXJlcG9ydGVycyIg KTsKLSAgICAgICAgICAgIHJldHVybiBQYXJzZXJSZXN1bHQ6Om9rKCBQYXJzZVJlc3VsdFR5cGU6 Ok1hdGNoZWQgKTsKLSAgICAgICAgfTsKLQotICAgICAgICBhdXRvIGNsaQotICAgICAgICAgICAg PSBFeGVOYW1lKCBjb25maWcucHJvY2Vzc05hbWUgKQotICAgICAgICAgICAgfCBIZWxwKCBjb25m aWcuc2hvd0hlbHAgKQotICAgICAgICAgICAgfCBPcHQoIGNvbmZpZy5saXN0VGVzdHMgKQotICAg ICAgICAgICAgICAgIFsiLWwiXVsiLS1saXN0LXRlc3RzIl0KLSAgICAgICAgICAgICAgICAoICJs aXN0IGFsbC9tYXRjaGluZyB0ZXN0IGNhc2VzIiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmln Lmxpc3RUYWdzICkKLSAgICAgICAgICAgICAgICBbIi10Il1bIi0tbGlzdC10YWdzIl0KLSAgICAg ICAgICAgICAgICAoICJsaXN0IGFsbC9tYXRjaGluZyB0YWdzIiApCi0gICAgICAgICAgICB8IE9w dCggY29uZmlnLnNob3dTdWNjZXNzZnVsVGVzdHMgKQotICAgICAgICAgICAgICAgIFsiLXMiXVsi LS1zdWNjZXNzIl0KLSAgICAgICAgICAgICAgICAoICJpbmNsdWRlIHN1Y2Nlc3NmdWwgdGVzdHMg aW4gb3V0cHV0IiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLnNob3VsZERlYnVnQnJlYWsg KQotICAgICAgICAgICAgICAgIFsiLWIiXVsiLS1icmVhayJdCi0gICAgICAgICAgICAgICAgKCAi YnJlYWsgaW50byBkZWJ1Z2dlciBvbiBmYWlsdXJlIiApCi0gICAgICAgICAgICB8IE9wdCggY29u ZmlnLm5vVGhyb3cgKQotICAgICAgICAgICAgICAgIFsiLWUiXVsiLS1ub3Rocm93Il0KLSAgICAg ICAgICAgICAgICAoICJza2lwIGV4Y2VwdGlvbiB0ZXN0cyIgKQotICAgICAgICAgICAgfCBPcHQo IGNvbmZpZy5zaG93SW52aXNpYmxlcyApCi0gICAgICAgICAgICAgICAgWyItaSJdWyItLWludmlz aWJsZXMiXQotICAgICAgICAgICAgICAgICggInNob3cgaW52aXNpYmxlcyAodGFicywgbmV3bGlu ZXMpIiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLm91dHB1dEZpbGVuYW1lLCAiZmlsZW5h bWUiICkKLSAgICAgICAgICAgICAgICBbIi1vIl1bIi0tb3V0Il0KLSAgICAgICAgICAgICAgICAo ICJvdXRwdXQgZmlsZW5hbWUiICkKLSAgICAgICAgICAgIHwgT3B0KCBzZXRSZXBvcnRlciwgIm5h bWUiICkKLSAgICAgICAgICAgICAgICBbIi1yIl1bIi0tcmVwb3J0ZXIiXQotICAgICAgICAgICAg ICAgICggInJlcG9ydGVyIHRvIHVzZSAoZGVmYXVsdHMgdG8gY29uc29sZSkiICkKLSAgICAgICAg ICAgIHwgT3B0KCBjb25maWcubmFtZSwgIm5hbWUiICkKLSAgICAgICAgICAgICAgICBbIi1uIl1b Ii0tbmFtZSJdCi0gICAgICAgICAgICAgICAgKCAic3VpdGUgbmFtZSIgKQotICAgICAgICAgICAg fCBPcHQoIFsmXSggYm9vbCApeyBjb25maWcuYWJvcnRBZnRlciA9IDE7IH0gKQotICAgICAgICAg ICAgICAgIFsiLWEiXVsiLS1hYm9ydCJdCi0gICAgICAgICAgICAgICAgKCAiYWJvcnQgYXQgZmly c3QgZmFpbHVyZSIgKQotICAgICAgICAgICAgfCBPcHQoIFsmXSggaW50IHggKXsgY29uZmlnLmFi b3J0QWZ0ZXIgPSB4OyB9LCAibm8uIGZhaWx1cmVzIiApCi0gICAgICAgICAgICAgICAgWyIteCJd WyItLWFib3J0eCJdCi0gICAgICAgICAgICAgICAgKCAiYWJvcnQgYWZ0ZXIgeCBmYWlsdXJlcyIg KQotICAgICAgICAgICAgfCBPcHQoIHNldFdhcm5pbmcsICJ3YXJuaW5nIG5hbWUiICkKLSAgICAg ICAgICAgICAgICBbIi13Il1bIi0td2FybiJdCi0gICAgICAgICAgICAgICAgKCAiZW5hYmxlIHdh cm5pbmdzIiApCi0gICAgICAgICAgICB8IE9wdCggWyZdKCBib29sIGZsYWcgKSB7IGNvbmZpZy5z aG93RHVyYXRpb25zID0gZmxhZyA/IFNob3dEdXJhdGlvbnM6OkFsd2F5cyA6IFNob3dEdXJhdGlv bnM6Ok5ldmVyOyB9LCAieWVzfG5vIiApCi0gICAgICAgICAgICAgICAgWyItZCJdWyItLWR1cmF0 aW9ucyJdCi0gICAgICAgICAgICAgICAgKCAic2hvdyB0ZXN0IGR1cmF0aW9ucyIgKQotICAgICAg ICAgICAgfCBPcHQoIGNvbmZpZy5taW5EdXJhdGlvbiwgInNlY29uZHMiICkKLSAgICAgICAgICAg ICAgICBbIi1EIl1bIi0tbWluLWR1cmF0aW9uIl0KLSAgICAgICAgICAgICAgICAoICJzaG93IHRl c3QgZHVyYXRpb25zIGZvciB0ZXN0cyB0YWtpbmcgYXQgbGVhc3QgdGhlIGdpdmVuIG51bWJlciBv ZiBzZWNvbmRzIiApCi0gICAgICAgICAgICB8IE9wdCggbG9hZFRlc3ROYW1lc0Zyb21GaWxlLCAi ZmlsZW5hbWUiICkKLSAgICAgICAgICAgICAgICBbIi1mIl1bIi0taW5wdXQtZmlsZSJdCi0gICAg ICAgICAgICAgICAgKCAibG9hZCB0ZXN0IG5hbWVzIHRvIHJ1biBmcm9tIGEgZmlsZSIgKQotICAg ICAgICAgICAgfCBPcHQoIGNvbmZpZy5maWxlbmFtZXNBc1RhZ3MgKQotICAgICAgICAgICAgICAg IFsiLSMiXVsiLS1maWxlbmFtZXMtYXMtdGFncyJdCi0gICAgICAgICAgICAgICAgKCAiYWRkcyBh IHRhZyBmb3IgdGhlIGZpbGVuYW1lIiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLnNlY3Rp b25zVG9SdW4sICJzZWN0aW9uIG5hbWUiICkKLSAgICAgICAgICAgICAgICBbIi1jIl1bIi0tc2Vj dGlvbiJdCi0gICAgICAgICAgICAgICAgKCAic3BlY2lmeSBzZWN0aW9uIHRvIHJ1biIgKQotICAg ICAgICAgICAgfCBPcHQoIHNldFZlcmJvc2l0eSwgInF1aWV0fG5vcm1hbHxoaWdoIiApCi0gICAg ICAgICAgICAgICAgWyItdiJdWyItLXZlcmJvc2l0eSJdCi0gICAgICAgICAgICAgICAgKCAic2V0 IG91dHB1dCB2ZXJib3NpdHkiICkKLSAgICAgICAgICAgIHwgT3B0KCBjb25maWcubGlzdFRlc3RO YW1lc09ubHkgKQotICAgICAgICAgICAgICAgIFsiLS1saXN0LXRlc3QtbmFtZXMtb25seSJdCi0g ICAgICAgICAgICAgICAgKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGVzdCBjYXNlcyBuYW1lcyBvbmx5 IiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLmxpc3RSZXBvcnRlcnMgKQotICAgICAgICAg ICAgICAgIFsiLS1saXN0LXJlcG9ydGVycyJdCi0gICAgICAgICAgICAgICAgKCAibGlzdCBhbGwg cmVwb3J0ZXJzIiApCi0gICAgICAgICAgICB8IE9wdCggc2V0VGVzdE9yZGVyLCAiZGVjbHxsZXh8 cmFuZCIgKQotICAgICAgICAgICAgICAgIFsiLS1vcmRlciJdCi0gICAgICAgICAgICAgICAgKCAi dGVzdCBjYXNlIG9yZGVyIChkZWZhdWx0cyB0byBkZWNsKSIgKQotICAgICAgICAgICAgfCBPcHQo IHNldFJuZ1NlZWQsICIndGltZSd8bnVtYmVyIiApCi0gICAgICAgICAgICAgICAgWyItLXJuZy1z ZWVkIl0KLSAgICAgICAgICAgICAgICAoICJzZXQgYSBzcGVjaWZpYyBzZWVkIGZvciByYW5kb20g bnVtYmVycyIgKQotICAgICAgICAgICAgfCBPcHQoIHNldENvbG91clVzYWdlLCAieWVzfG5vIiAp Ci0gICAgICAgICAgICAgICAgWyItLXVzZS1jb2xvdXIiXQotICAgICAgICAgICAgICAgICggInNo b3VsZCBvdXRwdXQgYmUgY29sb3VyaXNlZCIgKQotICAgICAgICAgICAgfCBPcHQoIGNvbmZpZy5s aWJJZGVudGlmeSApCi0gICAgICAgICAgICAgICAgWyItLWxpYmlkZW50aWZ5Il0KLSAgICAgICAg ICAgICAgICAoICJyZXBvcnQgbmFtZSBhbmQgdmVyc2lvbiBhY2NvcmRpbmcgdG8gbGliaWRlbnRp Znkgc3RhbmRhcmQiICkKLSAgICAgICAgICAgIHwgT3B0KCBzZXRXYWl0Rm9yS2V5cHJlc3MsICJu ZXZlcnxzdGFydHxleGl0fGJvdGgiICkKLSAgICAgICAgICAgICAgICBbIi0td2FpdC1mb3Ita2V5 cHJlc3MiXQotICAgICAgICAgICAgICAgICggIndhaXRzIGZvciBhIGtleXByZXNzIGJlZm9yZSBl eGl0aW5nIiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLmJlbmNobWFya1NhbXBsZXMsICJz YW1wbGVzIiApCi0gICAgICAgICAgICAgICAgWyItLWJlbmNobWFyay1zYW1wbGVzIl0KLSAgICAg ICAgICAgICAgICAoICJudW1iZXIgb2Ygc2FtcGxlcyB0byBjb2xsZWN0IChkZWZhdWx0OiAxMDAp IiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLmJlbmNobWFya1Jlc2FtcGxlcywgInJlc2Ft cGxlcyIgKQotICAgICAgICAgICAgICAgIFsiLS1iZW5jaG1hcmstcmVzYW1wbGVzIl0KLSAgICAg ICAgICAgICAgICAoICJudW1iZXIgb2YgcmVzYW1wbGVzIGZvciB0aGUgYm9vdHN0cmFwIChkZWZh dWx0OiAxMDAwMDApIiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLmJlbmNobWFya0NvbmZp ZGVuY2VJbnRlcnZhbCwgImNvbmZpZGVuY2UgaW50ZXJ2YWwiICkKLSAgICAgICAgICAgICAgICBb Ii0tYmVuY2htYXJrLWNvbmZpZGVuY2UtaW50ZXJ2YWwiXQotICAgICAgICAgICAgICAgICggImNv bmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBib290c3RyYXAgKGJldHdlZW4gMCBhbmQgMSwgZGVm YXVsdDogMC45NSkiICkKLSAgICAgICAgICAgIHwgT3B0KCBjb25maWcuYmVuY2htYXJrTm9BbmFs eXNpcyApCi0gICAgICAgICAgICAgICAgWyItLWJlbmNobWFyay1uby1hbmFseXNpcyJdCi0gICAg ICAgICAgICAgICAgKCAicGVyZm9ybSBvbmx5IG1lYXN1cmVtZW50czsgZG8gbm90IHBlcmZvcm0g YW55IGFuYWx5c2lzIiApCi0gICAgICAgICAgICB8IE9wdCggY29uZmlnLmJlbmNobWFya1dhcm11 cFRpbWUsICJiZW5jaG1hcmtXYXJtdXBUaW1lIiApCi0gICAgICAgICAgICAgICAgWyItLWJlbmNo bWFyay13YXJtdXAtdGltZSJdCi0gICAgICAgICAgICAgICAgKCAiYW1vdW50IG9mIHRpbWUgaW4g bWlsbGlzZWNvbmRzIHNwZW50IG9uIHdhcm1pbmcgdXAgZWFjaCB0ZXN0IChkZWZhdWx0OiAxMDAp IiApCi0gICAgICAgICAgICB8IEFyZyggY29uZmlnLnRlc3RzT3JUYWdzLCAidGVzdCBuYW1lfHBh dHRlcm58dGFncyIgKQotICAgICAgICAgICAgICAgICggIndoaWNoIHRlc3Qgb3IgdGVzdHMgdG8g dXNlIiApOwotCi0gICAgICAgIHJldHVybiBjbGk7Ci0gICAgfQotCi19IC8vIGVuZCBuYW1lc3Bh Y2UgQ2F0Y2gKLS8vIGVuZCBjYXRjaF9jb21tYW5kbGluZS5jcHAKLS8vIHN0YXJ0IGNhdGNoX2Nv bW1vbi5jcHAKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLQotbmFt ZXNwYWNlIENhdGNoIHsKLQotICAgIGJvb2wgU291cmNlTGluZUluZm86Om9wZXJhdG9yID09ICgg U291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3Qgbm9leGNlcHQgewotICAgICAgICBy ZXR1cm4gbGluZSA9PSBvdGhlci5saW5lICYmIChmaWxlID09IG90aGVyLmZpbGUgfHwgc3RkOjpz dHJjbXAoZmlsZSwgb3RoZXIuZmlsZSkgPT0gMCk7Ci0gICAgfQotICAgIGJvb2wgU291cmNlTGlu ZUluZm86Om9wZXJhdG9yIDwgKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCBu b2V4Y2VwdCB7Ci0gICAgICAgIC8vIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgc2FtZSBmaWxlIHdp bGwgdXN1YWxseSBoYXZlIHRoZSBzYW1lIHBvaW50ZXIuCi0gICAgICAgIC8vIFRodXMsIGlmIHRo ZSBwb2ludGVycyBhcmUgdGhlIHNhbWUsIHRoZXJlIGlzIG5vIHBvaW50IGluIGNhbGxpbmcgdGhl IHN0cmNtcAotICAgICAgICByZXR1cm4gbGluZSA8IG90aGVyLmxpbmUgfHwgKCBsaW5lID09IG90 aGVyLmxpbmUgJiYgZmlsZSAhPSBvdGhlci5maWxlICYmIChzdGQ6OnN0cmNtcChmaWxlLCBvdGhl ci5maWxlKSA8IDApKTsKLSAgICB9Ci0KLSAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICgg c3RkOjpvc3RyZWFtJiBvcywgU291cmNlTGluZUluZm8gY29uc3QmIGluZm8gKSB7Ci0jaWZuZGVm IF9fR05VR19fCi0gICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnKCcgPDwgaW5mby5saW5lIDw8 ICcpJzsKLSNlbHNlCi0gICAgICAgIG9zIDw8IGluZm8uZmlsZSA8PCAnOicgPDwgaW5mby5saW5l OwotI2VuZGlmCi0gICAgICAgIHJldHVybiBvczsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBT dHJlYW1FbmRTdG9wOjpvcGVyYXRvcisoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0 cmluZygpOwotICAgIH0KLQotICAgIE5vbkNvcHlhYmxlOjpOb25Db3B5YWJsZSgpID0gZGVmYXVs dDsKLSAgICBOb25Db3B5YWJsZTo6fk5vbkNvcHlhYmxlKCkgPSBkZWZhdWx0OwotCi19Ci0vLyBl bmQgY2F0Y2hfY29tbW9uLmNwcAotLy8gc3RhcnQgY2F0Y2hfY29uZmlnLmNwcAotCi1uYW1lc3Bh Y2UgQ2F0Y2ggewotCi0gICAgQ29uZmlnOjpDb25maWcoIENvbmZpZ0RhdGEgY29uc3QmIGRhdGEg KQotICAgIDogICBtX2RhdGEoIGRhdGEgKSwKLSAgICAgICAgbV9zdHJlYW0oIG9wZW5TdHJlYW0o KSApCi0gICAgewotICAgICAgICAvLyBXZSBuZWVkIHRvIHRyaW0gZmlsdGVyIHNwZWNzIHRvIGF2 b2lkIHRyb3VibGUgd2l0aCBzdXBlcmZsdW91cwotICAgICAgICAvLyB3aGl0ZXNwYWNlIChlc3Au IGltcG9ydGFudCBmb3IgYmRkIG1hY3JvcywgYXMgdGhvc2UgYXJlIG1hbnVhbGx5Ci0gICAgICAg IC8vIGFsaWduZWQgd2l0aCB3aGl0ZXNwYWNlKS4KLQotICAgICAgICBmb3IgKGF1dG8mIGVsZW0g OiBtX2RhdGEudGVzdHNPclRhZ3MpIHsKLSAgICAgICAgICAgIGVsZW0gPSB0cmltKGVsZW0pOwot ICAgICAgICB9Ci0gICAgICAgIGZvciAoYXV0byYgZWxlbSA6IG1fZGF0YS5zZWN0aW9uc1RvUnVu KSB7Ci0gICAgICAgICAgICBlbGVtID0gdHJpbShlbGVtKTsKLSAgICAgICAgfQotCi0gICAgICAg IFRlc3RTcGVjUGFyc2VyIHBhcnNlcihJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkpOwotICAgICAg ICBpZiAoIW1fZGF0YS50ZXN0c09yVGFncy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX2hhc1Rl c3RGaWx0ZXJzID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgdGVzdE9yVGFn cyA6IG1fZGF0YS50ZXN0c09yVGFncykgewotICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZSh0 ZXN0T3JUYWdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3Rlc3RTcGVj ID0gcGFyc2VyLnRlc3RTcGVjKCk7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgY29uc3QmIENv bmZpZzo6Z2V0RmlsZW5hbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtX2RhdGEub3V0cHV0 RmlsZW5hbWUgOwotICAgIH0KLQotICAgIGJvb2wgQ29uZmlnOjpsaXN0VGVzdHMoKSBjb25zdCAg ICAgICAgICB7IHJldHVybiBtX2RhdGEubGlzdFRlc3RzOyB9Ci0gICAgYm9vbCBDb25maWc6Omxp c3RUZXN0TmFtZXNPbmx5KCkgY29uc3QgIHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdE5hbWVzT25s eTsgfQotICAgIGJvb2wgQ29uZmlnOjpsaXN0VGFncygpIGNvbnN0ICAgICAgICAgICB7IHJldHVy biBtX2RhdGEubGlzdFRhZ3M7IH0KLSAgICBib29sIENvbmZpZzo6bGlzdFJlcG9ydGVycygpIGNv bnN0ICAgICAgeyByZXR1cm4gbV9kYXRhLmxpc3RSZXBvcnRlcnM7IH0KLQotICAgIHN0ZDo6c3Ry aW5nIENvbmZpZzo6Z2V0UHJvY2Vzc05hbWUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucHJvY2Vz c05hbWU7IH0KLSAgICBzdGQ6OnN0cmluZyBjb25zdCYgQ29uZmlnOjpnZXRSZXBvcnRlck5hbWUo KSBjb25zdCB7IHJldHVybiBtX2RhdGEucmVwb3J0ZXJOYW1lOyB9Ci0KLSAgICBzdGQ6OnZlY3Rv cjxzdGQ6OnN0cmluZz4gY29uc3QmIENvbmZpZzo6Z2V0VGVzdHNPclRhZ3MoKSBjb25zdCB7IHJl dHVybiBtX2RhdGEudGVzdHNPclRhZ3M7IH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4g Y29uc3QmIENvbmZpZzo6Z2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5z ZWN0aW9uc1RvUnVuOyB9Ci0KLSAgICBUZXN0U3BlYyBjb25zdCYgQ29uZmlnOjp0ZXN0U3BlYygp IGNvbnN0IHsgcmV0dXJuIG1fdGVzdFNwZWM7IH0KLSAgICBib29sIENvbmZpZzo6aGFzVGVzdEZp bHRlcnMoKSBjb25zdCB7IHJldHVybiBtX2hhc1Rlc3RGaWx0ZXJzOyB9Ci0KLSAgICBib29sIENv bmZpZzo6c2hvd0hlbHAoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2hvd0hlbHA7IH0KLQotICAg IC8vIElDb25maWcgaW50ZXJmYWNlCi0gICAgYm9vbCBDb25maWc6OmFsbG93VGhyb3dzKCkgY29u c3QgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gIW1fZGF0YS5ub1Rocm93OyB9Ci0gICAgc3Rk Ojpvc3RyZWFtJiBDb25maWc6OnN0cmVhbSgpIGNvbnN0ICAgICAgICAgICAgICAgeyByZXR1cm4g bV9zdHJlYW0tPnN0cmVhbSgpOyB9Ci0gICAgc3RkOjpzdHJpbmcgQ29uZmlnOjpuYW1lKCkgY29u c3QgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLm5hbWUuZW1wdHkoKSA/IG1fZGF0 YS5wcm9jZXNzTmFtZSA6IG1fZGF0YS5uYW1lOyB9Ci0gICAgYm9vbCBDb25maWc6OmluY2x1ZGVT dWNjZXNzZnVsUmVzdWx0cygpIGNvbnN0ICAgICAgeyByZXR1cm4gbV9kYXRhLnNob3dTdWNjZXNz ZnVsVGVzdHM7IH0KLSAgICBib29sIENvbmZpZzo6d2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMo KSBjb25zdCAgICB7IHJldHVybiAhIShtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vQXNz ZXJ0aW9ucyk7IH0KLSAgICBib29sIENvbmZpZzo6d2FybkFib3V0Tm9UZXN0cygpIGNvbnN0ICAg ICAgICAgICAgICB7IHJldHVybiAhIShtX2RhdGEud2FybmluZ3MgJiBXYXJuQWJvdXQ6Ok5vVGVz dHMpOyB9Ci0gICAgU2hvd0R1cmF0aW9uczo6T3JOb3QgQ29uZmlnOjpzaG93RHVyYXRpb25zKCkg Y29uc3QgeyByZXR1cm4gbV9kYXRhLnNob3dEdXJhdGlvbnM7IH0KLSAgICBkb3VibGUgQ29uZmln OjptaW5EdXJhdGlvbigpIGNvbnN0ICAgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEubWlu RHVyYXRpb247IH0KLSAgICBSdW5UZXN0czo6SW5XaGF0T3JkZXIgQ29uZmlnOjpydW5PcmRlcigp IGNvbnN0ICAgICB7IHJldHVybiBtX2RhdGEucnVuT3JkZXI7IH0KLSAgICB1bnNpZ25lZCBpbnQg Q29uZmlnOjpybmdTZWVkKCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEucm5n U2VlZDsgfQotICAgIFVzZUNvbG91cjo6WWVzT3JObyBDb25maWc6OnVzZUNvbG91cigpIGNvbnN0 ICAgICAgIHsgcmV0dXJuIG1fZGF0YS51c2VDb2xvdXI7IH0KLSAgICBib29sIENvbmZpZzo6c2hv dWxkRGVidWdCcmVhaygpIGNvbnN0ICAgICAgICAgICAgICB7IHJldHVybiBtX2RhdGEuc2hvdWxk RGVidWdCcmVhazsgfQotICAgIGludCBDb25maWc6OmFib3J0QWZ0ZXIoKSBjb25zdCAgICAgICAg ICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5hYm9ydEFmdGVyOyB9Ci0gICAgYm9vbCBDb25m aWc6OnNob3dJbnZpc2libGVzKCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRh LnNob3dJbnZpc2libGVzOyB9Ci0gICAgVmVyYm9zaXR5IENvbmZpZzo6dmVyYm9zaXR5KCkgY29u c3QgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLnZlcmJvc2l0eTsgfQotCi0gICAgYm9v bCBDb25maWc6OmJlbmNobWFya05vQW5hbHlzaXMoKSBjb25zdCAgICAgICAgICAgICAgICAgICAg ICB7IHJldHVybiBtX2RhdGEuYmVuY2htYXJrTm9BbmFseXNpczsgfQotICAgIGludCBDb25maWc6 OmJlbmNobWFya1NhbXBsZXMoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1 cm4gbV9kYXRhLmJlbmNobWFya1NhbXBsZXM7IH0KLSAgICBkb3VibGUgQ29uZmlnOjpiZW5jaG1h cmtDb25maWRlbmNlSW50ZXJ2YWwoKSBjb25zdCAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5i ZW5jaG1hcmtDb25maWRlbmNlSW50ZXJ2YWw7IH0KLSAgICB1bnNpZ25lZCBpbnQgQ29uZmlnOjpi ZW5jaG1hcmtSZXNhbXBsZXMoKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5i ZW5jaG1hcmtSZXNhbXBsZXM7IH0KLSAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIENvbmZp Zzo6YmVuY2htYXJrV2FybXVwVGltZSgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6Y2hyb25vOjptaWxs aXNlY29uZHMobV9kYXRhLmJlbmNobWFya1dhcm11cFRpbWUpOyB9Ci0KLSAgICBJU3RyZWFtIGNv bnN0KiBDb25maWc6Om9wZW5TdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBDYXRjaDo6bWFrZVN0 cmVhbShtX2RhdGEub3V0cHV0RmlsZW5hbWUpOwotICAgIH0KLQotfSAvLyBlbmQgbmFtZXNwYWNl IENhdGNoCi0vLyBlbmQgY2F0Y2hfY29uZmlnLmNwcAotLy8gc3RhcnQgY2F0Y2hfY29uc29sZV9j b2xvdXIuY3BwCi0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgICAgcHJhZ21hIGNsYW5nIGRp YWdub3N0aWMgcHVzaAotIyAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2V4 aXQtdGltZS1kZXN0cnVjdG9ycyIKLSNlbmRpZgotCi0vLyBzdGFydCBjYXRjaF9lcnJub19ndWFy ZC5oCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBjbGFzcyBFcnJub0d1YXJkIHsKLSAgICBw dWJsaWM6Ci0gICAgICAgIEVycm5vR3VhcmQoKTsKLSAgICAgICAgfkVycm5vR3VhcmQoKTsKLSAg ICBwcml2YXRlOgotICAgICAgICBpbnQgbV9vbGRFcnJubzsKLSAgICB9OwotCi19Ci0KLS8vIGVu ZCBjYXRjaF9lcnJub19ndWFyZC5oCi0vLyBzdGFydCBjYXRjaF93aW5kb3dzX2hfcHJveHkuaAot Ci0KLSNpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX1dJTkRPV1MpCi0KLSNpZiAhZGVmaW5lZChO T01JTk1BWCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX05PTUlOTUFYKQotIyAgZGVmaW5l IENBVENIX0RFRklORURfTk9NSU5NQVgKLSMgIGRlZmluZSBOT01JTk1BWAotI2VuZGlmCi0jaWYg IWRlZmluZWQoV0lOMzJfTEVBTl9BTkRfTUVBTikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05P X1dJTjMyX0xFQU5fQU5EX01FQU4pCi0jICBkZWZpbmUgQ0FUQ0hfREVGSU5FRF9XSU4zMl9MRUFO X0FORF9NRUFOCi0jICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2VuZGlmCi0KLSNpZmRl ZiBfX0FGWERMTAotI2luY2x1ZGUgPEFmeFdpbi5oPgotI2Vsc2UKLSNpbmNsdWRlIDx3aW5kb3dz Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIENBVENIX0RFRklORURfTk9NSU5NQVgKLSMgIHVuZGVmIE5P TUlOTUFYCi0jZW5kaWYKLSNpZmRlZiBDQVRDSF9ERUZJTkVEX1dJTjMyX0xFQU5fQU5EX01FQU4K LSMgIHVuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNlbmRpZgotCi0jZW5kaWYgLy8gZGVmaW5l ZChDQVRDSF9QTEFURk9STV9XSU5ET1dTKQotCi0vLyBlbmQgY2F0Y2hfd2luZG93c19oX3Byb3h5 LmgKLSNpbmNsdWRlIDxzc3RyZWFtPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIG5hbWVzcGFj ZSB7Ci0KLSAgICAgICAgc3RydWN0IElDb2xvdXJJbXBsIHsKLSAgICAgICAgICAgIHZpcnR1YWwg fklDb2xvdXJJbXBsKCkgPSBkZWZhdWx0OwotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHVzZSgg Q29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgPSAwOwotICAgICAgICB9OwotCi0gICAgICAgIHN0 cnVjdCBOb0NvbG91ckltcGwgOiBJQ29sb3VySW1wbCB7Ci0gICAgICAgICAgICB2b2lkIHVzZSgg Q29sb3VyOjpDb2RlICkgb3ZlcnJpZGUge30KLQotICAgICAgICAgICAgc3RhdGljIElDb2xvdXJJ bXBsKiBpbnN0YW5jZSgpIHsKLSAgICAgICAgICAgICAgICBzdGF0aWMgTm9Db2xvdXJJbXBsIHNf aW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOwotICAgICAgICAg ICAgfQotICAgICAgICB9OwotCi0gICAgfSAvLyBhbm9uIG5hbWVzcGFjZQotfSAvLyBuYW1lc3Bh Y2UgQ2F0Y2gKLQotI2lmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX05PTkUgKSAmJiAh ZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTICkgJiYgIWRlZmluZWQoIENBVENI X0NPTkZJR19DT0xPVVJfQU5TSSApCi0jICAgaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUwot IyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTCi0jICAgZWxzZQotIyAg ICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJCi0jICAgZW5kaWYKLSNlbmRpZgot Ci0jaWYgZGVmaW5lZCAoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApIC8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci1uYW1l c3BhY2UgewotCi0gICAgY2xhc3MgV2luMzJDb2xvdXJJbXBsIDogcHVibGljIElDb2xvdXJJbXBs IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFdpbjMyQ29sb3VySW1wbCgpIDogc3Rkb3V0SGFuZGxl KCBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpICkKLSAgICAgICAgewotICAgICAgICAg ICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaUluZm87Ci0gICAgICAgICAgICBHZXRD b25zb2xlU2NyZWVuQnVmZmVySW5mbyggc3Rkb3V0SGFuZGxlLCAmY3NiaUluZm8gKTsKLSAgICAg ICAgICAgIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgPSBjc2JpSW5mby53QXR0cmlidXRl cyAmIH4oIEJBQ0tHUk9VTkRfR1JFRU4gfCBCQUNLR1JPVU5EX1JFRCB8IEJBQ0tHUk9VTkRfQkxV RSB8IEJBQ0tHUk9VTkRfSU5URU5TSVRZICk7Ci0gICAgICAgICAgICBvcmlnaW5hbEJhY2tncm91 bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBGT1JFR1JPVU5EX0dSRUVO IHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0lOVEVOU0lU WSApOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3Vy Q29kZSApIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7Ci0g ICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6Ok5vbmU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRy aWJ1dGUoIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgKTsKLSAgICAgICAgICAgICAgICBj YXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VO RF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFICk7Ci0gICAgICAgICAg ICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZP UkVHUk9VTkRfUkVEICk7Ci0gICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZWVuOiAgICAg cmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfR1JFRU4gKTsKLSAgICAgICAgICAg ICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9S RUdST1VORF9CTFVFICk7Ci0gICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAg cmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfR1JF RU4gKTsKLSAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0 VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOICk7Ci0gICAg ICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1 dGUoIDAgKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICBy ZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgKTsKLSAgICAgICAg ICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1 dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9SRUQgKTsKLSAgICAgICAgICAg ICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUo IEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9HUkVFTiApOwotICAgICAgICAgICAg ICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRXaGl0ZTogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSgg Rk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQg fCBGT1JFR1JPVU5EX0JMVUUgKTsKLSAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0 WWVsbG93OiAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwg Rk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0dSRUVOICk7Ci0KLSAgICAgICAgICAgICAgICBj YXNlIENvbG91cjo6QnJpZ2h0OiBDQVRDSF9JTlRFUk5BTF9FUlJPUiggIm5vdCBhIGNvbG91ciIg KTsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIENBVENI X0VSUk9SKCAiVW5rbm93biBjb2xvdXIgcmVxdWVzdGVkIiApOwotICAgICAgICAgICAgfQotICAg ICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIHNldFRleHRBdHRyaWJ1dGUoIFdP UkQgX3RleHRBdHRyaWJ1dGUgKSB7Ci0gICAgICAgICAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0 ZSggc3Rkb3V0SGFuZGxlLCBfdGV4dEF0dHJpYnV0ZSB8IG9yaWdpbmFsQmFja2dyb3VuZEF0dHJp YnV0ZXMgKTsKLSAgICAgICAgfQotICAgICAgICBIQU5ETEUgc3Rkb3V0SGFuZGxlOwotICAgICAg ICBXT1JEIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXM7Ci0gICAgICAgIFdPUkQgb3JpZ2lu YWxCYWNrZ3JvdW5kQXR0cmlidXRlczsKLSAgICB9OwotCi0gICAgSUNvbG91ckltcGwqIHBsYXRm b3JtQ29sb3VySW5zdGFuY2UoKSB7Ci0gICAgICAgIHN0YXRpYyBXaW4zMkNvbG91ckltcGwgc19p bnN0YW5jZTsKLQotICAgICAgICBJQ29uZmlnUHRyIGNvbmZpZyA9IGdldEN1cnJlbnRDb250ZXh0 KCkuZ2V0Q29uZmlnKCk7Ci0gICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyBjb2xvdXJNb2RlID0g Y29uZmlnCi0gICAgICAgICAgICA/IGNvbmZpZy0+dXNlQ29sb3VyKCkKLSAgICAgICAgICAgIDog VXNlQ29sb3VyOjpBdXRvOwotICAgICAgICBpZiggY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OkF1 dG8gKQotICAgICAgICAgICAgY29sb3VyTW9kZSA9IFVzZUNvbG91cjo6WWVzOwotICAgICAgICBy ZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcwotICAgICAgICAgICAgPyAmc19pbnN0 YW5jZQotICAgICAgICAgICAgOiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7Ci0gICAgfQotCi19 IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLSNlbGlm IGRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSApIC8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotbmFtZXNwYWNlIENh dGNoIHsKLW5hbWVzcGFjZSB7Ci0KLSAgICAvLyB1c2UgUE9TSVgvIEFOU0kgY29uc29sZSB0ZXJt aW5hbCBjb2RlcwotICAgIC8vIFRoYW5rcyB0byBBZGFtIFN0cnplbGVja2kgZm9yIG9yaWdpbmFs IGNvbnRyaWJ1dGlvbgotICAgIC8vIChodHRwOi8vZ2l0aHViLmNvbS9uYW5vYW50KQotICAgIC8v IGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaC9wdWxsLzEzMQotICAgIGNsYXNz IFBvc2l4Q29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7Ci0gICAgcHVibGljOgotICAg ICAgICB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgb3ZlcnJpZGUgewotICAg ICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKLSAgICAgICAgICAgICAgICBjYXNlIENv bG91cjo6Tm9uZToKLSAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6V2hpdGU6ICAgICByZXR1 cm4gc2V0Q29sb3VyKCAiWzBtIiApOwotICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6 ICAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszMW0iICk7Ci0gICAgICAgICAgICAgICAgY2Fz ZSBDb2xvdXI6OkdyZWVuOiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMybSIgKTsKLSAgICAg ICAgICAgICAgICBjYXNlIENvbG91cjo6Qmx1ZTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7 MzRtIiApOwotICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBz ZXRDb2xvdXIoICJbMDszNm0iICk7Ci0gICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxv dzogICAgcmV0dXJuIHNldENvbG91ciggIlswOzMzbSIgKTsKLSAgICAgICAgICAgICAgICBjYXNl IENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzBtIiApOwotCi0gICAg ICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRDb2xvdXIo ICJbMDszN20iICk7Ci0gICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAg IHJldHVybiBzZXRDb2xvdXIoICJbMTszMW0iICk7Ci0gICAgICAgICAgICAgICAgY2FzZSBDb2xv dXI6OkJyaWdodEdyZWVuOiAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMm0iICk7Ci0gICAgICAg ICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRDb2xvdXIoICJb MTszN20iICk7Ci0gICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFllbGxvdzogIHJl dHVybiBzZXRDb2xvdXIoICJbMTszM20iICk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIENvbG91 cjo6QnJpZ2h0OiBDQVRDSF9JTlRFUk5BTF9FUlJPUiggIm5vdCBhIGNvbG91ciIgKTsKLSAgICAg ICAgICAgICAgICBkZWZhdWx0OiBDQVRDSF9JTlRFUk5BTF9FUlJPUiggIlVua25vd24gY29sb3Vy IHJlcXVlc3RlZCIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdGF0aWMg SUNvbG91ckltcGwqIGluc3RhbmNlKCkgewotICAgICAgICAgICAgc3RhdGljIFBvc2l4Q29sb3Vy SW1wbCBzX2luc3RhbmNlOwotICAgICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOwotICAgICAg ICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIHNldENvbG91ciggY29uc3QgY2hhciog X2VzY2FwZUNvZGUgKSB7Ci0gICAgICAgICAgICBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZp ZygpLT5zdHJlYW0oKQotICAgICAgICAgICAgICAgIDw8ICdcMDMzJyA8PCBfZXNjYXBlQ29kZTsK LSAgICAgICAgfQotICAgIH07Ci0KLSAgICBib29sIHVzZUNvbG91ck9uUGxhdGZvcm0oKSB7Ci0g ICAgICAgIHJldHVybgotI2lmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTUFDKSB8fCBkZWZpbmVk KENBVENIX1BMQVRGT1JNX0lQSE9ORSkKLSAgICAgICAgICAgICFpc0RlYnVnZ2VyQWN0aXZlKCkg JiYKLSNlbmRpZgotI2lmICEoZGVmaW5lZChfX0RKR1BQX18pICYmIGRlZmluZWQoX19TVFJJQ1Rf QU5TSV9fKSkKLSAgICAgICAgICAgIGlzYXR0eShTVERPVVRfRklMRU5PKQotI2Vsc2UKLSAgICAg ICAgICAgIGZhbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIDsKLSAgICB9Ci0gICAgSUNvbG91cklt cGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7Ci0gICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7 Ci0gICAgICAgIElDb25maWdQdHIgY29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25m aWcoKTsKLSAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKLSAg ICAgICAgICAgID8gY29uZmlnLT51c2VDb2xvdXIoKQotICAgICAgICAgICAgOiBVc2VDb2xvdXI6 OkF1dG87Ci0gICAgICAgIGlmKCBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCi0gICAg ICAgICAgICBjb2xvdXJNb2RlID0gdXNlQ29sb3VyT25QbGF0Zm9ybSgpCi0gICAgICAgICAgICAg ICAgPyBVc2VDb2xvdXI6OlllcwotICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKLSAg ICAgICAgcmV0dXJuIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpZZXMKLSAgICAgICAgICAgID8g UG9zaXhDb2xvdXJJbXBsOjppbnN0YW5jZSgpCi0gICAgICAgICAgICA6IE5vQ29sb3VySW1wbDo6 aW5zdGFuY2UoKTsKLSAgICB9Ci0KLX0gLy8gZW5kIGFub24gbmFtZXNwYWNlCi19IC8vIGVuZCBu YW1lc3BhY2UgQ2F0Y2gKLQotI2Vsc2UgIC8vIG5vdCBXaW5kb3dzIG9yIEFOU0kgLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotbmFtZXNwYWNlIENhdGNo IHsKLQotICAgIHN0YXRpYyBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsg cmV0dXJuIE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsgfQotCi19IC8vIGVuZCBuYW1lc3BhY2Ug Q2F0Y2gKLQotI2VuZGlmIC8vIFdpbmRvd3MvIEFOU0kvIE5vbmUKLQotbmFtZXNwYWNlIENhdGNo IHsKLQotICAgIENvbG91cjo6Q29sb3VyKCBDb2RlIF9jb2xvdXJDb2RlICkgeyB1c2UoIF9jb2xv dXJDb2RlICk7IH0KLSAgICBDb2xvdXI6OkNvbG91ciggQ29sb3VyJiYgb3RoZXIgKSBub2V4Y2Vw dCB7Ci0gICAgICAgIG1fbW92ZWQgPSBvdGhlci5tX21vdmVkOwotICAgICAgICBvdGhlci5tX21v dmVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgQ29sb3VyJiBDb2xvdXI6Om9wZXJhdG9yPSggQ29sb3Vy JiYgb3RoZXIgKSBub2V4Y2VwdCB7Ci0gICAgICAgIG1fbW92ZWQgPSBvdGhlci5tX21vdmVkOwot ICAgICAgICBvdGhlci5tX21vdmVkICA9IHRydWU7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAg ICB9Ci0KLSAgICBDb2xvdXI6On5Db2xvdXIoKXsgaWYoICFtX21vdmVkICkgdXNlKCBOb25lICk7 IH0KLQotICAgIHZvaWQgQ29sb3VyOjp1c2UoIENvZGUgX2NvbG91ckNvZGUgKSB7Ci0gICAgICAg IHN0YXRpYyBJQ29sb3VySW1wbCogaW1wbCA9IHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKTsKLSAg ICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgY2Fubm90IHBvc3NpYmx5IGhhcHBlbi4K LSAgICAgICAgLy8gSG93ZXZlciwgdW5kZXIgc29tZSBjb25kaXRpb25zIGl0IGRvZXMgaGFwcGVu IChzZWUgIzE2MjYpLAotICAgICAgICAvLyBhbmQgdGhpcyBjaGFuZ2UgaXMgc21hbGwgZW5vdWdo IHRoYXQgd2UgY2FuIGxldCBwcmFjdGljYWxpdHkKLSAgICAgICAgLy8gdHJpdW1waCBvdmVyIHB1 cml0eSBpbiB0aGlzIGNhc2UuCi0gICAgICAgIGlmIChpbXBsICE9IG51bGxwdHIpIHsKLSAgICAg ICAgICAgIGltcGwtPnVzZSggX2NvbG91ckNvZGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAg IHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBDb2xvdXIgY29u c3QmICkgewotICAgICAgICByZXR1cm4gb3M7Ci0gICAgfQotCi19IC8vIGVuZCBuYW1lc3BhY2Ug Q2F0Y2gKLQotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotIyAgICBwcmFnbWEgY2xhbmcgZGlhZ25v c3RpYyBwb3AKLSNlbmRpZgotCi0vLyBlbmQgY2F0Y2hfY29uc29sZV9jb2xvdXIuY3BwCi0vLyBz dGFydCBjYXRjaF9jb250ZXh0LmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgY2xhc3Mg Q29udGV4dCA6IHB1YmxpYyBJTXV0YWJsZUNvbnRleHQsIE5vbkNvcHlhYmxlIHsKLQotICAgIHB1 YmxpYzogLy8gSUNvbnRleHQKLSAgICAgICAgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1 cmUoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICByZXR1cm4gbV9yZXN1bHRDYXB0dXJlOwotICAg ICAgICB9Ci0gICAgICAgIElSdW5uZXIqIGdldFJ1bm5lcigpIG92ZXJyaWRlIHsKLSAgICAgICAg ICAgIHJldHVybiBtX3J1bm5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIElDb25maWdQdHIgY29u c3QmIGdldENvbmZpZygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIHJldHVybiBtX2Nv bmZpZzsKLSAgICAgICAgfQotCi0gICAgICAgIH5Db250ZXh0KCkgb3ZlcnJpZGU7Ci0KLSAgICBw dWJsaWM6IC8vIElNdXRhYmxlQ29udGV4dAotICAgICAgICB2b2lkIHNldFJlc3VsdENhcHR1cmUo IElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlICkgb3ZlcnJpZGUgewotICAgICAgICAgICAg bV9yZXN1bHRDYXB0dXJlID0gcmVzdWx0Q2FwdHVyZTsKLSAgICAgICAgfQotICAgICAgICB2b2lk IHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbV9y dW5uZXIgPSBydW5uZXI7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBzZXRDb25maWcoIElDb25m aWdQdHIgY29uc3QmIGNvbmZpZyApIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1fY29uZmlnID0g Y29uZmlnOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJpZW5kIElNdXRhYmxlQ29udGV4dCYgZ2V0 Q3VycmVudE11dGFibGVDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBJQ29uZmln UHRyIG1fY29uZmlnOwotICAgICAgICBJUnVubmVyKiBtX3J1bm5lciA9IG51bGxwdHI7Ci0gICAg ICAgIElSZXN1bHRDYXB0dXJlKiBtX3Jlc3VsdENhcHR1cmUgPSBudWxscHRyOwotICAgIH07Ci0K LSAgICBJTXV0YWJsZUNvbnRleHQgKklNdXRhYmxlQ29udGV4dDo6Y3VycmVudENvbnRleHQgPSBu dWxscHRyOwotCi0gICAgdm9pZCBJTXV0YWJsZUNvbnRleHQ6OmNyZWF0ZUNvbnRleHQoKQotICAg IHsKLSAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgQ29udGV4dCgpOwotICAgIH0KLQotICAg IHZvaWQgY2xlYW5VcENvbnRleHQoKSB7Ci0gICAgICAgIGRlbGV0ZSBJTXV0YWJsZUNvbnRleHQ6 OmN1cnJlbnRDb250ZXh0OwotICAgICAgICBJTXV0YWJsZUNvbnRleHQ6OmN1cnJlbnRDb250ZXh0 ID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgSUNvbnRleHQ6On5JQ29udGV4dCgpID0gZGVmYXVsdDsK LSAgICBJTXV0YWJsZUNvbnRleHQ6On5JTXV0YWJsZUNvbnRleHQoKSA9IGRlZmF1bHQ7Ci0gICAg Q29udGV4dDo6fkNvbnRleHQoKSA9IGRlZmF1bHQ7Ci0KLSAgICBTaW1wbGVQY2czMiYgcm5nKCkg ewotICAgICAgICBzdGF0aWMgU2ltcGxlUGNnMzIgc19ybmc7Ci0gICAgICAgIHJldHVybiBzX3Ju ZzsKLSAgICB9Ci0KLX0KLS8vIGVuZCBjYXRjaF9jb250ZXh0LmNwcAotLy8gc3RhcnQgY2F0Y2hf ZGVidWdfY29uc29sZS5jcHAKLQotLy8gc3RhcnQgY2F0Y2hfZGVidWdfY29uc29sZS5oCi0KLSNp bmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgdm9pZCB3cml0ZVRvRGVi dWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApOwotfQotCi0vLyBlbmQgY2F0Y2hf ZGVidWdfY29uc29sZS5oCi0jaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQU5EUk9JRF9MT0dXUklU RSkKLSNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgotCi0gICAgbmFtZXNwYWNlIENhdGNoIHsKLSAg ICAgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCAp IHsKLSAgICAgICAgICAgIF9fYW5kcm9pZF9sb2dfd3JpdGUoIEFORFJPSURfTE9HX0RFQlVHLCAi Q2F0Y2giLCB0ZXh0LmNfc3RyKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotI2VsaWYgZGVmaW5l ZChDQVRDSF9QTEFURk9STV9XSU5ET1dTKQotCi0gICAgbmFtZXNwYWNlIENhdGNoIHsKLSAgICAg ICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsK LSAgICAgICAgICAgIDo6T3V0cHV0RGVidWdTdHJpbmdBKCB0ZXh0LmNfc3RyKCkgKTsKLSAgICAg ICAgfQotICAgIH0KLQotI2Vsc2UKLQotICAgIG5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgICAgIHZv aWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7Ci0gICAg ICAgICAgICAvLyAhVEJEOiBOZWVkIGEgdmVyc2lvbiBmb3IgTWFjLyBYQ29kZSBhbmQgb3RoZXIg SURFcwotICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXh0OwotICAgICAgICB9Ci0gICAg fQotCi0jZW5kaWYgLy8gUGxhdGZvcm0KLS8vIGVuZCBjYXRjaF9kZWJ1Z19jb25zb2xlLmNwcAot Ly8gc3RhcnQgY2F0Y2hfZGVidWdnZXIuY3BwCi0KLSNpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JN X01BQykgfHwgZGVmaW5lZChDQVRDSF9QTEFURk9STV9JUEhPTkUpCi0KLSMgIGluY2x1ZGUgPGNh c3NlcnQ+Ci0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgot IyAgaW5jbHVkZSA8Y3N0ZGRlZj4KLSMgIGluY2x1ZGUgPG9zdHJlYW0+Ci0KLSNpZmRlZiBfX2Fw cGxlX2J1aWxkX3ZlcnNpb25fXwotICAgIC8vIFRoZXNlIGhlYWRlcnMgd2lsbCBvbmx5IGNvbXBp bGUgd2l0aCBBcHBsZUNsYW5nIChYQ29kZSkKLSAgICAvLyBGb3Igb3RoZXIgY29tcGlsZXJzIChD bGFuZywgR0NDLCAuLi4gKSB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhlbQotIyAgaW5jbHVkZSA8c3lz L3N5c2N0bC5oPgotI2VuZGlmCi0KLSAgICBuYW1lc3BhY2UgQ2F0Y2ggewotICAgICAgICAjaWZk ZWYgX19hcHBsZV9idWlsZF92ZXJzaW9uX18KLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5j dGlvbiBpcyB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBmb2xsb3dpbmcgdGVjaG5pY2FsIG5vdGU6 Ci0gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2FyY2hpdmUv cWEvcWExMzYxL19pbmRleC5odG1sCi0KLSAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBj dXJyZW50IHByb2Nlc3MgaXMgYmVpbmcgZGVidWdnZWQgKGVpdGhlcgotICAgICAgICAvLyBydW5u aW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciBvciBoYXMgYSBkZWJ1Z2dlciBhdHRhY2hlZCBwb3N0IGZh Y3RvKS4KLSAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7Ci0gICAgICAgICAgICBpbnQg ICAgICAgICAgICAgICAgIG1pYls0XTsKLSAgICAgICAgICAgIHN0cnVjdCBraW5mb19wcm9jICAg aW5mbzsKLSAgICAgICAgICAgIHN0ZDo6c2l6ZV90ICAgICAgICAgc2l6ZTsKLQotICAgICAgICAg ICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmxhZ3Mgc28gdGhhdCwgaWYgc3lzY3RsIGZhaWxzIGZvciBz b21lIGJpemFycmUKLSAgICAgICAgICAgIC8vIHJlYXNvbiwgd2UgZ2V0IGEgcHJlZGljdGFibGUg cmVzdWx0LgotCi0gICAgICAgICAgICBpbmZvLmtwX3Byb2MucF9mbGFnID0gMDsKLQotICAgICAg ICAgICAgLy8gSW5pdGlhbGl6ZSBtaWIsIHdoaWNoIHRlbGxzIHN5c2N0bCB0aGUgaW5mbyB3ZSB3 YW50LCBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgIC8vIHdlJ3JlIGxvb2tpbmcgZm9yIGluZm9y bWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcHJvY2VzcyBJRC4KLQotICAgICAgICAgICAgbWliWzBd ID0gQ1RMX0tFUk47Ci0gICAgICAgICAgICBtaWJbMV0gPSBLRVJOX1BST0M7Ci0gICAgICAgICAg ICBtaWJbMl0gPSBLRVJOX1BST0NfUElEOwotICAgICAgICAgICAgbWliWzNdID0gZ2V0cGlkKCk7 Ci0KLSAgICAgICAgICAgIC8vIENhbGwgc3lzY3RsLgotCi0gICAgICAgICAgICBzaXplID0gc2l6 ZW9mKGluZm8pOwotICAgICAgICAgICAgaWYoIHN5c2N0bChtaWIsIHNpemVvZihtaWIpIC8gc2l6 ZW9mKCptaWIpLCAmaW5mbywgJnNpemUsIG51bGxwdHIsIDApICE9IDAgKSB7Ci0gICAgICAgICAg ICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCAiXG4qKiBDYWxsIHRvIHN5c2N0bCBmYWlsZWQgLSB1bmFi bGUgdG8gZGV0ZXJtaW5lIGlmIGRlYnVnZ2VyIGlzIGFjdGl2ZSAqKlxuIiA8PCBzdGQ6OmVuZGw7 Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAg ICAgICAvLyBXZSdyZSBiZWluZyBkZWJ1Z2dlZCBpZiB0aGUgUF9UUkFDRUQgZmxhZyBpcyBzZXQu Ci0KLSAgICAgICAgICAgIHJldHVybiAoIChpbmZvLmtwX3Byb2MucF9mbGFnICYgUF9UUkFDRUQp ICE9IDAgKTsKLSAgICAgICAgfQotICAgICAgICAjZWxzZQotICAgICAgICBib29sIGlzRGVidWdn ZXJBY3RpdmUoKSB7Ci0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpbmQgYW5vdGhlciB3YXkg dG8gZGV0ZXJtaW5lIHRoaXMgZm9yIG5vbi1hcHBsZWNsYW5nIGNvbXBpbGVycyBvbiBtYWNPUwot ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgICNlbmRpZgotICAg IH0gLy8gbmFtZXNwYWNlIENhdGNoCi0KLSNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElO VVgpCi0gICAgI2luY2x1ZGUgPGZzdHJlYW0+Ci0gICAgI2luY2x1ZGUgPHN0cmluZz4KLQotICAg IG5hbWVzcGFjZSBDYXRjaHsKLSAgICAgICAgLy8gVGhlIHN0YW5kYXJkIFBPU0lYIHdheSBvZiBk ZXRlY3RpbmcgYSBkZWJ1Z2dlciBpcyB0byBhdHRlbXB0IHRvCi0gICAgICAgIC8vIHB0cmFjZSgp IHRoZSBwcm9jZXNzLCBidXQgdGhpcyBuZWVkcyB0byBiZSBkb25lIGZyb20gYSBjaGlsZCBhbmQg bm90Ci0gICAgICAgIC8vIHRoaXMgcHJvY2VzcyBpdHNlbGYgdG8gc3RpbGwgYWxsb3cgYXR0YWNo aW5nIHRvIHRoaXMgcHJvY2VzcyBsYXRlcgotICAgICAgICAvLyBpZiB3YW50ZWQsIHNvIGlzIHJh dGhlciBoZWF2eS4gVW5kZXIgTGludXggd2UgaGF2ZSB0aGUgUElEIG9mIHRoZQotICAgICAgICAv LyAiZGVidWdnZXIiICh3aGljaCBkb2Vzbid0IG5lZWQgdG8gYmUgZ2RiLCBvZiBjb3Vyc2UsIGl0 IGNvdWxkIGFsc28KLSAgICAgICAgLy8gYmUgc3RyYWNlLCBmb3IgZXhhbXBsZSkgaW4gL3Byb2Mv JFBJRC9zdGF0dXMsIHNvIGp1c3QgZ2V0IGl0IGZyb20KLSAgICAgICAgLy8gdGhlcmUgaW5zdGVh ZC4KLSAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7Ci0gICAgICAgICAgICAvLyBMaWJz dGRjKysgaGFzIGEgYnVnLCB3aGVyZSBzdGQ6Omlmc3RyZWFtIHNldHMgZXJybm8gdG8gMAotICAg ICAgICAgICAgLy8gVGhpcyB3YXkgb3VyIHVzZXJzIGNhbiBwcm9wZXJseSBhc3NlcnQgb3ZlciBl cnJubyB2YWx1ZXMKLSAgICAgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7Ci0gICAgICAgICAgICBz dGQ6Omlmc3RyZWFtIGluKCIvcHJvYy9zZWxmL3N0YXR1cyIpOwotICAgICAgICAgICAgZm9yKCBz dGQ6OnN0cmluZyBsaW5lOyBzdGQ6OmdldGxpbmUoaW4sIGxpbmUpOyApIHsKLSAgICAgICAgICAg ICAgICBzdGF0aWMgY29uc3QgaW50IFBSRUZJWF9MRU4gPSAxMTsKLSAgICAgICAgICAgICAgICBp ZiggbGluZS5jb21wYXJlKDAsIFBSRUZJWF9MRU4sICJUcmFjZXJQaWQ6XHQiKSA9PSAwICkgewot ICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSB0cmFjZWQgaWYgdGhlIFBJRCBpcyBub3QgMCBh bmQgbm8gb3RoZXIgUElEIHN0YXJ0cwotICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIDAgZGln aXQsIHNvIGl0J3MgZW5vdWdoIHRvIGNoZWNrIGZvciBqdXN0IGEgc2luZ2xlCi0gICAgICAgICAg ICAgICAgICAgIC8vIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUu bGVuZ3RoKCkgPiBQUkVGSVhfTEVOICYmIGxpbmVbUFJFRklYX0xFTl0gIT0gJzAnOwotICAgICAg ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot ICAgICAgICB9Ci0gICAgfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLSNlbGlmIGRlZmluZWQoX01TQ19W RVIpCi0gICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJ c0RlYnVnZ2VyUHJlc2VudCgpOwotICAgIG5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgICAgIGJvb2wg aXNEZWJ1Z2dlckFjdGl2ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2Vu dCgpICE9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQot ICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBfX3N0ZGNhbGwgSXNEZWJ1 Z2dlclByZXNlbnQoKTsKLSAgICBuYW1lc3BhY2UgQ2F0Y2ggewotICAgICAgICBib29sIGlzRGVi dWdnZXJBY3RpdmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKSAh PSAwOwotICAgICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgICBuYW1lc3BhY2UgQ2F0Y2ggewotICAg ICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgfQotI2Vu ZGlmIC8vIFBsYXRmb3JtCi0vLyBlbmQgY2F0Y2hfZGVidWdnZXIuY3BwCi0vLyBzdGFydCBjYXRj aF9kZWNvbXBvc2VyLmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgSVRyYW5zaWVudEV4 cHJlc3Npb246On5JVHJhbnNpZW50RXhwcmVzc2lvbigpID0gZGVmYXVsdDsKLQotICAgIHZvaWQg Zm9ybWF0UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oIHN0ZDo6b3N0cmVhbSAmb3MsIHN0ZDo6c3Ry aW5nIGNvbnN0JiBsaHMsIFN0cmluZ1JlZiBvcCwgc3RkOjpzdHJpbmcgY29uc3QmIHJocyApIHsK LSAgICAgICAgaWYoIGxocy5zaXplKCkgKyByaHMuc2l6ZSgpIDwgNDAgJiYKLSAgICAgICAgICAg ICAgICBsaHMuZmluZCgnXG4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgotICAgICAgICAgICAg ICAgIHJocy5maW5kKCdcbicpID09IHN0ZDo6c3RyaW5nOjpucG9zICkKLSAgICAgICAgICAgIG9z IDw8IGxocyA8PCAiICIgPDwgb3AgPDwgIiAiIDw8IHJoczsKLSAgICAgICAgZWxzZQotICAgICAg ICAgICAgb3MgPDwgbGhzIDw8ICJcbiIgPDwgb3AgPDwgIlxuIiA8PCByaHM7Ci0gICAgfQotfQot Ly8gZW5kIGNhdGNoX2RlY29tcG9zZXIuY3BwCi0vLyBzdGFydCBjYXRjaF9lbmZvcmNlLmNwcAot Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotI2lmIGRlZmluZWQo Q0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklH X0RJU0FCTEVfRVhDRVBUSU9OU19DVVNUT01fSEFORExFUikKLSAgICBbW25vcmV0dXJuXV0KLSAg ICB2b2lkIHRocm93X2V4Y2VwdGlvbihzdGQ6OmV4Y2VwdGlvbiBjb25zdCYgZSkgewotICAgICAg ICBDYXRjaDo6Y2VycigpIDw8ICJDYXRjaCB3aWxsIHRlcm1pbmF0ZSBiZWNhdXNlIGl0IG5lZWRl ZCB0byB0aHJvdyBhbiBleGNlcHRpb24uXG4iCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIlRo ZSBtZXNzYWdlIHdhczogIiA8PCBlLndoYXQoKSA8PCAnXG4nOwotICAgICAgICBzdGQ6OnRlcm1p bmF0ZSgpOwotICAgIH0KLSNlbmRpZgotCi0gICAgW1tub3JldHVybl1dCi0gICAgdm9pZCB0aHJv d19sb2dpY19lcnJvcihzdGQ6OnN0cmluZyBjb25zdCYgbXNnKSB7Ci0gICAgICAgIHRocm93X2V4 Y2VwdGlvbihzdGQ6OmxvZ2ljX2Vycm9yKG1zZykpOwotICAgIH0KLQotICAgIFtbbm9yZXR1cm5d XQotICAgIHZvaWQgdGhyb3dfZG9tYWluX2Vycm9yKHN0ZDo6c3RyaW5nIGNvbnN0JiBtc2cpIHsK LSAgICAgICAgdGhyb3dfZXhjZXB0aW9uKHN0ZDo6ZG9tYWluX2Vycm9yKG1zZykpOwotICAgIH0K LQotICAgIFtbbm9yZXR1cm5dXQotICAgIHZvaWQgdGhyb3dfcnVudGltZV9lcnJvcihzdGQ6OnN0 cmluZyBjb25zdCYgbXNnKSB7Ci0gICAgICAgIHRocm93X2V4Y2VwdGlvbihzdGQ6OnJ1bnRpbWVf ZXJyb3IobXNnKSk7Ci0gICAgfQotCi19IC8vIG5hbWVzcGFjZSBDYXRjaDsKLS8vIGVuZCBjYXRj aF9lbmZvcmNlLmNwcAotLy8gc3RhcnQgY2F0Y2hfZW51bV92YWx1ZXNfcmVnaXN0cnkuY3BwCi0v LyBzdGFydCBjYXRjaF9lbnVtX3ZhbHVlc19yZWdpc3RyeS5oCi0KLSNpbmNsdWRlIDx2ZWN0b3I+ Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgbmFtZXNwYWNl IERldGFpbCB7Ci0KLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEVudW1JbmZvPiBtYWtlRW51bUlu Zm8oIFN0cmluZ1JlZiBlbnVtTmFtZSwgU3RyaW5nUmVmIGFsbFZhbHVlTmFtZXMsIHN0ZDo6dmVj dG9yPGludD4gY29uc3QmIHZhbHVlcyApOwotCi0gICAgICAgIGNsYXNzIEVudW1WYWx1ZXNSZWdp c3RyeSA6IHB1YmxpYyBJTXV0YWJsZUVudW1WYWx1ZXNSZWdpc3RyeSB7Ci0KLSAgICAgICAgICAg IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxFbnVtSW5mbz4+IG1fZW51bUluZm9zOwotCi0g ICAgICAgICAgICBFbnVtSW5mbyBjb25zdCYgcmVnaXN0ZXJFbnVtKCBTdHJpbmdSZWYgZW51bU5h bWUsIFN0cmluZ1JlZiBhbGxFbnVtcywgc3RkOjp2ZWN0b3I8aW50PiBjb25zdCYgdmFsdWVzKSBv dmVycmlkZTsKLSAgICAgICAgfTsKLQotICAgICAgICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IHBh cnNlRW51bXMoIFN0cmluZ1JlZiBlbnVtcyApOwotCi0gICAgfSAvLyBEZXRhaWwKLQotfSAvLyBD YXRjaAotCi0vLyBlbmQgY2F0Y2hfZW51bV92YWx1ZXNfcmVnaXN0cnkuaAotCi0jaW5jbHVkZSA8 bWFwPgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBJTXV0 YWJsZUVudW1WYWx1ZXNSZWdpc3RyeTo6fklNdXRhYmxlRW51bVZhbHVlc1JlZ2lzdHJ5KCkge30K LQotICAgIG5hbWVzcGFjZSBEZXRhaWwgewotCi0gICAgICAgIG5hbWVzcGFjZSB7Ci0gICAgICAg ICAgICAvLyBFeHRyYWN0cyB0aGUgYWN0dWFsIG5hbWUgcGFydCBvZiBhbiBlbnVtIGluc3RhbmNl Ci0gICAgICAgICAgICAvLyBJbiBvdGhlciB3b3JkcywgaXQgcmV0dXJucyB0aGUgQmx1ZSBwYXJ0 IG9mIEJpa2VzaGVkOjpDb2xvdXI6OkJsdWUKLSAgICAgICAgICAgIFN0cmluZ1JlZiBleHRyYWN0 SW5zdGFuY2VOYW1lKFN0cmluZ1JlZiBlbnVtSW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAv LyBGaW5kIGxhc3Qgb2NjdXJyZW5jZSBvZiAiOiIKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFt ZV9zdGFydCA9IGVudW1JbnN0YW5jZS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG5h bWVfc3RhcnQgPiAwICYmIGVudW1JbnN0YW5jZVtuYW1lX3N0YXJ0IC0gMV0gIT0gJzonKSB7Ci0g ICAgICAgICAgICAgICAgICAgIC0tbmFtZV9zdGFydDsKLSAgICAgICAgICAgICAgICB9Ci0gICAg ICAgICAgICAgICAgcmV0dXJuIGVudW1JbnN0YW5jZS5zdWJzdHIobmFtZV9zdGFydCwgZW51bUlu c3RhbmNlLnNpemUoKSAtIG5hbWVfc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K LSAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBwYXJzZUVudW1zKCBTdHJpbmdSZWYgZW51 bXMgKSB7Ci0gICAgICAgICAgICBhdXRvIGVudW1WYWx1ZXMgPSBzcGxpdFN0cmluZ1JlZiggZW51 bXMsICcsJyApOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBwYXJzZWQ7Ci0g ICAgICAgICAgICBwYXJzZWQucmVzZXJ2ZSggZW51bVZhbHVlcy5zaXplKCkgKTsKLSAgICAgICAg ICAgIGZvciggYXV0byBjb25zdCYgZW51bVZhbHVlIDogZW51bVZhbHVlcyApIHsKLSAgICAgICAg ICAgICAgICBwYXJzZWQucHVzaF9iYWNrKHRyaW0oZXh0cmFjdEluc3RhbmNlTmFtZShlbnVtVmFs dWUpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VkOwotICAgICAg ICB9Ci0KLSAgICAgICAgRW51bUluZm86On5FbnVtSW5mbygpIHt9Ci0KLSAgICAgICAgU3RyaW5n UmVmIEVudW1JbmZvOjpsb29rdXAoIGludCB2YWx1ZSApIGNvbnN0IHsKLSAgICAgICAgICAgIGZv ciggYXV0byBjb25zdCYgdmFsdWVUb05hbWUgOiBtX3ZhbHVlcyApIHsKLSAgICAgICAgICAgICAg ICBpZiggdmFsdWVUb05hbWUuZmlyc3QgPT0gdmFsdWUgKQotICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gdmFsdWVUb05hbWUuc2Vjb25kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0 dXJuICJ7KiogdW5leHBlY3RlZCBlbnVtIHZhbHVlICoqfSJfc3I7Ci0gICAgICAgIH0KLQotICAg ICAgICBzdGQ6OnVuaXF1ZV9wdHI8RW51bUluZm8+IG1ha2VFbnVtSW5mbyggU3RyaW5nUmVmIGVu dW1OYW1lLCBTdHJpbmdSZWYgYWxsVmFsdWVOYW1lcywgc3RkOjp2ZWN0b3I8aW50PiBjb25zdCYg dmFsdWVzICkgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEVudW1JbmZvPiBlbnVtSW5m byggbmV3IEVudW1JbmZvICk7Ci0gICAgICAgICAgICBlbnVtSW5mby0+bV9uYW1lID0gZW51bU5h bWU7Ci0gICAgICAgICAgICBlbnVtSW5mby0+bV92YWx1ZXMucmVzZXJ2ZSggdmFsdWVzLnNpemUo KSApOwotCi0gICAgICAgICAgICBjb25zdCBhdXRvIHZhbHVlTmFtZXMgPSBDYXRjaDo6RGV0YWls OjpwYXJzZUVudW1zKCBhbGxWYWx1ZU5hbWVzICk7Ci0gICAgICAgICAgICBhc3NlcnQoIHZhbHVl TmFtZXMuc2l6ZSgpID09IHZhbHVlcy5zaXplKCkgKTsKLSAgICAgICAgICAgIHN0ZDo6c2l6ZV90 IGkgPSAwOwotICAgICAgICAgICAgZm9yKCBhdXRvIHZhbHVlIDogdmFsdWVzICkKLSAgICAgICAg ICAgICAgICBlbnVtSW5mby0+bV92YWx1ZXMuZW1wbGFjZV9iYWNrKHZhbHVlLCB2YWx1ZU5hbWVz W2krK10pOwotCi0gICAgICAgICAgICByZXR1cm4gZW51bUluZm87Ci0gICAgICAgIH0KLQotICAg ICAgICBFbnVtSW5mbyBjb25zdCYgRW51bVZhbHVlc1JlZ2lzdHJ5OjpyZWdpc3RlckVudW0oIFN0 cmluZ1JlZiBlbnVtTmFtZSwgU3RyaW5nUmVmIGFsbFZhbHVlTmFtZXMsIHN0ZDo6dmVjdG9yPGlu dD4gY29uc3QmIHZhbHVlcyApIHsKLSAgICAgICAgICAgIG1fZW51bUluZm9zLnB1c2hfYmFjayht YWtlRW51bUluZm8oZW51bU5hbWUsIGFsbFZhbHVlTmFtZXMsIHZhbHVlcykpOwotICAgICAgICAg ICAgcmV0dXJuICptX2VudW1JbmZvcy5iYWNrKCk7Ci0gICAgICAgIH0KLQotICAgIH0gLy8gRGV0 YWlsCi19IC8vIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9lbnVtX3ZhbHVlc19yZWdpc3RyeS5jcHAK LS8vIHN0YXJ0IGNhdGNoX2Vycm5vX2d1YXJkLmNwcAotCi0jaW5jbHVkZSA8Y2Vycm5vPgotCi1u YW1lc3BhY2UgQ2F0Y2ggewotICAgICAgICBFcnJub0d1YXJkOjpFcnJub0d1YXJkKCk6bV9vbGRF cnJubyhlcnJubyl7fQotICAgICAgICBFcnJub0d1YXJkOjp+RXJybm9HdWFyZCgpIHsgZXJybm8g PSBtX29sZEVycm5vOyB9Ci19Ci0vLyBlbmQgY2F0Y2hfZXJybm9fZ3VhcmQuY3BwCi0vLyBzdGFy dCBjYXRjaF9leGNlcHRpb25fdHJhbnNsYXRvcl9yZWdpc3RyeS5jcHAKLQotLy8gc3RhcnQgY2F0 Y2hfZXhjZXB0aW9uX3RyYW5zbGF0b3JfcmVnaXN0cnkuaAotCi0jaW5jbHVkZSA8dmVjdG9yPgot I2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7 Ci0KLSAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgOiBwdWJsaWMgSUV4Y2Vw dGlvblRyYW5zbGF0b3JSZWdpc3RyeSB7Ci0gICAgcHVibGljOgotICAgICAgICB+RXhjZXB0aW9u VHJhbnNsYXRvclJlZ2lzdHJ5KCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5z bGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICk7Ci0gICAgICAg IHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0IG92ZXJyaWRlOwot ICAgICAgICBzdGQ6OnN0cmluZyB0cnlUcmFuc2xhdG9ycygpIGNvbnN0OwotCi0gICAgcHJpdmF0 ZToKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPElFeGNlcHRpb25UcmFuc2xh dG9yIGNvbnN0Pj4gbV90cmFuc2xhdG9yczsKLSAgICB9OwotfQotCi0vLyBlbmQgY2F0Y2hfZXhj ZXB0aW9uX3RyYW5zbGF0b3JfcmVnaXN0cnkuaAotI2lmZGVmIF9fT0JKQ19fCi0jaW1wb3J0ICJG b3VuZGF0aW9uL0ZvdW5kYXRpb24uaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0g ICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5Ojp+RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lz dHJ5KCkgewotICAgIH0KLQotICAgIHZvaWQgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5Ojpy ZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9y ICkgewotICAgICAgICBtX3RyYW5zbGF0b3JzLnB1c2hfYmFjayggc3RkOjp1bmlxdWVfcHRyPGNv bnN0IElFeGNlcHRpb25UcmFuc2xhdG9yPiggdHJhbnNsYXRvciApICk7Ci0gICAgfQotCi0jaWYg IWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUykKLSAgICBzdGQ6OnN0cmlu ZyBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigp IGNvbnN0IHsKLSAgICAgICAgdHJ5IHsKLSNpZmRlZiBfX09CSkNfXwotICAgICAgICAgICAgLy8g SW4gT2JqZWN0aXZlLUMgdHJ5IG9iamVjdGl2ZS1jIGV4Y2VwdGlvbnMgZmlyc3QKLSAgICAgICAg ICAgIEB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOwotICAg ICAgICAgICAgfQotICAgICAgICAgICAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZXhjZXB0aW9uKSB7 Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeSggW2V4Y2Vw dGlvbiBkZXNjcmlwdGlvbl0gKTsKLSAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAv LyBDb21waWxpbmcgYSBtaXhlZCBtb2RlIHByb2plY3Qgd2l0aCBNU1ZDIG1lYW5zIHRoYXQgQ0xS Ci0gICAgICAgICAgICAvLyBleGNlcHRpb25zIHdpbGwgYmUgY2F1Z2h0IGluICguLi4pIGFzIHdl bGwuIEhvd2V2ZXIsIHRoZXNlCi0gICAgICAgICAgICAvLyBkbyBub3QgZmlsbC1pbiBzdGQ6OmN1 cnJlbnRfZXhjZXB0aW9uIGFuZCB0aHVzIGxlYWQgdG8gY3Jhc2gKLSAgICAgICAgICAgIC8vIHdo ZW4gYXR0ZW1wdGluZyByZXRocm93LgotICAgICAgICAgICAgLy8gL0VIYSBzd2l0Y2ggYWxzbyBj YXVzZXMgc3RydWN0dXJlZCBleGNlcHRpb25zIHRvIGJlIGNhdWdodAotICAgICAgICAgICAgLy8g aGVyZSwgYnV0IHRoZXkgZmlsbC1pbiBjdXJyZW50X2V4Y2VwdGlvbiBwcm9wZXJseSwgc28KLSAg ICAgICAgICAgIC8vIGF0IHdvcnN0IHRoZSBvdXRwdXQgc2hvdWxkIGJlIGEgbGl0dGxlIHdlaXJk LCBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAvLyBjYXVzaW5nIGEgY3Jhc2guCi0gICAgICAgICAg ICBpZiAoc3RkOjpjdXJyZW50X2V4Y2VwdGlvbigpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAg ICAgICByZXR1cm4gIk5vbiBDKysgZXhjZXB0aW9uLiBQb3NzaWJseSBhIENMUiBleGNlcHRpb24u IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnlUcmFuc2xhdG9ycygpOwot I2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIFRlc3RGYWlsdXJlRXhjZXB0aW9uJiAp IHsKLSAgICAgICAgICAgIHN0ZDo6cmV0aHJvd19leGNlcHRpb24oc3RkOjpjdXJyZW50X2V4Y2Vw dGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkg ewotICAgICAgICAgICAgcmV0dXJuIGV4LndoYXQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRj aCggc3RkOjpzdHJpbmcmIG1zZyApIHsKLSAgICAgICAgICAgIHJldHVybiBtc2c7Ci0gICAgICAg IH0KLSAgICAgICAgY2F0Y2goIGNvbnN0IGNoYXIqIG1zZyApIHsKLSAgICAgICAgICAgIHJldHVy biBtc2c7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goLi4uKSB7Ci0gICAgICAgICAgICByZXR1 cm4gIlVua25vd24gZXhjZXB0aW9uIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6c3Ry aW5nIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTo6dHJ5VHJhbnNsYXRvcnMoKSBjb25zdCB7 Ci0gICAgICAgIGlmIChtX3RyYW5zbGF0b3JzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0ZDo6 cmV0aHJvd19leGNlcHRpb24oc3RkOjpjdXJyZW50X2V4Y2VwdGlvbigpKTsKLSAgICAgICAgfSBl bHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtX3RyYW5zbGF0b3JzWzBdLT50cmFuc2xhdGUobV90 cmFuc2xhdG9ycy5iZWdpbigpICsgMSwgbV90cmFuc2xhdG9ycy5lbmQoKSk7Ci0gICAgICAgIH0K LSAgICB9Ci0KLSNlbHNlIC8vIF5eIEV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgLy8gRXhjZXB0aW9u cyBhcmUgZGlzYWJsZWQgdnYKLSAgICBzdGQ6OnN0cmluZyBFeGNlcHRpb25UcmFuc2xhdG9yUmVn aXN0cnk6OnRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0IHsKLSAgICAgICAgQ0FUQ0hf SU5URVJOQUxfRVJST1IoIkF0dGVtcHRlZCB0byB0cmFuc2xhdGUgYWN0aXZlIGV4Y2VwdGlvbiB1 bmRlciBDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TISIpOwotICAgIH0KLQotICAgIHN0 ZDo6c3RyaW5nIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTo6dHJ5VHJhbnNsYXRvcnMoKSBj b25zdCB7Ci0gICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCJBdHRlbXB0ZWQgdG8gdXNlIGV4 Y2VwdGlvbiB0cmFuc2xhdG9ycyB1bmRlciBDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05T ISIpOwotICAgIH0KLSNlbmRpZgotCi19Ci0vLyBlbmQgY2F0Y2hfZXhjZXB0aW9uX3RyYW5zbGF0 b3JfcmVnaXN0cnkuY3BwCi0vLyBzdGFydCBjYXRjaF9mYXRhbF9jb25kaXRpb24uY3BwCi0KLSNp bmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpZiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX1dJTkRPV1Nf U0VIICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTICkKLQotbmFtZXNw YWNlIENhdGNoIHsKLQotICAgIC8vIElmIG5laXRoZXIgU0VIIG5vciBzaWduYWwgaGFuZGxpbmcg aXMgcmVxdWlyZWQsIHRoZSBoYW5kbGVyIGltcGxzCi0gICAgLy8gZG8gbm90IGhhdmUgdG8gZG8g YW55dGhpbmcsIGFuZCBjYW4gYmUgZW1wdHkuCi0gICAgdm9pZCBGYXRhbENvbmRpdGlvbkhhbmRs ZXI6OmVuZ2FnZV9wbGF0Zm9ybSgpIHt9Ci0gICAgdm9pZCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6 OmRpc2VuZ2FnZV9wbGF0Zm9ybSgpIHt9Ci0gICAgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpGYXRh bENvbmRpdGlvbkhhbmRsZXIoKSA9IGRlZmF1bHQ7Ci0gICAgRmF0YWxDb25kaXRpb25IYW5kbGVy Ojp+RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgPSBkZWZhdWx0OwotCi19IC8vIGVuZCBuYW1lc3Bh Y2UgQ2F0Y2gKLQotI2VuZGlmIC8vICFDQVRDSF9DT05GSUdfV0lORE9XU19TRUggJiYgIUNBVENI X0NPTkZJR19QT1NJWF9TSUdOQUxTCi0KLSNpZiBkZWZpbmVkKCBDQVRDSF9DT05GSUdfV0lORE9X U19TRUggKSAmJiBkZWZpbmVkKCBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUyApCi0jZXJyb3Ig IkluY29uc2lzdGVudCBjb25maWd1cmF0aW9uOiBXaW5kb3dzJyBTRUggaGFuZGxpbmcgYW5kIFBP U0lYIHNpZ25hbHMgY2Fubm90IGJlIGVuYWJsZWQgYXQgdGhlIHNhbWUgdGltZSIKLSNlbmRpZiAv LyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggJiYgQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMK LQotI2lmIGRlZmluZWQoIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCApIHx8IGRlZmluZWQoIENB VENIX0NPTkZJR19QT1NJWF9TSUdOQUxTICkKLQotbmFtZXNwYWNlIHsKLSAgICAvLyEgU2lnbmFs cyBmYXRhbCBlcnJvciBtZXNzYWdlIHRvIHRoZSBydW4gY29udGV4dAotICAgIHZvaWQgcmVwb3J0 RmF0YWwoIGNoYXIgY29uc3QgKiBjb25zdCBtZXNzYWdlICkgewotICAgICAgICBDYXRjaDo6Z2V0 Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCktPmhhbmRsZUZhdGFsRXJyb3JDb25k aXRpb24oIG1lc3NhZ2UgKTsKLSAgICB9Ci0KLSAgICAvLyEgTWluaW1hbCBzaXplIENhdGNoMiBu ZWVkcyBmb3IgaXRzIG93biBmYXRhbCBlcnJvciBoYW5kbGluZy4KLSAgICAvLyEgUGlja2VkIGFu ZWNkb3RhbGx5LCBzbyBpdCBtaWdodCBub3QgYmUgc3VmZmljaWVudCBvbiBhbGwKLSAgICAvLyEg cGxhdGZvcm1zLCBhbmQgZm9yIGFsbCBjb25maWd1cmF0aW9ucy4KLSAgICBjb25zdGV4cHIgc3Rk OjpzaXplX3QgbWluU3RhY2tTaXplRm9yRXJyb3JzID0gMzIgKiAxMDI0OwotfSAvLyBlbmQgdW5u YW1lZCBuYW1lc3BhY2UKLQotI2VuZGlmIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCB8fCBD QVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUwotCi0jaWYgZGVmaW5lZCggQ0FUQ0hfQ09ORklHX1dJ TkRPV1NfU0VIICkKLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIHN0cnVjdCBTaWduYWxEZWZz IHsgRFdPUkQgaWQ7IGNvbnN0IGNoYXIqIG5hbWU7IH07Ci0KLSAgICAvLyBUaGVyZSBpcyBubyAx LTEgbWFwcGluZyBiZXR3ZWVuIHNpZ25hbHMgYW5kIHdpbmRvd3MgZXhjZXB0aW9ucy4KLSAgICAv LyBXaW5kb3dzIGNhbiBlYXNpbHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBTTyBhbmQgU2lnU2VnViwK LSAgICAvLyBidXQgU2lnSW50LCBTaWdUZXJtLCBldGMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHku Ci0gICAgc3RhdGljIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdID0gewotICAgICAgICB7IHN0YXRp Y19jYXN0PERXT1JEPihFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTiksICAiU0lHSUxMIC0g SWxsZWdhbCBpbnN0cnVjdGlvbiBzaWduYWwiIH0sCi0gICAgICAgIHsgc3RhdGljX2Nhc3Q8RFdP UkQ+KEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVyksICJTSUdTRUdWIC0gU3RhY2sgb3ZlcmZsb3ci IH0sCi0gICAgICAgIHsgc3RhdGljX2Nhc3Q8RFdPUkQ+KEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFU SU9OKSwgIlNJR1NFR1YgLSBTZWdtZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKLSAgICAg ICAgeyBzdGF0aWNfY2FzdDxEV09SRD4oRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTyksICJE aXZpZGUgYnkgemVybyBlcnJvciIgfSwKLSAgICB9OwotCi0gICAgc3RhdGljIExPTkcgQ0FMTEJB Q0sgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24oUEVYQ0VQVElPTl9QT0lOVEVSUyBFeGNlcHRpb25J bmZvKSB7Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCYgZGVmIDogc2lnbmFsRGVmcykgewotICAg ICAgICAgICAgaWYgKEV4Y2VwdGlvbkluZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29k ZSA9PSBkZWYuaWQpIHsKLSAgICAgICAgICAgICAgICByZXBvcnRGYXRhbChkZWYubmFtZSk7Ci0g ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgaXRzIG5vdCBhbiBleGNlcHRp b24gd2UgY2FyZSBhYm91dCwgcGFzcyBpdCBhbG9uZy4KLSAgICAgICAgLy8gVGhpcyBzdG9wcyB1 cyBmcm9tIGVhdGluZyBkZWJ1Z2dlciBicmVha3MgZXRjLgotICAgICAgICByZXR1cm4gRVhDRVBU SU9OX0NPTlRJTlVFX1NFQVJDSDsKLSAgICB9Ci0KLSAgICAvLyBTaW5jZSB3ZSBkbyBub3Qgc3Vw cG9ydCBtdWx0aXBsZSBpbnN0YW50aWF0aW9ucywgd2UgcHV0IHRoZXNlCi0gICAgLy8gaW50byBn bG9iYWwgdmFyaWFibGVzIGFuZCByZWx5IG9uIGNsZWFuaW5nIHRoZW0gdXAgaW4gb3V0bGluZWQK LSAgICAvLyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKLSAgICBzdGF0aWMgUFZPSUQgZXhjZXB0 aW9uSGFuZGxlckhhbmRsZSA9IG51bGxwdHI7Ci0KLSAgICAvLyBGb3IgTVNWQywgd2UgcmVzZXJ2 ZSBwYXJ0IG9mIHRoZSBzdGFjayBtZW1vcnkgZm9yIGhhbmRsaW5nCi0gICAgLy8gbWVtb3J5IG92 ZXJmbG93IHN0cnVjdHVyZWQgZXhjZXB0aW9uLgotICAgIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6 RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgewotICAgICAgICBVTE9ORyBndWFyYW50ZWVTaXplID0g c3RhdGljX2Nhc3Q8VUxPTkc+KG1pblN0YWNrU2l6ZUZvckVycm9ycyk7Ci0gICAgICAgIGlmICgh U2V0VGhyZWFkU3RhY2tHdWFyYW50ZWUoJmd1YXJhbnRlZVNpemUpKSB7Ci0gICAgICAgICAgICAv LyBXZSBkbyBub3Qgd2FudCB0byBmdWxseSBlcnJvciBvdXQsIGJlY2F1c2UgbmVlZGluZwotICAg ICAgICAgICAgLy8gdGhlIHN0YWNrIHJlc2VydmUgc2hvdWxkIGJlIHJhcmUgZW5vdWdoIGFueXdh eS4KLSAgICAgICAgICAgIENhdGNoOjpjZXJyKCkKLSAgICAgICAgICAgICAgICA8PCAiRmFpbGVk IHRvIHJlc2VydmUgcGllY2Ugb2Ygc3RhY2suIgotICAgICAgICAgICAgICAgIDw8ICIgU3RhY2sg b3ZlcmZsb3dzIHdpbGwgbm90IGJlIHJlcG9ydGVkIHN1Y2Nlc3NmdWxseS4iOwotICAgICAgICB9 Ci0gICAgfQotCi0gICAgLy8gV2UgZG8gbm90IGF0dGVtcHQgdG8gdW5zZXQgdGhlIHN0YWNrIGd1 YXJhbnRlZSwgYmVjYXVzZQotICAgIC8vIFdpbmRvd3MgZG9lcyBub3Qgc3VwcG9ydCBsb3dlcmlu ZyB0aGUgc3RhY2sgc2l6ZSBndWFyYW50ZWUuCi0gICAgRmF0YWxDb25kaXRpb25IYW5kbGVyOjp+ RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgPSBkZWZhdWx0OwotCi0gICAgdm9pZCBGYXRhbENvbmRp dGlvbkhhbmRsZXI6OmVuZ2FnZV9wbGF0Zm9ybSgpIHsKLSAgICAgICAgLy8gUmVnaXN0ZXIgYXMg Zmlyc3QgaGFuZGxlciBpbiBjdXJyZW50IGNoYWluCi0gICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJI YW5kbGUgPSBBZGRWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoMSwgaGFuZGxlVmVjdG9yZWRFeGNl cHRpb24pOwotICAgICAgICBpZiAoIWV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUpIHsKLSAgICAgICAg ICAgIENBVENIX1JVTlRJTUVfRVJST1IoIkNvdWxkIG5vdCByZWdpc3RlciB2ZWN0b3JlZCBleGNl cHRpb24gaGFuZGxlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBGYXRhbENvbmRp dGlvbkhhbmRsZXI6OmRpc2VuZ2FnZV9wbGF0Zm9ybSgpIHsKLSAgICAgICAgaWYgKCFSZW1vdmVW ZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlckhhbmRsZSkpIHsKLSAgICAg ICAgICAgIENBVENIX1JVTlRJTUVfRVJST1IoIkNvdWxkIG5vdCB1bnJlZ2lzdGVyIHZlY3RvcmVk IGV4Y2VwdGlvbiBoYW5kbGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgZXhjZXB0aW9uSGFuZGxl ckhhbmRsZSA9IG51bGxwdHI7Ci0gICAgfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLQot I2VuZGlmIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSAotCi0jaWYgZGVmaW5lZCggQ0FUQ0hf Q09ORklHX1BPU0lYX1NJR05BTFMgKQotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLW5hbWVzcGFj ZSBDYXRjaCB7Ci0KLSAgICBzdHJ1Y3QgU2lnbmFsRGVmcyB7Ci0gICAgICAgIGludCBpZDsKLSAg ICAgICAgY29uc3QgY2hhciogbmFtZTsKLSAgICB9OwotCi0gICAgc3RhdGljIFNpZ25hbERlZnMg c2lnbmFsRGVmc1tdID0gewotICAgICAgICB7IFNJR0lOVCwgICJTSUdJTlQgLSBUZXJtaW5hbCBp bnRlcnJ1cHQgc2lnbmFsIiB9LAotICAgICAgICB7IFNJR0lMTCwgICJTSUdJTEwgLSBJbGxlZ2Fs IGluc3RydWN0aW9uIHNpZ25hbCIgfSwKLSAgICAgICAgeyBTSUdGUEUsICAiU0lHRlBFIC0gRmxv YXRpbmcgcG9pbnQgZXJyb3Igc2lnbmFsIiB9LAotICAgICAgICB7IFNJR1NFR1YsICJTSUdTRUdW IC0gU2VnbWVudGF0aW9uIHZpb2xhdGlvbiBzaWduYWwiIH0sCi0gICAgICAgIHsgU0lHVEVSTSwg IlNJR1RFUk0gLSBUZXJtaW5hdGlvbiByZXF1ZXN0IHNpZ25hbCIgfSwKLSAgICAgICAgeyBTSUdB QlJULCAiU0lHQUJSVCAtIEFib3J0IChhYm5vcm1hbCB0ZXJtaW5hdGlvbikgc2lnbmFsIiB9Ci0g ICAgfTsKLQotLy8gT2xkZXIgR0NDcyB0cmlnZ2VyIC1XbWlzc2luZy1maWVsZC1pbml0aWFsaXpl cnMgZm9yIFQgZm9vID0ge30KLS8vIHdoaWNoIGlzIHplcm8gaW5pdGlhbGl6YXRpb24sIGJ1dCBu b3QgZXhwbGljaXQuIFdlIHdhbnQgdG8gYXZvaWQKLS8vIHRoYXQuCi0jaWYgZGVmaW5lZChfX0dO VUNfXykKLSMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKLSMgICAgcHJhZ21hIEdDQyBk aWFnbm9zdGljIGlnbm9yZWQgIi1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiCi0jZW5kaWYK LQotICAgIHN0YXRpYyBjaGFyKiBhbHRTdGFja01lbSA9IG51bGxwdHI7Ci0gICAgc3RhdGljIHN0 ZDo6c2l6ZV90IGFsdFN0YWNrU2l6ZSA9IDA7Ci0gICAgc3RhdGljIHN0YWNrX3Qgb2xkU2lnU3Rh Y2t7fTsKLSAgICBzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBvbGRTaWdBY3Rpb25zW3NpemVvZihz aWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKV17fTsKLQotICAgIHN0YXRpYyB2b2lkIHJl c3RvcmVQcmV2aW91c1NpZ25hbEhhbmRsZXJzKCkgewotICAgICAgICAvLyBXZSBzZXQgc2lnbmFs IGhhbmRsZXJzIGJhY2sgdG8gdGhlIHByZXZpb3VzIG9uZXMuIEhvcGVmdWxseQotICAgICAgICAv LyBub2JvZHkgb3Zlcndyb3RlIHRoZW0gaW4gdGhlIG1lYW50aW1lLCBhbmQgZG9lc24ndCBleHBl Y3QKLSAgICAgICAgLy8gdGhlaXIgc2lnbmFsIGhhbmRsZXJzIHRvIGxpdmUgcGFzdCBvdXJzIGdp dmVuIHRoYXQgdGhleQotICAgICAgICAvLyBpbnN0YWxsZWQgdGhlbSBhZnRlciBvdXJzLi4KLSAg ICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNp emVvZihTaWduYWxEZWZzKTsgKytpKSB7Ci0gICAgICAgICAgICBzaWdhY3Rpb24oc2lnbmFsRGVm c1tpXS5pZCwgJm9sZFNpZ0FjdGlvbnNbaV0sIG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAg IC8vIFJldHVybiB0aGUgb2xkIHN0YWNrCi0gICAgICAgIHNpZ2FsdHN0YWNrKCZvbGRTaWdTdGFj aywgbnVsbHB0cik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgaGFuZGxlU2lnbmFsKCBpbnQg c2lnICkgewotICAgICAgICBjaGFyIGNvbnN0ICogbmFtZSA9ICI8dW5rbm93biBzaWduYWw+IjsK LSAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBkZWYgOiBzaWduYWxEZWZzKSB7Ci0gICAgICAgICAg ICBpZiAoc2lnID09IGRlZi5pZCkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBkZWYubmFtZTsK LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAg ICAvLyBXZSBuZWVkIHRvIHJlc3RvcmUgcHJldmlvdXMgc2lnbmFsIGhhbmRsZXJzIGFuZCBsZXQg dGhlbSBkbwotICAgICAgICAvLyB0aGVpciB0aGluZywgc28gdGhhdCB0aGUgdXNlcnMgY2FuIGhh dmUgdGhlIGRlYnVnZ2VyIGJyZWFrCi0gICAgICAgIC8vIHdoZW4gYSBzaWduYWwgaXMgcmFpc2Vk LCBhbmQgc28gb24uCi0gICAgICAgIHJlc3RvcmVQcmV2aW91c1NpZ25hbEhhbmRsZXJzKCk7Ci0g ICAgICAgIHJlcG9ydEZhdGFsKCBuYW1lICk7Ci0gICAgICAgIHJhaXNlKCBzaWcgKTsKLSAgICB9 Ci0KLSAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsK LSAgICAgICAgYXNzZXJ0KCFhbHRTdGFja01lbSAmJiAiQ2Fubm90IGluaXRpYWxpemUgUE9TSVgg c2lnbmFsIGhhbmRsZXIgd2hlbiBvbmUgYWxyZWFkeSBleGlzdHMiKTsKLSAgICAgICAgaWYgKGFs dFN0YWNrU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBhbHRTdGFja1NpemUgPSBzdGQ6Om1heChz dGF0aWNfY2FzdDxzaXplX3Q+KFNJR1NUS1NaKSwgbWluU3RhY2tTaXplRm9yRXJyb3JzKTsKLSAg ICAgICAgfQotICAgICAgICBhbHRTdGFja01lbSA9IG5ldyBjaGFyW2FsdFN0YWNrU2l6ZV0oKTsK LSAgICB9Ci0KLSAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXI6On5GYXRhbENvbmRpdGlvbkhhbmRs ZXIoKSB7Ci0gICAgICAgIGRlbGV0ZVtdIGFsdFN0YWNrTWVtOwotICAgICAgICAvLyBXZSBzaWdu YWwgdGhhdCBhbm90aGVyIGluc3RhbmNlIGNhbiBiZSBjb25zdHJ1Y3RlZCBieSB6ZXJvaW5nCi0g ICAgICAgIC8vIG91dCB0aGUgcG9pbnRlci4KLSAgICAgICAgYWx0U3RhY2tNZW0gPSBudWxscHRy OwotICAgIH0KLQotICAgIHZvaWQgRmF0YWxDb25kaXRpb25IYW5kbGVyOjplbmdhZ2VfcGxhdGZv cm0oKSB7Ci0gICAgICAgIHN0YWNrX3Qgc2lnU3RhY2s7Ci0gICAgICAgIHNpZ1N0YWNrLnNzX3Nw ID0gYWx0U3RhY2tNZW07Ci0gICAgICAgIHNpZ1N0YWNrLnNzX3NpemUgPSBhbHRTdGFja1NpemU7 Ci0gICAgICAgIHNpZ1N0YWNrLnNzX2ZsYWdzID0gMDsKLSAgICAgICAgc2lnYWx0c3RhY2soJnNp Z1N0YWNrLCAmb2xkU2lnU3RhY2spOwotICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhID0geyB9 OwotCi0gICAgICAgIHNhLnNhX2hhbmRsZXIgPSBoYW5kbGVTaWduYWw7Ci0gICAgICAgIHNhLnNh X2ZsYWdzID0gU0FfT05TVEFDSzsKLSAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8 IHNpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgewotICAgICAgICAg ICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZzYSwgJm9sZFNpZ0FjdGlvbnNbaV0pOwot ICAgICAgICB9Ci0gICAgfQotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgICAgcHJhZ21hIEdD QyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0KLSAgICB2b2lkIEZhdGFsQ29uZGl0aW9uSGFuZGxl cjo6ZGlzZW5nYWdlX3BsYXRmb3JtKCkgewotICAgICAgICByZXN0b3JlUHJldmlvdXNTaWduYWxI YW5kbGVycygpOwotICAgIH0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLSNlbmRpZiAv LyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUwotLy8gZW5kIGNhdGNoX2ZhdGFsX2NvbmRpdGlv bi5jcHAKLS8vIHN0YXJ0IGNhdGNoX2dlbmVyYXRvcnMuY3BwCi0KLSNpbmNsdWRlIDxsaW1pdHM+ Ci0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi1JR2VuZXJhdG9yVHJhY2tl cjo6fklHZW5lcmF0b3JUcmFja2VyKCkge30KLQotY29uc3QgY2hhciogR2VuZXJhdG9yRXhjZXB0 aW9uOjp3aGF0KCkgY29uc3Qgbm9leGNlcHQgewotICAgIHJldHVybiBtX21zZzsKLX0KLQotbmFt ZXNwYWNlIEdlbmVyYXRvcnMgewotCi0gICAgR2VuZXJhdG9yVW50eXBlZEJhc2U6On5HZW5lcmF0 b3JVbnR5cGVkQmFzZSgpIHt9Ci0KLSAgICBhdXRvIGFjcXVpcmVHZW5lcmF0b3JUcmFja2VyKCBT dHJpbmdSZWYgZ2VuZXJhdG9yTmFtZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkg LT4gSUdlbmVyYXRvclRyYWNrZXImIHsKLSAgICAgICAgcmV0dXJuIGdldFJlc3VsdENhcHR1cmUo KS5hY3F1aXJlR2VuZXJhdG9yVHJhY2tlciggZ2VuZXJhdG9yTmFtZSwgbGluZUluZm8gKTsKLSAg ICB9Ci0KLX0gLy8gbmFtZXNwYWNlIEdlbmVyYXRvcnMKLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0v LyBlbmQgY2F0Y2hfZ2VuZXJhdG9ycy5jcHAKLS8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfY2Fw dHVyZS5jcHAKLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBJUmVzdWx0Q2FwdHVyZTo6fklSZXN1 bHRDYXB0dXJlKCkgPSBkZWZhdWx0OwotfQotLy8gZW5kIGNhdGNoX2ludGVyZmFjZXNfY2FwdHVy ZS5jcHAKLS8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfY29uZmlnLmNwcAotCi1uYW1lc3BhY2Ug Q2F0Y2ggewotICAgIElDb25maWc6On5JQ29uZmlnKCkgPSBkZWZhdWx0OwotfQotLy8gZW5kIGNh dGNoX2ludGVyZmFjZXNfY29uZmlnLmNwcAotLy8gc3RhcnQgY2F0Y2hfaW50ZXJmYWNlc19leGNl cHRpb24uY3BwCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgSUV4Y2VwdGlvblRyYW5zbGF0b3I6 On5JRXhjZXB0aW9uVHJhbnNsYXRvcigpID0gZGVmYXVsdDsKLSAgICBJRXhjZXB0aW9uVHJhbnNs YXRvclJlZ2lzdHJ5Ojp+SUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpID0gZGVmYXVsdDsK LX0KLS8vIGVuZCBjYXRjaF9pbnRlcmZhY2VzX2V4Y2VwdGlvbi5jcHAKLS8vIHN0YXJ0IGNhdGNo X2ludGVyZmFjZXNfcmVnaXN0cnlfaHViLmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIElS ZWdpc3RyeUh1Yjo6fklSZWdpc3RyeUh1YigpID0gZGVmYXVsdDsKLSAgICBJTXV0YWJsZVJlZ2lz dHJ5SHViOjp+SU11dGFibGVSZWdpc3RyeUh1YigpID0gZGVmYXVsdDsKLX0KLS8vIGVuZCBjYXRj aF9pbnRlcmZhY2VzX3JlZ2lzdHJ5X2h1Yi5jcHAKLS8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNf cmVwb3J0ZXIuY3BwCi0KLS8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2xpc3RlbmluZy5oCi0KLW5h bWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBjbGFzcyBMaXN0ZW5pbmdSZXBvcnRlciA6IHB1YmxpYyBJ U3RyZWFtaW5nUmVwb3J0ZXIgewotICAgICAgICB1c2luZyBSZXBvcnRlcnMgPSBzdGQ6OnZlY3Rv cjxJU3RyZWFtaW5nUmVwb3J0ZXJQdHI+OwotICAgICAgICBSZXBvcnRlcnMgbV9saXN0ZW5lcnM7 Ci0gICAgICAgIElTdHJlYW1pbmdSZXBvcnRlclB0ciBtX3JlcG9ydGVyID0gbnVsbHB0cjsKLSAg ICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBtX3ByZWZlcmVuY2VzOwotCi0gICAgcHVibGljOgot ICAgICAgICBMaXN0ZW5pbmdSZXBvcnRlcigpOwotCi0gICAgICAgIHZvaWQgYWRkTGlzdGVuZXIo IElTdHJlYW1pbmdSZXBvcnRlclB0ciYmIGxpc3RlbmVyICk7Ci0gICAgICAgIHZvaWQgYWRkUmVw b3J0ZXIoIElTdHJlYW1pbmdSZXBvcnRlclB0ciYmIHJlcG9ydGVyICk7Ci0KLSAgICBwdWJsaWM6 IC8vIElTdHJlYW1pbmdSZXBvcnRlcgotCi0gICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0 UHJlZmVyZW5jZXMoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIG5vTWF0Y2hpbmdU ZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgb3ZlcnJpZGU7Ci0KLSAgICAgICAg dm9pZCByZXBvcnRJbnZhbGlkQXJndW1lbnRzKHN0ZDo6c3RyaW5nIGNvbnN0JmFyZykgb3ZlcnJp ZGU7Ci0KLSAgICAgICAgc3RhdGljIHN0ZDo6c2V0PFZlcmJvc2l0eT4gZ2V0U3VwcG9ydGVkVmVy Ym9zaXRpZXMoKTsKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJ TkcpCi0gICAgICAgIHZvaWQgYmVuY2htYXJrUHJlcGFyaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBu YW1lKSBvdmVycmlkZTsKLSAgICAgICAgdm9pZCBiZW5jaG1hcmtTdGFydGluZyggQmVuY2htYXJr SW5mbyBjb25zdCYgYmVuY2htYXJrSW5mbyApIG92ZXJyaWRlOwotICAgICAgICB2b2lkIGJlbmNo bWFya0VuZGVkKCBCZW5jaG1hcmtTdGF0czw+IGNvbnN0JiBiZW5jaG1hcmtTdGF0cyApIG92ZXJy aWRlOwotICAgICAgICB2b2lkIGJlbmNobWFya0ZhaWxlZChzdGQ6OnN0cmluZyBjb25zdCYpIG92 ZXJyaWRlOwotI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCi0KLSAg ICAgICAgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5m byApIG92ZXJyaWRlOwotICAgICAgICB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8g Y29uc3QmIGdyb3VwSW5mbyApIG92ZXJyaWRlOwotICAgICAgICB2b2lkIHRlc3RDYXNlU3RhcnRp bmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBvdmVycmlkZTsKLSAgICAgICAgdm9p ZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIG92ZXJy aWRlOwotICAgICAgICB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0 JiBhc3NlcnRpb25JbmZvICkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1 ZSBpbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKLSAg ICAgICAgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlv blN0YXRzICkgb3ZlcnJpZGU7Ci0gICAgICAgIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3Rh dHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIG92ZXJyaWRlOwotICAgICAgICB2b2lkIHRlc3RDYXNl RW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBvdmVycmlkZTsKLSAg ICAgICAgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91 cFN0YXRzICkgb3ZlcnJpZGU7Ci0gICAgICAgIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3Rh dHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIG92ZXJyaWRlOwotCi0gICAgICAgIHZvaWQgc2tpcFRl c3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBvdmVycmlkZTsKLSAgICAgICAgYm9v bCBpc011bHRpKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB9OwotCi19IC8vIGVuZCBuYW1lc3Bh Y2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX3JlcG9ydGVyX2xpc3RlbmluZy5oCi1uYW1lc3BhY2Ug Q2F0Y2ggewotCi0gICAgUmVwb3J0ZXJDb25maWc6OlJlcG9ydGVyQ29uZmlnKCBJQ29uZmlnUHRy IGNvbnN0JiBfZnVsbENvbmZpZyApCi0gICAgOiAgIG1fc3RyZWFtKCAmX2Z1bGxDb25maWctPnN0 cmVhbSgpICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQotCi0gICAgUmVwb3J0ZXJD b25maWc6OlJlcG9ydGVyQ29uZmlnKCBJQ29uZmlnUHRyIGNvbnN0JiBfZnVsbENvbmZpZywgc3Rk Ojpvc3RyZWFtJiBfc3RyZWFtICkKLSAgICA6ICAgbV9zdHJlYW0oICZfc3RyZWFtICksIG1fZnVs bENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQotCi0gICAgc3RkOjpvc3RyZWFtJiBSZXBvcnRlckNv bmZpZzo6c3RyZWFtKCkgY29uc3QgeyByZXR1cm4gKm1fc3RyZWFtOyB9Ci0gICAgSUNvbmZpZ1B0 ciBSZXBvcnRlckNvbmZpZzo6ZnVsbENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1fZnVsbENvbmZp ZzsgfQotCi0gICAgVGVzdFJ1bkluZm86OlRlc3RSdW5JbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYg X25hbWUgKSA6IG5hbWUoIF9uYW1lICkge30KLQotICAgIEdyb3VwSW5mbzo6R3JvdXBJbmZvKCAg c3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rk OjpzaXplX3QgX2dyb3VwSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNp emVfdCBfZ3JvdXBzQ291bnQgKQotICAgIDogICBuYW1lKCBfbmFtZSApLAotICAgICAgICBncm91 cEluZGV4KCBfZ3JvdXBJbmRleCApLAotICAgICAgICBncm91cHNDb3VudHMoIF9ncm91cHNDb3Vu dCApCi0gICAge30KLQotICAgICBBc3NlcnRpb25TdGF0czo6QXNzZXJ0aW9uU3RhdHMoIEFzc2Vy dGlvblJlc3VsdCBjb25zdCYgX2Fzc2VydGlvblJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gY29uc3QmIF9pbmZvTWVz c2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0 JiBfdG90YWxzICkKLSAgICA6ICAgYXNzZXJ0aW9uUmVzdWx0KCBfYXNzZXJ0aW9uUmVzdWx0ICks Ci0gICAgICAgIGluZm9NZXNzYWdlcyggX2luZm9NZXNzYWdlcyApLAotICAgICAgICB0b3RhbHMo IF90b3RhbHMgKQotICAgIHsKLSAgICAgICAgYXNzZXJ0aW9uUmVzdWx0Lm1fcmVzdWx0RGF0YS5s YXp5RXhwcmVzc2lvbi5tX3RyYW5zaWVudEV4cHJlc3Npb24gPSBfYXNzZXJ0aW9uUmVzdWx0Lm1f cmVzdWx0RGF0YS5sYXp5RXhwcmVzc2lvbi5tX3RyYW5zaWVudEV4cHJlc3Npb247Ci0KLSAgICAg ICAgaWYoIGFzc2VydGlvblJlc3VsdC5oYXNNZXNzYWdlKCkgKSB7Ci0gICAgICAgICAgICAvLyBD b3B5IG1lc3NhZ2UgaW50byBtZXNzYWdlcyBsaXN0LgotICAgICAgICAgICAgLy8gIVRCRCBUaGlz IHNob3VsZCBoYXZlIGJlZW4gZG9uZSBlYXJsaWVyLCBzb21ld2hlcmUKLSAgICAgICAgICAgIE1l c3NhZ2VCdWlsZGVyIGJ1aWxkZXIoIGFzc2VydGlvblJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCks IGFzc2VydGlvblJlc3VsdC5nZXRTb3VyY2VJbmZvKCksIGFzc2VydGlvblJlc3VsdC5nZXRSZXN1 bHRUeXBlKCkgKTsKLSAgICAgICAgICAgIGJ1aWxkZXIgPDwgYXNzZXJ0aW9uUmVzdWx0LmdldE1l c3NhZ2UoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIubV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1f c3RyZWFtLnN0cigpOwotCi0gICAgICAgICAgICBpbmZvTWVzc2FnZXMucHVzaF9iYWNrKCBidWls ZGVyLm1faW5mbyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgIEFzc2VydGlvblN0YXRzOjp+ QXNzZXJ0aW9uU3RhdHMoKSA9IGRlZmF1bHQ7Ci0KLSAgICBTZWN0aW9uU3RhdHM6OlNlY3Rpb25T dGF0cyggIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBDb3VudHMgY29uc3QmIF9hc3NlcnRpb25zLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcywKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX21pc3NpbmdBc3NlcnRpb25zICkKLSAgICA6 ICAgc2VjdGlvbkluZm8oIF9zZWN0aW9uSW5mbyApLAotICAgICAgICBhc3NlcnRpb25zKCBfYXNz ZXJ0aW9ucyApLAotICAgICAgICBkdXJhdGlvbkluU2Vjb25kcyggX2R1cmF0aW9uSW5TZWNvbmRz ICksCi0gICAgICAgIG1pc3NpbmdBc3NlcnRpb25zKCBfbWlzc2luZ0Fzc2VydGlvbnMgKQotICAg IHt9Ci0KLSAgICBTZWN0aW9uU3RhdHM6On5TZWN0aW9uU3RhdHMoKSA9IGRlZmF1bHQ7Ci0KLSAg ICBUZXN0Q2FzZVN0YXRzOjpUZXN0Q2FzZVN0YXRzKCAgVGVzdENhc2VJbmZvIGNvbnN0JiBfdGVz dEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYg X3RvdGFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcg Y29uc3QmIF9zdGRPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6 c3RyaW5nIGNvbnN0JiBfc3RkRXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBib29sIF9hYm9ydGluZyApCi0gICAgOiB0ZXN0SW5mbyggX3Rlc3RJbmZvICksCi0gICAgICAg IHRvdGFscyggX3RvdGFscyApLAotICAgICAgICBzdGRPdXQoIF9zdGRPdXQgKSwKLSAgICAgICAg c3RkRXJyKCBfc3RkRXJyICksCi0gICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQotICAgIHt9 Ci0KLSAgICBUZXN0Q2FzZVN0YXRzOjp+VGVzdENhc2VTdGF0cygpID0gZGVmYXVsdDsKLQotICAg IFRlc3RHcm91cFN0YXRzOjpUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJ bmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBf dG90YWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRp bmcgKQotICAgIDogICBncm91cEluZm8oIF9ncm91cEluZm8gKSwKLSAgICAgICAgdG90YWxzKCBf dG90YWxzICksCi0gICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQotICAgIHt9Ci0KLSAgICBU ZXN0R3JvdXBTdGF0czo6VGVzdEdyb3VwU3RhdHMoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5m byApCi0gICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAotICAgICAgICBhYm9ydGluZygg ZmFsc2UgKQotICAgIHt9Ci0KLSAgICBUZXN0R3JvdXBTdGF0czo6flRlc3RHcm91cFN0YXRzKCkg PSBkZWZhdWx0OwotCi0gICAgVGVzdFJ1blN0YXRzOjpUZXN0UnVuU3RhdHMoICAgVGVzdFJ1bklu Zm8gY29uc3QmIF9ydW5JbmZvLAotICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90 b3RhbHMsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKLSAgICA6ICAgcnVu SW5mbyggX3J1bkluZm8gKSwKLSAgICAgICAgdG90YWxzKCBfdG90YWxzICksCi0gICAgICAgIGFi b3J0aW5nKCBfYWJvcnRpbmcgKQotICAgIHt9Ci0KLSAgICBUZXN0UnVuU3RhdHM6On5UZXN0UnVu U3RhdHMoKSA9IGRlZmF1bHQ7Ci0KLSAgICB2b2lkIElTdHJlYW1pbmdSZXBvcnRlcjo6ZmF0YWxF cnJvckVuY291bnRlcmVkKCBTdHJpbmdSZWYgKSB7fQotICAgIGJvb2wgSVN0cmVhbWluZ1JlcG9y dGVyOjppc011bHRpKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIElSZXBvcnRlckZh Y3Rvcnk6On5JUmVwb3J0ZXJGYWN0b3J5KCkgPSBkZWZhdWx0OwotICAgIElSZXBvcnRlclJlZ2lz dHJ5Ojp+SVJlcG9ydGVyUmVnaXN0cnkoKSA9IGRlZmF1bHQ7Ci0KLX0gLy8gZW5kIG5hbWVzcGFj ZSBDYXRjaAotLy8gZW5kIGNhdGNoX2ludGVyZmFjZXNfcmVwb3J0ZXIuY3BwCi0vLyBzdGFydCBj YXRjaF9pbnRlcmZhY2VzX3J1bm5lci5jcHAKLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBJUnVu bmVyOjp+SVJ1bm5lcigpID0gZGVmYXVsdDsKLX0KLS8vIGVuZCBjYXRjaF9pbnRlcmZhY2VzX3J1 bm5lci5jcHAKLS8vIHN0YXJ0IGNhdGNoX2ludGVyZmFjZXNfdGVzdGNhc2UuY3BwCi0KLW5hbWVz cGFjZSBDYXRjaCB7Ci0gICAgSVRlc3RJbnZva2VyOjp+SVRlc3RJbnZva2VyKCkgPSBkZWZhdWx0 OwotICAgIElUZXN0Q2FzZVJlZ2lzdHJ5Ojp+SVRlc3RDYXNlUmVnaXN0cnkoKSA9IGRlZmF1bHQ7 Ci19Ci0vLyBlbmQgY2F0Y2hfaW50ZXJmYWNlc190ZXN0Y2FzZS5jcHAKLS8vIHN0YXJ0IGNhdGNo X2xlYWtfZGV0ZWN0b3IuY3BwCi0KLSNpZmRlZiBDQVRDSF9DT05GSUdfV0lORE9XU19DUlREQkcK LSNpbmNsdWRlIDxjcnRkYmcuaD4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIExlYWtEZXRl Y3Rvcjo6TGVha0RldGVjdG9yKCkgewotICAgICAgICBpbnQgZmxhZyA9IF9DcnRTZXREYmdGbGFn KF9DUlREQkdfUkVQT1JUX0ZMQUcpOwotICAgICAgICBmbGFnIHw9IF9DUlREQkdfTEVBS19DSEVD S19ERjsKLSAgICAgICAgZmxhZyB8PSBfQ1JUREJHX0FMTE9DX01FTV9ERjsKLSAgICAgICAgX0Ny dFNldERiZ0ZsYWcoZmxhZyk7Ci0gICAgICAgIF9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfV0FSTiwg X0NSVERCR19NT0RFX0ZJTEUgfCBfQ1JUREJHX01PREVfREVCVUcpOwotICAgICAgICBfQ3J0U2V0 UmVwb3J0RmlsZShfQ1JUX1dBUk4sIF9DUlREQkdfRklMRV9TVERFUlIpOwotICAgICAgICAvLyBD aGFuZ2UgdGhpcyB0byBsZWFraW5nIGFsbG9jYXRpb24ncyBudW1iZXIgdG8gYnJlYWsgdGhlcmUK LSAgICAgICAgX0NydFNldEJyZWFrQWxsb2MoLTEpOwotICAgIH0KLX0KLQotI2Vsc2UKLQotICAg IENhdGNoOjpMZWFrRGV0ZWN0b3I6OkxlYWtEZXRlY3RvcigpIHt9Ci0KLSNlbmRpZgotCi1DYXRj aDo6TGVha0RldGVjdG9yOjp+TGVha0RldGVjdG9yKCkgewotICAgIENhdGNoOjpjbGVhblVwKCk7 Ci19Ci0vLyBlbmQgY2F0Y2hfbGVha19kZXRlY3Rvci5jcHAKLS8vIHN0YXJ0IGNhdGNoX2xpc3Qu Y3BwCi0KLS8vIHN0YXJ0IGNhdGNoX2xpc3QuaAotCi0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3Bh Y2UgQ2F0Y2ggewotCi0gICAgc3RkOjpzaXplX3QgbGlzdFRlc3RzKCBDb25maWcgY29uc3QmIGNv bmZpZyApOwotCi0gICAgc3RkOjpzaXplX3QgbGlzdFRlc3RzTmFtZXNPbmx5KCBDb25maWcgY29u c3QmIGNvbmZpZyApOwotCi0gICAgc3RydWN0IFRhZ0luZm8gewotICAgICAgICB2b2lkIGFkZCgg c3RkOjpzdHJpbmcgY29uc3QmIHNwZWxsaW5nICk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGFsbCgp IGNvbnN0OwotCi0gICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzcGVsbGluZ3M7Ci0gICAg ICAgIHN0ZDo6c2l6ZV90IGNvdW50ID0gMDsKLSAgICB9OwotCi0gICAgc3RkOjpzaXplX3QgbGlz dFRhZ3MoIENvbmZpZyBjb25zdCYgY29uZmlnICk7Ci0KLSAgICBzdGQ6OnNpemVfdCBsaXN0UmVw b3J0ZXJzKCk7Ci0KLSAgICBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3QoIHN0ZDo6c2hhcmVkX3B0 cjxDb25maWc+IGNvbnN0JiBjb25maWcgKTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0K LS8vIGVuZCBjYXRjaF9saXN0LmgKLS8vIHN0YXJ0IGNhdGNoX3RleHQuaAotCi1uYW1lc3BhY2Ug Q2F0Y2ggewotICAgIHVzaW5nIG5hbWVzcGFjZSBjbGFyYTo6VGV4dEZsb3c7Ci19Ci0KLS8vIGVu ZCBjYXRjaF90ZXh0LmgKLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgot I2luY2x1ZGUgPGlvbWFuaXA+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBzdGQ6OnNpemVf dCBsaXN0VGVzdHMoIENvbmZpZyBjb25zdCYgY29uZmlnICkgewotICAgICAgICBUZXN0U3BlYyBj b25zdCYgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKLSAgICAgICAgaWYoIGNvbmZpZy5o YXNUZXN0RmlsdGVycygpICkKLSAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIk1hdGNoaW5n IHRlc3QgY2FzZXM6XG4iOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIENhdGNoOjpjb3V0 KCkgPDwgIkFsbCBhdmFpbGFibGUgdGVzdCBjYXNlczpcbiI7Ci0gICAgICAgIH0KLQotICAgICAg ICBhdXRvIG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29y dGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOwotICAgICAgICBmb3IoIGF1dG8gY29u c3QmIHRlc3RDYXNlSW5mbyA6IG1hdGNoZWRUZXN0Q2FzZXMgKSB7Ci0gICAgICAgICAgICBDb2xv dXI6OkNvZGUgY29sb3VyID0gdGVzdENhc2VJbmZvLmlzSGlkZGVuKCkKLSAgICAgICAgICAgICAg ICA/IENvbG91cjo6U2Vjb25kYXJ5VGV4dAotICAgICAgICAgICAgICAgIDogQ29sb3VyOjpOb25l OwotICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKLQotICAgICAgICAg ICAgQ2F0Y2g6OmNvdXQoKSA8PCBDb2x1bW4oIHRlc3RDYXNlSW5mby5uYW1lICkuaW5pdGlhbElu ZGVudCggMiApLmluZGVudCggNCApIDw8ICJcbiI7Ci0gICAgICAgICAgICBpZiggY29uZmlnLnZl cmJvc2l0eSgpID49IFZlcmJvc2l0eTo6SGlnaCApIHsKLSAgICAgICAgICAgICAgICBDYXRjaDo6 Y291dCgpIDw8IENvbHVtbiggQ2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KCB0ZXN0Q2FzZUluZm8u bGluZUluZm8gKSApLmluZGVudCg0KSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICAgICAgc3Rk OjpzdHJpbmcgZGVzY3JpcHRpb24gPSB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb247Ci0gICAgICAg ICAgICAgICAgaWYoIGRlc2NyaXB0aW9uLmVtcHR5KCkgKQotICAgICAgICAgICAgICAgICAgICBk ZXNjcmlwdGlvbiA9ICIoTk8gREVTQ1JJUFRJT04pIjsKLSAgICAgICAgICAgICAgICBDYXRjaDo6 Y291dCgpIDw8IENvbHVtbiggZGVzY3JpcHRpb24gKS5pbmRlbnQoNCkgPDwgc3RkOjplbmRsOwot ICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZUluZm8udGFncy5lbXB0eSgp ICkKLSAgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IENvbHVtbiggdGVzdENhc2VJbmZv LnRhZ3NBc1N0cmluZygpICkuaW5kZW50KCA2ICkgPDwgIlxuIjsKLSAgICAgICAgfQotCi0gICAg ICAgIGlmKCAhY29uZmlnLmhhc1Rlc3RGaWx0ZXJzKCkgKQotICAgICAgICAgICAgQ2F0Y2g6OmNv dXQoKSA8PCBwbHVyYWxpc2UoIG1hdGNoZWRUZXN0Q2FzZXMuc2l6ZSgpLCAidGVzdCBjYXNlIiAp IDw8ICdcbicgPDwgc3RkOjplbmRsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBDYXRjaDo6 Y291dCgpIDw8IHBsdXJhbGlzZSggbWF0Y2hlZFRlc3RDYXNlcy5zaXplKCksICJtYXRjaGluZyB0 ZXN0IGNhc2UiICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybiBtYXRjaGVk VGVzdENhc2VzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnNpemVfdCBsaXN0VGVzdHNOYW1l c09ubHkoIENvbmZpZyBjb25zdCYgY29uZmlnICkgewotICAgICAgICBUZXN0U3BlYyBjb25zdCYg dGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKLSAgICAgICAgc3RkOjpzaXplX3QgbWF0Y2hl ZFRlc3RzID0gMDsKLSAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2Fz ZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNw ZWMsIGNvbmZpZyApOwotICAgICAgICBmb3IoIGF1dG8gY29uc3QmIHRlc3RDYXNlSW5mbyA6IG1h dGNoZWRUZXN0Q2FzZXMgKSB7Ci0gICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKLSAgICAgICAg ICAgIGlmKCBzdGFydHNXaXRoKCB0ZXN0Q2FzZUluZm8ubmFtZSwgJyMnICkgKQotICAgICAgICAg ICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAnIicgPDwgdGVzdENhc2VJbmZvLm5hbWUgPDwgJyInOwot ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXN0Q2Fz ZUluZm8ubmFtZTsKLSAgICAgICAgICAgIGlmICggY29uZmlnLnZlcmJvc2l0eSgpID49IFZlcmJv c2l0eTo6SGlnaCApCi0gICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiXHRAIiA8PCB0 ZXN0Q2FzZUluZm8ubGluZUluZm87Ci0gICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHN0ZDo6 ZW5kbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2hlZFRlc3RzOwotICAgIH0KLQot ICAgIHZvaWQgVGFnSW5mbzo6YWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlbGxpbmcgKSB7Ci0g ICAgICAgICsrY291bnQ7Ci0gICAgICAgIHNwZWxsaW5ncy5pbnNlcnQoIHNwZWxsaW5nICk7Ci0g ICAgfQotCi0gICAgc3RkOjpzdHJpbmcgVGFnSW5mbzo6YWxsKCkgY29uc3QgewotICAgICAgICBz aXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCYgc3BlbGxpbmcgOiBzcGVs bGluZ3MpIHsKLSAgICAgICAgICAgIC8vIEFkZCAyIGZvciB0aGUgYnJhY2tlcwotICAgICAgICAg ICAgc2l6ZSArPSBzcGVsbGluZy5zaXplKCkgKyAyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3Rk OjpzdHJpbmcgb3V0OyBvdXQucmVzZXJ2ZShzaXplKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0 JiBzcGVsbGluZyA6IHNwZWxsaW5ncykgewotICAgICAgICAgICAgb3V0ICs9ICdbJzsKLSAgICAg ICAgICAgIG91dCArPSBzcGVsbGluZzsKLSAgICAgICAgICAgIG91dCArPSAnXSc7Ci0gICAgICAg IH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICBzdGQ6OnNpemVfdCBsaXN0VGFn cyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7Ci0gICAgICAgIFRlc3RTcGVjIGNvbnN0JiB0ZXN0 U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOwotICAgICAgICBpZiggY29uZmlnLmhhc1Rlc3RGaWx0 ZXJzKCkgKQotICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiVGFncyBmb3IgbWF0Y2hpbmcg dGVzdCBjYXNlczpcbiI7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgQ2F0Y2g6OmNvdXQo KSA8PCAiQWxsIGF2YWlsYWJsZSB0YWdzOlxuIjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0ZDo6 bWFwPHN0ZDo6c3RyaW5nLCBUYWdJbmZvPiB0YWdDb3VudHM7Ci0KLSAgICAgICAgc3RkOjp2ZWN0 b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENh c2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOwotICAgICAgICBmb3IoIGF1 dG8gY29uc3QmIHRlc3RDYXNlIDogbWF0Y2hlZFRlc3RDYXNlcyApIHsKLSAgICAgICAgICAgIGZv ciggYXV0byBjb25zdCYgdGFnTmFtZSA6IHRlc3RDYXNlLmdldFRlc3RDYXNlSW5mbygpLnRhZ3Mg KSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGNhc2VUYWdOYW1lID0gdG9Mb3dlcigg dGFnTmFtZSApOwotICAgICAgICAgICAgICAgIGF1dG8gY291bnRJdCA9IHRhZ0NvdW50cy5maW5k KCBsY2FzZVRhZ05hbWUgKTsKLSAgICAgICAgICAgICAgICBpZiggY291bnRJdCA9PSB0YWdDb3Vu dHMuZW5kKCkgKQotICAgICAgICAgICAgICAgICAgICBjb3VudEl0ID0gdGFnQ291bnRzLmluc2Vy dCggc3RkOjptYWtlX3BhaXIoIGxjYXNlVGFnTmFtZSwgVGFnSW5mbygpICkgKS5maXJzdDsKLSAg ICAgICAgICAgICAgICBjb3VudEl0LT5zZWNvbmQuYWRkKCB0YWdOYW1lICk7Ci0gICAgICAgICAg ICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoIGF1dG8gY29uc3QmIHRhZ0NvdW50IDogdGFn Q291bnRzICkgewotICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwotICAgICAg ICAgICAgcnNzIDw8ICIgICIgPDwgc3RkOjpzZXR3KDIpIDw8IHRhZ0NvdW50LnNlY29uZC5jb3Vu dCA8PCAiICAiOwotICAgICAgICAgICAgYXV0byBzdHIgPSByc3Muc3RyKCk7Ci0gICAgICAgICAg ICBhdXRvIHdyYXBwZXIgPSBDb2x1bW4oIHRhZ0NvdW50LnNlY29uZC5hbGwoKSApCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRpYWxJbmRl bnQoIDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC5pbmRlbnQoIHN0ci5zaXplKCkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC53aWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgt MTAgKTsKLSAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgc3RyIDw8IHdyYXBwZXIgPDwgJ1xu JzsKLSAgICAgICAgfQotICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggdGFnQ291 bnRzLnNpemUoKSwgInRhZyIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgcmV0dXJu IHRhZ0NvdW50cy5zaXplKCk7Ci0gICAgfQotCi0gICAgc3RkOjpzaXplX3QgbGlzdFJlcG9ydGVy cygpIHsKLSAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQXZhaWxhYmxlIHJlcG9ydGVyczpcbiI7 Ci0gICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpGYWN0b3J5TWFwIGNvbnN0JiBmYWN0b3JpZXMg PSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRGYWN0b3JpZXMoKTsK LSAgICAgICAgc3RkOjpzaXplX3QgbWF4TmFtZUxlbiA9IDA7Ci0gICAgICAgIGZvciggYXV0byBj b25zdCYgZmFjdG9yeUt2cCA6IGZhY3RvcmllcyApCi0gICAgICAgICAgICBtYXhOYW1lTGVuID0g KHN0ZDo6bWF4KSggbWF4TmFtZUxlbiwgZmFjdG9yeUt2cC5maXJzdC5zaXplKCkgKTsKLQotICAg ICAgICBmb3IoIGF1dG8gY29uc3QmIGZhY3RvcnlLdnAgOiBmYWN0b3JpZXMgKSB7Ci0gICAgICAg ICAgICBDYXRjaDo6Y291dCgpCi0gICAgICAgICAgICAgICAgICAgIDw8IENvbHVtbiggZmFjdG9y eUt2cC5maXJzdCArICI6IiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGVudCgy KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aWR0aCggNSttYXhOYW1lTGVuICkKLSAg ICAgICAgICAgICAgICAgICAgKyAgQ29sdW1uKCBmYWN0b3J5S3ZwLnNlY29uZC0+Z2V0RGVzY3Jp cHRpb24oKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRpYWxJbmRlbnQoMCkK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZW50KDIpCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgLndpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCAtIG1heE5hbWVM ZW4tOCApCi0gICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7Ci0gICAgICAgIH0KLSAgICAgICAg Q2F0Y2g6OmNvdXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybiBmYWN0b3JpZXMuc2l6 ZSgpOwotICAgIH0KLQotICAgIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdCggc3RkOjpzaGFyZWRf cHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKLSAgICAgICAgT3B0aW9uPHN0ZDo6c2l6ZV90 PiBsaXN0ZWRDb3VudDsKLSAgICAgICAgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkuc2V0Q29u ZmlnKCBjb25maWcgKTsKLSAgICAgICAgaWYoIGNvbmZpZy0+bGlzdFRlc3RzKCkgKQotICAgICAg ICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzKCAq Y29uZmlnICk7Ci0gICAgICAgIGlmKCBjb25maWctPmxpc3RUZXN0TmFtZXNPbmx5KCkgKQotICAg ICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3Rz TmFtZXNPbmx5KCAqY29uZmlnICk7Ci0gICAgICAgIGlmKCBjb25maWctPmxpc3RUYWdzKCkgKQot ICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRh Z3MoICpjb25maWcgKTsKLSAgICAgICAgaWYoIGNvbmZpZy0+bGlzdFJlcG9ydGVycygpICkKLSAg ICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RSZXBv cnRlcnMoKTsKLSAgICAgICAgcmV0dXJuIGxpc3RlZENvdW50OwotICAgIH0KLQotfSAvLyBlbmQg bmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfbGlzdC5jcHAKLS8vIHN0YXJ0IGNhdGNoX21h dGNoZXJzLmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotbmFtZXNwYWNlIE1hdGNoZXJzIHsKLSAg ICBuYW1lc3BhY2UgSW1wbCB7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgTWF0Y2hlclVudHlwZWRC YXNlOjp0b1N0cmluZygpIGNvbnN0IHsKLSAgICAgICAgICAgIGlmKCBtX2NhY2hlZFRvU3RyaW5n LmVtcHR5KCkgKQotICAgICAgICAgICAgICAgIG1fY2FjaGVkVG9TdHJpbmcgPSBkZXNjcmliZSgp OwotICAgICAgICAgICAgcmV0dXJuIG1fY2FjaGVkVG9TdHJpbmc7Ci0gICAgICAgIH0KLQotICAg ICAgICBNYXRjaGVyVW50eXBlZEJhc2U6On5NYXRjaGVyVW50eXBlZEJhc2UoKSA9IGRlZmF1bHQ7 Ci0KLSAgICB9IC8vIG5hbWVzcGFjZSBJbXBsCi19IC8vIG5hbWVzcGFjZSBNYXRjaGVycwotCi11 c2luZyBuYW1lc3BhY2UgTWF0Y2hlcnM7Ci11c2luZyBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJh c2U7Ci0KLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfbWF0Y2hlcnMuY3BwCi0v LyBzdGFydCBjYXRjaF9tYXRjaGVyc19leGNlcHRpb24uY3BwCi0KLW5hbWVzcGFjZSBDYXRjaCB7 Ci1uYW1lc3BhY2UgTWF0Y2hlcnMgewotbmFtZXNwYWNlIEV4Y2VwdGlvbiB7Ci0KLWJvb2wgRXhj ZXB0aW9uTWVzc2FnZU1hdGNoZXI6Om1hdGNoKHN0ZDo6ZXhjZXB0aW9uIGNvbnN0JiBleCkgY29u c3QgewotICAgIHJldHVybiBleC53aGF0KCkgPT0gbV9tZXNzYWdlOwotfQotCi1zdGQ6OnN0cmlu ZyBFeGNlcHRpb25NZXNzYWdlTWF0Y2hlcjo6ZGVzY3JpYmUoKSBjb25zdCB7Ci0gICAgcmV0dXJu ICJleGNlcHRpb24gbWVzc2FnZSBtYXRjaGVzIFwiIiArIG1fbWVzc2FnZSArICJcIiI7Ci19Ci0K LX0KLUV4Y2VwdGlvbjo6RXhjZXB0aW9uTWVzc2FnZU1hdGNoZXIgTWVzc2FnZShzdGQ6OnN0cmlu ZyBjb25zdCYgbWVzc2FnZSkgewotICAgIHJldHVybiBFeGNlcHRpb246OkV4Y2VwdGlvbk1lc3Nh Z2VNYXRjaGVyKG1lc3NhZ2UpOwotfQotCi0vLyBuYW1lc3BhY2UgRXhjZXB0aW9uCi19IC8vIG5h bWVzcGFjZSBNYXRjaGVycwotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLS8vIGVuZCBjYXRjaF9tYXRj aGVyc19leGNlcHRpb24uY3BwCi0vLyBzdGFydCBjYXRjaF9tYXRjaGVyc19mbG9hdGluZy5jcHAK LQotLy8gc3RhcnQgY2F0Y2hfcG9seWZpbGxzLmhwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAg IGJvb2wgaXNuYW4oZmxvYXQgZik7Ci0gICAgYm9vbCBpc25hbihkb3VibGUgZCk7Ci19Ci0KLS8v IGVuZCBjYXRjaF9wb2x5ZmlsbHMuaHBwCi0vLyBzdGFydCBjYXRjaF90b19zdHJpbmcuaHBwCi0K LSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgdGVtcGxhdGUgPHR5 cGVuYW1lIFQ+Ci0gICAgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKFQgY29uc3QmIHQpIHsKLSNpZiBk ZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UT19TVFJJTkcpCi0gICAgICAgIHJldHVybiBzdGQ6 OnRvX3N0cmluZyh0KTsKLSNlbHNlCi0gICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsK LSAgICAgICAgcnNzIDw8IHQ7Ci0gICAgICAgIHJldHVybiByc3Muc3RyKCk7Ci0jZW5kaWYKLSAg ICB9Ci19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX3RvX3N0cmluZy5o cHAKLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8Y3N0 ZGxpYj4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8 c3N0cmVhbT4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLSNpbmNsdWRlIDxpb21hbmlwPgotI2lu Y2x1ZGUgPGxpbWl0cz4KLQotbmFtZXNwYWNlIENhdGNoIHsKLW5hbWVzcGFjZSB7Ci0KLSAgICBp bnQzMl90IGNvbnZlcnQoZmxvYXQgZikgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihm bG9hdCkgPT0gc2l6ZW9mKGludDMyX3QpLCAiSW1wb3J0YW50IFVMUCBtYXRjaGVyIGFzc3VtcHRp b24gdmlvbGF0ZWQiKTsKLSAgICAgICAgaW50MzJfdCBpOwotICAgICAgICBzdGQ6Om1lbWNweSgm aSwgJmYsIHNpemVvZihmKSk7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIGludDY0 X3QgY29udmVydChkb3VibGUgZCkgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3Vi bGUpID09IHNpemVvZihpbnQ2NF90KSwgIkltcG9ydGFudCBVTFAgbWF0Y2hlciBhc3N1bXB0aW9u IHZpb2xhdGVkIik7Ci0gICAgICAgIGludDY0X3QgaTsKLSAgICAgICAgc3RkOjptZW1jcHkoJmks ICZkLCBzaXplb2YoZCkpOwotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0 ZSA8dHlwZW5hbWUgRlA+Ci0gICAgYm9vbCBhbG1vc3RFcXVhbFVscHMoRlAgbGhzLCBGUCByaHMs IHVpbnQ2NF90IG1heFVscERpZmYpIHsKLSAgICAgICAgLy8gQ29tcGFyaXNvbiB3aXRoIE5hTiBz aG91bGQgYWx3YXlzIGJlIGZhbHNlLgotICAgICAgICAvLyBUaGlzIHdheSB3ZSBjYW4gcnVsZSBp dCBvdXQgYmVmb3JlIGdldHRpbmcgaW50byB0aGUgdWdseSBkZXRhaWxzCi0gICAgICAgIGlmIChD YXRjaDo6aXNuYW4obGhzKSB8fCBDYXRjaDo6aXNuYW4ocmhzKSkgewotICAgICAgICAgICAgcmV0 dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYXV0byBsYyA9IGNvbnZlcnQobGhzKTsK LSAgICAgICAgYXV0byByYyA9IGNvbnZlcnQocmhzKTsKLQotICAgICAgICBpZiAoKGxjIDwgMCkg IT0gKHJjIDwgMCkpIHsKLSAgICAgICAgICAgIC8vIFBvdGVudGlhbGx5IHdlIGNhbiBoYXZlICsw IGFuZCAtMAotICAgICAgICAgICAgcmV0dXJuIGxocyA9PSByaHM7Ci0gICAgICAgIH0KLQotICAg ICAgICAvLyBzdGF0aWMgY2FzdCBhcyBhIHdvcmthcm91bmQgZm9yIElCTSBYTEMKLSAgICAgICAg YXV0byB1bHBEaWZmID0gc3RkOjphYnMoc3RhdGljX2Nhc3Q8RlA+KGxjIC0gcmMpKTsKLSAgICAg ICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ2NF90Pih1bHBEaWZmKSA8PSBtYXhVbHBEaWZmOwot ICAgIH0KLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0dMT0JBTF9ORVhUQUZURVIpCi0KLSAg ICBmbG9hdCBuZXh0YWZ0ZXIoZmxvYXQgeCwgZmxvYXQgeSkgewotICAgICAgICByZXR1cm4gOjpu ZXh0YWZ0ZXJmKHgsIHkpOwotICAgIH0KLQotICAgIGRvdWJsZSBuZXh0YWZ0ZXIoZG91YmxlIHgs IGRvdWJsZSB5KSB7Ci0gICAgICAgIHJldHVybiA6Om5leHRhZnRlcih4LCB5KTsKLSAgICB9Ci0K LSNlbmRpZiAvLyBeXl4gQ0FUQ0hfQ09ORklHX0dMT0JBTF9ORVhUQUZURVIgXl5eCi0KLXRlbXBs YXRlIDx0eXBlbmFtZSBGUD4KLUZQIHN0ZXAoRlAgc3RhcnQsIEZQIGRpcmVjdGlvbiwgdWludDY0 X3Qgc3RlcHMpIHsKLSAgICBmb3IgKHVpbnQ2NF90IGkgPSAwOyBpIDwgc3RlcHM7ICsraSkgewot I2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0dMT0JBTF9ORVhUQUZURVIpCi0gICAgICAgIHN0YXJ0 ID0gQ2F0Y2g6Om5leHRhZnRlcihzdGFydCwgZGlyZWN0aW9uKTsKLSNlbHNlCi0gICAgICAgIHN0 YXJ0ID0gc3RkOjpuZXh0YWZ0ZXIoc3RhcnQsIGRpcmVjdGlvbik7Ci0jZW5kaWYKLSAgICB9Ci0g ICAgcmV0dXJuIHN0YXJ0OwotfQotCi0vLyBQZXJmb3JtcyBlcXVpdmFsZW50IGNoZWNrIG9mIHN0 ZDo6ZmFicyhsaHMgLSByaHMpIDw9IG1hcmdpbgotLy8gQnV0IHdpdGhvdXQgdGhlIHN1YnRyYWN0 aW9uIHRvIGFsbG93IGZvciBJTkZJTklUWSBpbiBjb21wYXJpc29uCi1ib29sIG1hcmdpbkNvbXBh cmlzb24oZG91YmxlIGxocywgZG91YmxlIHJocywgZG91YmxlIG1hcmdpbikgewotICAgIHJldHVy biAobGhzICsgbWFyZ2luID49IHJocykgJiYgKHJocyArIG1hcmdpbiA+PSBsaHMpOwotfQotCi10 ZW1wbGF0ZSA8dHlwZW5hbWUgRmxvYXRpbmdQb2ludD4KLXZvaWQgd3JpdGUoc3RkOjpvc3RyZWFt JiBvdXQsIEZsb2F0aW5nUG9pbnQgbnVtKSB7Ci0gICAgb3V0IDw8IHN0ZDo6c2NpZW50aWZpYwot ICAgICAgICA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPEZsb2F0aW5n UG9pbnQ+OjptYXhfZGlnaXRzMTAgLSAxKQotICAgICAgICA8PCBudW07Ci19Ci0KLX0gLy8gZW5k IGFub255bW91cyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIE1hdGNoZXJzIHsKLW5hbWVzcGFjZSBG bG9hdGluZyB7Ci0KLSAgICBlbnVtIGNsYXNzIEZsb2F0aW5nUG9pbnRLaW5kIDogdWludDhfdCB7 Ci0gICAgICAgIEZsb2F0LAotICAgICAgICBEb3VibGUKLSAgICB9OwotCi0gICAgV2l0aGluQWJz TWF0Y2hlcjo6V2l0aGluQWJzTWF0Y2hlcihkb3VibGUgdGFyZ2V0LCBkb3VibGUgbWFyZ2luKQot ICAgICAgICA6bV90YXJnZXR7IHRhcmdldCB9LCBtX21hcmdpbnsgbWFyZ2luIH0gewotICAgICAg ICBDQVRDSF9FTkZPUkNFKG1hcmdpbiA+PSAwLCAiSW52YWxpZCBtYXJnaW46ICIgPDwgbWFyZ2lu IDw8ICcuJwotICAgICAgICAgICAgPDwgIiBNYXJnaW4gaGFzIHRvIGJlIG5vbi1uZWdhdGl2ZS4i KTsKLSAgICB9Ci0KLSAgICAvLyBQZXJmb3JtcyBlcXVpdmFsZW50IGNoZWNrIG9mIHN0ZDo6ZmFi cyhsaHMgLSByaHMpIDw9IG1hcmdpbgotICAgIC8vIEJ1dCB3aXRob3V0IHRoZSBzdWJ0cmFjdGlv biB0byBhbGxvdyBmb3IgSU5GSU5JVFkgaW4gY29tcGFyaXNvbgotICAgIGJvb2wgV2l0aGluQWJz TWF0Y2hlcjo6bWF0Y2goZG91YmxlIGNvbnN0JiBtYXRjaGVlKSBjb25zdCB7Ci0gICAgICAgIHJl dHVybiAobWF0Y2hlZSArIG1fbWFyZ2luID49IG1fdGFyZ2V0KSAmJiAobV90YXJnZXQgKyBtX21h cmdpbiA+PSBtYXRjaGVlKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBXaXRoaW5BYnNNYXRj aGVyOjpkZXNjcmliZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICJpcyB3aXRoaW4gIiArIDo6 Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KG1fbWFyZ2luKSArICIgb2YgIiArIDo6Q2F0Y2g6OkRl dGFpbDo6c3RyaW5naWZ5KG1fdGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBXaXRoaW5VbHBzTWF0Y2hl cjo6V2l0aGluVWxwc01hdGNoZXIoZG91YmxlIHRhcmdldCwgdWludDY0X3QgdWxwcywgRmxvYXRp bmdQb2ludEtpbmQgYmFzZVR5cGUpCi0gICAgICAgIDptX3RhcmdldHsgdGFyZ2V0IH0sIG1fdWxw c3sgdWxwcyB9LCBtX3R5cGV7IGJhc2VUeXBlIH0gewotICAgICAgICBDQVRDSF9FTkZPUkNFKG1f dHlwZSA9PSBGbG9hdGluZ1BvaW50S2luZDo6RG91YmxlCi0gICAgICAgICAgICAgICAgICAgfHwg bV91bHBzIDwgKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCksCi0gICAgICAg ICAgICAiUHJvdmlkZWQgVUxQIGlzIGltcG9zc2libHkgbGFyZ2UgZm9yIGEgZmxvYXQgY29tcGFy aXNvbi4iKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNwcmFnbWEgY2xhbmcg ZGlhZ25vc3RpYyBwdXNoCi0vLyBDbGFuZyA8My41IHJlcG9ydHMgb24gdGhlIGRlZmF1bHQgYnJh bmNoIGluIHRoZSBzd2l0Y2ggYmVsb3cKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVk ICItV3VucmVhY2hhYmxlLWNvZGUiCi0jZW5kaWYKLQotICAgIGJvb2wgV2l0aGluVWxwc01hdGNo ZXI6Om1hdGNoKGRvdWJsZSBjb25zdCYgbWF0Y2hlZSkgY29uc3QgewotICAgICAgICBzd2l0Y2gg KG1fdHlwZSkgewotICAgICAgICBjYXNlIEZsb2F0aW5nUG9pbnRLaW5kOjpGbG9hdDoKLSAgICAg ICAgICAgIHJldHVybiBhbG1vc3RFcXVhbFVscHM8ZmxvYXQ+KHN0YXRpY19jYXN0PGZsb2F0Piht YXRjaGVlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fdGFyZ2V0KSwgbV91bHBzKTsKLSAgICAgICAg Y2FzZSBGbG9hdGluZ1BvaW50S2luZDo6RG91YmxlOgotICAgICAgICAgICAgcmV0dXJuIGFsbW9z dEVxdWFsVWxwczxkb3VibGU+KG1hdGNoZWUsIG1fdGFyZ2V0LCBtX3VscHMpOwotICAgICAgICBk ZWZhdWx0OgotICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJST1IoICJVbmtub3duIEZsb2F0 aW5nUG9pbnRLaW5kIHZhbHVlIiApOwotICAgICAgICB9Ci0gICAgfQotCi0jaWYgZGVmaW5lZChf X2NsYW5nX18pCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotICAgIHN0 ZDo6c3RyaW5nIFdpdGhpblVscHNNYXRjaGVyOjpkZXNjcmliZSgpIGNvbnN0IHsKLSAgICAgICAg c3RkOjpzdHJpbmdzdHJlYW0gcmV0OwotCi0gICAgICAgIHJldCA8PCAiaXMgd2l0aGluICIgPDwg bV91bHBzIDw8ICIgVUxQcyBvZiAiOwotCi0gICAgICAgIGlmIChtX3R5cGUgPT0gRmxvYXRpbmdQ b2ludEtpbmQ6OkZsb2F0KSB7Ci0gICAgICAgICAgICB3cml0ZShyZXQsIHN0YXRpY19jYXN0PGZs b2F0PihtX3RhcmdldCkpOwotICAgICAgICAgICAgcmV0IDw8ICdmJzsKLSAgICAgICAgfSBlbHNl IHsKLSAgICAgICAgICAgIHdyaXRlKHJldCwgbV90YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAg ICAgcmV0IDw8ICIgKFsiOwotICAgICAgICBpZiAobV90eXBlID09IEZsb2F0aW5nUG9pbnRLaW5k OjpEb3VibGUpIHsKLSAgICAgICAgICAgIHdyaXRlKHJldCwgc3RlcChtX3RhcmdldCwgc3RhdGlj X2Nhc3Q8ZG91YmxlPigtSU5GSU5JVFkpLCBtX3VscHMpKTsKLSAgICAgICAgICAgIHJldCA8PCAi LCAiOwotICAgICAgICAgICAgd3JpdGUocmV0LCBzdGVwKG1fdGFyZ2V0LCBzdGF0aWNfY2FzdDxk b3VibGU+KCBJTkZJTklUWSksIG1fdWxwcykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg ICAgLy8gV2UgaGF2ZSB0byBjYXN0IElORklOSVRZIHRvIGZsb2F0IGJlY2F1c2Ugb2YgTWluR1cs IHNlZSAjMTc4MgotICAgICAgICAgICAgd3JpdGUocmV0LCBzdGVwKHN0YXRpY19jYXN0PGZsb2F0 PihtX3RhcmdldCksIHN0YXRpY19jYXN0PGZsb2F0PigtSU5GSU5JVFkpLCBtX3VscHMpKTsKLSAg ICAgICAgICAgIHJldCA8PCAiLCAiOwotICAgICAgICAgICAgd3JpdGUocmV0LCBzdGVwKHN0YXRp Y19jYXN0PGZsb2F0PihtX3RhcmdldCksIHN0YXRpY19jYXN0PGZsb2F0PiggSU5GSU5JVFkpLCBt X3VscHMpKTsKLSAgICAgICAgfQotICAgICAgICByZXQgPDwgIl0pIjsKLQotICAgICAgICByZXR1 cm4gcmV0LnN0cigpOwotICAgIH0KLQotICAgIFdpdGhpblJlbE1hdGNoZXI6OldpdGhpblJlbE1h dGNoZXIoZG91YmxlIHRhcmdldCwgZG91YmxlIGVwc2lsb24pOgotICAgICAgICBtX3RhcmdldCh0 YXJnZXQpLAotICAgICAgICBtX2Vwc2lsb24oZXBzaWxvbil7Ci0gICAgICAgIENBVENIX0VORk9S Q0UobV9lcHNpbG9uID49IDAuLCAiUmVsYXRpdmUgY29tcGFyaXNvbiB3aXRoIGVwc2lsb24gPCAg MCBkb2VzIG5vdCBtYWtlIHNlbnNlLiIpOwotICAgICAgICBDQVRDSF9FTkZPUkNFKG1fZXBzaWxv biAgPCAxLiwgIlJlbGF0aXZlIGNvbXBhcmlzb24gd2l0aCBlcHNpbG9uID49IDEgZG9lcyBub3Qg bWFrZSBzZW5zZS4iKTsKLSAgICB9Ci0KLSAgICBib29sIFdpdGhpblJlbE1hdGNoZXI6Om1hdGNo KGRvdWJsZSBjb25zdCYgbWF0Y2hlZSkgY29uc3QgewotICAgICAgICBjb25zdCBhdXRvIHJlbE1h cmdpbiA9IG1fZXBzaWxvbiAqIChzdGQ6Om1heCkoc3RkOjpmYWJzKG1hdGNoZWUpLCBzdGQ6OmZh YnMobV90YXJnZXQpKTsKLSAgICAgICAgcmV0dXJuIG1hcmdpbkNvbXBhcmlzb24obWF0Y2hlZSwg bV90YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNpbmYocmVs TWFyZ2luKT8gMCA6IHJlbE1hcmdpbik7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgV2l0aGlu UmVsTWF0Y2hlcjo6ZGVzY3JpYmUoKSBjb25zdCB7Ci0gICAgICAgIENhdGNoOjpSZXVzYWJsZVN0 cmluZ1N0cmVhbSBzc3RyOwotICAgICAgICBzc3RyIDw8ICJhbmQgIiA8PCBtX3RhcmdldCA8PCAi IGFyZSB3aXRoaW4gIiA8PCBtX2Vwc2lsb24gKiAxMDAuIDw8ICIlIG9mIGVhY2ggb3RoZXIiOwot ICAgICAgICByZXR1cm4gc3N0ci5zdHIoKTsKLSAgICB9Ci0KLX0vLyBuYW1lc3BhY2UgRmxvYXRp bmcKLQotRmxvYXRpbmc6OldpdGhpblVscHNNYXRjaGVyIFdpdGhpblVMUChkb3VibGUgdGFyZ2V0 LCB1aW50NjRfdCBtYXhVbHBEaWZmKSB7Ci0gICAgcmV0dXJuIEZsb2F0aW5nOjpXaXRoaW5VbHBz TWF0Y2hlcih0YXJnZXQsIG1heFVscERpZmYsIEZsb2F0aW5nOjpGbG9hdGluZ1BvaW50S2luZDo6 RG91YmxlKTsKLX0KLQotRmxvYXRpbmc6OldpdGhpblVscHNNYXRjaGVyIFdpdGhpblVMUChmbG9h dCB0YXJnZXQsIHVpbnQ2NF90IG1heFVscERpZmYpIHsKLSAgICByZXR1cm4gRmxvYXRpbmc6Oldp dGhpblVscHNNYXRjaGVyKHRhcmdldCwgbWF4VWxwRGlmZiwgRmxvYXRpbmc6OkZsb2F0aW5nUG9p bnRLaW5kOjpGbG9hdCk7Ci19Ci0KLUZsb2F0aW5nOjpXaXRoaW5BYnNNYXRjaGVyIFdpdGhpbkFi cyhkb3VibGUgdGFyZ2V0LCBkb3VibGUgbWFyZ2luKSB7Ci0gICAgcmV0dXJuIEZsb2F0aW5nOjpX aXRoaW5BYnNNYXRjaGVyKHRhcmdldCwgbWFyZ2luKTsKLX0KLQotRmxvYXRpbmc6OldpdGhpblJl bE1hdGNoZXIgV2l0aGluUmVsKGRvdWJsZSB0YXJnZXQsIGRvdWJsZSBlcHMpIHsKLSAgICByZXR1 cm4gRmxvYXRpbmc6OldpdGhpblJlbE1hdGNoZXIodGFyZ2V0LCBlcHMpOwotfQotCi1GbG9hdGlu Zzo6V2l0aGluUmVsTWF0Y2hlciBXaXRoaW5SZWwoZG91YmxlIHRhcmdldCkgewotICAgIHJldHVy biBGbG9hdGluZzo6V2l0aGluUmVsTWF0Y2hlcih0YXJnZXQsIHN0ZDo6bnVtZXJpY19saW1pdHM8 ZG91YmxlPjo6ZXBzaWxvbigpICogMTAwKTsKLX0KLQotRmxvYXRpbmc6OldpdGhpblJlbE1hdGNo ZXIgV2l0aGluUmVsKGZsb2F0IHRhcmdldCwgZmxvYXQgZXBzKSB7Ci0gICAgcmV0dXJuIEZsb2F0 aW5nOjpXaXRoaW5SZWxNYXRjaGVyKHRhcmdldCwgZXBzKTsKLX0KLQotRmxvYXRpbmc6OldpdGhp blJlbE1hdGNoZXIgV2l0aGluUmVsKGZsb2F0IHRhcmdldCkgewotICAgIHJldHVybiBGbG9hdGlu Zzo6V2l0aGluUmVsTWF0Y2hlcih0YXJnZXQsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+Ojpl cHNpbG9uKCkgKiAxMDApOwotfQotCi19IC8vIG5hbWVzcGFjZSBNYXRjaGVycwotfSAvLyBuYW1l c3BhY2UgQ2F0Y2gKLS8vIGVuZCBjYXRjaF9tYXRjaGVyc19mbG9hdGluZy5jcHAKLS8vIHN0YXJ0 IGNhdGNoX21hdGNoZXJzX2dlbmVyaWMuY3BwCi0KLXN0ZDo6c3RyaW5nIENhdGNoOjpNYXRjaGVy czo6R2VuZXJpYzo6RGV0YWlsOjpmaW5hbGl6ZURlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5n JiBkZXNjKSB7Ci0gICAgaWYgKGRlc2MuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gIm1hdGNo ZXMgdW5kZXNjcmliZWQgcHJlZGljYXRlIjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4g Im1hdGNoZXMgcHJlZGljYXRlOiBcIiIgKyBkZXNjICsgJyInOwotICAgIH0KLX0KLS8vIGVuZCBj YXRjaF9tYXRjaGVyc19nZW5lcmljLmNwcAotLy8gc3RhcnQgY2F0Y2hfbWF0Y2hlcnNfc3RyaW5n LmNwcAotCi0jaW5jbHVkZSA8cmVnZXg+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci1uYW1lc3BhY2Ug TWF0Y2hlcnMgewotCi0gICAgbmFtZXNwYWNlIFN0ZFN0cmluZyB7Ci0KLSAgICAgICAgQ2FzZWRT dHJpbmc6OkNhc2VkU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZl OjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkKLSAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5 KCBjYXNlU2Vuc2l0aXZpdHkgKSwKLSAgICAgICAgICAgIG1fc3RyKCBhZGp1c3RTdHJpbmcoIHN0 ciApICkKLSAgICAgICAge30KLSAgICAgICAgc3RkOjpzdHJpbmcgQ2FzZWRTdHJpbmc6OmFkanVz dFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKLSAgICAgICAgICAgIHJl dHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObwotICAgICAgICAgICAg ICAgICAgID8gdG9Mb3dlciggc3RyICkKLSAgICAgICAgICAgICAgICAgICA6IHN0cjsKLSAgICAg ICAgfQotICAgICAgICBzdGQ6OnN0cmluZyBDYXNlZFN0cmluZzo6Y2FzZVNlbnNpdGl2aXR5U3Vm Zml4KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENh c2VTZW5zaXRpdmU6Ok5vCi0gICAgICAgICAgICAgICAgICAgPyAiIChjYXNlIGluc2Vuc2l0aXZl KSIKLSAgICAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAg ICAgICBTdHJpbmdNYXRjaGVyQmFzZTo6U3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNv bnN0JiBvcGVyYXRpb24sIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkKLSAgICAgICAg OiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSwKLSAgICAgICAgICBtX29wZXJhdGlvbiggb3Bl cmF0aW9uICkgewotICAgICAgICB9Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgU3RyaW5nTWF0Y2hl ckJhc2U6OmRlc2NyaWJlKCkgY29uc3QgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3Jp cHRpb247Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKDUgKyBtX29wZXJhdGlvbi5z aXplKCkgKyBtX2NvbXBhcmF0b3IubV9zdHIuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBtX2NvbXBhcmF0b3IuY2FzZVNlbnNpdGl2aXR5U3VmZml4KCku c2l6ZSgpKTsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fb3BlcmF0aW9uOwotICAgICAg ICAgICAgZGVzY3JpcHRpb24gKz0gIjogXCIiOwotICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0g bV9jb21wYXJhdG9yLm1fc3RyOwotICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIlwiIjsKLSAg ICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZm aXgoKTsKLSAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAg ICAgIEVxdWFsc01hdGNoZXI6OkVxdWFsc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21w YXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImVxdWFscyIsIGNvbXBhcmF0b3IgKSB7fQot Ci0gICAgICAgIGJvb2wgRXF1YWxzTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBz b3VyY2UgKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gbV9jb21wYXJhdG9yLmFkanVzdFN0 cmluZyggc291cmNlICkgPT0gbV9jb21wYXJhdG9yLm1fc3RyOwotICAgICAgICB9Ci0KLSAgICAg ICAgQ29udGFpbnNNYXRjaGVyOjpDb250YWluc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBj b21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImNvbnRhaW5zIiwgY29tcGFyYXRvciAp IHt9Ci0KLSAgICAgICAgYm9vbCBDb250YWluc01hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBj b25zdCYgc291cmNlICkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBtX2Nv bXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7Ci0g ICAgICAgIH0KLQotICAgICAgICBTdGFydHNXaXRoTWF0Y2hlcjo6U3RhcnRzV2l0aE1hdGNoZXIo IENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggInN0 YXJ0cyB3aXRoIiwgY29tcGFyYXRvciApIHt9Ci0KLSAgICAgICAgYm9vbCBTdGFydHNXaXRoTWF0 Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7Ci0gICAgICAg ICAgICByZXR1cm4gc3RhcnRzV2l0aCggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNl ICksIG1fY29tcGFyYXRvci5tX3N0ciApOwotICAgICAgICB9Ci0KLSAgICAgICAgRW5kc1dpdGhN YXRjaGVyOjpFbmRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkg OiBTdHJpbmdNYXRjaGVyQmFzZSggImVuZHMgd2l0aCIsIGNvbXBhcmF0b3IgKSB7fQotCi0gICAg ICAgIGJvb2wgRW5kc1dpdGhNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJj ZSApIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBlbmRzV2l0aCggbV9jb21wYXJhdG9yLmFk anVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOwotICAgICAgICB9Ci0K LSAgICAgICAgUmVnZXhNYXRjaGVyOjpSZWdleE1hdGNoZXIoc3RkOjpzdHJpbmcgcmVnZXgsIENh c2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkpOiBtX3JlZ2V4KHN0ZDo6bW92ZShy ZWdleCkpLCBtX2Nhc2VTZW5zaXRpdml0eShjYXNlU2Vuc2l0aXZpdHkpIHt9Ci0KLSAgICAgICAg Ym9vbCBSZWdleE1hdGNoZXI6Om1hdGNoKHN0ZDo6c3RyaW5nIGNvbnN0JiBtYXRjaGVlKSBjb25z dCB7Ci0gICAgICAgICAgICBhdXRvIGZsYWdzID0gc3RkOjpyZWdleDo6RUNNQVNjcmlwdDsgLy8g RUNNQVNjcmlwdCBpcyB0aGUgZGVmYXVsdCBzeW50YXggb3B0aW9uIGFueXdheQotICAgICAgICAg ICAgaWYgKG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6OkNob2ljZTo6Tm8pIHsK LSAgICAgICAgICAgICAgICBmbGFncyB8PSBzdGQ6OnJlZ2V4OjppY2FzZTsKLSAgICAgICAgICAg IH0KLSAgICAgICAgICAgIGF1dG8gcmVnID0gc3RkOjpyZWdleChtX3JlZ2V4LCBmbGFncyk7Ci0g ICAgICAgICAgICByZXR1cm4gc3RkOjpyZWdleF9tYXRjaChtYXRjaGVlLCByZWcpOwotICAgICAg ICB9Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgUmVnZXhNYXRjaGVyOjpkZXNjcmliZSgpIGNvbnN0 IHsKLSAgICAgICAgICAgIHJldHVybiAibWF0Y2hlcyAiICsgOjpDYXRjaDo6RGV0YWlsOjpzdHJp bmdpZnkobV9yZWdleCkgKyAoKG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6OkNo b2ljZTo6WWVzKT8gIiBjYXNlIHNlbnNpdGl2ZWx5IiA6ICIgY2FzZSBpbnNlbnNpdGl2ZWx5Iik7 Ci0gICAgICAgIH0KLQotICAgIH0gLy8gbmFtZXNwYWNlIFN0ZFN0cmluZwotCi0gICAgU3RkU3Ry aW5nOjpFcXVhbHNNYXRjaGVyIEVxdWFscyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNl bnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKLSAgICAgICAgcmV0dXJuIFN0ZFN0 cmluZzo6RXF1YWxzTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vu c2l0aXZpdHkpICk7Ci0gICAgfQotICAgIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyIENvbnRh aW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNl bnNpdGl2aXR5ICkgewotICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIo IFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOwotICAgIH0K LSAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29u c3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKLSAgICAg ICAgcmV0dXJuIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3Ry aW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKLSAgICB9Ci0gICAgU3RkU3RyaW5nOjpTdGFy dHNXaXRoTWF0Y2hlciBTdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vu c2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgewotICAgICAgICByZXR1cm4gU3RkU3Ry aW5nOjpTdGFydHNXaXRoTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNl U2Vuc2l0aXZpdHkpICk7Ci0gICAgfQotCi0gICAgU3RkU3RyaW5nOjpSZWdleE1hdGNoZXIgTWF0 Y2hlcyhzdGQ6OnN0cmluZyBjb25zdCYgcmVnZXgsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNl U2Vuc2l0aXZpdHkpIHsKLSAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6UmVnZXhNYXRjaGVyKHJl Z2V4LCBjYXNlU2Vuc2l0aXZpdHkpOwotICAgIH0KLQotfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMK LX0gLy8gbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmNwcAot Ly8gc3RhcnQgY2F0Y2hfbWVzc2FnZS5jcHAKLQotLy8gc3RhcnQgY2F0Y2hfdW5jYXVnaHRfZXhj ZXB0aW9ucy5oCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0gICAgYm9vbCB1bmNhdWdodF9leGNlcHRp b25zKCk7Ci19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLQotLy8gZW5kIGNhdGNoX3VuY2F1Z2h0 X2V4Y2VwdGlvbnMuaAotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c3RhY2s+Ci0KLW5h bWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBNZXNzYWdlSW5mbzo6TWVzc2FnZUluZm8oICAgU3RyaW5n UmVmIGNvbnN0JiBfbWFjcm9OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBT b3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBfdHlwZSApCi0gICAgOiAgIG1hY3JvTmFtZSggX21h Y3JvTmFtZSApLAotICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCi0gICAgICAgIHR5cGUo IF90eXBlICksCi0gICAgICAgIHNlcXVlbmNlKCArK2dsb2JhbENvdW50ICkKLSAgICB7fQotCi0g ICAgYm9vbCBNZXNzYWdlSW5mbzo6b3BlcmF0b3I9PSggTWVzc2FnZUluZm8gY29uc3QmIG90aGVy ICkgY29uc3QgewotICAgICAgICByZXR1cm4gc2VxdWVuY2UgPT0gb3RoZXIuc2VxdWVuY2U7Ci0g ICAgfQotCi0gICAgYm9vbCBNZXNzYWdlSW5mbzo6b3BlcmF0b3I8KCBNZXNzYWdlSW5mbyBjb25z dCYgb3RoZXIgKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBzZXF1ZW5jZSA8IG90aGVyLnNlcXVl bmNlOwotICAgIH0KLQotICAgIC8vIFRoaXMgbWF5IG5lZWQgcHJvdGVjdGluZyBpZiB0aHJlYWRp bmcgc3VwcG9ydCBpcyBhZGRlZAotICAgIHVuc2lnbmVkIGludCBNZXNzYWdlSW5mbzo6Z2xvYmFs Q291bnQgPSAwOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQ2F0Y2g6Ok1lc3Nh Z2VCdWlsZGVyOjpNZXNzYWdlQnVpbGRlciggU3RyaW5nUmVmIGNvbnN0JiBtYWNyb05hbWUsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8g Y29uc3QmIGxpbmVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5cGUgKQotICAgICAgICA6bV9pbmZvKG1hY3JvTmFtZSwg bGluZUluZm8sIHR5cGUpIHt9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBTY29w ZWRNZXNzYWdlOjpTY29wZWRNZXNzYWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciAp Ci0gICAgOiBtX2luZm8oIGJ1aWxkZXIubV9pbmZvICksIG1fbW92ZWQoKQotICAgIHsKLSAgICAg ICAgbV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOwotICAgICAgICBnZXRS ZXN1bHRDYXB0dXJlKCkucHVzaFNjb3BlZE1lc3NhZ2UoIG1faW5mbyApOwotICAgIH0KLQotICAg IFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UmJiBvbGQgKQotICAg IDogbV9pbmZvKCBvbGQubV9pbmZvICksIG1fbW92ZWQoKQotICAgIHsKLSAgICAgICAgb2xkLm1f bW92ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIFNjb3BlZE1lc3NhZ2U6On5TY29wZWRNZXNzYWdl KCkgewotICAgICAgICBpZiAoICF1bmNhdWdodF9leGNlcHRpb25zKCkgJiYgIW1fbW92ZWQgKXsK LSAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5wb3BTY29wZWRNZXNzYWdlKG1faW5mbyk7 Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDYXB0dXJlcjo6Q2FwdHVyZXIoIFN0cmluZ1JlZiBt YWNyb05hbWUsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywgUmVzdWx0V2FzOjpPZlR5 cGUgcmVzdWx0VHlwZSwgU3RyaW5nUmVmIG5hbWVzICkgewotICAgICAgICBhdXRvIHRyaW1tZWQg PSBbJl0gKHNpemVfdCBzdGFydCwgc2l6ZV90IGVuZCkgewotICAgICAgICAgICAgd2hpbGUgKG5h bWVzW3N0YXJ0XSA9PSAnLCcgfHwgaXNzcGFjZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihu YW1lc1tzdGFydF0pKSkgewotICAgICAgICAgICAgICAgICsrc3RhcnQ7Ci0gICAgICAgICAgICB9 Ci0gICAgICAgICAgICB3aGlsZSAobmFtZXNbZW5kXSA9PSAnLCcgfHwgaXNzcGFjZShzdGF0aWNf Y2FzdDx1bnNpZ25lZCBjaGFyPihuYW1lc1tlbmRdKSkpIHsKLSAgICAgICAgICAgICAgICAtLWVu ZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuYW1lcy5zdWJzdHIoc3RhcnQs IGVuZCAtIHN0YXJ0ICsgMSk7Ci0gICAgICAgIH07Ci0gICAgICAgIGF1dG8gc2tpcHEgPSBbJl0g KHNpemVfdCBzdGFydCwgY2hhciBxdW90ZSkgewotICAgICAgICAgICAgZm9yIChhdXRvIGkgPSBz dGFydCArIDE7IGkgPCBuYW1lcy5zaXplKCkgOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAo bmFtZXNbaV0gPT0gcXVvdGUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAg ICAgICAgICAgIGlmIChuYW1lc1tpXSA9PSAnXFwnKQotICAgICAgICAgICAgICAgICAgICArK2k7 Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9FUlJPUigiQ0FQVFVS RSBwYXJzaW5nIGVuY291bnRlcmVkIHVubWF0Y2hlZCBxdW90ZSIpOwotICAgICAgICB9OwotCi0g ICAgICAgIHNpemVfdCBzdGFydCA9IDA7Ci0gICAgICAgIHN0ZDo6c3RhY2s8Y2hhcj4gb3Blbmlu Z3M7Ci0gICAgICAgIGZvciAoc2l6ZV90IHBvcyA9IDA7IHBvcyA8IG5hbWVzLnNpemUoKTsgKytw b3MpIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IG5hbWVzW3Bvc107Ci0gICAgICAgICAgICBzd2l0 Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgY2FzZSAneyc6Ci0g ICAgICAgICAgICBjYXNlICcoJzoKLSAgICAgICAgICAgIC8vIEl0IGlzIGJhc2ljYWxseSBpbXBv c3NpYmxlIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuCi0gICAgICAgICAgICAvLyBjb21wYXJpc29u IGFuZCBzdGFydCBvZiB0ZW1wbGF0ZSBhcmdzIGluIHRoaXMgY29udGV4dAotLy8gICAgICAgICAg ICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBvcGVuaW5ncy5wdXNoKGMpOwotICAgICAgICAg ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnXSc6Ci0gICAgICAgICAgICBjYXNlICd9 JzoKLSAgICAgICAgICAgIGNhc2UgJyknOgotLy8gICAgICAgICAgIGNhc2UgJz4nOgotICAgICAg ICAgICAgICAgIG9wZW5pbmdzLnBvcCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgICAg cG9zID0gc2tpcHEocG9zLCBjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg IGNhc2UgJywnOgotICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSBwb3MgJiYgb3BlbmluZ3Mu ZW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtX21lc3NhZ2VzLmVtcGxhY2VfYmFjayht YWNyb05hbWUsIGxpbmVJbmZvLCByZXN1bHRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgbV9t ZXNzYWdlcy5iYWNrKCkubWVzc2FnZSA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nPih0cmltbWVk KHN0YXJ0LCBwb3MpKTsKLSAgICAgICAgICAgICAgICAgICAgbV9tZXNzYWdlcy5iYWNrKCkubWVz c2FnZSArPSAiIDo9ICI7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zOwotICAgICAg ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnQob3Bl bmluZ3MuZW1wdHkoKSAmJiAiTWlzbWF0Y2hlZCBvcGVuaW5ncyIpOwotICAgICAgICBtX21lc3Nh Z2VzLmVtcGxhY2VfYmFjayhtYWNyb05hbWUsIGxpbmVJbmZvLCByZXN1bHRUeXBlKTsKLSAgICAg ICAgbV9tZXNzYWdlcy5iYWNrKCkubWVzc2FnZSA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nPih0 cmltbWVkKHN0YXJ0LCBuYW1lcy5zaXplKCkgLSAxKSk7Ci0gICAgICAgIG1fbWVzc2FnZXMuYmFj aygpLm1lc3NhZ2UgKz0gIiA6PSAiOwotICAgIH0KLSAgICBDYXB0dXJlcjo6fkNhcHR1cmVyKCkg ewotICAgICAgICBpZiAoICF1bmNhdWdodF9leGNlcHRpb25zKCkgKXsKLSAgICAgICAgICAgIGFz c2VydCggbV9jYXB0dXJlZCA9PSBtX21lc3NhZ2VzLnNpemUoKSApOwotICAgICAgICAgICAgZm9y KCBzaXplX3QgaSA9IDA7IGkgPCBtX2NhcHR1cmVkOyArK2kgICkKLSAgICAgICAgICAgICAgICBt X3Jlc3VsdENhcHR1cmUucG9wU2NvcGVkTWVzc2FnZSggbV9tZXNzYWdlc1tpXSApOwotICAgICAg ICB9Ci0gICAgfQotCi0gICAgdm9pZCBDYXB0dXJlcjo6Y2FwdHVyZVZhbHVlKCBzaXplX3QgaW5k ZXgsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKLSAgICAgICAgYXNzZXJ0KCBpbmRleCA8 IG1fbWVzc2FnZXMuc2l6ZSgpICk7Ci0gICAgICAgIG1fbWVzc2FnZXNbaW5kZXhdLm1lc3NhZ2Ug Kz0gdmFsdWU7Ci0gICAgICAgIG1fcmVzdWx0Q2FwdHVyZS5wdXNoU2NvcGVkTWVzc2FnZSggbV9t ZXNzYWdlc1tpbmRleF0gKTsKLSAgICAgICAgbV9jYXB0dXJlZCsrOwotICAgIH0KLQotfSAvLyBl bmQgbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfbWVzc2FnZS5jcHAKLS8vIHN0YXJ0IGNh dGNoX291dHB1dF9yZWRpcmVjdC5jcHAKLQotLy8gc3RhcnQgY2F0Y2hfb3V0cHV0X3JlZGlyZWN0 LmgKLSNpZm5kZWYgVFdPQkxVRUNVQkVTX0NBVENIX09VVFBVVF9SRURJUkVDVF9ICi0jZGVmaW5l IFRXT0JMVUVDVUJFU19DQVRDSF9PVVRQVVRfUkVESVJFQ1RfSAotCi0jaW5jbHVkZSA8Y3N0ZGlv PgotI2luY2x1ZGUgPGlvc2Z3ZD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBDYXRj aCB7Ci0KLSAgICBjbGFzcyBSZWRpcmVjdGVkU3RyZWFtIHsKLSAgICAgICAgc3RkOjpvc3RyZWFt JiBtX29yaWdpbmFsU3RyZWFtOwotICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fcmVkaXJlY3Rpb25T dHJlYW07Ci0gICAgICAgIHN0ZDo6c3RyZWFtYnVmKiBtX3ByZXZCdWY7Ci0KLSAgICBwdWJsaWM6 Ci0gICAgICAgIFJlZGlyZWN0ZWRTdHJlYW0oIHN0ZDo6b3N0cmVhbSYgb3JpZ2luYWxTdHJlYW0s IHN0ZDo6b3N0cmVhbSYgcmVkaXJlY3Rpb25TdHJlYW0gKTsKLSAgICAgICAgflJlZGlyZWN0ZWRT dHJlYW0oKTsKLSAgICB9OwotCi0gICAgY2xhc3MgUmVkaXJlY3RlZFN0ZE91dCB7Ci0gICAgICAg IFJldXNhYmxlU3RyaW5nU3RyZWFtIG1fcnNzOwotICAgICAgICBSZWRpcmVjdGVkU3RyZWFtIG1f Y291dDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFJlZGlyZWN0ZWRTdGRPdXQoKTsKLSAgICAgICAg YXV0byBzdHIoKSBjb25zdCAtPiBzdGQ6OnN0cmluZzsKLSAgICB9OwotCi0gICAgLy8gU3RkRXJy IGhhcyB0d28gY29uc3RpdHVlbnQgc3RyZWFtcyBpbiBDKyssIHN0ZDo6Y2VyciBhbmQgc3RkOjpj bG9nCi0gICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gcmVkaXJlY3QgMiBzdHJlYW1z IGludG8gMSB0byBrZWVwIHByb3BlcgotICAgIC8vIG9yZGVyIG9mIHdyaXRlcwotICAgIGNsYXNz IFJlZGlyZWN0ZWRTdGRFcnIgewotICAgICAgICBSZXVzYWJsZVN0cmluZ1N0cmVhbSBtX3JzczsK LSAgICAgICAgUmVkaXJlY3RlZFN0cmVhbSBtX2NlcnI7Ci0gICAgICAgIFJlZGlyZWN0ZWRTdHJl YW0gbV9jbG9nOwotICAgIHB1YmxpYzoKLSAgICAgICAgUmVkaXJlY3RlZFN0ZEVycigpOwotICAg ICAgICBhdXRvIHN0cigpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nOwotICAgIH07Ci0KLSAgICBjbGFz cyBSZWRpcmVjdGVkU3RyZWFtcyB7Ci0gICAgcHVibGljOgotICAgICAgICBSZWRpcmVjdGVkU3Ry ZWFtcyhSZWRpcmVjdGVkU3RyZWFtcyBjb25zdCYpID0gZGVsZXRlOwotICAgICAgICBSZWRpcmVj dGVkU3RyZWFtcyYgb3BlcmF0b3I9KFJlZGlyZWN0ZWRTdHJlYW1zIGNvbnN0JikgPSBkZWxldGU7 Ci0gICAgICAgIFJlZGlyZWN0ZWRTdHJlYW1zKFJlZGlyZWN0ZWRTdHJlYW1zJiYpID0gZGVsZXRl OwotICAgICAgICBSZWRpcmVjdGVkU3RyZWFtcyYgb3BlcmF0b3I9KFJlZGlyZWN0ZWRTdHJlYW1z JiYpID0gZGVsZXRlOwotCi0gICAgICAgIFJlZGlyZWN0ZWRTdHJlYW1zKHN0ZDo6c3RyaW5nJiBy ZWRpcmVjdGVkQ291dCwgc3RkOjpzdHJpbmcmIHJlZGlyZWN0ZWRDZXJyKTsKLSAgICAgICAgflJl ZGlyZWN0ZWRTdHJlYW1zKCk7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RkOjpzdHJpbmcmIG1f cmVkaXJlY3RlZENvdXQ7Ci0gICAgICAgIHN0ZDo6c3RyaW5nJiBtX3JlZGlyZWN0ZWRDZXJyOwot ICAgICAgICBSZWRpcmVjdGVkU3RkT3V0IG1fcmVkaXJlY3RlZFN0ZE91dDsKLSAgICAgICAgUmVk aXJlY3RlZFN0ZEVyciBtX3JlZGlyZWN0ZWRTdGRFcnI7Ci0gICAgfTsKLQotI2lmIGRlZmluZWQo Q0FUQ0hfQ09ORklHX05FV19DQVBUVVJFKQotCi0gICAgLy8gV2luZG93cydzIGltcGxlbWVudGF0 aW9uIG9mIHN0ZDo6dG1wZmlsZSBpcyB0ZXJyaWJsZSAoaXQgdHJpZXMKLSAgICAvLyB0byBjcmVh dGUgYSBmaWxlIGluc2lkZSBzeXN0ZW0gZm9sZGVyLCB0aHVzIHJlcXVpcmluZyBlbGV2YXRlZAot ICAgIC8vIHByaXZpbGVnZXMgZm9yIHRoZSBiaW5hcnkpLCBzbyB3ZSBoYXZlIHRvIHVzZSB0bXBu YW0oX3MpIGFuZAotICAgIC8vIGNyZWF0ZSB0aGUgZmlsZSBvdXJzZWx2ZXMgdGhlcmUuCi0gICAg Y2xhc3MgVGVtcEZpbGUgewotICAgIHB1YmxpYzoKLSAgICAgICAgVGVtcEZpbGUoVGVtcEZpbGUg Y29uc3QmKSA9IGRlbGV0ZTsKLSAgICAgICAgVGVtcEZpbGUmIG9wZXJhdG9yPShUZW1wRmlsZSBj b25zdCYpID0gZGVsZXRlOwotICAgICAgICBUZW1wRmlsZShUZW1wRmlsZSYmKSA9IGRlbGV0ZTsK LSAgICAgICAgVGVtcEZpbGUmIG9wZXJhdG9yPShUZW1wRmlsZSYmKSA9IGRlbGV0ZTsKLQotICAg ICAgICBUZW1wRmlsZSgpOwotICAgICAgICB+VGVtcEZpbGUoKTsKLQotICAgICAgICBzdGQ6OkZJ TEUqIGdldEZpbGUoKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q29udGVudHMoKTsKLQotICAg IHByaXZhdGU6Ci0gICAgICAgIHN0ZDo6RklMRSogbV9maWxlID0gbnVsbHB0cjsKLSAgICAjaWYg ZGVmaW5lZChfTVNDX1ZFUikKLSAgICAgICAgY2hhciBtX2J1ZmZlcltMX3RtcG5hbV0gPSB7IDAg fTsKLSAgICAjZW5kaWYKLSAgICB9OwotCi0gICAgY2xhc3MgT3V0cHV0UmVkaXJlY3QgewotICAg IHB1YmxpYzoKLSAgICAgICAgT3V0cHV0UmVkaXJlY3QoT3V0cHV0UmVkaXJlY3QgY29uc3QmKSA9 IGRlbGV0ZTsKLSAgICAgICAgT3V0cHV0UmVkaXJlY3QmIG9wZXJhdG9yPShPdXRwdXRSZWRpcmVj dCBjb25zdCYpID0gZGVsZXRlOwotICAgICAgICBPdXRwdXRSZWRpcmVjdChPdXRwdXRSZWRpcmVj dCYmKSA9IGRlbGV0ZTsKLSAgICAgICAgT3V0cHV0UmVkaXJlY3QmIG9wZXJhdG9yPShPdXRwdXRS ZWRpcmVjdCYmKSA9IGRlbGV0ZTsKLQotICAgICAgICBPdXRwdXRSZWRpcmVjdChzdGQ6OnN0cmlu ZyYgc3Rkb3V0X2Rlc3QsIHN0ZDo6c3RyaW5nJiBzdGRlcnJfZGVzdCk7Ci0gICAgICAgIH5PdXRw dXRSZWRpcmVjdCgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgaW50IG1fb3JpZ2luYWxTdGRv dXQgPSAtMTsKLSAgICAgICAgaW50IG1fb3JpZ2luYWxTdGRlcnIgPSAtMTsKLSAgICAgICAgVGVt cEZpbGUgbV9zdGRvdXRGaWxlOwotICAgICAgICBUZW1wRmlsZSBtX3N0ZGVyckZpbGU7Ci0gICAg ICAgIHN0ZDo6c3RyaW5nJiBtX3N0ZG91dERlc3Q7Ci0gICAgICAgIHN0ZDo6c3RyaW5nJiBtX3N0 ZGVyckRlc3Q7Ci0gICAgfTsKLQotI2VuZGlmCi0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAot Ci0jZW5kaWYgLy8gVFdPQkxVRUNVQkVTX0NBVENIX09VVFBVVF9SRURJUkVDVF9ICi0vLyBlbmQg Y2F0Y2hfb3V0cHV0X3JlZGlyZWN0LmgKLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0 cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8 c3RkZXhjZXB0PgotCi0jaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfTkVXX0NBUFRVUkUpCi0gICAg I2lmIGRlZmluZWQoX01TQ19WRVIpCi0gICAgI2luY2x1ZGUgPGlvLmg+ICAgICAgLy9fZHVwIGFu ZCBfZHVwMgotICAgICNkZWZpbmUgZHVwIF9kdXAKLSAgICAjZGVmaW5lIGR1cDIgX2R1cDIKLSAg ICAjZGVmaW5lIGZpbGVubyBfZmlsZW5vCi0gICAgI2Vsc2UKLSAgICAjaW5jbHVkZSA8dW5pc3Rk Lmg+ICAvLyBkdXAgYW5kIGR1cDIKLSAgICAjZW5kaWYKLSNlbmRpZgotCi1uYW1lc3BhY2UgQ2F0 Y2ggewotCi0gICAgUmVkaXJlY3RlZFN0cmVhbTo6UmVkaXJlY3RlZFN0cmVhbSggc3RkOjpvc3Ry ZWFtJiBvcmlnaW5hbFN0cmVhbSwgc3RkOjpvc3RyZWFtJiByZWRpcmVjdGlvblN0cmVhbSApCi0g ICAgOiAgIG1fb3JpZ2luYWxTdHJlYW0oIG9yaWdpbmFsU3RyZWFtICksCi0gICAgICAgIG1fcmVk aXJlY3Rpb25TdHJlYW0oIHJlZGlyZWN0aW9uU3RyZWFtICksCi0gICAgICAgIG1fcHJldkJ1Zigg bV9vcmlnaW5hbFN0cmVhbS5yZGJ1ZigpICkKLSAgICB7Ci0gICAgICAgIG1fb3JpZ2luYWxTdHJl YW0ucmRidWYoIG1fcmVkaXJlY3Rpb25TdHJlYW0ucmRidWYoKSApOwotICAgIH0KLQotICAgIFJl ZGlyZWN0ZWRTdHJlYW06On5SZWRpcmVjdGVkU3RyZWFtKCkgewotICAgICAgICBtX29yaWdpbmFs U3RyZWFtLnJkYnVmKCBtX3ByZXZCdWYgKTsKLSAgICB9Ci0KLSAgICBSZWRpcmVjdGVkU3RkT3V0 OjpSZWRpcmVjdGVkU3RkT3V0KCkgOiBtX2NvdXQoIENhdGNoOjpjb3V0KCksIG1fcnNzLmdldCgp ICkge30KLSAgICBhdXRvIFJlZGlyZWN0ZWRTdGRPdXQ6OnN0cigpIGNvbnN0IC0+IHN0ZDo6c3Ry aW5nIHsgcmV0dXJuIG1fcnNzLnN0cigpOyB9Ci0KLSAgICBSZWRpcmVjdGVkU3RkRXJyOjpSZWRp cmVjdGVkU3RkRXJyKCkKLSAgICA6ICAgbV9jZXJyKCBDYXRjaDo6Y2VycigpLCBtX3Jzcy5nZXQo KSApLAotICAgICAgICBtX2Nsb2coIENhdGNoOjpjbG9nKCksIG1fcnNzLmdldCgpICkKLSAgICB7 fQotICAgIGF1dG8gUmVkaXJlY3RlZFN0ZEVycjo6c3RyKCkgY29uc3QgLT4gc3RkOjpzdHJpbmcg eyByZXR1cm4gbV9yc3Muc3RyKCk7IH0KLQotICAgIFJlZGlyZWN0ZWRTdHJlYW1zOjpSZWRpcmVj dGVkU3RyZWFtcyhzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENvdXQsIHN0ZDo6c3RyaW5nJiByZWRp cmVjdGVkQ2VycikKLSAgICA6ICAgbV9yZWRpcmVjdGVkQ291dChyZWRpcmVjdGVkQ291dCksCi0g ICAgICAgIG1fcmVkaXJlY3RlZENlcnIocmVkaXJlY3RlZENlcnIpCi0gICAge30KLQotICAgIFJl ZGlyZWN0ZWRTdHJlYW1zOjp+UmVkaXJlY3RlZFN0cmVhbXMoKSB7Ci0gICAgICAgIG1fcmVkaXJl Y3RlZENvdXQgKz0gbV9yZWRpcmVjdGVkU3RkT3V0LnN0cigpOwotICAgICAgICBtX3JlZGlyZWN0 ZWRDZXJyICs9IG1fcmVkaXJlY3RlZFN0ZEVyci5zdHIoKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVk KENBVENIX0NPTkZJR19ORVdfQ0FQVFVSRSkKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0gICAg VGVtcEZpbGU6OlRlbXBGaWxlKCkgewotICAgICAgICBpZiAodG1wbmFtX3MobV9idWZmZXIpKSB7 Ci0gICAgICAgICAgICBDQVRDSF9SVU5USU1FX0VSUk9SKCJDb3VsZCBub3QgZ2V0IGEgdGVtcCBm aWxlbmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb3Blbl9zKCZtX2ZpbGUsIG1fYnVm ZmVyLCAidysiKSkgewotICAgICAgICAgICAgY2hhciBidWZmZXJbMTAwXTsKLSAgICAgICAgICAg IGlmIChzdHJlcnJvcl9zKGJ1ZmZlciwgZXJybm8pKSB7Ci0gICAgICAgICAgICAgICAgQ0FUQ0hf UlVOVElNRV9FUlJPUigiQ291bGQgbm90IHRyYW5zbGF0ZSBlcnJubyB0byBhIHN0cmluZyIpOwot ICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0FUQ0hfUlVOVElNRV9FUlJPUigiQ291bGQgbm90 IG9wZW4gdGhlIHRlbXAgZmlsZTogJyIgPDwgbV9idWZmZXIgPDwgIicgYmVjYXVzZTogIiA8PCBi dWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgICBUZW1wRmlsZTo6VGVtcEZpbGUo KSB7Ci0gICAgICAgIG1fZmlsZSA9IHN0ZDo6dG1wZmlsZSgpOwotICAgICAgICBpZiAoIW1fZmls ZSkgewotICAgICAgICAgICAgQ0FUQ0hfUlVOVElNRV9FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBh IHRlbXAgZmlsZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmCi0KLSAgICBUZW1wRmls ZTo6flRlbXBGaWxlKCkgewotICAgICAgICAgLy8gVEJEOiBXaGF0IHRvIGRvIGFib3V0IGVycm9y cyBoZXJlPwotICAgICAgICAgc3RkOjpmY2xvc2UobV9maWxlKTsKLSAgICAgICAgIC8vIFdlIG1h bnVhbGx5IGNyZWF0ZSB0aGUgZmlsZSBvbiBXaW5kb3dzIG9ubHksIG9uIExpbnV4Ci0gICAgICAg ICAvLyBpdCB3aWxsIGJlIGF1dG9kZWxldGVkCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSAgICAg ICAgIHN0ZDo6cmVtb3ZlKG1fYnVmZmVyKTsKLSNlbmRpZgotICAgIH0KLQotICAgIEZJTEUqIFRl bXBGaWxlOjpnZXRGaWxlKCkgewotICAgICAgICByZXR1cm4gbV9maWxlOwotICAgIH0KLQotICAg IHN0ZDo6c3RyaW5nIFRlbXBGaWxlOjpnZXRDb250ZW50cygpIHsKLSAgICAgICAgc3RkOjpzdHJp bmdzdHJlYW0gc3N0cjsKLSAgICAgICAgY2hhciBidWZmZXJbMTAwXSA9IHt9OwotICAgICAgICBz dGQ6OnJld2luZChtX2ZpbGUpOwotICAgICAgICB3aGlsZSAoc3RkOjpmZ2V0cyhidWZmZXIsIHNp emVvZihidWZmZXIpLCBtX2ZpbGUpKSB7Ci0gICAgICAgICAgICBzc3RyIDw8IGJ1ZmZlcjsKLSAg ICAgICAgfQotICAgICAgICByZXR1cm4gc3N0ci5zdHIoKTsKLSAgICB9Ci0KLSAgICBPdXRwdXRS ZWRpcmVjdDo6T3V0cHV0UmVkaXJlY3Qoc3RkOjpzdHJpbmcmIHN0ZG91dF9kZXN0LCBzdGQ6OnN0 cmluZyYgc3RkZXJyX2Rlc3QpIDoKLSAgICAgICAgbV9vcmlnaW5hbFN0ZG91dChkdXAoMSkpLAot ICAgICAgICBtX29yaWdpbmFsU3RkZXJyKGR1cCgyKSksCi0gICAgICAgIG1fc3Rkb3V0RGVzdChz dGRvdXRfZGVzdCksCi0gICAgICAgIG1fc3RkZXJyRGVzdChzdGRlcnJfZGVzdCkgewotICAgICAg ICBkdXAyKGZpbGVubyhtX3N0ZG91dEZpbGUuZ2V0RmlsZSgpKSwgMSk7Ci0gICAgICAgIGR1cDIo ZmlsZW5vKG1fc3RkZXJyRmlsZS5nZXRGaWxlKCkpLCAyKTsKLSAgICB9Ci0KLSAgICBPdXRwdXRS ZWRpcmVjdDo6fk91dHB1dFJlZGlyZWN0KCkgewotICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHN0 ZDo6Zmx1c2g7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAvLyBTaW5jZSB3ZSBz dXBwb3J0IG92ZXJyaWRpbmcgdGhlc2Ugc3RyZWFtcywgd2UgZmx1c2ggY2VycgotICAgICAgICAv LyBldmVuIHRob3VnaCBzdGQ6OmNlcnIgaXMgdW5idWZmZXJlZAotICAgICAgICBDYXRjaDo6Y2Vy cigpIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgICAgIENhdGNoOjpjbG9nKCkgPDwgc3RkOjpmbHVzaDsK LSAgICAgICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICAgICAgZHVwMihtX29yaWdpbmFsU3Rkb3V0 LCAxKTsKLSAgICAgICAgZHVwMihtX29yaWdpbmFsU3RkZXJyLCAyKTsKLQotICAgICAgICBtX3N0 ZG91dERlc3QgKz0gbV9zdGRvdXRGaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIG1fc3RkZXJy RGVzdCArPSBtX3N0ZGVyckZpbGUuZ2V0Q29udGVudHMoKTsKLSAgICB9Ci0KLSNlbmRpZiAvLyBD QVRDSF9DT05GSUdfTkVXX0NBUFRVUkUKLQotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLQotI2lmIGRl ZmluZWQoQ0FUQ0hfQ09ORklHX05FV19DQVBUVVJFKQotICAgICNpZiBkZWZpbmVkKF9NU0NfVkVS KQotICAgICN1bmRlZiBkdXAKLSAgICAjdW5kZWYgZHVwMgotICAgICN1bmRlZiBmaWxlbm8KLSAg ICAjZW5kaWYKLSNlbmRpZgotLy8gZW5kIGNhdGNoX291dHB1dF9yZWRpcmVjdC5jcHAKLS8vIHN0 YXJ0IGNhdGNoX3BvbHlmaWxscy5jcHAKLQotI2luY2x1ZGUgPGNtYXRoPgotCi1uYW1lc3BhY2Ug Q2F0Y2ggewotCi0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPTFlGSUxMX0lTTkFOKQotICAg IGJvb2wgaXNuYW4oZmxvYXQgZikgewotICAgICAgICByZXR1cm4gc3RkOjppc25hbihmKTsKLSAg ICB9Ci0gICAgYm9vbCBpc25hbihkb3VibGUgZCkgewotICAgICAgICByZXR1cm4gc3RkOjppc25h bihkKTsKLSAgICB9Ci0jZWxzZQotICAgIC8vIEZvciBub3cgd2Ugb25seSB1c2UgdGhpcyBmb3Ig ZW1iYXJjYWRlcm8KLSAgICBib29sIGlzbmFuKGZsb2F0IGYpIHsKLSAgICAgICAgcmV0dXJuIHN0 ZDo6X2lzbmFuKGYpOwotICAgIH0KLSAgICBib29sIGlzbmFuKGRvdWJsZSBkKSB7Ci0gICAgICAg IHJldHVybiBzdGQ6Ol9pc25hbihkKTsKLSAgICB9Ci0jZW5kaWYKLQotfSAvLyBlbmQgbmFtZXNw YWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfcG9seWZpbGxzLmNwcAotLy8gc3RhcnQgY2F0Y2hfcmFu ZG9tX251bWJlcl9nZW5lcmF0b3IuY3BwCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLW5hbWVzcGFj ZSB7Ci0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI3ByYWdtYSB3YXJuaW5nKHB1c2gpCi0jcHJh Z21hIHdhcm5pbmcoZGlzYWJsZTo0MTQ2KSAvLyB3ZSBuZWdhdGUgdWludDMyIGR1cmluZyB0aGUg cm90YXRlCi0jZW5kaWYKLSAgICAgICAgLy8gU2FmZSByb3RyIGltcGxlbWVudGF0aW9uIHRoYW5r cyB0byBKb2huIFJlZ2VocgotICAgICAgICB1aW50MzJfdCByb3RhdGVfcmlnaHQodWludDMyX3Qg dmFsLCB1aW50MzJfdCBjb3VudCkgewotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWFzayA9 IDMxOwotICAgICAgICAgICAgY291bnQgJj0gbWFzazsKLSAgICAgICAgICAgIHJldHVybiAodmFs ID4+IGNvdW50KSB8ICh2YWwgPDwgKC1jb3VudCAmIG1hc2spKTsKLSAgICAgICAgfQotCi0jaWYg ZGVmaW5lZChfTVNDX1ZFUikKLSNwcmFnbWEgd2FybmluZyhwb3ApCi0jZW5kaWYKLQotfQotCi0g ICAgU2ltcGxlUGNnMzI6OlNpbXBsZVBjZzMyKHJlc3VsdF90eXBlIHNlZWRfKSB7Ci0gICAgICAg IHNlZWQoc2VlZF8pOwotICAgIH0KLQotICAgIHZvaWQgU2ltcGxlUGNnMzI6OnNlZWQocmVzdWx0 X3R5cGUgc2VlZF8pIHsKLSAgICAgICAgbV9zdGF0ZSA9IDA7Ci0gICAgICAgICgqdGhpcykoKTsK LSAgICAgICAgbV9zdGF0ZSArPSBzZWVkXzsKLSAgICAgICAgKCp0aGlzKSgpOwotICAgIH0KLQot ICAgIHZvaWQgU2ltcGxlUGNnMzI6OmRpc2NhcmQodWludDY0X3Qgc2tpcCkgewotICAgICAgICAv LyBXZSBjb3VsZCBpbXBsZW1lbnQgdGhpcyB0byBydW4gaW4gTyhsb2cgbikgc3RlcHMsIGJ1dCB0 aGlzCi0gICAgICAgIC8vIHNob3VsZCBzdWZmaWNlIGZvciBvdXIgdXNlIGNhc2UuCi0gICAgICAg IGZvciAodWludDY0X3QgcyA9IDA7IHMgPCBza2lwOyArK3MpIHsKLSAgICAgICAgICAgIHN0YXRp Y19jYXN0PHZvaWQ+KCgqdGhpcykoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTaW1wbGVQ Y2czMjo6cmVzdWx0X3R5cGUgU2ltcGxlUGNnMzI6Om9wZXJhdG9yKCkoKSB7Ci0gICAgICAgIC8v IHByZXBhcmUgdGhlIG91dHB1dCB2YWx1ZQotICAgICAgICBjb25zdCB1aW50MzJfdCB4b3JzaGlm dGVkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCgobV9zdGF0ZSA+PiAxOHUpIF4gbV9zdGF0ZSkg Pj4gMjd1KTsKLSAgICAgICAgY29uc3QgYXV0byBvdXRwdXQgPSByb3RhdGVfcmlnaHQoeG9yc2hp ZnRlZCwgbV9zdGF0ZSA+PiA1OXUpOwotCi0gICAgICAgIC8vIGFkdmFuY2Ugc3RhdGUKLSAgICAg ICAgbV9zdGF0ZSA9IG1fc3RhdGUgKiA2MzY0MTM2MjIzODQ2NzkzMDA1VUxMICsgc19pbmM7Ci0K LSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPT0oU2lt cGxlUGNnMzIgY29uc3QmIGxocywgU2ltcGxlUGNnMzIgY29uc3QmIHJocykgewotICAgICAgICBy ZXR1cm4gbGhzLm1fc3RhdGUgPT0gcmhzLm1fc3RhdGU7Ci0gICAgfQotCi0gICAgYm9vbCBvcGVy YXRvciE9KFNpbXBsZVBjZzMyIGNvbnN0JiBsaHMsIFNpbXBsZVBjZzMyIGNvbnN0JiByaHMpIHsK LSAgICAgICAgcmV0dXJuIGxocy5tX3N0YXRlICE9IHJocy5tX3N0YXRlOwotICAgIH0KLX0KLS8v IGVuZCBjYXRjaF9yYW5kb21fbnVtYmVyX2dlbmVyYXRvci5jcHAKLS8vIHN0YXJ0IGNhdGNoX3Jl Z2lzdHJ5X2h1Yi5jcHAKLQotLy8gc3RhcnQgY2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5X2ltcGwu aAotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxhbGdvcml0 aG0+Ci0jaW5jbHVkZSA8aW9zPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgY2xhc3MgVGVz dENhc2U7Ci0gICAgc3RydWN0IElDb25maWc7Ci0KLSAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4g c29ydFRlc3RzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBj b25zdCYgdW5zb3J0ZWRUZXN0Q2FzZXMgKTsKLQotICAgIGJvb2wgaXNUaHJvd1NhZmUoIFRlc3RD YXNlIGNvbnN0JiB0ZXN0Q2FzZSwgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7Ci0gICAgYm9vbCBt YXRjaFRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RT cGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKLQotICAgIHZvaWQgZW5mb3JjZU5vRHVwbGlj YXRlVGVzdENhc2VzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGZ1bmN0aW9ucyApOwot Ci0gICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0 Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmln IGNvbnN0JiBjb25maWcgKTsKLSAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFs bFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7Ci0KLSAgICBjbGFzcyBU ZXN0UmVnaXN0cnkgOiBwdWJsaWMgSVRlc3RDYXNlUmVnaXN0cnkgewotICAgIHB1YmxpYzoKLSAg ICAgICAgdmlydHVhbCB+VGVzdFJlZ2lzdHJ5KCkgPSBkZWZhdWx0OwotCi0gICAgICAgIHZpcnR1 YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSApOwotCi0gICAg ICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHMoKSBjb25zdCBvdmVy cmlkZTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1Nv cnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICBwcml2 YXRlOgotICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbV9mdW5jdGlvbnM7Ci0gICAgICAg IG11dGFibGUgUnVuVGVzdHM6OkluV2hhdE9yZGVyIG1fY3VycmVudFNvcnRPcmRlciA9IFJ1blRl c3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI7Ci0gICAgICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8VGVz dENhc2U+IG1fc29ydGVkRnVuY3Rpb25zOwotICAgICAgICBzdGQ6OnNpemVfdCBtX3VubmFtZWRD b3VudCA9IDA7Ci0gICAgICAgIHN0ZDo6aW9zX2Jhc2U6OkluaXQgbV9vc3RyZWFtSW5pdDsgLy8g Rm9yY2VzIGNvdXQvIGNlcnIgdG8gYmUgaW5pdGlhbGlzZWQKLSAgICB9OwotCi0gICAgLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vCi0KLSAgICBjbGFzcyBUZXN0SW52b2tlckFzRnVuY3Rpb24gOiBwdWJsaWMg SVRlc3RJbnZva2VyIHsKLSAgICAgICAgdm9pZCgqbV90ZXN0QXNGdW5jdGlvbikoKTsKLSAgICBw dWJsaWM6Ci0gICAgICAgIFRlc3RJbnZva2VyQXNGdW5jdGlvbiggdm9pZCgqdGVzdEFzRnVuY3Rp b24pKCkgKSBub2V4Y2VwdDsKLQotICAgICAgICB2b2lkIGludm9rZSgpIGNvbnN0IG92ZXJyaWRl OwotICAgIH07Ci0KLSAgICBzdGQ6OnN0cmluZyBleHRyYWN0Q2xhc3NOYW1lKCBTdHJpbmdSZWYg Y29uc3QmIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICk7Ci0KLSAgICAvLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8KLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF90ZXN0X2Nh c2VfcmVnaXN0cnlfaW1wbC5oCi0vLyBzdGFydCBjYXRjaF9yZXBvcnRlcl9yZWdpc3RyeS5oCi0K LSNpbmNsdWRlIDxtYXA+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBjbGFzcyBSZXBvcnRl clJlZ2lzdHJ5IDogcHVibGljIElSZXBvcnRlclJlZ2lzdHJ5IHsKLQotICAgIHB1YmxpYzoKLQot ICAgICAgICB+UmVwb3J0ZXJSZWdpc3RyeSgpIG92ZXJyaWRlOwotCi0gICAgICAgIElTdHJlYW1p bmdSZXBvcnRlclB0ciBjcmVhdGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBJQ29uZmlnUHRy IGNvbnN0JiBjb25maWcgKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2b2lkIHJlZ2lzdGVy UmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBJUmVwb3J0ZXJGYWN0b3J5UHRyIGNv bnN0JiBmYWN0b3J5ICk7Ci0gICAgICAgIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggSVJlcG9ydGVy RmFjdG9yeVB0ciBjb25zdCYgZmFjdG9yeSApOwotCi0gICAgICAgIEZhY3RvcnlNYXAgY29uc3Qm IGdldEZhY3RvcmllcygpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICBMaXN0ZW5lcnMgY29uc3Qm IGdldExpc3RlbmVycygpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAg RmFjdG9yeU1hcCBtX2ZhY3RvcmllczsKLSAgICAgICAgTGlzdGVuZXJzIG1fbGlzdGVuZXJzOwot ICAgIH07Ci19Ci0KLS8vIGVuZCBjYXRjaF9yZXBvcnRlcl9yZWdpc3RyeS5oCi0vLyBzdGFydCBj YXRjaF90YWdfYWxpYXNfcmVnaXN0cnkuaAotCi0vLyBzdGFydCBjYXRjaF90YWdfYWxpYXMuaAot Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgc3RydWN0IFRh Z0FsaWFzIHsKLSAgICAgICAgVGFnQWxpYXMoc3RkOjpzdHJpbmcgY29uc3QmIF90YWcsIFNvdXJj ZUxpbmVJbmZvIF9saW5lSW5mbyk7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgdGFnOwotICAgICAg ICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKLSAgICB9OwotCi19IC8vIGVuZCBuYW1lc3BhY2Ug Q2F0Y2gKLQotLy8gZW5kIGNhdGNoX3RhZ19hbGlhcy5oCi0jaW5jbHVkZSA8bWFwPgotCi1uYW1l c3BhY2UgQ2F0Y2ggewotCi0gICAgY2xhc3MgVGFnQWxpYXNSZWdpc3RyeSA6IHB1YmxpYyBJVGFn QWxpYXNSZWdpc3RyeSB7Ci0gICAgcHVibGljOgotICAgICAgICB+VGFnQWxpYXNSZWdpc3RyeSgp IG92ZXJyaWRlOwotICAgICAgICBUYWdBbGlhcyBjb25zdCogZmluZCggc3RkOjpzdHJpbmcgY29u c3QmIGFsaWFzICkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGV4cGFuZEFs aWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCBvdmVy cmlkZTsKLSAgICAgICAgdm9pZCBhZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpz dHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7Ci0KLSAg ICBwcml2YXRlOgotICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+IG1fcmVn aXN0cnk7Ci0gICAgfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRj aF90YWdfYWxpYXNfcmVnaXN0cnkuaAotLy8gc3RhcnQgY2F0Y2hfc3RhcnR1cF9leGNlcHRpb25f cmVnaXN0cnkuaAotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLQot bmFtZXNwYWNlIENhdGNoIHsKLQotICAgIGNsYXNzIFN0YXJ0dXBFeGNlcHRpb25SZWdpc3RyeSB7 Ci0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhDRVBUSU9OUykKLSAgICBwdWJs aWM6Ci0gICAgICAgIHZvaWQgYWRkKHN0ZDo6ZXhjZXB0aW9uX3B0ciBjb25zdCYgZXhjZXB0aW9u KSBub2V4Y2VwdDsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpleGNlcHRpb25fcHRyPiBjb25z dCYgZ2V0RXhjZXB0aW9ucygpIGNvbnN0IG5vZXhjZXB0OwotICAgIHByaXZhdGU6Ci0gICAgICAg IHN0ZDo6dmVjdG9yPHN0ZDo6ZXhjZXB0aW9uX3B0cj4gbV9leGNlcHRpb25zOwotI2VuZGlmCi0g ICAgfTsKLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLS8vIGVuZCBjYXRjaF9zdGFydHVw X2V4Y2VwdGlvbl9yZWdpc3RyeS5oCi0vLyBzdGFydCBjYXRjaF9zaW5nbGV0b25zLmhwcAotCi1u YW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgc3RydWN0IElTaW5nbGV0b24gewotICAgICAgICB2aXJ0 dWFsIH5JU2luZ2xldG9uKCk7Ci0gICAgfTsKLQotICAgIHZvaWQgYWRkU2luZ2xldG9uKCBJU2lu Z2xldG9uKiBzaW5nbGV0b24gKTsKLSAgICB2b2lkIGNsZWFudXBTaW5nbGV0b25zKCk7Ci0KLSAg ICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaW5nbGV0b25JbXBsVCwgdHlwZW5hbWUgSW50ZXJmYWNlVCA9 IFNpbmdsZXRvbkltcGxULCB0eXBlbmFtZSBNdXRhYmxlSW50ZXJmYWNlVCA9IEludGVyZmFjZVQ+ Ci0gICAgY2xhc3MgU2luZ2xldG9uIDogU2luZ2xldG9uSW1wbFQsIHB1YmxpYyBJU2luZ2xldG9u IHsKLQotICAgICAgICBzdGF0aWMgYXV0byBnZXRJbnRlcm5hbCgpIC0+IFNpbmdsZXRvbiogewot ICAgICAgICAgICAgc3RhdGljIFNpbmdsZXRvbiogc19pbnN0YW5jZSA9IG51bGxwdHI7Ci0gICAg ICAgICAgICBpZiggIXNfaW5zdGFuY2UgKSB7Ci0gICAgICAgICAgICAgICAgc19pbnN0YW5jZSA9 IG5ldyBTaW5nbGV0b247Ci0gICAgICAgICAgICAgICAgYWRkU2luZ2xldG9uKCBzX2luc3RhbmNl ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc19pbnN0YW5jZTsKLSAgICAg ICAgfQotCi0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgYXV0byBnZXQoKSAtPiBJbnRlcmZh Y2VUIGNvbnN0JiB7Ci0gICAgICAgICAgICByZXR1cm4gKmdldEludGVybmFsKCk7Ci0gICAgICAg IH0KLSAgICAgICAgc3RhdGljIGF1dG8gZ2V0TXV0YWJsZSgpIC0+IE11dGFibGVJbnRlcmZhY2VU JiB7Ci0gICAgICAgICAgICByZXR1cm4gKmdldEludGVybmFsKCk7Ci0gICAgICAgIH0KLSAgICB9 OwotCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0vLyBlbmQgY2F0Y2hfc2luZ2xldG9ucy5ocHAK LW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBuYW1lc3BhY2UgewotCi0gICAgICAgIGNsYXNzIFJl Z2lzdHJ5SHViIDogcHVibGljIElSZWdpc3RyeUh1YiwgcHVibGljIElNdXRhYmxlUmVnaXN0cnlI dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBOb25Db3B5YWJsZSB7Ci0K LSAgICAgICAgcHVibGljOiAvLyBJUmVnaXN0cnlIdWIKLSAgICAgICAgICAgIFJlZ2lzdHJ5SHVi KCkgPSBkZWZhdWx0OwotICAgICAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnkgY29uc3QmIGdldFJl cG9ydGVyUmVnaXN0cnkoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJu IG1fcmVwb3J0ZXJSZWdpc3RyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElUZXN0Q2Fz ZVJlZ2lzdHJ5IGNvbnN0JiBnZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkgY29uc3Qgb3ZlcnJpZGUgewot ICAgICAgICAgICAgICAgIHJldHVybiBtX3Rlc3RDYXNlUmVnaXN0cnk7Ci0gICAgICAgICAgICB9 Ci0gICAgICAgICAgICBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IGNvbnN0JiBnZXRFeGNl cHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAg ICAgcmV0dXJuIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OwotICAgICAgICAgICAgfQot ICAgICAgICAgICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldFRhZ0FsaWFzUmVnaXN0cnko KSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fdGFnQWxpYXNSZWdp c3RyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXJ0dXBFeGNlcHRpb25SZWdpc3Ry eSBjb25zdCYgZ2V0U3RhcnR1cEV4Y2VwdGlvblJlZ2lzdHJ5KCkgY29uc3Qgb3ZlcnJpZGUgewot ICAgICAgICAgICAgICAgIHJldHVybiBtX2V4Y2VwdGlvblJlZ2lzdHJ5OwotICAgICAgICAgICAg fQotCi0gICAgICAgIHB1YmxpYzogLy8gSU11dGFibGVSZWdpc3RyeUh1YgotICAgICAgICAgICAg dm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgSVJlcG9ydGVy RmFjdG9yeVB0ciBjb25zdCYgZmFjdG9yeSApIG92ZXJyaWRlIHsKLSAgICAgICAgICAgICAgICBt X3JlcG9ydGVyUmVnaXN0cnkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgZmFjdG9yeSApOwotICAg ICAgICAgICAgfQotICAgICAgICAgICAgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBJUmVwb3J0ZXJG YWN0b3J5UHRyIGNvbnN0JiBmYWN0b3J5ICkgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIG1f cmVwb3J0ZXJSZWdpc3RyeS5yZWdpc3Rlckxpc3RlbmVyKCBmYWN0b3J5ICk7Ci0gICAgICAgICAg ICB9Ci0gICAgICAgICAgICB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJ bmZvICkgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIG1fdGVzdENhc2VSZWdpc3RyeS5yZWdp c3RlclRlc3QoIHRlc3RJbmZvICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2b2lkIHJl Z2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3Ig KSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0 cnkucmVnaXN0ZXJUcmFuc2xhdG9yKCB0cmFuc2xhdG9yICk7Ci0gICAgICAgICAgICB9Ci0gICAg ICAgICAgICB2b2lkIHJlZ2lzdGVyVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywg c3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkg b3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIG1fdGFnQWxpYXNSZWdpc3RyeS5hZGQoIGFsaWFz LCB0YWcsIGxpbmVJbmZvICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2b2lkIHJlZ2lz dGVyU3RhcnR1cEV4Y2VwdGlvbigpIG5vZXhjZXB0IG92ZXJyaWRlIHsKLSNpZiAhZGVmaW5lZChD QVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TKQotICAgICAgICAgICAgICAgIG1fZXhjZXB0 aW9uUmVnaXN0cnkuYWRkKHN0ZDo6Y3VycmVudF9leGNlcHRpb24oKSk7Ci0jZWxzZQotICAgICAg ICAgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCJBdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgYWN0 aXZlIGV4Y2VwdGlvbiB1bmRlciBDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TISIpOwot I2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJTXV0YWJsZUVudW1WYWx1ZXNSZWdp c3RyeSYgZ2V0TXV0YWJsZUVudW1WYWx1ZXNSZWdpc3RyeSgpIG92ZXJyaWRlIHsKLSAgICAgICAg ICAgICAgICByZXR1cm4gbV9lbnVtVmFsdWVzUmVnaXN0cnk7Ci0gICAgICAgICAgICB9Ci0KLSAg ICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIFRlc3RSZWdpc3RyeSBtX3Rlc3RDYXNlUmVnaXN0 cnk7Ci0gICAgICAgICAgICBSZXBvcnRlclJlZ2lzdHJ5IG1fcmVwb3J0ZXJSZWdpc3RyeTsKLSAg ICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSBtX2V4Y2VwdGlvblRyYW5zbGF0 b3JSZWdpc3RyeTsKLSAgICAgICAgICAgIFRhZ0FsaWFzUmVnaXN0cnkgbV90YWdBbGlhc1JlZ2lz dHJ5OwotICAgICAgICAgICAgU3RhcnR1cEV4Y2VwdGlvblJlZ2lzdHJ5IG1fZXhjZXB0aW9uUmVn aXN0cnk7Ci0gICAgICAgICAgICBEZXRhaWw6OkVudW1WYWx1ZXNSZWdpc3RyeSBtX2VudW1WYWx1 ZXNSZWdpc3RyeTsKLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICB1c2luZyBSZWdpc3RyeUh1YlNp bmdsZXRvbiA9IFNpbmdsZXRvbjxSZWdpc3RyeUh1YiwgSVJlZ2lzdHJ5SHViLCBJTXV0YWJsZVJl Z2lzdHJ5SHViPjsKLQotICAgIElSZWdpc3RyeUh1YiBjb25zdCYgZ2V0UmVnaXN0cnlIdWIoKSB7 Ci0gICAgICAgIHJldHVybiBSZWdpc3RyeUh1YlNpbmdsZXRvbjo6Z2V0KCk7Ci0gICAgfQotICAg IElNdXRhYmxlUmVnaXN0cnlIdWImIGdldE11dGFibGVSZWdpc3RyeUh1YigpIHsKLSAgICAgICAg cmV0dXJuIFJlZ2lzdHJ5SHViU2luZ2xldG9uOjpnZXRNdXRhYmxlKCk7Ci0gICAgfQotICAgIHZv aWQgY2xlYW5VcCgpIHsKLSAgICAgICAgY2xlYW51cFNpbmdsZXRvbnMoKTsKLSAgICAgICAgY2xl YW5VcENvbnRleHQoKTsKLSAgICB9Ci0gICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhj ZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRFeGNlcHRpb25U cmFuc2xhdG9yUmVnaXN0cnkoKS50cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKLSAgICB9Ci0K LX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotLy8gZW5kIGNhdGNoX3JlZ2lzdHJ5X2h1Yi5jcHAK LS8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX3JlZ2lzdHJ5LmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2gg ewotCi0gICAgUmVwb3J0ZXJSZWdpc3RyeTo6flJlcG9ydGVyUmVnaXN0cnkoKSA9IGRlZmF1bHQ7 Ci0KLSAgICBJU3RyZWFtaW5nUmVwb3J0ZXJQdHIgUmVwb3J0ZXJSZWdpc3RyeTo6Y3JlYXRlKCBz dGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgSUNvbmZpZ1B0ciBjb25zdCYgY29uZmlnICkgY29uc3Qg ewotICAgICAgICBhdXRvIGl0ID0gIG1fZmFjdG9yaWVzLmZpbmQoIG5hbWUgKTsKLSAgICAgICAg aWYoIGl0ID09IG1fZmFjdG9yaWVzLmVuZCgpICkKLSAgICAgICAgICAgIHJldHVybiBudWxscHRy OwotICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29u ZmlnICkgKTsKLSAgICB9Ci0KLSAgICB2b2lkIFJlcG9ydGVyUmVnaXN0cnk6OnJlZ2lzdGVyUmVw b3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBJUmVwb3J0ZXJGYWN0b3J5UHRyIGNvbnN0 JiBmYWN0b3J5ICkgewotICAgICAgICBtX2ZhY3Rvcmllcy5lbXBsYWNlKG5hbWUsIGZhY3Rvcnkp OwotICAgIH0KLSAgICB2b2lkIFJlcG9ydGVyUmVnaXN0cnk6OnJlZ2lzdGVyTGlzdGVuZXIoIElS ZXBvcnRlckZhY3RvcnlQdHIgY29uc3QmIGZhY3RvcnkgKSB7Ci0gICAgICAgIG1fbGlzdGVuZXJz LnB1c2hfYmFjayggZmFjdG9yeSApOwotICAgIH0KLQotICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpG YWN0b3J5TWFwIGNvbnN0JiBSZXBvcnRlclJlZ2lzdHJ5OjpnZXRGYWN0b3JpZXMoKSBjb25zdCB7 Ci0gICAgICAgIHJldHVybiBtX2ZhY3RvcmllczsKLSAgICB9Ci0gICAgSVJlcG9ydGVyUmVnaXN0 cnk6Okxpc3RlbmVycyBjb25zdCYgUmVwb3J0ZXJSZWdpc3RyeTo6Z2V0TGlzdGVuZXJzKCkgY29u c3QgewotICAgICAgICByZXR1cm4gbV9saXN0ZW5lcnM7Ci0gICAgfQotCi19Ci0vLyBlbmQgY2F0 Y2hfcmVwb3J0ZXJfcmVnaXN0cnkuY3BwCi0vLyBzdGFydCBjYXRjaF9yZXN1bHRfdHlwZS5jcHAK LQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIGJvb2wgaXNPayggUmVzdWx0V2FzOjpPZlR5cGUg cmVzdWx0VHlwZSApIHsKLSAgICAgICAgcmV0dXJuICggcmVzdWx0VHlwZSAmIFJlc3VsdFdhczo6 RmFpbHVyZUJpdCApID09IDA7Ci0gICAgfQotICAgIGJvb2wgaXNKdXN0SW5mbyggaW50IGZsYWdz ICkgewotICAgICAgICByZXR1cm4gZmxhZ3MgPT0gUmVzdWx0V2FzOjpJbmZvOwotICAgIH0KLQot ICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBvcGVyYXRvciB8ICggUmVzdWx0RGlzcG9zaXRp b246OkZsYWdzIGxocywgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJocyApIHsKLSAgICAgICAg cmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncz4oIHN0YXRpY19jYXN0 PGludD4oIGxocyApIHwgc3RhdGljX2Nhc3Q8aW50PiggcmhzICkgKTsKLSAgICB9Ci0KLSAgICBi b29sIHNob3VsZENvbnRpbnVlT25GYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICB7IHJldHVybiAoIGZs YWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlICkgIT0gMDsgfQotICAg IGJvb2wgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICAgIHsgcmV0dXJuICgg ZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsICkgIT0gMDsgfQotCi19IC8v IGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLS8vIGVuZCBjYXRjaF9yZXN1bHRfdHlwZS5jcHAKLS8vIHN0 YXJ0IGNhdGNoX3J1bl9jb250ZXh0LmNwcAotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRl IDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQot ICAgIG5hbWVzcGFjZSBHZW5lcmF0b3JzIHsKLSAgICAgICAgc3RydWN0IEdlbmVyYXRvclRyYWNr ZXIgOiBUZXN0Q2FzZVRyYWNraW5nOjpUcmFja2VyQmFzZSwgSUdlbmVyYXRvclRyYWNrZXIgewot ICAgICAgICAgICAgR2VuZXJhdG9yQmFzZVB0ciBtX2dlbmVyYXRvcjsKLQotICAgICAgICAgICAg R2VuZXJhdG9yVHJhY2tlciggVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uIGNvbnN0 JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQg KQotICAgICAgICAgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFy ZW50ICkKLSAgICAgICAgICAgIHt9Ci0gICAgICAgICAgICB+R2VuZXJhdG9yVHJhY2tlcigpOwot Ci0gICAgICAgICAgICBzdGF0aWMgR2VuZXJhdG9yVHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNv bnRleHQmIGN0eCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1l QW5kTG9jYXRpb24gKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdlbmVyYXRv clRyYWNrZXI+IHRyYWNrZXI7Ci0KLSAgICAgICAgICAgICAgICBJVHJhY2tlciYgY3VycmVudFRy YWNrZXIgPSBjdHguY3VycmVudFRyYWNrZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBVbmRlciBz cGVjaWZpYyBjaXJjdW1zdGFuY2VzLCB0aGUgZ2VuZXJhdG9yIHdlIHdhbnQKLSAgICAgICAgICAg ICAgICAvLyB0byBhY3F1aXJlIGlzIGFsc28gdGhlIGN1cnJlbnQgdHJhY2tlci4gSWYgdGhpcyBp cwotICAgICAgICAgICAgICAgIC8vIHRoZSBjYXNlLCB3ZSBoYXZlIHRvIGF2b2lkIGxvb2tpbmcg dGhyb3VnaCBjdXJyZW50Ci0gICAgICAgICAgICAgICAgLy8gdHJhY2tlcidzIGNoaWxkcmVuLCBh bmQgaW5zdGVhZCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyB0cmFja2Vy LgotICAgICAgICAgICAgICAgIC8vIEEgY2FzZSB3aGVyZSB0aGlzIGNoZWNrIGlzIGltcG9ydGFu dCBpcyBlLmcuCi0gICAgICAgICAgICAgICAgLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsg KytpKSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICBpbnQgbiA9IEdFTkVSQVRFKDEsIDIp OwotICAgICAgICAgICAgICAgIC8vICAgICB9Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAg ICAgICAgICAvLyB3aXRob3V0IGl0LCB0aGUgY29kZSBhYm92ZSBjcmVhdGVzIDUgbmVzdGVkIGdl bmVyYXRvcnMuCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUcmFja2VyLm5hbWVBbmRMb2Nh dGlvbigpID09IG5hbWVBbmRMb2NhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBhdXRvIHRo aXNUcmFja2VyID0gY3VycmVudFRyYWNrZXIucGFyZW50KCkuZmluZENoaWxkKG5hbWVBbmRMb2Nh dGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzVHJhY2tlcik7Ci0gICAgICAg ICAgICAgICAgICAgIGFzc2VydCh0aGlzVHJhY2tlci0+aXNHZW5lcmF0b3JUcmFja2VyKCkpOwot ICAgICAgICAgICAgICAgICAgICB0cmFja2VyID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEdl bmVyYXRvclRyYWNrZXI+KHRoaXNUcmFja2VyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYg KCBUZXN0Q2FzZVRyYWNraW5nOjpJVHJhY2tlclB0ciBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJh Y2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgewotICAgICAgICAgICAgICAgICAg ICBhc3NlcnQoIGNoaWxkVHJhY2tlciApOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGNo aWxkVHJhY2tlci0+aXNHZW5lcmF0b3JUcmFja2VyKCkgKTsKLSAgICAgICAgICAgICAgICAgICAg dHJhY2tlciA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxHZW5lcmF0b3JUcmFja2VyPiggY2hp bGRUcmFja2VyICk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg ICAgdHJhY2tlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8R2VuZXJhdG9yVHJhY2tlcj4oIG5hbWVBbmRM b2NhdGlvbiwgY3R4LCAmY3VycmVudFRyYWNrZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgY3Vy cmVudFRyYWNrZXIuYWRkQ2hpbGQoIHRyYWNrZXIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAg ICAgICAgICAgICAgICBpZiggIXRyYWNrZXItPmlzQ29tcGxldGUoKSApIHsKLSAgICAgICAgICAg ICAgICAgICAgdHJhY2tlci0+b3BlbigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg ICAgICAgIHJldHVybiAqdHJhY2tlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8g VHJhY2tlckJhc2UgaW50ZXJmYWNlCi0gICAgICAgICAgICBib29sIGlzR2VuZXJhdG9yVHJhY2tl cigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgICAgIGF1dG8gaGFz R2VuZXJhdG9yKCkgY29uc3QgLT4gYm9vbCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgcmV0 dXJuICEhbV9nZW5lcmF0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2b2lkIGNsb3Nl KCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIFRyYWNrZXJCYXNlOjpjbG9zZSgpOwotICAg ICAgICAgICAgICAgIC8vIElmIGEgZ2VuZXJhdG9yIGhhcyBhIGNoaWxkIChpdCBpcyBmb2xsb3dl ZCBieSBhIHNlY3Rpb24pCi0gICAgICAgICAgICAgICAgLy8gYW5kIG5vbmUgb2YgaXRzIGNoaWxk cmVuIGhhdmUgc3RhcnRlZCwgdGhlbiB3ZSBtdXN0IHdhaXQKLSAgICAgICAgICAgICAgICAvLyB1 bnRpbCBsYXRlciB0byBzdGFydCBjb25zdW1pbmcgaXRzIHZhbHVlcy4KLSAgICAgICAgICAgICAg ICAvLyBUaGlzIGNhdGNoZXMgY2FzZXMgd2hlcmUgYEdFTkVSQVRFYCBpcyBwbGFjZWQgYmV0d2Vl biB0d28KLSAgICAgICAgICAgICAgICAvLyBgU0VDVElPTmBzLgotICAgICAgICAgICAgICAgIC8v ICoqVGhlIGNoZWNrIGZvciBtX2NoaWxkcmVuLmVtcHR5IGNhbm5vdCBiZSByZW1vdmVkKiouCi0g ICAgICAgICAgICAgICAgLy8gZG9pbmcgc28gd291bGQgYnJlYWsgYEdFTkVSQVRFYCBfbm90XyBm b2xsb3dlZCBieSBgU0VDVElPTmBzLgotICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2hvdWxk X3dhaXRfZm9yX2NoaWxkID0gWyZdKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBObyBjaGls ZHJlbiAtPiBub2JvZHkgdG8gd2FpdCBmb3IKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBtX2No aWxkcmVuLmVtcHR5KCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7 Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXQgbGVh c3Qgb25lIGNoaWxkIHN0YXJ0ZWQgZXhlY3V0aW5nLCBkb24ndCB3YWl0Ci0gICAgICAgICAgICAg ICAgICAgIGlmICggc3RkOjpmaW5kX2lmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt X2NoaWxkcmVuLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY2hpbGRy ZW4uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKCBUZXN0Q2FzZVRyYWNr aW5nOjpJVHJhY2tlclB0ciB0cmFja2VyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmV0dXJuIHRyYWNrZXItPmhhc1N0YXJ0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfSApICE9IG1fY2hpbGRyZW4uZW5kKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg ICAgICAgICAvLyBObyBjaGlsZHJlbiBoYXZlIHN0YXJ0ZWQuIFdlIG5lZWQgdG8gY2hlY2sgaWYg dGhleSBfY2FuXwotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCwgYW5kIHRodXMgd2Ugc2hv dWxkIHdhaXQgZm9yIHRoZW0sIG9yIHRoZXkgY2Fubm90Ci0gICAgICAgICAgICAgICAgICAgIC8v IHN0YXJ0IChkdWUgdG8gZmlsdGVycyksIGFuZCB3ZSBzaG91bGRuJ3Qgd2FpdCBmb3IgdGhlbQot ICAgICAgICAgICAgICAgICAgICBhdXRvKiBwYXJlbnQgPSBtX3BhcmVudDsKLSAgICAgICAgICAg ICAgICAgICAgLy8gVGhpcyBpcyBzYWZlOiB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIHNl Y3Rpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tlciBpbiBhIHRlc3QgY2FzZSB0cmFj a2luZyB0cmVlCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICggIXBhcmVudC0+aXNTZWN0aW9u VHJhY2tlcigpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gJiggcGFyZW50 LT5wYXJlbnQoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg IGFzc2VydCggcGFyZW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3Npbmcg cm9vdCAodGVzdCBjYXNlKSBsZXZlbCBzZWN0aW9uIiApOwotCi0gICAgICAgICAgICAgICAgICAg IGF1dG8gY29uc3QmIHBhcmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgc3Rh dGljX2Nhc3Q8U2VjdGlvblRyYWNrZXImPiggKnBhcmVudCApOwotICAgICAgICAgICAgICAgICAg ICBhdXRvIGNvbnN0JiBmaWx0ZXJzID0gcGFyZW50U2VjdGlvbi5nZXRGaWx0ZXJzKCk7Ci0gICAg ICAgICAgICAgICAgICAgIC8vIE5vIGZpbHRlcnMgLT4gbm8gcmVzdHJpY3Rpb25zIG9uIHJ1bm5p bmcgc2VjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBmaWx0ZXJzLmVtcHR5KCkgKSB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg ICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGF1dG8gY29uc3QmIGNoaWxkIDogbV9j aGlsZHJlbiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2hpbGQtPmlzU2VjdGlv blRyYWNrZXIoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZpbmQoIGZp bHRlcnMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm aWx0ZXJzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oICpjaGlsZCApCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC50cmltbWVkTmFtZSgpICkgIT0KLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMuZW5kKCkgKSB7Ci0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAg ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg ICAgICAgICAgICAgIH0oKTsKLQotICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgYSBi aXQgdHJpY2t5LCBiZWNhdXNlIG1fZ2VuZXJhdG9yLT5uZXh0KCkKLSAgICAgICAgICAgICAgICAv LyBoYXMgYSBzaWRlLWVmZmVjdCwgd2hlcmUgaXQgY29uc3VtZXMgZ2VuZXJhdG9yJ3MgY3VycmVu dAotICAgICAgICAgICAgICAgIC8vIHZhbHVlLCBidXQgd2UgZG8gbm90IHdhbnQgdG8gaW52b2tl IHRoZSBzaWRlLWVmZmVjdCBpZgotICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VuZXJhdG9yIGlz IHN0aWxsIHdhaXRpbmcgZm9yIGFueSBjaGlsZCB0byBzdGFydC4KLSAgICAgICAgICAgICAgICBp ZiAoIHNob3VsZF93YWl0X2Zvcl9jaGlsZCB8fAotICAgICAgICAgICAgICAgICAgICAgKCBtX3J1 blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSAmJgotICAgICAgICAgICAgICAgICAgICAg ICBtX2dlbmVyYXRvci0+bmV4dCgpICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fY2hpbGRy ZW4uY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsK LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElHZW5l cmF0b3JUcmFja2VyIGludGVyZmFjZQotICAgICAgICAgICAgYXV0byBnZXRHZW5lcmF0b3IoKSBj b25zdCAtPiBHZW5lcmF0b3JCYXNlUHRyIGNvbnN0JiBvdmVycmlkZSB7Ci0gICAgICAgICAgICAg ICAgcmV0dXJuIG1fZ2VuZXJhdG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdm9pZCBz ZXRHZW5lcmF0b3IoIEdlbmVyYXRvckJhc2VQdHImJiBnZW5lcmF0b3IgKSBvdmVycmlkZSB7Ci0g ICAgICAgICAgICAgICAgbV9nZW5lcmF0b3IgPSBzdGQ6Om1vdmUoIGdlbmVyYXRvciApOwotICAg ICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBHZW5lcmF0b3JUcmFja2VyOjp+R2VuZXJh dG9yVHJhY2tlcigpIHt9Ci0gICAgfQotCi0gICAgUnVuQ29udGV4dDo6UnVuQ29udGV4dChJQ29u ZmlnUHRyIGNvbnN0JiBfY29uZmlnLCBJU3RyZWFtaW5nUmVwb3J0ZXJQdHImJiByZXBvcnRlcikK LSAgICA6ICAgbV9ydW5JbmZvKF9jb25maWctPm5hbWUoKSksCi0gICAgICAgIG1fY29udGV4dChn ZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKSksCi0gICAgICAgIG1fY29uZmlnKF9jb25maWcpLAot ICAgICAgICBtX3JlcG9ydGVyKHN0ZDo6bW92ZShyZXBvcnRlcikpLAotICAgICAgICBtX2xhc3RB c3NlcnRpb25JbmZveyBTdHJpbmdSZWYoKSwgU291cmNlTGluZUluZm8oIiIsMCksIFN0cmluZ1Jl ZigpLCBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIH0sCi0gICAgICAgIG1faW5jbHVkZVN1Y2Nl c3NmdWxSZXN1bHRzKCBtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgfHwgbV9y ZXBvcnRlci0+Z2V0UHJlZmVyZW5jZXMoKS5zaG91bGRSZXBvcnRBbGxBc3NlcnRpb25zICkKLSAg ICB7Ci0gICAgICAgIG1fY29udGV4dC5zZXRSdW5uZXIodGhpcyk7Ci0gICAgICAgIG1fY29udGV4 dC5zZXRDb25maWcobV9jb25maWcpOwotICAgICAgICBtX2NvbnRleHQuc2V0UmVzdWx0Q2FwdHVy ZSh0aGlzKTsKLSAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1blN0YXJ0aW5nKG1fcnVuSW5mbyk7 Ci0gICAgfQotCi0gICAgUnVuQ29udGV4dDo6flJ1bkNvbnRleHQoKSB7Ci0gICAgICAgIG1fcmVw b3J0ZXItPnRlc3RSdW5FbmRlZChUZXN0UnVuU3RhdHMobV9ydW5JbmZvLCBtX3RvdGFscywgYWJv cnRpbmcoKSkpOwotICAgIH0KLQotICAgIHZvaWQgUnVuQ29udGV4dDo6dGVzdEdyb3VwU3RhcnRp bmcoc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RTcGVjLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBz dGQ6OnNpemVfdCBncm91cHNDb3VudCkgewotICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBT dGFydGluZyhHcm91cEluZm8odGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50KSk7Ci0g ICAgfQotCi0gICAgdm9pZCBSdW5Db250ZXh0Ojp0ZXN0R3JvdXBFbmRlZChzdGQ6OnN0cmluZyBj b25zdCYgdGVzdFNwZWMsIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnNpemVfdCBncm91cElu ZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCkgewotICAgICAgICBtX3JlcG9ydGVyLT50ZXN0 R3JvdXBFbmRlZChUZXN0R3JvdXBTdGF0cyhHcm91cEluZm8odGVzdFNwZWMsIGdyb3VwSW5kZXgs IGdyb3Vwc0NvdW50KSwgdG90YWxzLCBhYm9ydGluZygpKSk7Ci0gICAgfQotCi0gICAgVG90YWxz IFJ1bkNvbnRleHQ6OnJ1blRlc3QoVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlKSB7Ci0gICAgICAg IFRvdGFscyBwcmV2VG90YWxzID0gbV90b3RhbHM7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgcmVk aXJlY3RlZENvdXQ7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJlZGlyZWN0ZWRDZXJyOwotCi0gICAg ICAgIGF1dG8gY29uc3QmIHRlc3RJbmZvID0gdGVzdENhc2UuZ2V0VGVzdENhc2VJbmZvKCk7Ci0K LSAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VTdGFydGluZyh0ZXN0SW5mbyk7Ci0KLSAgICAg ICAgbV9hY3RpdmVUZXN0Q2FzZSA9ICZ0ZXN0Q2FzZTsKLQotICAgICAgICBJVHJhY2tlciYgcm9v dFRyYWNrZXIgPSBtX3RyYWNrZXJDb250ZXh0LnN0YXJ0UnVuKCk7Ci0gICAgICAgIGFzc2VydChy b290VHJhY2tlci5pc1NlY3Rpb25UcmFja2VyKCkpOwotICAgICAgICBzdGF0aWNfY2FzdDxTZWN0 aW9uVHJhY2tlciY+KHJvb3RUcmFja2VyKS5hZGRJbml0aWFsRmlsdGVycyhtX2NvbmZpZy0+Z2V0 U2VjdGlvbnNUb1J1bigpKTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgbV90cmFja2VyQ29u dGV4dC5zdGFydEN5Y2xlKCk7Ci0gICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9ICZTZWN0 aW9uVHJhY2tlcjo6YWNxdWlyZShtX3RyYWNrZXJDb250ZXh0LCBUZXN0Q2FzZVRyYWNraW5nOjpO YW1lQW5kTG9jYXRpb24odGVzdEluZm8ubmFtZSwgdGVzdEluZm8ubGluZUluZm8pKTsKLSAgICAg ICAgICAgIHJ1bkN1cnJlbnRUZXN0KHJlZGlyZWN0ZWRDb3V0LCByZWRpcmVjdGVkQ2Vycik7Ci0g ICAgICAgIH0gd2hpbGUgKCFtX3Rlc3RDYXNlVHJhY2tlci0+aXNTdWNjZXNzZnVsbHlDb21wbGV0 ZWQoKSAmJiAhYWJvcnRpbmcoKSk7Ci0KLSAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzID0gbV90 b3RhbHMuZGVsdGEocHJldlRvdGFscyk7Ci0gICAgICAgIGlmICh0ZXN0SW5mby5leHBlY3RlZFRv RmFpbCgpICYmIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgPiAwKSB7Ci0gICAgICAgICAg ICBkZWx0YVRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCsrOwotICAgICAgICAgICAgZGVsdGFUb3Rh bHMudGVzdENhc2VzLnBhc3NlZC0tOwotICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2Vz LmZhaWxlZCsrOwotICAgICAgICB9Ci0gICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcyArPSBkZWx0 YVRvdGFscy50ZXN0Q2FzZXM7Ci0gICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlRW5kZWQoVGVz dENhc2VTdGF0cyh0ZXN0SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk ZWx0YVRvdGFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVk Q291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ2VyciwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGluZygpKSk7Ci0KLSAgICAg ICAgbV9hY3RpdmVUZXN0Q2FzZSA9IG51bGxwdHI7Ci0gICAgICAgIG1fdGVzdENhc2VUcmFja2Vy ID0gbnVsbHB0cjsKLQotICAgICAgICByZXR1cm4gZGVsdGFUb3RhbHM7Ci0gICAgfQotCi0gICAg SUNvbmZpZ1B0ciBSdW5Db250ZXh0Ojpjb25maWcoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBt X2NvbmZpZzsKLSAgICB9Ci0KLSAgICBJU3RyZWFtaW5nUmVwb3J0ZXImIFJ1bkNvbnRleHQ6OnJl cG9ydGVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gKm1fcmVwb3J0ZXI7Ci0gICAgfQotCi0g ICAgdm9pZCBSdW5Db250ZXh0Ojphc3NlcnRpb25FbmRlZChBc3NlcnRpb25SZXN1bHQgY29uc3Qg JiByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0 V2FzOjpPaykgewotICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQrKzsKLSAg ICAgICAgICAgIG1fbGFzdEFzc2VydGlvblBhc3NlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBp ZiAoIXJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvblBhc3NlZCA9 IGZhbHNlOwotICAgICAgICAgICAgaWYoIG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5m bygpLm9rVG9GYWlsKCkgKQotICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFp bGVkQnV0T2srKzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3RvdGFscy5h c3NlcnRpb25zLmZhaWxlZCsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAg ICAgbV9sYXN0QXNzZXJ0aW9uUGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8v IFdlIGhhdmUgbm8gdXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlICh3aGV0aGVyIG1lc3NhZ2VzIHNo b3VsZCBiZSBjbGVhcmVkKSwgYmVjYXVzZSBtZXNzYWdlcyB3ZXJlIG1hZGUgc2NvcGVkCi0gICAg ICAgIC8vIGFuZCBzaG91bGQgYmUgbGV0IHRvIGNsZWFyIHRoZW1zZWx2ZXMgb3V0LgotICAgICAg ICBzdGF0aWNfY2FzdDx2b2lkPihtX3JlcG9ydGVyLT5hc3NlcnRpb25FbmRlZChBc3NlcnRpb25T dGF0cyhyZXN1bHQsIG1fbWVzc2FnZXMsIG1fdG90YWxzKSkpOwotCi0gICAgICAgIGlmIChyZXN1 bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZykKLSAgICAgICAgICAgIG1f bWVzc2FnZVNjb3Blcy5jbGVhcigpOwotCi0gICAgICAgIC8vIFJlc2V0IHdvcmtpbmcgc3RhdGUK LSAgICAgICAgcmVzZXRBc3NlcnRpb25JbmZvKCk7Ci0gICAgICAgIG1fbGFzdFJlc3VsdCA9IHJl c3VsdDsKLSAgICB9Ci0gICAgdm9pZCBSdW5Db250ZXh0OjpyZXNldEFzc2VydGlvbkluZm8oKSB7 Ci0gICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ubWFjcm9OYW1lID0gU3RyaW5nUmVmKCk7Ci0g ICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uID0gIntVbmtub3du IGV4cHJlc3Npb24gYWZ0ZXIgdGhlIHJlcG9ydGVkIGxpbmV9Il9zcjsKLSAgICB9Ci0KLSAgICBi b29sIFJ1bkNvbnRleHQ6OnNlY3Rpb25TdGFydGVkKFNlY3Rpb25JbmZvIGNvbnN0ICYgc2VjdGlv bkluZm8sIENvdW50cyAmIGFzc2VydGlvbnMpIHsKLSAgICAgICAgSVRyYWNrZXImIHNlY3Rpb25U cmFja2VyID0gU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUobV90cmFja2VyQ29udGV4dCwgVGVzdENh c2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKHNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25JbmZv LmxpbmVJbmZvKSk7Ci0gICAgICAgIGlmICghc2VjdGlvblRyYWNrZXIuaXNPcGVuKCkpCi0gICAg ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucHVzaF9iYWNr KCZzZWN0aW9uVHJhY2tlcik7Ci0KLSAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5m byA9IHNlY3Rpb25JbmZvLmxpbmVJbmZvOwotCi0gICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25T dGFydGluZyhzZWN0aW9uSW5mbyk7Ci0KLSAgICAgICAgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFz c2VydGlvbnM7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGF1dG8gUnVuQ29u dGV4dDo6YWNxdWlyZUdlbmVyYXRvclRyYWNrZXIoIFN0cmluZ1JlZiBnZW5lcmF0b3JOYW1lLCBT b3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSAtPiBJR2VuZXJhdG9yVHJhY2tlciYgewot ICAgICAgICB1c2luZyBuYW1lc3BhY2UgR2VuZXJhdG9yczsKLSAgICAgICAgR2VuZXJhdG9yVHJh Y2tlciYgdHJhY2tlciA9IEdlbmVyYXRvclRyYWNrZXI6OmFjcXVpcmUobV90cmFja2VyQ29udGV4 dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCBzdGF0aWNfY2FzdDxz dGQ6OnN0cmluZz4oZ2VuZXJhdG9yTmFtZSksIGxpbmVJbmZvICkgKTsKLSAgICAgICAgbV9sYXN0 QXNzZXJ0aW9uSW5mby5saW5lSW5mbyA9IGxpbmVJbmZvOwotICAgICAgICByZXR1cm4gdHJhY2tl cjsKLSAgICB9Ci0KLSAgICBib29sIFJ1bkNvbnRleHQ6OnRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9u cyhDb3VudHMmIGFzc2VydGlvbnMpIHsKLSAgICAgICAgaWYgKGFzc2VydGlvbnMudG90YWwoKSAh PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIW1fY29uZmlnLT53 YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot ICAgICAgICBpZiAobV90cmFja2VyQ29udGV4dC5jdXJyZW50VHJhY2tlcigpLmhhc0NoaWxkcmVu KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIG1fdG90YWxzLmFzc2VydGlv bnMuZmFpbGVkKys7Ci0gICAgICAgIGFzc2VydGlvbnMuZmFpbGVkKys7Ci0gICAgICAgIHJldHVy biB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgUnVuQ29udGV4dDo6c2VjdGlvbkVuZGVkKFNlY3Rp b25FbmRJbmZvIGNvbnN0ICYgZW5kSW5mbykgewotICAgICAgICBDb3VudHMgYXNzZXJ0aW9ucyA9 IG1fdG90YWxzLmFzc2VydGlvbnMgLSBlbmRJbmZvLnByZXZBc3NlcnRpb25zOwotICAgICAgICBi b29sIG1pc3NpbmdBc3NlcnRpb25zID0gdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKGFzc2VydGlv bnMpOwotCi0gICAgICAgIGlmICghbV9hY3RpdmVTZWN0aW9ucy5lbXB0eSgpKSB7Ci0gICAgICAg ICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKLSAgICAgICAgICAgIG1fYWN0 aXZlU2VjdGlvbnMucG9wX2JhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1fcmVwb3J0ZXIt PnNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMoZW5kSW5mby5zZWN0aW9uSW5mbywgYXNzZXJ0aW9u cywgZW5kSW5mby5kdXJhdGlvbkluU2Vjb25kcywgbWlzc2luZ0Fzc2VydGlvbnMpKTsKLSAgICAg ICAgbV9tZXNzYWdlcy5jbGVhcigpOwotICAgICAgICBtX21lc3NhZ2VTY29wZXMuY2xlYXIoKTsK LSAgICB9Ci0KLSAgICB2b2lkIFJ1bkNvbnRleHQ6OnNlY3Rpb25FbmRlZEVhcmx5KFNlY3Rpb25F bmRJbmZvIGNvbnN0ICYgZW5kSW5mbykgewotICAgICAgICBpZiAobV91bmZpbmlzaGVkU2VjdGlv bnMuZW1wdHkoKSkKLSAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5mYWlsKCk7 Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5jbG9z ZSgpOwotICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLnBvcF9iYWNrKCk7Ci0KLSAgICAgICAgbV91 bmZpbmlzaGVkU2VjdGlvbnMucHVzaF9iYWNrKGVuZEluZm8pOwotICAgIH0KLQotI2lmIGRlZmlu ZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcpCi0gICAgdm9pZCBSdW5Db250ZXh0 OjpiZW5jaG1hcmtQcmVwYXJpbmcoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpIHsKLSAgICAgICAg bV9yZXBvcnRlci0+YmVuY2htYXJrUHJlcGFyaW5nKG5hbWUpOwotICAgIH0KLSAgICB2b2lkIFJ1 bkNvbnRleHQ6OmJlbmNobWFya1N0YXJ0aW5nKCBCZW5jaG1hcmtJbmZvIGNvbnN0JiBpbmZvICkg ewotICAgICAgICBtX3JlcG9ydGVyLT5iZW5jaG1hcmtTdGFydGluZyggaW5mbyApOwotICAgIH0K LSAgICB2b2lkIFJ1bkNvbnRleHQ6OmJlbmNobWFya0VuZGVkKCBCZW5jaG1hcmtTdGF0czw+IGNv bnN0JiBzdGF0cyApIHsKLSAgICAgICAgbV9yZXBvcnRlci0+YmVuY2htYXJrRW5kZWQoIHN0YXRz ICk7Ci0gICAgfQotICAgIHZvaWQgUnVuQ29udGV4dDo6YmVuY2htYXJrRmFpbGVkKHN0ZDo6c3Ry aW5nIGNvbnN0ICYgZXJyb3IpIHsKLSAgICAgICAgbV9yZXBvcnRlci0+YmVuY2htYXJrRmFpbGVk KGVycm9yKTsKLSAgICB9Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJ TkcKLQotICAgIHZvaWQgUnVuQ29udGV4dDo6cHVzaFNjb3BlZE1lc3NhZ2UoTWVzc2FnZUluZm8g Y29uc3QgJiBtZXNzYWdlKSB7Ci0gICAgICAgIG1fbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2Up OwotICAgIH0KLQotICAgIHZvaWQgUnVuQ29udGV4dDo6cG9wU2NvcGVkTWVzc2FnZShNZXNzYWdl SW5mbyBjb25zdCAmIG1lc3NhZ2UpIHsKLSAgICAgICAgbV9tZXNzYWdlcy5lcmFzZShzdGQ6OnJl bW92ZShtX21lc3NhZ2VzLmJlZ2luKCksIG1fbWVzc2FnZXMuZW5kKCksIG1lc3NhZ2UpLCBtX21l c3NhZ2VzLmVuZCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIFJ1bkNvbnRleHQ6OmVtcGxhY2VVbnNj b3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICkgewotICAgICAgICBt X21lc3NhZ2VTY29wZXMuZW1wbGFjZV9iYWNrKCBidWlsZGVyICk7Ci0gICAgfQotCi0gICAgc3Rk OjpzdHJpbmcgUnVuQ29udGV4dDo6Z2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgewotICAgICAg ICByZXR1cm4gbV9hY3RpdmVUZXN0Q2FzZQotICAgICAgICAgICAgPyBtX2FjdGl2ZVRlc3RDYXNl LT5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lCi0gICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7Ci0g ICAgfQotCi0gICAgY29uc3QgQXNzZXJ0aW9uUmVzdWx0ICogUnVuQ29udGV4dDo6Z2V0TGFzdFJl c3VsdCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICYoKm1fbGFzdFJlc3VsdCk7Ci0gICAgfQot Ci0gICAgdm9pZCBSdW5Db250ZXh0OjpleGNlcHRpb25FYXJseVJlcG9ydGVkKCkgewotICAgICAg ICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIFJ1 bkNvbnRleHQ6OmhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIFN0cmluZ1JlZiBtZXNzYWdlICkg ewotICAgICAgICAvLyBGaXJzdCBub3RpZnkgcmVwb3J0ZXIgdGhhdCBiYWQgdGhpbmdzIGhhcHBl bmVkCi0gICAgICAgIG1fcmVwb3J0ZXItPmZhdGFsRXJyb3JFbmNvdW50ZXJlZChtZXNzYWdlKTsK LQotICAgICAgICAvLyBEb24ndCByZWJ1aWxkIHRoZSByZXN1bHQgLS0gdGhlIHN0cmluZ2lmaWNh dGlvbiBpdHNlbGYgY2FuIGNhdXNlIG1vcmUgZmF0YWwgZXJyb3JzCi0gICAgICAgIC8vIEluc3Rl YWQsIGZha2UgYSByZXN1bHQgZGF0YS4KLSAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSB0ZW1w UmVzdWx0KCBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb24sIHsgZmFsc2UgfSApOwotICAg ICAgICB0ZW1wUmVzdWx0Lm1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4obWVzc2Fn ZSk7Ci0gICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQobV9sYXN0QXNzZXJ0aW9uSW5mbywg dGVtcFJlc3VsdCk7Ci0KLSAgICAgICAgYXNzZXJ0aW9uRW5kZWQocmVzdWx0KTsKLQotICAgICAg ICBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKTsKLQotICAgICAgICAvLyBSZWNyZWF0ZSBzZWN0 aW9uIGZvciB0ZXN0IGNhc2UgKGFzIHdlIHdpbGwgbG9zZSB0aGUgb25lIHRoYXQgd2FzIGluIHNj b3BlKQotICAgICAgICBhdXRvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNl LT5nZXRUZXN0Q2FzZUluZm8oKTsKLSAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9u KHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUpOwotCi0gICAgICAgIENv dW50cyBhc3NlcnRpb25zOwotICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCA9IDE7Ci0gICAgICAg IFNlY3Rpb25TdGF0cyB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyh0ZXN0Q2FzZVNlY3Rpb24sIGFzc2Vy dGlvbnMsIDAsIGZhbHNlKTsKLSAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKHRlc3RD YXNlU2VjdGlvblN0YXRzKTsKLQotICAgICAgICBhdXRvIGNvbnN0JiB0ZXN0SW5mbyA9IG1fYWN0 aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOwotCi0gICAgICAgIFRvdGFscyBkZWx0YVRv dGFsczsKLSAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLmZhaWxlZCA9IDE7Ci0gICAgICAg IGRlbHRhVG90YWxzLmFzc2VydGlvbnMuZmFpbGVkID0gMTsKLSAgICAgICAgbV9yZXBvcnRlci0+ dGVzdENhc2VFbmRlZChUZXN0Q2FzZVN0YXRzKHRlc3RJbmZvLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0ZDo6c3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RkOjpzdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkp OwotICAgICAgICBtX3RvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKys7Ci0gICAgICAgIHRlc3RHcm91 cEVuZGVkKHN0ZDo6c3RyaW5nKCksIG1fdG90YWxzLCAxLCAxKTsKLSAgICAgICAgbV9yZXBvcnRl ci0+dGVzdFJ1bkVuZGVkKFRlc3RSdW5TdGF0cyhtX3J1bkluZm8sIG1fdG90YWxzLCBmYWxzZSkp OwotICAgIH0KLQotICAgIGJvb2wgUnVuQ29udGV4dDo6bGFzdEFzc2VydGlvblBhc3NlZCgpIHsK LSAgICAgICAgIHJldHVybiBtX2xhc3RBc3NlcnRpb25QYXNzZWQ7Ci0gICAgfQotCi0gICAgdm9p ZCBSdW5Db250ZXh0Ojphc3NlcnRpb25QYXNzZWQoKSB7Ci0gICAgICAgIG1fbGFzdEFzc2VydGlv blBhc3NlZCA9IHRydWU7Ci0gICAgICAgICsrbV90b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQ7Ci0g ICAgICAgIHJlc2V0QXNzZXJ0aW9uSW5mbygpOwotICAgICAgICBtX21lc3NhZ2VTY29wZXMuY2xl YXIoKTsKLSAgICB9Ci0KLSAgICBib29sIFJ1bkNvbnRleHQ6OmFib3J0aW5nKCkgY29uc3Qgewot ICAgICAgICByZXR1cm4gbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgPj0gc3RhdGljX2Nhc3Q8 c3RkOjpzaXplX3Q+KG1fY29uZmlnLT5hYm9ydEFmdGVyKCkpOwotICAgIH0KLQotICAgIHZvaWQg UnVuQ29udGV4dDo6cnVuQ3VycmVudFRlc3Qoc3RkOjpzdHJpbmcgJiByZWRpcmVjdGVkQ291dCwg c3RkOjpzdHJpbmcgJiByZWRpcmVjdGVkQ2VycikgewotICAgICAgICBhdXRvIGNvbnN0JiB0ZXN0 Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKLSAgICAgICAg U2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENh c2VJbmZvLm5hbWUpOwotICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcodGVzdENh c2VTZWN0aW9uKTsKLSAgICAgICAgQ291bnRzIHByZXZBc3NlcnRpb25zID0gbV90b3RhbHMuYXNz ZXJ0aW9uczsKLSAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gMDsKLSAgICAgICAgbV9zaG91bGRS ZXBvcnRVbmV4cGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IHsg IlRFU1RfQ0FTRSJfc3IsIHRlc3RDYXNlSW5mby5saW5lSW5mbywgU3RyaW5nUmVmKCksIFJlc3Vs dERpc3Bvc2l0aW9uOjpOb3JtYWwgfTsKLQotICAgICAgICBzZWVkUm5nKCptX2NvbmZpZyk7Ci0K LSAgICAgICAgVGltZXIgdGltZXI7Ci0gICAgICAgIENBVENIX1RSWSB7Ci0gICAgICAgICAgICBp ZiAobV9yZXBvcnRlci0+Z2V0UHJlZmVyZW5jZXMoKS5zaG91bGRSZWRpcmVjdFN0ZE91dCkgewot I2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19FWFBFUklNRU5UQUxfUkVESVJFQ1QpCi0gICAgICAg ICAgICAgICAgUmVkaXJlY3RlZFN0cmVhbXMgcmVkaXJlY3RlZFN0cmVhbXMocmVkaXJlY3RlZENv dXQsIHJlZGlyZWN0ZWRDZXJyKTsKLQotICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0g ICAgICAgICAgICAgICAgaW52b2tlQWN0aXZlVGVzdENhc2UoKTsKLSNlbHNlCi0gICAgICAgICAg ICAgICAgT3V0cHV0UmVkaXJlY3QgcihyZWRpcmVjdGVkQ291dCwgcmVkaXJlY3RlZENlcnIpOwot ICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaW52b2tlQWN0 aXZlVGVzdENhc2UoKTsKLSNlbmRpZgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg ICAgICB0aW1lci5zdGFydCgpOwotICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNl KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkdXJhdGlvbiA9IHRpbWVyLmdldEVsYXBz ZWRTZWNvbmRzKCk7Ci0gICAgICAgIH0gQ0FUQ0hfQ0FUQ0hfQU5PTiAoVGVzdEZhaWx1cmVFeGNl cHRpb24mKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGp1c3QgbWVhbnMgdGhlIHRlc3Qgd2FzIGFi b3J0ZWQgZHVlIHRvIGZhaWx1cmUKLSAgICAgICAgfSBDQVRDSF9DQVRDSF9BTEwgewotICAgICAg ICAgICAgLy8gVW5kZXIgQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSwgdW5leHBlY3RlZCBleGNl cHRpb25zIHVuZGVyIFJFUVVJUkUgYXNzZXJ0aW9ucwotICAgICAgICAgICAgLy8gYXJlIHJlcG9y dGVkIHdpdGhvdXQgdHJhbnNsYXRpb24gYXQgdGhlIHBvaW50IG9mIG9yaWdpbi4KLSAgICAgICAg ICAgIGlmKCBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgKSB7Ci0gICAgICAgICAgICAgICAgQXNz ZXJ0aW9uUmVhY3Rpb24gZHVtbXlSZWFjdGlvbjsKLSAgICAgICAgICAgICAgICBoYW5kbGVVbmV4 cGVjdGVkSW5mbGlnaHRFeGNlcHRpb24oIG1fbGFzdEFzc2VydGlvbkluZm8sIHRyYW5zbGF0ZUFj dGl2ZUV4Y2VwdGlvbigpLCBkdW1teVJlYWN0aW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg IH0KLSAgICAgICAgQ291bnRzIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zIC0gcHJl dkFzc2VydGlvbnM7Ci0gICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlz c2luZ0Fzc2VydGlvbnMoYXNzZXJ0aW9ucyk7Ci0KLSAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXIt PmNsb3NlKCk7Ci0gICAgICAgIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOwotICAgICAgICBt X21lc3NhZ2VzLmNsZWFyKCk7Ci0gICAgICAgIG1fbWVzc2FnZVNjb3Blcy5jbGVhcigpOwotCi0g ICAgICAgIFNlY3Rpb25TdGF0cyB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyh0ZXN0Q2FzZVNlY3Rpb24s IGFzc2VydGlvbnMsIGR1cmF0aW9uLCBtaXNzaW5nQXNzZXJ0aW9ucyk7Ci0gICAgICAgIG1fcmVw b3J0ZXItPnNlY3Rpb25FbmRlZCh0ZXN0Q2FzZVNlY3Rpb25TdGF0cyk7Ci0gICAgfQotCi0gICAg dm9pZCBSdW5Db250ZXh0OjppbnZva2VBY3RpdmVUZXN0Q2FzZSgpIHsKLSAgICAgICAgRmF0YWxD b25kaXRpb25IYW5kbGVyR3VhcmQgXygmbV9mYXRhbENvbmRpdGlvbmhhbmRsZXIpOwotICAgICAg ICBtX2FjdGl2ZVRlc3RDYXNlLT5pbnZva2UoKTsKLSAgICB9Ci0KLSAgICB2b2lkIFJ1bkNvbnRl eHQ6OmhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpIHsKLSAgICAgICAgLy8gSWYgc2VjdGlvbnMg ZW5kZWQgcHJlbWF0dXJlbHkgZHVlIHRvIGFuIGV4Y2VwdGlvbiB3ZSBzdG9yZWQgdGhlaXIKLSAg ICAgICAgLy8gaW5mb3MgaGVyZSBzbyB3ZSBjYW4gdGVhciB0aGVtIGRvd24gb3V0c2lkZSB0aGUg dW53aW5kIHByb2Nlc3MuCi0gICAgICAgIGZvciAoYXV0byBpdCA9IG1fdW5maW5pc2hlZFNlY3Rp b25zLnJiZWdpbigpLAotICAgICAgICAgICAgIGl0RW5kID0gbV91bmZpbmlzaGVkU2VjdGlvbnMu cmVuZCgpOwotICAgICAgICAgICAgIGl0ICE9IGl0RW5kOwotICAgICAgICAgICAgICsraXQpCi0g ICAgICAgICAgICBzZWN0aW9uRW5kZWQoKml0KTsKLSAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlv bnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICB2b2lkIFJ1bkNvbnRleHQ6OmhhbmRsZUV4cHIoCi0g ICAgICAgIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sCi0gICAgICAgIElUcmFuc2llbnRFeHBy ZXNzaW9uIGNvbnN0JiBleHByLAotICAgICAgICBBc3NlcnRpb25SZWFjdGlvbiYgcmVhY3Rpb24K LSAgICApIHsKLSAgICAgICAgbV9yZXBvcnRlci0+YXNzZXJ0aW9uU3RhcnRpbmcoIGluZm8gKTsK LQotICAgICAgICBib29sIG5lZ2F0ZWQgPSBpc0ZhbHNlVGVzdCggaW5mby5yZXN1bHREaXNwb3Np dGlvbiApOwotICAgICAgICBib29sIHJlc3VsdCA9IGV4cHIuZ2V0UmVzdWx0KCkgIT0gbmVnYXRl ZDsKLQotICAgICAgICBpZiggcmVzdWx0ICkgewotICAgICAgICAgICAgaWYgKCFtX2luY2x1ZGVT dWNjZXNzZnVsUmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFzc2VydGlvblBhc3NlZCgpOwot ICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVwb3J0 RXhwcihpbmZvLCBSZXN1bHRXYXM6Ok9rLCAmZXhwciwgbmVnYXRlZCk7Ci0gICAgICAgICAgICB9 Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXBvcnRFeHByKGluZm8s IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZCwgJmV4cHIsIG5lZ2F0ZWQgKTsKLSAgICAgICAg ICAgIHBvcHVsYXRlUmVhY3Rpb24oIHJlYWN0aW9uICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAg dm9pZCBSdW5Db250ZXh0OjpyZXBvcnRFeHByKAotICAgICAgICAgICAgQXNzZXJ0aW9uSW5mbyBj b25zdCAmaW5mbywKLSAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUsCi0g ICAgICAgICAgICBJVHJhbnNpZW50RXhwcmVzc2lvbiBjb25zdCAqZXhwciwKLSAgICAgICAgICAg IGJvb2wgbmVnYXRlZCApIHsKLQotICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gaW5mbzsK LSAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhKCByZXN1bHRUeXBlLCBMYXp5RXhwcmVz c2lvbiggbmVnYXRlZCApICk7Ci0KLSAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJl c3VsdHsgaW5mbywgZGF0YSB9OwotICAgICAgICBhc3NlcnRpb25SZXN1bHQubV9yZXN1bHREYXRh LmxhenlFeHByZXNzaW9uLm1fdHJhbnNpZW50RXhwcmVzc2lvbiA9IGV4cHI7Ci0KLSAgICAgICAg YXNzZXJ0aW9uRW5kZWQoIGFzc2VydGlvblJlc3VsdCApOwotICAgIH0KLQotICAgIHZvaWQgUnVu Q29udGV4dDo6aGFuZGxlTWVzc2FnZSgKLSAgICAgICAgICAgIEFzc2VydGlvbkluZm8gY29uc3Qm IGluZm8sCi0gICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlLAotICAgICAg ICAgICAgU3RyaW5nUmVmIGNvbnN0JiBtZXNzYWdlLAotICAgICAgICAgICAgQXNzZXJ0aW9uUmVh Y3Rpb24mIHJlYWN0aW9uCi0gICAgKSB7Ci0gICAgICAgIG1fcmVwb3J0ZXItPmFzc2VydGlvblN0 YXJ0aW5nKCBpbmZvICk7Ci0KLSAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IGluZm87Ci0K LSAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhKCByZXN1bHRUeXBlLCBMYXp5RXhwcmVz c2lvbiggZmFsc2UgKSApOwotICAgICAgICBkYXRhLm1lc3NhZ2UgPSBzdGF0aWNfY2FzdDxzdGQ6 OnN0cmluZz4obWVzc2FnZSk7Ci0gICAgICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1 bHR7IG1fbGFzdEFzc2VydGlvbkluZm8sIGRhdGEgfTsKLSAgICAgICAgYXNzZXJ0aW9uRW5kZWQo IGFzc2VydGlvblJlc3VsdCApOwotICAgICAgICBpZiggIWFzc2VydGlvblJlc3VsdC5pc09rKCkg KQotICAgICAgICAgICAgcG9wdWxhdGVSZWFjdGlvbiggcmVhY3Rpb24gKTsKLSAgICB9Ci0gICAg dm9pZCBSdW5Db250ZXh0OjpoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uTm90VGhyb3duKAotICAg ICAgICAgICAgQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywKLSAgICAgICAgICAgIEFzc2VydGlv blJlYWN0aW9uJiByZWFjdGlvbgotICAgICkgewotICAgICAgICBoYW5kbGVOb25FeHByKGluZm8s IENhdGNoOjpSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb24sIHJlYWN0aW9uKTsKLSAgICB9 Ci0KLSAgICB2b2lkIFJ1bkNvbnRleHQ6OmhhbmRsZVVuZXhwZWN0ZWRJbmZsaWdodEV4Y2VwdGlv bigKLSAgICAgICAgICAgIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sCi0gICAgICAgICAgICBz dGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwKLSAgICAgICAgICAgIEFzc2VydGlvblJlYWN0aW9u JiByZWFjdGlvbgotICAgICkgewotICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gaW5mbzsK LQotICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEoIFJlc3VsdFdhczo6VGhyZXdFeGNl cHRpb24sIExhenlFeHByZXNzaW9uKCBmYWxzZSApICk7Ci0gICAgICAgIGRhdGEubWVzc2FnZSA9 IG1lc3NhZ2U7Ci0gICAgICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHR7IGluZm8s IGRhdGEgfTsKLSAgICAgICAgYXNzZXJ0aW9uRW5kZWQoIGFzc2VydGlvblJlc3VsdCApOwotICAg ICAgICBwb3B1bGF0ZVJlYWN0aW9uKCByZWFjdGlvbiApOwotICAgIH0KLQotICAgIHZvaWQgUnVu Q29udGV4dDo6cG9wdWxhdGVSZWFjdGlvbiggQXNzZXJ0aW9uUmVhY3Rpb24mIHJlYWN0aW9uICkg ewotICAgICAgICByZWFjdGlvbi5zaG91bGREZWJ1Z0JyZWFrID0gbV9jb25maWctPnNob3VsZERl YnVnQnJlYWsoKTsKLSAgICAgICAgcmVhY3Rpb24uc2hvdWxkVGhyb3cgPSBhYm9ydGluZygpIHx8 IChtX2xhc3RBc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICYgUmVzdWx0RGlzcG9zaXRp b246Ok5vcm1hbCk7Ci0gICAgfQotCi0gICAgdm9pZCBSdW5Db250ZXh0OjpoYW5kbGVJbmNvbXBs ZXRlKAotICAgICAgICAgICAgQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbwotICAgICkgewotICAg ICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gaW5mbzsKLQotICAgICAgICBBc3NlcnRpb25SZXN1 bHREYXRhIGRhdGEoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24sIExhenlFeHByZXNzaW9uKCBm YWxzZSApICk7Ci0gICAgICAgIGRhdGEubWVzc2FnZSA9ICJFeGNlcHRpb24gdHJhbnNsYXRpb24g d2FzIGRpc2FibGVkIGJ5IENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUiOwotICAgICAgICBBc3Nl cnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0eyBpbmZvLCBkYXRhIH07Ci0gICAgICAgIGFzc2Vy dGlvbkVuZGVkKCBhc3NlcnRpb25SZXN1bHQgKTsKLSAgICB9Ci0gICAgdm9pZCBSdW5Db250ZXh0 OjpoYW5kbGVOb25FeHByKAotICAgICAgICAgICAgQXNzZXJ0aW9uSW5mbyBjb25zdCAmaW5mbywK LSAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUsCi0gICAgICAgICAgICBB c3NlcnRpb25SZWFjdGlvbiAmcmVhY3Rpb24KLSAgICApIHsKLSAgICAgICAgbV9sYXN0QXNzZXJ0 aW9uSW5mbyA9IGluZm87Ci0KLSAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBkYXRhKCByZXN1 bHRUeXBlLCBMYXp5RXhwcmVzc2lvbiggZmFsc2UgKSApOwotICAgICAgICBBc3NlcnRpb25SZXN1 bHQgYXNzZXJ0aW9uUmVzdWx0eyBpbmZvLCBkYXRhIH07Ci0gICAgICAgIGFzc2VydGlvbkVuZGVk KCBhc3NlcnRpb25SZXN1bHQgKTsKLQotICAgICAgICBpZiggIWFzc2VydGlvblJlc3VsdC5pc09r KCkgKQotICAgICAgICAgICAgcG9wdWxhdGVSZWFjdGlvbiggcmVhY3Rpb24gKTsKLSAgICB9Ci0K LSAgICBJUmVzdWx0Q2FwdHVyZSYgZ2V0UmVzdWx0Q2FwdHVyZSgpIHsKLSAgICAgICAgaWYgKGF1 dG8qIGNhcHR1cmUgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJlc3VsdENhcHR1cmUoKSkKLSAg ICAgICAgICAgIHJldHVybiAqY2FwdHVyZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQ0FU Q0hfSU5URVJOQUxfRVJST1IoIk5vIHJlc3VsdCBjYXB0dXJlIGluc3RhbmNlIik7Ci0gICAgfQot Ci0gICAgdm9pZCBzZWVkUm5nKElDb25maWcgY29uc3QmIGNvbmZpZykgewotICAgICAgICBpZiAo Y29uZmlnLnJuZ1NlZWQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBzdGQ6OnNyYW5kKGNvbmZpZy5y bmdTZWVkKCkpOwotICAgICAgICAgICAgcm5nKCkuc2VlZChjb25maWcucm5nU2VlZCgpKTsKLSAg ICAgICAgfQotICAgIH0KLQotICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCkgewotICAgICAgICBy ZXR1cm4gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+cm5nU2VlZCgpOwotICAgIH0K LQotfQotLy8gZW5kIGNhdGNoX3J1bl9jb250ZXh0LmNwcAotLy8gc3RhcnQgY2F0Y2hfc2VjdGlv bi5jcHAKLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIFNlY3Rpb246OlNlY3Rpb24oIFNlY3Rp b25JbmZvIGNvbnN0JiBpbmZvICkKLSAgICA6ICAgbV9pbmZvKCBpbmZvICksCi0gICAgICAgIG1f c2VjdGlvbkluY2x1ZGVkKCBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvblN0YXJ0ZWQoIG1faW5m bywgbV9hc3NlcnRpb25zICkgKQotICAgIHsKLSAgICAgICAgbV90aW1lci5zdGFydCgpOwotICAg IH0KLQotICAgIFNlY3Rpb246On5TZWN0aW9uKCkgewotICAgICAgICBpZiggbV9zZWN0aW9uSW5j bHVkZWQgKSB7Ci0gICAgICAgICAgICBTZWN0aW9uRW5kSW5mbyBlbmRJbmZveyBtX2luZm8sIG1f YXNzZXJ0aW9ucywgbV90aW1lci5nZXRFbGFwc2VkU2Vjb25kcygpIH07Ci0gICAgICAgICAgICBp ZiggdW5jYXVnaHRfZXhjZXB0aW9ucygpICkKLSAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0 dXJlKCkuc2VjdGlvbkVuZGVkRWFybHkoIGVuZEluZm8gKTsKLSAgICAgICAgICAgIGVsc2UKLSAg ICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvbkVuZGVkKCBlbmRJbmZvICk7 Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBz ZWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QKLSAgICBTZWN0aW9uOjpvcGVyYXRvciBi b29sKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbV9zZWN0aW9uSW5jbHVkZWQ7Ci0gICAgfQot Ci19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLS8vIGVuZCBjYXRjaF9zZWN0aW9uLmNwcAotLy8g c3RhcnQgY2F0Y2hfc2VjdGlvbl9pbmZvLmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAg U2VjdGlvbkluZm86OlNlY3Rpb25JbmZvCi0gICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25z dCYgX2xpbmVJbmZvLAotICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkKLSAg ICA6ICAgbmFtZSggX25hbWUgKSwKLSAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApCi0gICAg e30KLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfc2VjdGlvbl9pbmZv LmNwcAotLy8gc3RhcnQgY2F0Y2hfc2Vzc2lvbi5jcHAKLQotLy8gc3RhcnQgY2F0Y2hfc2Vzc2lv bi5oCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBjbGFz cyBTZXNzaW9uIDogTm9uQ29weWFibGUgewotICAgIHB1YmxpYzoKLQotICAgICAgICBTZXNzaW9u KCk7Ci0gICAgICAgIH5TZXNzaW9uKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdm9pZCBzaG93SGVs cCgpIGNvbnN0OwotICAgICAgICB2b2lkIGxpYklkZW50aWZ5KCk7Ci0KLSAgICAgICAgaW50IGFw cGx5Q29tbWFuZExpbmUoIGludCBhcmdjLCBjaGFyIGNvbnN0ICogY29uc3QgKiBhcmd2ICk7Ci0g ICAgI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX1dDSEFSKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYg ZGVmaW5lZChVTklDT0RFKQotICAgICAgICBpbnQgYXBwbHlDb21tYW5kTGluZSggaW50IGFyZ2Ms IHdjaGFyX3QgY29uc3QgKiBjb25zdCAqIGFyZ3YgKTsKLSAgICAjZW5kaWYKLQotICAgICAgICB2 b2lkIHVzZUNvbmZpZ0RhdGEoIENvbmZpZ0RhdGEgY29uc3QmIGNvbmZpZ0RhdGEgKTsKLQotICAg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVD4KLSAgICAgICAgaW50IHJ1bihpbnQgYXJnYywg Q2hhclQgY29uc3QgKiBjb25zdCBhcmd2W10pIHsKLSAgICAgICAgICAgIGlmIChtX3N0YXJ0dXBF eGNlcHRpb25zKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgaW50IHJl dHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKGFyZ2MsIGFyZ3YpOwotICAgICAgICAgICAgaWYg KHJldHVybkNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7Ci0g ICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBy dW4oKTsKLQotICAgICAgICBjbGFyYTo6UGFyc2VyIGNvbnN0JiBjbGkoKSBjb25zdDsKLSAgICAg ICAgdm9pZCBjbGkoIGNsYXJhOjpQYXJzZXIgY29uc3QmIG5ld1BhcnNlciApOwotICAgICAgICBD b25maWdEYXRhJiBjb25maWdEYXRhKCk7Ci0gICAgICAgIENvbmZpZyYgY29uZmlnKCk7Ci0gICAg cHJpdmF0ZToKLSAgICAgICAgaW50IHJ1bkludGVybmFsKCk7Ci0KLSAgICAgICAgY2xhcmE6OlBh cnNlciBtX2NsaTsKLSAgICAgICAgQ29uZmlnRGF0YSBtX2NvbmZpZ0RhdGE7Ci0gICAgICAgIHN0 ZDo6c2hhcmVkX3B0cjxDb25maWc+IG1fY29uZmlnOwotICAgICAgICBib29sIG1fc3RhcnR1cEV4 Y2VwdGlvbnMgPSBmYWxzZTsKLSAgICB9OwotCi19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLQot Ly8gZW5kIGNhdGNoX3Nlc3Npb24uaAotLy8gc3RhcnQgY2F0Y2hfdmVyc2lvbi5oCi0KLSNpbmNs dWRlIDxpb3Nmd2Q+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICAvLyBWZXJzaW9uaW5nIGlu Zm9ybWF0aW9uCi0gICAgc3RydWN0IFZlcnNpb24gewotICAgICAgICBWZXJzaW9uKCBWZXJzaW9u IGNvbnN0JiApID0gZGVsZXRlOwotICAgICAgICBWZXJzaW9uJiBvcGVyYXRvcj0oIFZlcnNpb24g Y29uc3QmICkgPSBkZWxldGU7Ci0gICAgICAgIFZlcnNpb24oICAgIHVuc2lnbmVkIGludCBfbWFq b3JWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lv biwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKLSAgICAg ICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAotICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J1aWxkTnVtYmVyICk7Ci0KLSAgICAgICAgdW5zaWdu ZWQgaW50IGNvbnN0IG1ham9yVmVyc2lvbjsKLSAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1p bm9yVmVyc2lvbjsKLSAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IHBhdGNoTnVtYmVyOwotCi0g ICAgICAgIC8vIGJ1aWxkTnVtYmVyIGlzIG9ubHkgdXNlZCBpZiBicmFuY2hOYW1lIGlzIG5vdCBu dWxsCi0gICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBicmFuY2hOYW1lOwotICAgICAgICB1bnNp Z25lZCBpbnQgY29uc3QgYnVpbGROdW1iZXI7Ci0KLSAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVh bSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9u ICk7Ci0gICAgfTsKLQotICAgIFZlcnNpb24gY29uc3QmIGxpYnJhcnlWZXJzaW9uKCk7Ci19Ci0K LS8vIGVuZCBjYXRjaF92ZXJzaW9uLmgKLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGlv bWFuaXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotCi1uYW1lc3BhY2Ug Q2F0Y2ggewotCi0gICAgbmFtZXNwYWNlIHsKLSAgICAgICAgY29uc3QgaW50IE1heEV4aXRDb2Rl ID0gMjU1OwotCi0gICAgICAgIElTdHJlYW1pbmdSZXBvcnRlclB0ciBjcmVhdGVSZXBvcnRlcihz dGQ6OnN0cmluZyBjb25zdCYgcmVwb3J0ZXJOYW1lLCBJQ29uZmlnUHRyIGNvbnN0JiBjb25maWcp IHsKLSAgICAgICAgICAgIGF1dG8gcmVwb3J0ZXIgPSBDYXRjaDo6Z2V0UmVnaXN0cnlIdWIoKS5n ZXRSZXBvcnRlclJlZ2lzdHJ5KCkuY3JlYXRlKHJlcG9ydGVyTmFtZSwgY29uZmlnKTsKLSAgICAg ICAgICAgIENBVENIX0VORk9SQ0UocmVwb3J0ZXIsICJObyByZXBvcnRlciByZWdpc3RlcmVkIHdp dGggbmFtZTogJyIgPDwgcmVwb3J0ZXJOYW1lIDw8ICInIik7Ci0KLSAgICAgICAgICAgIHJldHVy biByZXBvcnRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIElTdHJlYW1pbmdSZXBvcnRlclB0ciBt YWtlUmVwb3J0ZXIoc3RkOjpzaGFyZWRfcHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZykgewotICAg ICAgICAgICAgaWYgKENhdGNoOjpnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnko KS5nZXRMaXN0ZW5lcnMoKS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0 ZVJlcG9ydGVyKGNvbmZpZy0+Z2V0UmVwb3J0ZXJOYW1lKCksIGNvbmZpZyk7Ci0gICAgICAgICAg ICB9Ci0KLSAgICAgICAgICAgIC8vIE9uIG9sZGVyIHBsYXRmb3JtcywgcmV0dXJuaW5nIHN0ZDo6 dW5pcXVlX3B0cjxMaXN0ZW5pbmdSZXBvcnRlcj4KLSAgICAgICAgICAgIC8vIHdoZW4gdGhlIHJl dHVybiB0eXBlIGlzIHN0ZDo6dW5pcXVlX3B0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+Ci0gICAgICAg ICAgICAvLyBkb2Vzbid0IGNvbXBpbGUgd2l0aG91dCBhIHN0ZDo6bW92ZSBjYWxsLiBIb3dldmVy LCB0aGlzIGNhdXNlcwotICAgICAgICAgICAgLy8gYSB3YXJuaW5nIG9uIG5ld2VyIHBsYXRmb3Jt cy4gVGh1cywgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZAotICAgICAgICAgICAgLy8gaXQgYSBiaXQg YW5kIGRvd25jYXN0IHRoZSBwb2ludGVyIG1hbnVhbGx5LgotICAgICAgICAgICAgYXV0byByZXQg PSBzdGQ6OnVuaXF1ZV9wdHI8SVN0cmVhbWluZ1JlcG9ydGVyPihuZXcgTGlzdGVuaW5nUmVwb3J0 ZXIpOwotICAgICAgICAgICAgYXV0byYgbXVsdGkgPSBzdGF0aWNfY2FzdDxMaXN0ZW5pbmdSZXBv cnRlciY+KCpyZXQpOwotICAgICAgICAgICAgYXV0byBjb25zdCYgbGlzdGVuZXJzID0gQ2F0Y2g6 OmdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmdldExpc3RlbmVycygpOwot ICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotICAg ICAgICAgICAgICAgIG11bHRpLmFkZExpc3RlbmVyKGxpc3RlbmVyLT5jcmVhdGUoQ2F0Y2g6OlJl cG9ydGVyQ29uZmlnKGNvbmZpZykpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG11bHRp LmFkZFJlcG9ydGVyKGNyZWF0ZVJlcG9ydGVyKGNvbmZpZy0+Z2V0UmVwb3J0ZXJOYW1lKCksIGNv bmZpZykpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIGNs YXNzIFRlc3RHcm91cCB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGV4cGxpY2l0IFRl c3RHcm91cChzdGQ6OnNoYXJlZF9wdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnKQotICAgICAgICAg ICAgOiBtX2NvbmZpZ3tjb25maWd9Ci0gICAgICAgICAgICAsIG1fY29udGV4dHtjb25maWcsIG1h a2VSZXBvcnRlcihjb25maWcpfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF1dG8g Y29uc3QmIGFsbFRlc3RDYXNlcyA9IGdldEFsbFRlc3RDYXNlc1NvcnRlZCgqbV9jb25maWcpOwot ICAgICAgICAgICAgICAgIG1fbWF0Y2hlcyA9IG1fY29uZmlnLT50ZXN0U3BlYygpLm1hdGNoZXNC eUZpbHRlcihhbGxUZXN0Q2FzZXMsICptX2NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgYXV0byBj b25zdCYgaW52YWxpZEFyZ3MgPSBtX2NvbmZpZy0+dGVzdFNwZWMoKS5nZXRJbnZhbGlkQXJncygp OwotCi0gICAgICAgICAgICAgICAgaWYgKG1fbWF0Y2hlcy5lbXB0eSgpICYmIGludmFsaWRBcmdz LmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiB0ZXN0IDog YWxsVGVzdENhc2VzKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXN0LmlzSGlkZGVu KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90ZXN0cy5lbXBsYWNlKCZ0ZXN0KTsK LSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8g Y29uc3QmIG1hdGNoIDogbV9tYXRjaGVzKQotICAgICAgICAgICAgICAgICAgICAgICAgbV90ZXN0 cy5pbnNlcnQobWF0Y2gudGVzdHMuYmVnaW4oKSwgbWF0Y2gudGVzdHMuZW5kKCkpOwotICAgICAg ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVG90YWxzIGV4ZWN1dGUo KSB7Ci0gICAgICAgICAgICAgICAgYXV0byBjb25zdCYgaW52YWxpZEFyZ3MgPSBtX2NvbmZpZy0+ dGVzdFNwZWMoKS5nZXRJbnZhbGlkQXJncygpOwotICAgICAgICAgICAgICAgIFRvdGFscyB0b3Rh bHM7Ci0gICAgICAgICAgICAgICAgbV9jb250ZXh0LnRlc3RHcm91cFN0YXJ0aW5nKG1fY29uZmln LT5uYW1lKCksIDEsIDEpOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgdGVzdENh c2UgOiBtX3Rlc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbV9jb250ZXh0LmFib3J0 aW5nKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbHMgKz0gbV9jb250ZXh0LnJ1blRl c3QoKnRlc3RDYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg ICAgICAgICAgbV9jb250ZXh0LnJlcG9ydGVyKCkuc2tpcFRlc3QoKnRlc3RDYXNlKTsKLSAgICAg ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIG1hdGNoIDog bV9tYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC50ZXN0cy5lbXB0eSgp KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2NvbnRleHQucmVwb3J0ZXIoKS5ub01hdGNo aW5nVGVzdENhc2VzKG1hdGNoLm5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxz LmVycm9yID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0K LSAgICAgICAgICAgICAgICBpZiAoIWludmFsaWRBcmdzLmVtcHR5KCkpIHsKLSAgICAgICAgICAg ICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBpbnZhbGlkQXJnOiBpbnZhbGlkQXJncykKLSAgICAg ICAgICAgICAgICAgICAgICAgICBtX2NvbnRleHQucmVwb3J0ZXIoKS5yZXBvcnRJbnZhbGlkQXJn dW1lbnRzKGludmFsaWRBcmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAg IG1fY29udGV4dC50ZXN0R3JvdXBFbmRlZChtX2NvbmZpZy0+bmFtZSgpLCB0b3RhbHMsIDEsIDEp OwotICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg ICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHVzaW5nIFRlc3RzID0gc3RkOjpzZXQ8VGVzdENhc2Ug Y29uc3QqPjsKLQotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZz4gbV9jb25maWc7 Ci0gICAgICAgICAgICBSdW5Db250ZXh0IG1fY29udGV4dDsKLSAgICAgICAgICAgIFRlc3RzIG1f dGVzdHM7Ci0gICAgICAgICAgICBUZXN0U3BlYzo6TWF0Y2hlcyBtX21hdGNoZXM7Ci0gICAgICAg IH07Ci0KLSAgICAgICAgdm9pZCBhcHBseUZpbGVuYW1lc0FzVGFncyhDYXRjaDo6SUNvbmZpZyBj b25zdCYgY29uZmlnKSB7Ci0gICAgICAgICAgICBhdXRvJiB0ZXN0cyA9IGNvbnN0X2Nhc3Q8c3Rk Ojp2ZWN0b3I8VGVzdENhc2U+Jj4oZ2V0QWxsVGVzdENhc2VzU29ydGVkKGNvbmZpZykpOwotICAg ICAgICAgICAgZm9yIChhdXRvJiB0ZXN0Q2FzZSA6IHRlc3RzKSB7Ci0gICAgICAgICAgICAgICAg YXV0byB0YWdzID0gdGVzdENhc2UudGFnczsKLQotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5n IGZpbGVuYW1lID0gdGVzdENhc2UubGluZUluZm8uZmlsZTsKLSAgICAgICAgICAgICAgICBhdXRv IGxhc3RTbGFzaCA9IGZpbGVuYW1lLmZpbmRfbGFzdF9vZigiXFwvIik7Ci0gICAgICAgICAgICAg ICAgaWYgKGxhc3RTbGFzaCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgICAg ICAgICBmaWxlbmFtZS5lcmFzZSgwLCBsYXN0U2xhc2gpOwotICAgICAgICAgICAgICAgICAgICBm aWxlbmFtZVswXSA9ICcjJzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBh dXRvIGxhc3REb3QgPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKLSAgICAgICAgICAgICAg ICBpZiAobGFzdERvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgICAgICAg ICBmaWxlbmFtZS5lcmFzZShsYXN0RG90KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg ICAgICAgICB0YWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZmlsZW5hbWUpKTsKLSAgICAgICAgICAg ICAgICBzZXRUYWdzKHRlc3RDYXNlLCB0YWdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot Ci0gICAgfSAvLyBhbm9uIG5hbWVzcGFjZQotCi0gICAgU2Vzc2lvbjo6U2Vzc2lvbigpIHsKLSAg ICAgICAgc3RhdGljIGJvb2wgYWxyZWFkeUluc3RhbnRpYXRlZCA9IGZhbHNlOwotICAgICAgICBp ZiggYWxyZWFkeUluc3RhbnRpYXRlZCApIHsKLSAgICAgICAgICAgIENBVENIX1RSWSB7IENBVENI X0lOVEVSTkFMX0VSUk9SKCAiT25seSBvbmUgaW5zdGFuY2Ugb2YgQ2F0Y2g6OlNlc3Npb24gY2Fu IGV2ZXIgYmUgdXNlZCIgKTsgfQotICAgICAgICAgICAgQ0FUQ0hfQ0FUQ0hfQUxMIHsgZ2V0TXV0 YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJTdGFydHVwRXhjZXB0aW9uKCk7IH0KLSAgICAgICAg fQotCi0gICAgICAgIC8vIFRoZXJlIGNhbm5vdCBiZSBleGNlcHRpb25zIGF0IHN0YXJ0dXAgaW4g bm8tZXhjZXB0aW9uIG1vZGUuCi0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfRVhD RVBUSU9OUykKLSAgICAgICAgY29uc3QgYXV0byYgZXhjZXB0aW9ucyA9IGdldFJlZ2lzdHJ5SHVi KCkuZ2V0U3RhcnR1cEV4Y2VwdGlvblJlZ2lzdHJ5KCkuZ2V0RXhjZXB0aW9ucygpOwotICAgICAg ICBpZiAoICFleGNlcHRpb25zLmVtcHR5KCkgKSB7Ci0gICAgICAgICAgICBjb25maWcoKTsKLSAg ICAgICAgICAgIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpLnNldENvbmZpZyhtX2NvbmZpZyk7 Ci0KLSAgICAgICAgICAgIG1fc3RhcnR1cEV4Y2VwdGlvbnMgPSB0cnVlOwotICAgICAgICAgICAg Q29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlZCApOwotICAgICAgICAgICAgQ2F0Y2g6OmNl cnIoKSA8PCAiRXJyb3JzIG9jY3VycmVkIGR1cmluZyBzdGFydHVwISIgPDwgJ1xuJzsKLSAgICAg ICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBhbGwgZXhjZXB0aW9ucyBhbmQgbm90aWZ5IHVzZXIKLSAg ICAgICAgICAgIGZvciAoIGNvbnN0IGF1dG8mIGV4X3B0ciA6IGV4Y2VwdGlvbnMgKSB7Ci0gICAg ICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpyZXRocm93X2V4Y2Vw dGlvbihleF9wdHIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKCBzdGQ6OmV4Y2VwdGlvbiBj b25zdCYgZXggKSB7Ci0gICAgICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgQ29sdW1u KCBleC53aGF0KCkgKS5pbmRlbnQoMikgPDwgJ1xuJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAg ICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGFscmVhZHlJbnN0YW50aWF0 ZWQgPSB0cnVlOwotICAgICAgICBtX2NsaSA9IG1ha2VDb21tYW5kTGluZVBhcnNlciggbV9jb25m aWdEYXRhICk7Ci0gICAgfQotICAgIFNlc3Npb246On5TZXNzaW9uKCkgewotICAgICAgICBDYXRj aDo6Y2xlYW5VcCgpOwotICAgIH0KLQotICAgIHZvaWQgU2Vzc2lvbjo6c2hvd0hlbHAoKSBjb25z dCB7Ci0gICAgICAgIENhdGNoOjpjb3V0KCkKLSAgICAgICAgICAgICAgICA8PCAiXG5DYXRjaCB2 IiA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICJcbiIKLSAgICAgICAgICAgICAgICA8PCBtX2NsaSA8 PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgICA8PCAiRm9yIG1vcmUgZGV0YWlsZWQgdXNhZ2Ug cGxlYXNlIHNlZSB0aGUgcHJvamVjdCBkb2NzXG4iIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gICAg dm9pZCBTZXNzaW9uOjpsaWJJZGVudGlmeSgpIHsKLSAgICAgICAgQ2F0Y2g6OmNvdXQoKQotICAg ICAgICAgICAgICAgIDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoMTYpIDw8ICJkZXNjcmlwdGlv bjogIiA8PCAiQSBDYXRjaDIgdGVzdCBleGVjdXRhYmxlXG4iCi0gICAgICAgICAgICAgICAgPDwg c3RkOjpsZWZ0IDw8IHN0ZDo6c2V0dygxNikgPDwgImNhdGVnb3J5OiAiIDw8ICJ0ZXN0ZnJhbWV3 b3JrXG4iCi0gICAgICAgICAgICAgICAgPDwgc3RkOjpsZWZ0IDw8IHN0ZDo6c2V0dygxNikgPDwg ImZyYW1ld29yazogIiA8PCAiQ2F0Y2ggVGVzdFxuIgotICAgICAgICAgICAgICAgIDw8IHN0ZDo6 bGVmdCA8PCBzdGQ6OnNldHcoMTYpIDw8ICJ2ZXJzaW9uOiAiIDw8IGxpYnJhcnlWZXJzaW9uKCkg PDwgc3RkOjplbmRsOwotICAgIH0KLQotICAgIGludCBTZXNzaW9uOjphcHBseUNvbW1hbmRMaW5l KCBpbnQgYXJnYywgY2hhciBjb25zdCAqIGNvbnN0ICogYXJndiApIHsKLSAgICAgICAgaWYoIG1f c3RhcnR1cEV4Y2VwdGlvbnMgKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgYXV0 byByZXN1bHQgPSBtX2NsaS5wYXJzZSggY2xhcmE6OkFyZ3MoIGFyZ2MsIGFyZ3YgKSApOwotICAg ICAgICBpZiggIXJlc3VsdCApIHsKLSAgICAgICAgICAgIGNvbmZpZygpOwotICAgICAgICAgICAg Z2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkuc2V0Q29uZmlnKG1fY29uZmlnKTsKLSAgICAgICAg ICAgIENhdGNoOjpjZXJyKCkKLSAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6UmVk ICkKLSAgICAgICAgICAgICAgICA8PCAiXG5FcnJvcihzKSBpbiBpbnB1dDpcbiIKLSAgICAgICAg ICAgICAgICA8PCBDb2x1bW4oIHJlc3VsdC5lcnJvck1lc3NhZ2UoKSApLmluZGVudCggMiApCi0g ICAgICAgICAgICAgICAgPDwgIlxuXG4iOwotICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCAi UnVuIHdpdGggLT8gZm9yIHVzYWdlXG4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIHJldHVy biBNYXhFeGl0Q29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hv d0hlbHAgKQotICAgICAgICAgICAgc2hvd0hlbHAoKTsKLSAgICAgICAgaWYoIG1fY29uZmlnRGF0 YS5saWJJZGVudGlmeSApCi0gICAgICAgICAgICBsaWJJZGVudGlmeSgpOwotICAgICAgICBtX2Nv bmZpZy5yZXNldCgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKENB VENIX0NPTkZJR19XQ0hBUikgJiYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoVU5JQ09ERSkK LSAgICBpbnQgU2Vzc2lvbjo6YXBwbHlDb21tYW5kTGluZSggaW50IGFyZ2MsIHdjaGFyX3QgY29u c3QgKiBjb25zdCAqIGFyZ3YgKSB7Ci0KLSAgICAgICAgY2hhciAqKnV0ZjhBcmd2ID0gbmV3IGNo YXIgKlsgYXJnYyBdOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSAp IHsKLSAgICAgICAgICAgIGludCBidWZTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZSggQ1BfVVRG OCwgMCwgYXJndltpXSwgLTEsIG51bGxwdHIsIDAsIG51bGxwdHIsIG51bGxwdHIgKTsKLQotICAg ICAgICAgICAgdXRmOEFyZ3ZbIGkgXSA9IG5ldyBjaGFyWyBidWZTaXplIF07Ci0KLSAgICAgICAg ICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCB1dGY4QXJn dltpXSwgYnVmU2l6ZSwgbnVsbHB0ciwgbnVsbHB0ciApOwotICAgICAgICB9Ci0KLSAgICAgICAg aW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCB1dGY4QXJndiApOwotCi0g ICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApCi0gICAgICAgICAgICBkZWxl dGUgW10gdXRmOEFyZ3ZbIGkgXTsKLQotICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3Y7Ci0KLSAg ICAgICAgcmV0dXJuIHJldHVybkNvZGU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB2b2lkIFNlc3Np b246OnVzZUNvbmZpZ0RhdGEoIENvbmZpZ0RhdGEgY29uc3QmIGNvbmZpZ0RhdGEgKSB7Ci0gICAg ICAgIG1fY29uZmlnRGF0YSA9IGNvbmZpZ0RhdGE7Ci0gICAgICAgIG1fY29uZmlnLnJlc2V0KCk7 Ci0gICAgfQotCi0gICAgaW50IFNlc3Npb246OnJ1bigpIHsKLSAgICAgICAgaWYoICggbV9jb25m aWdEYXRhLndhaXRGb3JLZXlwcmVzcyAmIFdhaXRGb3JLZXlwcmVzczo6QmVmb3JlU3RhcnQgKSAh PSAwICkgewotICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiLi4ud2FpdGluZyBmb3IgZW50 ZXIvIHJldHVybiBiZWZvcmUgc3RhcnRpbmciIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIHN0 YXRpY19jYXN0PHZvaWQ+KHN0ZDo6Z2V0Y2hhcigpKTsKLSAgICAgICAgfQotICAgICAgICBpbnQg ZXhpdENvZGUgPSBydW5JbnRlcm5hbCgpOwotICAgICAgICBpZiggKCBtX2NvbmZpZ0RhdGEud2Fp dEZvcktleXByZXNzICYgV2FpdEZvcktleXByZXNzOjpCZWZvcmVFeGl0ICkgIT0gMCApIHsKLSAg ICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIi4uLndhaXRpbmcgZm9yIGVudGVyLyByZXR1cm4g YmVmb3JlIGV4aXRpbmcsIHdpdGggY29kZTogIiA8PCBleGl0Q29kZSA8PCBzdGQ6OmVuZGw7Ci0g ICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihzdGQ6OmdldGNoYXIoKSk7Ci0gICAgICAgIH0K LSAgICAgICAgcmV0dXJuIGV4aXRDb2RlOwotICAgIH0KLQotICAgIGNsYXJhOjpQYXJzZXIgY29u c3QmIFNlc3Npb246OmNsaSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1fY2xpOwotICAgIH0K LSAgICB2b2lkIFNlc3Npb246OmNsaSggY2xhcmE6OlBhcnNlciBjb25zdCYgbmV3UGFyc2VyICkg ewotICAgICAgICBtX2NsaSA9IG5ld1BhcnNlcjsKLSAgICB9Ci0gICAgQ29uZmlnRGF0YSYgU2Vz c2lvbjo6Y29uZmlnRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1fY29uZmlnRGF0YTsKLSAgICB9 Ci0gICAgQ29uZmlnJiBTZXNzaW9uOjpjb25maWcoKSB7Ci0gICAgICAgIGlmKCAhbV9jb25maWcg KQotICAgICAgICAgICAgbV9jb25maWcgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbmZpZz4oIG1fY29u ZmlnRGF0YSApOwotICAgICAgICByZXR1cm4gKm1fY29uZmlnOwotICAgIH0KLQotICAgIGludCBT ZXNzaW9uOjpydW5JbnRlcm5hbCgpIHsKLSAgICAgICAgaWYoIG1fc3RhcnR1cEV4Y2VwdGlvbnMg KQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgaWYgKG1fY29uZmlnRGF0YS5zaG93 SGVscCB8fCBtX2NvbmZpZ0RhdGEubGliSWRlbnRpZnkpIHsKLSAgICAgICAgICAgIHJldHVybiAw OwotICAgICAgICB9Ci0KLSAgICAgICAgQ0FUQ0hfVFJZIHsKLSAgICAgICAgICAgIGNvbmZpZygp OyAvLyBGb3JjZSBjb25maWcgdG8gYmUgY29uc3RydWN0ZWQKLQotICAgICAgICAgICAgc2VlZFJu ZyggKm1fY29uZmlnICk7Ci0KLSAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuZmlsZW5hbWVz QXNUYWdzICkKLSAgICAgICAgICAgICAgICBhcHBseUZpbGVuYW1lc0FzVGFncyggKm1fY29uZmln ICk7Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsZSBsaXN0IHJlcXVlc3QKLSAgICAgICAgICAgIGlm KCBPcHRpb248c3RkOjpzaXplX3Q+IGxpc3RlZCA9IGxpc3QoIG1fY29uZmlnICkgKQotICAgICAg ICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KCAqbGlzdGVkICk7Ci0KLSAgICAgICAg ICAgIFRlc3RHcm91cCB0ZXN0cyB7IG1fY29uZmlnIH07Ci0gICAgICAgICAgICBhdXRvIGNvbnN0 IHRvdGFscyA9IHRlc3RzLmV4ZWN1dGUoKTsKLQotICAgICAgICAgICAgaWYoIG1fY29uZmlnLT53 YXJuQWJvdXROb1Rlc3RzKCkgJiYgdG90YWxzLmVycm9yID09IC0xICkKLSAgICAgICAgICAgICAg ICByZXR1cm4gMjsKLQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IG9uIHVuaWNlcyBvbmx5IHRo ZSBsb3dlciA4IGJpdHMgYXJlIHVzdWFsbHkgdXNlZCwgY2xhbXBpbmcKLSAgICAgICAgICAgIC8v IHRoZSByZXR1cm4gdmFsdWUgdG8gMjU1IHByZXZlbnRzIGZhbHNlIG5lZ2F0aXZlIHdoZW4gc29t ZSBtdWx0aXBsZQotICAgICAgICAgICAgLy8gb2YgMjU2IHRlc3RzIGhhcyBmYWlsZWQKLSAgICAg ICAgICAgIHJldHVybiAoc3RkOjptaW4pIChNYXhFeGl0Q29kZSwgKHN0ZDo6bWF4KSAodG90YWxz LmVycm9yLCBzdGF0aWNfY2FzdDxpbnQ+KHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCkpKTsKLSAg ICAgICAgfQotI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX0VYQ0VQVElPTlMpCi0g ICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7Ci0gICAgICAgICAgICBDYXRjaDo6 Y2VycigpIDw8IGV4LndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICByZXR1cm4gTWF4 RXhpdENvZGU7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotfSAvLyBlbmQgbmFtZXNwYWNl IENhdGNoCi0vLyBlbmQgY2F0Y2hfc2Vzc2lvbi5jcHAKLS8vIHN0YXJ0IGNhdGNoX3NpbmdsZXRv bnMuY3BwCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBu YW1lc3BhY2UgewotICAgICAgICBzdGF0aWMgYXV0byBnZXRTaW5nbGV0b25zKCkgLT4gc3RkOjp2 ZWN0b3I8SVNpbmdsZXRvbio+KiYgewotICAgICAgICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPElT aW5nbGV0b24qPiogZ19zaW5nbGV0b25zID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGlmKCAhZ19z aW5nbGV0b25zICkKLSAgICAgICAgICAgICAgICBnX3NpbmdsZXRvbnMgPSBuZXcgc3RkOjp2ZWN0 b3I8SVNpbmdsZXRvbio+KCk7Ci0gICAgICAgICAgICByZXR1cm4gZ19zaW5nbGV0b25zOwotICAg ICAgICB9Ci0gICAgfQotCi0gICAgSVNpbmdsZXRvbjo6fklTaW5nbGV0b24oKSB7fQotCi0gICAg dm9pZCBhZGRTaW5nbGV0b24oSVNpbmdsZXRvbiogc2luZ2xldG9uICkgewotICAgICAgICBnZXRT aW5nbGV0b25zKCktPnB1c2hfYmFjayggc2luZ2xldG9uICk7Ci0gICAgfQotICAgIHZvaWQgY2xl YW51cFNpbmdsZXRvbnMoKSB7Ci0gICAgICAgIGF1dG8mIHNpbmdsZXRvbnMgPSBnZXRTaW5nbGV0 b25zKCk7Ci0gICAgICAgIGZvciggYXV0byBzaW5nbGV0b24gOiAqc2luZ2xldG9ucyApCi0gICAg ICAgICAgICBkZWxldGUgc2luZ2xldG9uOwotICAgICAgICBkZWxldGUgc2luZ2xldG9uczsKLSAg ICAgICAgc2luZ2xldG9ucyA9IG51bGxwdHI7Ci0gICAgfQotCi19IC8vIG5hbWVzcGFjZSBDYXRj aAotLy8gZW5kIGNhdGNoX3NpbmdsZXRvbnMuY3BwCi0vLyBzdGFydCBjYXRjaF9zdGFydHVwX2V4 Y2VwdGlvbl9yZWdpc3RyeS5jcHAKLQotI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxF X0VYQ0VQVElPTlMpCi1uYW1lc3BhY2UgQ2F0Y2ggewotdm9pZCBTdGFydHVwRXhjZXB0aW9uUmVn aXN0cnk6OmFkZCggc3RkOjpleGNlcHRpb25fcHRyIGNvbnN0JiBleGNlcHRpb24gKSBub2V4Y2Vw dCB7Ci0gICAgICAgIENBVENIX1RSWSB7Ci0gICAgICAgICAgICBtX2V4Y2VwdGlvbnMucHVzaF9i YWNrKGV4Y2VwdGlvbik7Ci0gICAgICAgIH0gQ0FUQ0hfQ0FUQ0hfQUxMIHsKLSAgICAgICAgICAg IC8vIElmIHdlIHJ1biBvdXQgb2YgbWVtb3J5IGR1cmluZyBzdGFydC11cCB0aGVyZSdzIHJlYWxs eSBub3QgYSBsb3QgbW9yZSB3ZSBjYW4gZG8gYWJvdXQgaXQKLSAgICAgICAgICAgIHN0ZDo6dGVy bWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OmV4Y2Vw dGlvbl9wdHI+IGNvbnN0JiBTdGFydHVwRXhjZXB0aW9uUmVnaXN0cnk6OmdldEV4Y2VwdGlvbnMo KSBjb25zdCBub2V4Y2VwdCB7Ci0gICAgICAgIHJldHVybiBtX2V4Y2VwdGlvbnM7Ci0gICAgfQot Ci19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLSNlbmRpZgotLy8gZW5kIGNhdGNoX3N0YXJ0dXBf ZXhjZXB0aW9uX3JlZ2lzdHJ5LmNwcAotLy8gc3RhcnQgY2F0Y2hfc3RyZWFtLmNwcAotCi0jaW5j bHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0j aW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5Pgot Ci1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgQ2F0Y2g6OklTdHJlYW06On5JU3RyZWFtKCkgPSBk ZWZhdWx0OwotCi0gICAgbmFtZXNwYWNlIERldGFpbCB7IG5hbWVzcGFjZSB7Ci0gICAgICAgIHRl bXBsYXRlPHR5cGVuYW1lIFdyaXRlckYsIHN0ZDo6c2l6ZV90IGJ1ZmZlclNpemU9MjU2PgotICAg ICAgICBjbGFzcyBTdHJlYW1CdWZJbXBsIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKLSAgICAg ICAgICAgIGNoYXIgZGF0YVtidWZmZXJTaXplXTsKLSAgICAgICAgICAgIFdyaXRlckYgbV93cml0 ZXI7Ci0KLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU3RyZWFtQnVmSW1wbCgpIHsKLSAg ICAgICAgICAgICAgICBzZXRwKCBkYXRhLCBkYXRhICsgc2l6ZW9mKGRhdGEpICk7Ci0gICAgICAg ICAgICB9Ci0KLSAgICAgICAgICAgIH5TdHJlYW1CdWZJbXBsKCkgbm9leGNlcHQgewotICAgICAg ICAgICAgICAgIFN0cmVhbUJ1ZkltcGw6OnN5bmMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAg ICBwcml2YXRlOgotICAgICAgICAgICAgaW50IG92ZXJmbG93KCBpbnQgYyApIG92ZXJyaWRlIHsK LSAgICAgICAgICAgICAgICBzeW5jKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggYyAhPSBFT0Yg KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwYmFzZSgpID09IGVwcHRyKCkgKQotICAgICAg ICAgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCAxLCBzdGF0aWNfY2FzdDxj aGFyPiggYyApICkgKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg ICAgICAgICAgc3B1dGMoIHN0YXRpY19jYXN0PGNoYXI+KCBjICkgKTsKLSAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg ICAgIGludCBzeW5jKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgICAgIGlmKCBwYmFzZSgpICE9 IHBwdHIoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCBw YmFzZSgpLCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZzo6c2l6ZV90eXBlPiggcHB0cigpIC0gcGJh c2UoKSApICkgKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0cCggcGJhc2UoKSwgZXBwdHIoKSAp OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAg ICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAg ICBzdHJ1Y3QgT3V0cHV0RGVidWdXcml0ZXIgewotCi0gICAgICAgICAgICB2b2lkIG9wZXJhdG9y KCkoIHN0ZDo6c3RyaW5nIGNvbnN0JnN0ciApIHsKLSAgICAgICAgICAgICAgICB3cml0ZVRvRGVi dWdDb25zb2xlKCBzdHIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAv Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICBjbGFzcyBGaWxlU3RyZWFtIDogcHVibGljIElT dHJlYW0gewotICAgICAgICAgICAgbXV0YWJsZSBzdGQ6Om9mc3RyZWFtIG1fb2ZzOwotICAgICAg ICBwdWJsaWM6Ci0gICAgICAgICAgICBGaWxlU3RyZWFtKCBTdHJpbmdSZWYgZmlsZW5hbWUgKSB7 Ci0gICAgICAgICAgICAgICAgbV9vZnMub3BlbiggZmlsZW5hbWUuY19zdHIoKSApOwotICAgICAg ICAgICAgICAgIENBVENIX0VORk9SQ0UoICFtX29mcy5mYWlsKCksICJVbmFibGUgdG8gb3BlbiBm aWxlOiAnIiA8PCBmaWxlbmFtZSA8PCAiJyIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg IH5GaWxlU3RyZWFtKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotICAgICAgICBwdWJsaWM6IC8vIElT dHJlYW0KLSAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3Qgb3ZlcnJpZGUg ewotICAgICAgICAgICAgICAgIHJldHVybiBtX29mczsKLSAgICAgICAgICAgIH0KLSAgICAgICAg fTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICBjbGFzcyBDb3V0U3Ry ZWFtIDogcHVibGljIElTdHJlYW0gewotICAgICAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0g bV9vczsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHN0cmVhbWJ1 ZiBmcm9tIGNvdXQgdXAtZnJvbnQgYmVjYXVzZQotICAgICAgICAgICAgLy8gY291dCBtYXkgZ2V0 IHJlZGlyZWN0ZWQgd2hlbiBydW5uaW5nIHRlc3RzCi0gICAgICAgICAgICBDb3V0U3RyZWFtKCkg OiBtX29zKCBDYXRjaDo6Y291dCgpLnJkYnVmKCkgKSB7fQotICAgICAgICAgICAgfkNvdXRTdHJl YW0oKSBvdmVycmlkZSA9IGRlZmF1bHQ7Ci0KLSAgICAgICAgcHVibGljOiAvLyBJU3RyZWFtCi0g ICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJu IG1fb3M7IH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAg ICAgICBjbGFzcyBEZWJ1Z091dFN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKLSAgICAgICAgICAg IHN0ZDo6dW5pcXVlX3B0cjxTdHJlYW1CdWZJbXBsPE91dHB1dERlYnVnV3JpdGVyPj4gbV9zdHJl YW1CdWY7Ci0gICAgICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOwotICAgICAgICBw dWJsaWM6Ci0gICAgICAgICAgICBEZWJ1Z091dFN0cmVhbSgpCi0gICAgICAgICAgICA6ICAgbV9z dHJlYW1CdWYoIG5ldyBTdHJlYW1CdWZJbXBsPE91dHB1dERlYnVnV3JpdGVyPigpICksCi0gICAg ICAgICAgICAgICAgbV9vcyggbV9zdHJlYW1CdWYuZ2V0KCkgKQotICAgICAgICAgICAge30KLQot ICAgICAgICAgICAgfkRlYnVnT3V0U3RyZWFtKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gICAg ICAgIHB1YmxpYzogLy8gSVN0cmVhbQotICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW0o KSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX29zOyB9Ci0gICAgICAgIH07Ci0KLSAgICB9fSAv LyBuYW1lc3BhY2UgYW5vbjo6ZGV0YWlsCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAg IGF1dG8gbWFrZVN0cmVhbSggU3RyaW5nUmVmIGNvbnN0ICZmaWxlbmFtZSApIC0+IElTdHJlYW0g Y29uc3QqIHsKLSAgICAgICAgaWYoIGZpbGVuYW1lLmVtcHR5KCkgKQotICAgICAgICAgICAgcmV0 dXJuIG5ldyBEZXRhaWw6OkNvdXRTdHJlYW0oKTsKLSAgICAgICAgZWxzZSBpZiggZmlsZW5hbWVb MF0gPT0gJyUnICkgewotICAgICAgICAgICAgaWYoIGZpbGVuYW1lID09ICIlZGVidWciICkKLSAg ICAgICAgICAgICAgICByZXR1cm4gbmV3IERldGFpbDo6RGVidWdPdXRTdHJlYW0oKTsKLSAgICAg ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBDQVRDSF9FUlJPUiggIlVucmVjb2duaXNlZCBz dHJlYW06ICciIDw8IGZpbGVuYW1lIDw8ICInIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UK LSAgICAgICAgICAgIHJldHVybiBuZXcgRGV0YWlsOjpGaWxlU3RyZWFtKCBmaWxlbmFtZSApOwot ICAgIH0KLQotICAgIC8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBpZGVhIG9mIGEgcG9v bCBvZiBvc3RyaW5nc3RyZWFtcyB0aGF0IGNhbiBiZSByZXVzZWQuCi0gICAgc3RydWN0IFN0cmlu Z1N0cmVhbXMgewotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpvc3Ry aW5nc3RyZWFtPj4gbV9zdHJlYW1zOwotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4g bV91bnVzZWQ7Ci0gICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX3JlZmVyZW5jZVN0cmVhbTsg Ly8gVXNlZCBmb3IgY29weSBzdGF0ZS8gZmxhZ3MgZnJvbQotCi0gICAgICAgIGF1dG8gYWRkKCkg LT4gc3RkOjpzaXplX3QgewotICAgICAgICAgICAgaWYoIG1fdW51c2VkLmVtcHR5KCkgKSB7Ci0g ICAgICAgICAgICAgICAgbV9zdHJlYW1zLnB1c2hfYmFjayggc3RkOjp1bmlxdWVfcHRyPHN0ZDo6 b3N0cmluZ3N0cmVhbT4oIG5ldyBzdGQ6Om9zdHJpbmdzdHJlYW0gKSApOwotICAgICAgICAgICAg ICAgIHJldHVybiBtX3N0cmVhbXMuc2l6ZSgpLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg ICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdXRvIGluZGV4ID0gbV91bnVzZWQuYmFjaygpOwot ICAgICAgICAgICAgICAgIG1fdW51c2VkLnBvcF9iYWNrKCk7Ci0gICAgICAgICAgICAgICAgcmV0 dXJuIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWxl YXNlKCBzdGQ6OnNpemVfdCBpbmRleCApIHsKLSAgICAgICAgICAgIG1fc3RyZWFtc1tpbmRleF0t PmNvcHlmbXQoIG1fcmVmZXJlbmNlU3RyZWFtICk7IC8vIFJlc3RvcmUgaW5pdGlhbCBmbGFncyBh bmQgb3RoZXIgc3RhdGUKLSAgICAgICAgICAgIG1fdW51c2VkLnB1c2hfYmFjayhpbmRleCk7Ci0g ICAgICAgIH0KLSAgICB9OwotCi0gICAgUmV1c2FibGVTdHJpbmdTdHJlYW06OlJldXNhYmxlU3Ry aW5nU3RyZWFtKCkKLSAgICA6ICAgbV9pbmRleCggU2luZ2xldG9uPFN0cmluZ1N0cmVhbXM+Ojpn ZXRNdXRhYmxlKCkuYWRkKCkgKSwKLSAgICAgICAgbV9vc3MoIFNpbmdsZXRvbjxTdHJpbmdTdHJl YW1zPjo6Z2V0TXV0YWJsZSgpLm1fc3RyZWFtc1ttX2luZGV4XS5nZXQoKSApCi0gICAge30KLQot ICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtOjp+UmV1c2FibGVTdHJpbmdTdHJlYW0oKSB7Ci0gICAg ICAgIHN0YXRpY19jYXN0PHN0ZDo6b3N0cmluZ3N0cmVhbSo+KCBtX29zcyApLT5zdHIoIiIpOwot ICAgICAgICBtX29zcy0+Y2xlYXIoKTsKLSAgICAgICAgU2luZ2xldG9uPFN0cmluZ1N0cmVhbXM+ OjpnZXRNdXRhYmxlKCkucmVsZWFzZSggbV9pbmRleCApOwotICAgIH0KLQotICAgIGF1dG8gUmV1 c2FibGVTdHJpbmdTdHJlYW06OnN0cigpIGNvbnN0IC0+IHN0ZDo6c3RyaW5nIHsKLSAgICAgICAg cmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6b3N0cmluZ3N0cmVhbSo+KCBtX29zcyApLT5zdHIoKTsK LSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotI2lmbmRlZiBDQVRDSF9DT05GSUdf Tk9TVERPVVQgLy8gSWYgeW91ICNkZWZpbmUgdGhpcyB5b3UgbXVzdCBpbXBsZW1lbnQgdGhlc2Ug ZnVuY3Rpb25zCi0gICAgc3RkOjpvc3RyZWFtJiBjb3V0KCkgeyByZXR1cm4gc3RkOjpjb3V0OyB9 Ci0gICAgc3RkOjpvc3RyZWFtJiBjZXJyKCkgeyByZXR1cm4gc3RkOjpjZXJyOyB9Ci0gICAgc3Rk Ojpvc3RyZWFtJiBjbG9nKCkgeyByZXR1cm4gc3RkOjpjbG9nOyB9Ci0jZW5kaWYKLX0KLS8vIGVu ZCBjYXRjaF9zdHJlYW0uY3BwCi0vLyBzdGFydCBjYXRjaF9zdHJpbmdfbWFuaXAuY3BwCi0KLSNp bmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlIDxjc3RyaW5n PgotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBDYXRj aCB7Ci0KLSAgICBuYW1lc3BhY2UgewotICAgICAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsK LSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPiggc3RkOjp0b2xvd2VyKCBzdGF0 aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBi b29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYg cHJlZml4ICkgewotICAgICAgICByZXR1cm4gcy5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBz dGQ6OmVxdWFsKHByZWZpeC5iZWdpbigpLCBwcmVmaXguZW5kKCksIHMuYmVnaW4oKSk7Ci0gICAg fQotICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4 ICkgewotICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzWzBdID09IHByZWZpeDsKLSAgICB9 Ci0gICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNv bnN0JiBzdWZmaXggKSB7Ci0gICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgp ICYmIHN0ZDo6ZXF1YWwoc3VmZml4LnJiZWdpbigpLCBzdWZmaXgucmVuZCgpLCBzLnJiZWdpbigp KTsKLSAgICB9Ci0gICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIg c3VmZml4ICkgewotICAgICAgICByZXR1cm4gIXMuZW1wdHkoKSAmJiBzW3Muc2l6ZSgpLTFdID09 IHN1ZmZpeDsKLSAgICB9Ci0gICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMs IHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApIHsKLSAgICAgICAgcmV0dXJuIHMuZmluZCggaW5m aXggKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKLSAgICB9Ci0gICAgdm9pZCB0b0xvd2VySW5QbGFj ZSggc3RkOjpzdHJpbmcmIHMgKSB7Ci0gICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzLmJlZ2luKCks IHMuZW5kKCksIHMuYmVnaW4oKSwgdG9Mb3dlckNoICk7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5n IHRvTG93ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgewotICAgICAgICBzdGQ6OnN0cmluZyBs YyA9IHM7Ci0gICAgICAgIHRvTG93ZXJJblBsYWNlKCBsYyApOwotICAgICAgICByZXR1cm4gbGM7 Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSB7 Ci0gICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0KiB3aGl0ZXNwYWNlQ2hhcnMgPSAiXG5cclx0ICI7 Ci0gICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc3RhcnQgPSBzdHIuZmluZF9maXJzdF9u b3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOwotICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBl IGVuZCA9IHN0ci5maW5kX2xhc3Rfbm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKLQotICAgICAg ICByZXR1cm4gc3RhcnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBzdHIuc3Vic3RyKCBzdGFydCwg MStlbmQtc3RhcnQgKSA6IHN0ZDo6c3RyaW5nKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nUmVmIHRy aW0oU3RyaW5nUmVmIHJlZikgewotICAgICAgICBjb25zdCBhdXRvIGlzX3dzID0gW10oY2hhciBj KSB7Ci0gICAgICAgICAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xu JyB8fCBjID09ICdccic7Ci0gICAgICAgIH07Ci0gICAgICAgIHNpemVfdCByZWFsX2JlZ2luID0g MDsKLSAgICAgICAgd2hpbGUgKHJlYWxfYmVnaW4gPCByZWYuc2l6ZSgpICYmIGlzX3dzKHJlZlty ZWFsX2JlZ2luXSkpIHsgKytyZWFsX2JlZ2luOyB9Ci0gICAgICAgIHNpemVfdCByZWFsX2VuZCA9 IHJlZi5zaXplKCk7Ci0gICAgICAgIHdoaWxlIChyZWFsX2VuZCA+IHJlYWxfYmVnaW4gJiYgaXNf d3MocmVmW3JlYWxfZW5kIC0gMV0pKSB7IC0tcmVhbF9lbmQ7IH0KLQotICAgICAgICByZXR1cm4g cmVmLnN1YnN0cihyZWFsX2JlZ2luLCByZWFsX2VuZCAtIHJlYWxfYmVnaW4pOwotICAgIH0KLQot ICAgIGJvb2wgcmVwbGFjZUluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNv bnN0JiByZXBsYWNlVGhpcywgc3RkOjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICkgewotICAgICAg ICBib29sIHJlcGxhY2VkID0gZmFsc2U7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IGkgPSBzdHIuZmlu ZCggcmVwbGFjZVRoaXMgKTsKLSAgICAgICAgd2hpbGUoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3Mg KSB7Ci0gICAgICAgICAgICByZXBsYWNlZCA9IHRydWU7Ci0gICAgICAgICAgICBzdHIgPSBzdHIu c3Vic3RyKCAwLCBpICkgKyB3aXRoVGhpcyArIHN0ci5zdWJzdHIoIGkrcmVwbGFjZVRoaXMuc2l6 ZSgpICk7Ci0gICAgICAgICAgICBpZiggaSA8IHN0ci5zaXplKCktd2l0aFRoaXMuc2l6ZSgpICkK LSAgICAgICAgICAgICAgICBpID0gc3RyLmZpbmQoIHJlcGxhY2VUaGlzLCBpK3dpdGhUaGlzLnNp emUoKSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGkgPSBzdGQ6OnN0cmlu Zzo6bnBvczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVwbGFjZWQ7Ci0gICAgfQotCi0g ICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBzcGxpdFN0cmluZ1JlZiggU3RyaW5nUmVmIHN0ciwg Y2hhciBkZWxpbWl0ZXIgKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gc3ViU3Ry aW5nczsKLSAgICAgICAgc3RkOjpzaXplX3Qgc3RhcnQgPSAwOwotICAgICAgICBmb3Ioc3RkOjpz aXplX3QgcG9zID0gMDsgcG9zIDwgc3RyLnNpemUoKTsgKytwb3MgKSB7Ci0gICAgICAgICAgICBp Ziggc3RyW3Bvc10gPT0gZGVsaW1pdGVyICkgewotICAgICAgICAgICAgICAgIGlmKCBwb3MgLSBz dGFydCA+IDEgKQotICAgICAgICAgICAgICAgICAgICBzdWJTdHJpbmdzLnB1c2hfYmFjayggc3Ry LnN1YnN0ciggc3RhcnQsIHBvcy1zdGFydCApICk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBw b3MrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiggc3RhcnQgPCBzdHIu c2l6ZSgpICkKLSAgICAgICAgICAgIHN1YlN0cmluZ3MucHVzaF9iYWNrKCBzdHIuc3Vic3RyKCBz dGFydCwgc3RyLnNpemUoKS1zdGFydCApICk7Ci0gICAgICAgIHJldHVybiBzdWJTdHJpbmdzOwot ICAgIH0KLQotICAgIHBsdXJhbGlzZTo6cGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3Rk OjpzdHJpbmcgY29uc3QmIGxhYmVsICkKLSAgICA6ICAgbV9jb3VudCggY291bnQgKSwKLSAgICAg ICAgbV9sYWJlbCggbGFiZWwgKQotICAgIHt9Ci0KLSAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9y IDw8ICggc3RkOjpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICkgewot ICAgICAgICBvcyA8PCBwbHVyYWxpc2VyLm1fY291bnQgPDwgJyAnIDw8IHBsdXJhbGlzZXIubV9s YWJlbDsKLSAgICAgICAgaWYoIHBsdXJhbGlzZXIubV9jb3VudCAhPSAxICkKLSAgICAgICAgICAg IG9zIDw8ICdzJzsKLSAgICAgICAgcmV0dXJuIG9zOwotICAgIH0KLQotfQotLy8gZW5kIGNhdGNo X3N0cmluZ19tYW5pcC5jcHAKLS8vIHN0YXJ0IGNhdGNoX3N0cmluZ3JlZi5jcHAKLQotI2luY2x1 ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxvc3RyZWFtPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0j aW5jbHVkZSA8Y3N0ZGludD4KLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBTdHJpbmdSZWY6OlN0 cmluZ1JlZiggY2hhciBjb25zdCogcmF3Q2hhcnMgKSBub2V4Y2VwdAotICAgIDogU3RyaW5nUmVm KCByYXdDaGFycywgc3RhdGljX2Nhc3Q8U3RyaW5nUmVmOjpzaXplX3R5cGU+KHN0ZDo6c3RybGVu KHJhd0NoYXJzKSApICkKLSAgICB7fQotCi0gICAgYXV0byBTdHJpbmdSZWY6OmNfc3RyKCkgY29u c3QgLT4gY2hhciBjb25zdCogewotICAgICAgICBDQVRDSF9FTkZPUkNFKGlzTnVsbFRlcm1pbmF0 ZWQoKSwgIkNhbGxlZCBTdHJpbmdSZWY6OmNfc3RyKCkgb24gYSBub24tbnVsbC10ZXJtaW5hdGVk IGluc3RhbmNlIik7Ci0gICAgICAgIHJldHVybiBtX3N0YXJ0OwotICAgIH0KLSAgICBhdXRvIFN0 cmluZ1JlZjo6ZGF0YSgpIGNvbnN0IG5vZXhjZXB0IC0+IGNoYXIgY29uc3QqIHsKLSAgICAgICAg cmV0dXJuIG1fc3RhcnQ7Ci0gICAgfQotCi0gICAgYXV0byBTdHJpbmdSZWY6OnN1YnN0ciggc2l6 ZV90eXBlIHN0YXJ0LCBzaXplX3R5cGUgc2l6ZSApIGNvbnN0IG5vZXhjZXB0IC0+IFN0cmluZ1Jl ZiB7Ci0gICAgICAgIGlmIChzdGFydCA8IG1fc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIFN0 cmluZ1JlZihtX3N0YXJ0ICsgc3RhcnQsIChzdGQ6Om1pbikobV9zaXplIC0gc3RhcnQsIHNpemUp KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdSZWYoKTsKLSAg ICAgICAgfQotICAgIH0KLSAgICBhdXRvIFN0cmluZ1JlZjo6b3BlcmF0b3IgPT0gKCBTdHJpbmdS ZWYgY29uc3QmIG90aGVyICkgY29uc3Qgbm9leGNlcHQgLT4gYm9vbCB7Ci0gICAgICAgIHJldHVy biBtX3NpemUgPT0gb3RoZXIubV9zaXplCi0gICAgICAgICAgICAmJiAoc3RkOjptZW1jbXAoIG1f c3RhcnQsIG90aGVyLm1fc3RhcnQsIG1fc2l6ZSApID09IDApOwotICAgIH0KLQotICAgIGF1dG8g b3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTdHJpbmdSZWYgY29uc3QmIHN0ciApIC0+ IHN0ZDo6b3N0cmVhbSYgewotICAgICAgICByZXR1cm4gb3Mud3JpdGUoc3RyLmRhdGEoKSwgc3Ry LnNpemUoKSk7Ci0gICAgfQotCi0gICAgYXV0byBvcGVyYXRvcis9KCBzdGQ6OnN0cmluZyYgbGhz LCBTdHJpbmdSZWYgY29uc3QmIHJocyApIC0+IHN0ZDo6c3RyaW5nJiB7Ci0gICAgICAgIGxocy5h cHBlbmQocmhzLmRhdGEoKSwgcmhzLnNpemUoKSk7Ci0gICAgICAgIHJldHVybiBsaHM7Ci0gICAg fQotCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotLy8gZW5kIGNhdGNoX3N0cmluZ3JlZi5jcHAKLS8v IHN0YXJ0IGNhdGNoX3RhZ19hbGlhcy5jcHAKLQotbmFtZXNwYWNlIENhdGNoIHsKLSAgICBUYWdB bGlhczo6VGFnQWxpYXMoc3RkOjpzdHJpbmcgY29uc3QgJiBfdGFnLCBTb3VyY2VMaW5lSW5mbyBf bGluZUluZm8pOiB0YWcoX3RhZyksIGxpbmVJbmZvKF9saW5lSW5mbykge30KLX0KLS8vIGVuZCBj YXRjaF90YWdfYWxpYXMuY3BwCi0vLyBzdGFydCBjYXRjaF90YWdfYWxpYXNfYXV0b3JlZ2lzdHJh ci5jcHAKLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXM6 OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoY2hhciBjb25zdCogYWxpYXMsIGNoYXIgY29uc3QqIHRh ZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvKSB7Ci0gICAgICAgIENBVENIX1RSWSB7 Ci0gICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRhZ0FsaWFzKGFs aWFzLCB0YWcsIGxpbmVJbmZvKTsKLSAgICAgICAgfSBDQVRDSF9DQVRDSF9BTEwgewotICAgICAg ICAgICAgLy8gRG8gbm90IHRocm93IHdoZW4gY29uc3RydWN0aW5nIGdsb2JhbCBvYmplY3RzLCBp bnN0ZWFkIHJlZ2lzdGVyIHRoZSBleGNlcHRpb24gdG8gYmUgcHJvY2Vzc2VkIGxhdGVyCi0gICAg ICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclN0YXJ0dXBFeGNlcHRpb24o KTsKLSAgICAgICAgfQotICAgIH0KLQotfQotLy8gZW5kIGNhdGNoX3RhZ19hbGlhc19hdXRvcmVn aXN0cmFyLmNwcAotLy8gc3RhcnQgY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmNwcAotCi0jaW5j bHVkZSA8c3N0cmVhbT4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIFRhZ0FsaWFzUmVnaXN0 cnk6On5UYWdBbGlhc1JlZ2lzdHJ5KCkge30KLQotICAgIFRhZ0FsaWFzIGNvbnN0KiBUYWdBbGlh c1JlZ2lzdHJ5OjpmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCB7Ci0gICAg ICAgIGF1dG8gaXQgPSBtX3JlZ2lzdHJ5LmZpbmQoIGFsaWFzICk7Ci0gICAgICAgIGlmKCBpdCAh PSBtX3JlZ2lzdHJ5LmVuZCgpICkKLSAgICAgICAgICAgIHJldHVybiAmKGl0LT5zZWNvbmQpOwot ICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBz dGQ6OnN0cmluZyBUYWdBbGlhc1JlZ2lzdHJ5OjpleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBj b25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3QgewotICAgICAgICBzdGQ6OnN0cmluZyBl eHBhbmRlZFRlc3RTcGVjID0gdW5leHBhbmRlZFRlc3RTcGVjOwotICAgICAgICBmb3IoIGF1dG8g Y29uc3QmIHJlZ2lzdHJ5S3ZwIDogbV9yZWdpc3RyeSApIHsKLSAgICAgICAgICAgIHN0ZDo6c2l6 ZV90IHBvcyA9IGV4cGFuZGVkVGVzdFNwZWMuZmluZCggcmVnaXN0cnlLdnAuZmlyc3QgKTsKLSAg ICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7Ci0gICAgICAgICAgICAg ICAgZXhwYW5kZWRUZXN0U3BlYyA9ICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggMCwgcG9zICkg KwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnlLdnAuc2Vjb25k LnRhZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFRlc3RT cGVjLnN1YnN0ciggcG9zICsgcmVnaXN0cnlLdnAuZmlyc3Quc2l6ZSgpICk7Ci0gICAgICAgICAg ICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4cGFuZGVkVGVzdFNwZWM7Ci0gICAgfQot Ci0gICAgdm9pZCBUYWdBbGlhc1JlZ2lzdHJ5OjphZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlh cywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZv ICkgewotICAgICAgICBDQVRDSF9FTkZPUkNFKCBzdGFydHNXaXRoKGFsaWFzLCAiW0AiKSAmJiBl bmRzV2l0aChhbGlhcywgJ10nKSwKLSAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6IHRhZyBh bGlhcywgJyIgPDwgYWxpYXMgPDwgIicgaXMgbm90IG9mIHRoZSBmb3JtIFtAYWxpYXMgbmFtZV0u XG4iIDw8IGxpbmVJbmZvICk7Ci0KLSAgICAgICAgQ0FUQ0hfRU5GT1JDRSggbV9yZWdpc3RyeS5p bnNlcnQoc3RkOjptYWtlX3BhaXIoYWxpYXMsIFRhZ0FsaWFzKHRhZywgbGluZUluZm8pKSkuc2Vj b25kLAotICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjogdGFnIGFsaWFzLCAnIiA8PCBhbGlh cyA8PCAiJyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgPDwg Ilx0Rmlyc3Qgc2VlbiBhdDogIiA8PCBmaW5kKGFsaWFzKS0+bGluZUluZm8gPDwgIlxuIgotICAg ICAgICAgICAgICAgICAgICAgIDw8ICJcdFJlZGVmaW5lZCBhdDogIiA8PCBsaW5lSW5mbyApOwot ICAgIH0KLQotICAgIElUYWdBbGlhc1JlZ2lzdHJ5Ojp+SVRhZ0FsaWFzUmVnaXN0cnkoKSB7fQot Ci0gICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSB7 Ci0gICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldFRhZ0FsaWFzUmVnaXN0cnkoKTsK LSAgICB9Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotLy8gZW5kIGNhdGNoX3RhZ19hbGlh c19yZWdpc3RyeS5jcHAKLS8vIHN0YXJ0IGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmNwcAotCi0jaW5j bHVkZSA8Y2N0eXBlPgotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLSNpbmNsdWRlIDxhbGdvcml0aG0+ Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIG5hbWVzcGFj ZSB7Ci0gICAgICAgIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcGFyc2VTcGVjaWFs VGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgewotICAgICAgICAgICAgaWYoIHN0YXJ0c1dp dGgoIHRhZywgJy4nICkgfHwKLSAgICAgICAgICAgICAgICB0YWcgPT0gIiFoaWRlIiApCi0gICAg ICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6SXNIaWRkZW47Ci0gICAgICAgICAgICBl bHNlIGlmKCB0YWcgPT0gIiF0aHJvd3MiICkKLSAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENh c2VJbmZvOjpUaHJvd3M7Ci0gICAgICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiFzaG91bGRmYWls IiApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6U2hvdWxkRmFpbDsKLSAg ICAgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIW1heWZhaWwiICkKLSAgICAgICAgICAgICAgICBy ZXR1cm4gVGVzdENhc2VJbmZvOjpNYXlGYWlsOwotICAgICAgICAgICAgZWxzZSBpZiggdGFnID09 ICIhbm9ucG9ydGFibGUiICkKLSAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpO b25Qb3J0YWJsZTsKLSAgICAgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIWJlbmNobWFyayIgKQot ICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm86OlNwZWNpYWxQ cm9wZXJ0aWVzPiggVGVzdENhc2VJbmZvOjpCZW5jaG1hcmsgfCBUZXN0Q2FzZUluZm86OklzSGlk ZGVuICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNl SW5mbzo6Tm9uZTsKLSAgICAgICAgfQotICAgICAgICBib29sIGlzUmVzZXJ2ZWRUYWcoIHN0ZDo6 c3RyaW5nIGNvbnN0JiB0YWcgKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VTcGVjaWFsVGFn KCB0YWcgKSA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgJiYgdGFnLnNpemUoKSA+IDAgJiYgIXN0ZDo6 aXNhbG51bSggc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4odGFnWzBdKSApOwotICAgICAgICB9 Ci0gICAgICAgIHZvaWQgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYg dGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkgewotICAgICAgICAgICAgQ0FU Q0hfRU5GT1JDRSggIWlzUmVzZXJ2ZWRUYWcodGFnKSwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgIlRhZyBuYW1lOiBbIiA8PCB0YWcgPDwgIl0gaXMgbm90IGFsbG93ZWQuXG4iCi0gICAgICAg ICAgICAgICAgICAgICAgICAgIDw8ICJUYWcgbmFtZXMgc3RhcnRpbmcgd2l0aCBub24gYWxwaGFu dW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlc2VydmVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAg ICAgIDw8IF9saW5lSW5mbyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVGVzdENhc2UgbWFr ZVRlc3RDYXNlKCAgSVRlc3RJbnZva2VyKiBfdGVzdENhc2UsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgTmFtZUFuZFRhZ3MgY29uc3QmIG5hbWVBbmRUYWdzLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQotICAgIHsK LSAgICAgICAgYm9vbCBpc0hpZGRlbiA9IGZhbHNlOwotCi0gICAgICAgIC8vIFBhcnNlIG91dCB0 YWdzCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0YWdzOwotICAgICAgICBzdGQ6 OnN0cmluZyBkZXNjLCB0YWc7Ci0gICAgICAgIGJvb2wgaW5UYWcgPSBmYWxzZTsKLSAgICAgICAg Zm9yIChjaGFyIGMgOiBuYW1lQW5kVGFncy50YWdzKSB7Ci0gICAgICAgICAgICBpZiggIWluVGFn ICkgewotICAgICAgICAgICAgICAgIGlmKCBjID09ICdbJyApCi0gICAgICAgICAgICAgICAgICAg IGluVGFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAg IGRlc2MgKz0gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAg ICAgICAgIGlmKCBjID09ICddJyApIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2VJbmZv OjpTcGVjaWFsUHJvcGVydGllcyBwcm9wID0gcGFyc2VTcGVjaWFsVGFnKCB0YWcgKTsKLSAgICAg ICAgICAgICAgICAgICAgaWYoICggcHJvcCAmIFRlc3RDYXNlSW5mbzo6SXNIaWRkZW4gKSAhPSAw ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzSGlkZGVuID0gdHJ1ZTsKLSAgICAgICAgICAg ICAgICAgICAgZWxzZSBpZiggcHJvcCA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgKQotICAgICAgICAg ICAgICAgICAgICAgICAgZW5mb3JjZU5vdFJlc2VydmVkVGFnKCB0YWcsIF9saW5lSW5mbyApOwot Ci0gICAgICAgICAgICAgICAgICAgIC8vIE1lcmdlZCBoaWRlIHRhZ3MgbGlrZSBgWy5hcHByb3Zh bHNdYCBzaG91bGQgYmUgYWRkZWQgYXMKLSAgICAgICAgICAgICAgICAgICAgLy8gYFsuXVthcHBy b3ZhbHNdYC4gVGhlIGBbLl1gIGlzIGFkZGVkIGF0IGxhdGVyIHBvaW50LCBzbwotICAgICAgICAg ICAgICAgICAgICAvLyB3ZSBvbmx5IHN0cmlwIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAg ICAgaWYgKHN0YXJ0c1dpdGgodGFnLCAnLicpICYmIHRhZy5zaXplKCkgPiAxKSB7Ci0gICAgICAg ICAgICAgICAgICAgICAgICB0YWcuZXJhc2UoMCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0K LSAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoX2JhY2soIHRhZyApOwotICAgICAgICAgICAg ICAgICAgICB0YWcuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSBmYWxzZTsK LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg ICAgICB0YWcgKz0gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiggaXNI aWRkZW4gKSB7Ci0gICAgICAgICAgICAvLyBBZGQgYWxsICJoaWRkZW4iIHRhZ3MgdG8gbWFrZSB0 aGVtIGJlaGF2ZSBpZGVudGljYWxseQotICAgICAgICAgICAgdGFncy5pbnNlcnQoIHRhZ3MuZW5k KCksIHsgIi4iLCAiIWhpZGUiIH0gKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRlc3RDYXNlSW5m byBpbmZvKCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4obmFtZUFuZFRhZ3MubmFtZSksIF9jbGFz c05hbWUsIGRlc2MsIHRhZ3MsIF9saW5lSW5mbyApOwotICAgICAgICByZXR1cm4gVGVzdENhc2Uo IF90ZXN0Q2FzZSwgc3RkOjptb3ZlKGluZm8pICk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRUYWdz KCBUZXN0Q2FzZUluZm8mIHRlc3RDYXNlSW5mbywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRh Z3MgKSB7Ci0gICAgICAgIHN0ZDo6c29ydChiZWdpbih0YWdzKSwgZW5kKHRhZ3MpKTsKLSAgICAg ICAgdGFncy5lcmFzZShzdGQ6OnVuaXF1ZShiZWdpbih0YWdzKSwgZW5kKHRhZ3MpKSwgZW5kKHRh Z3MpKTsKLSAgICAgICAgdGVzdENhc2VJbmZvLmxjYXNlVGFncy5jbGVhcigpOwotCi0gICAgICAg IGZvciggYXV0byBjb25zdCYgdGFnIDogdGFncyApIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5n IGxjYXNlVGFnID0gdG9Mb3dlciggdGFnICk7Ci0gICAgICAgICAgICB0ZXN0Q2FzZUluZm8ucHJv cGVydGllcyA9IHN0YXRpY19jYXN0PFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXM+KCB0 ZXN0Q2FzZUluZm8ucHJvcGVydGllcyB8IHBhcnNlU3BlY2lhbFRhZyggbGNhc2VUYWcgKSApOwot ICAgICAgICAgICAgdGVzdENhc2VJbmZvLmxjYXNlVGFncy5wdXNoX2JhY2soIGxjYXNlVGFnICk7 Ci0gICAgICAgIH0KLSAgICAgICAgdGVzdENhc2VJbmZvLnRhZ3MgPSBzdGQ6Om1vdmUodGFncyk7 Ci0gICAgfQotCi0gICAgVGVzdENhc2VJbmZvOjpUZXN0Q2FzZUluZm8oIHN0ZDo6c3RyaW5nIGNv bnN0JiBfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcg Y29uc3QmIF9jbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6 c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQotICAg IDogICBuYW1lKCBfbmFtZSApLAotICAgICAgICBjbGFzc05hbWUoIF9jbGFzc05hbWUgKSwKLSAg ICAgICAgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApLAotICAgICAgICBsaW5lSW5mbyggX2xp bmVJbmZvICksCi0gICAgICAgIHByb3BlcnRpZXMoIE5vbmUgKQotICAgIHsKLSAgICAgICAgc2V0 VGFncyggKnRoaXMsIF90YWdzICk7Ci0gICAgfQotCi0gICAgYm9vbCBUZXN0Q2FzZUluZm86Omlz SGlkZGVuKCkgY29uc3QgewotICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgSXNIaWRkZW4g KSAhPSAwOwotICAgIH0KLSAgICBib29sIFRlc3RDYXNlSW5mbzo6dGhyb3dzKCkgY29uc3Qgewot ICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgVGhyb3dzICkgIT0gMDsKLSAgICB9Ci0gICAg Ym9vbCBUZXN0Q2FzZUluZm86Om9rVG9GYWlsKCkgY29uc3QgewotICAgICAgICByZXR1cm4gKCBw cm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgfCBNYXlGYWlsICkgKSAhPSAwOwotICAgIH0KLSAgICBi b29sIFRlc3RDYXNlSW5mbzo6ZXhwZWN0ZWRUb0ZhaWwoKSBjb25zdCB7Ci0gICAgICAgIHJldHVy biAoIHByb3BlcnRpZXMgJiAoU2hvdWxkRmFpbCApICkgIT0gMDsKLSAgICB9Ci0KLSAgICBzdGQ6 OnN0cmluZyBUZXN0Q2FzZUluZm86OnRhZ3NBc1N0cmluZygpIGNvbnN0IHsKLSAgICAgICAgc3Rk OjpzdHJpbmcgcmV0OwotICAgICAgICAvLyAnWycgYW5kICddJyBwZXIgdGFnCi0gICAgICAgIHN0 ZDo6c2l6ZV90IGZ1bGxfc2l6ZSA9IDIgKiB0YWdzLnNpemUoKTsKLSAgICAgICAgZm9yIChjb25z dCBhdXRvJiB0YWcgOiB0YWdzKSB7Ci0gICAgICAgICAgICBmdWxsX3NpemUgKz0gdGFnLnNpemUo KTsKLSAgICAgICAgfQotICAgICAgICByZXQucmVzZXJ2ZShmdWxsX3NpemUpOwotICAgICAgICBm b3IgKGNvbnN0IGF1dG8mIHRhZyA6IHRhZ3MpIHsKLSAgICAgICAgICAgIHJldC5wdXNoX2JhY2so J1snKTsKLSAgICAgICAgICAgIHJldC5hcHBlbmQodGFnKTsKLSAgICAgICAgICAgIHJldC5wdXNo X2JhY2soJ10nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0g ICAgVGVzdENhc2U6OlRlc3RDYXNlKCBJVGVzdEludm9rZXIqIHRlc3RDYXNlLCBUZXN0Q2FzZUlu Zm8mJiBpbmZvICkgOiBUZXN0Q2FzZUluZm8oIHN0ZDo6bW92ZShpbmZvKSApLCB0ZXN0KCB0ZXN0 Q2FzZSApIHt9Ci0KLSAgICBUZXN0Q2FzZSBUZXN0Q2FzZTo6d2l0aE5hbWUoIHN0ZDo6c3RyaW5n IGNvbnN0JiBfbmV3TmFtZSApIGNvbnN0IHsKLSAgICAgICAgVGVzdENhc2Ugb3RoZXIoICp0aGlz ICk7Ci0gICAgICAgIG90aGVyLm5hbWUgPSBfbmV3TmFtZTsKLSAgICAgICAgcmV0dXJuIG90aGVy OwotICAgIH0KLQotICAgIHZvaWQgVGVzdENhc2U6Omludm9rZSgpIGNvbnN0IHsKLSAgICAgICAg dGVzdC0+aW52b2tlKCk7Ci0gICAgfQotCi0gICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPT0g KCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAgdGVzdC5n ZXQoKSA9PSBvdGhlci50ZXN0LmdldCgpICYmCi0gICAgICAgICAgICAgICAgbmFtZSA9PSBvdGhl ci5uYW1lICYmCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID09IG90aGVyLmNsYXNzTmFtZTsK LSAgICB9Ci0KLSAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3Qm IG90aGVyICkgY29uc3QgewotICAgICAgICByZXR1cm4gbmFtZSA8IG90aGVyLm5hbWU7Ci0gICAg fQotCi0gICAgVGVzdENhc2VJbmZvIGNvbnN0JiBUZXN0Q2FzZTo6Z2V0VGVzdENhc2VJbmZvKCkg Y29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLX0gLy8gZW5kIG5h bWVzcGFjZSBDYXRjaAotLy8gZW5kIGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmNwcAotLy8gc3RhcnQg Y2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5X2ltcGwuY3BwCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+ Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIG5hbWVzcGFj ZSB7Ci0gICAgICAgIHN0cnVjdCBUZXN0SGFzaGVyIHsKLSAgICAgICAgICAgIHVzaW5nIGhhc2hf dCA9IHVpbnQ2NF90OwotCi0gICAgICAgICAgICBleHBsaWNpdCBUZXN0SGFzaGVyKCBoYXNoX3Qg aGFzaFN1ZmZpeCApOgotICAgICAgICAgICAgICAgIG1faGFzaFN1ZmZpeHsgaGFzaFN1ZmZpeCB9 IHt9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG9wZXJhdG9yKCkoIFRlc3RDYXNlIGNvbnN0JiB0 ICkgY29uc3QgewotICAgICAgICAgICAgICAgIC8vIEZOVi0xYSBoYXNoIHdpdGggbXVsdGlwbGlj YXRpb24gZm9sZC4KLSAgICAgICAgICAgICAgICBjb25zdCBoYXNoX3QgcHJpbWUgPSAxMDk5NTEx NjI4MjExdTsKLSAgICAgICAgICAgICAgICBoYXNoX3QgaGFzaCA9IDE0Njk1OTgxMDM5MzQ2NjU2 MDM3dTsKLSAgICAgICAgICAgICAgICBmb3IgKCBjb25zdCBjaGFyIGMgOiB0Lm5hbWUgKSB7Ci0g ICAgICAgICAgICAgICAgICAgIGhhc2ggXj0gYzsKLSAgICAgICAgICAgICAgICAgICAgaGFzaCAq PSBwcmltZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFzaCBePSBtX2hh c2hTdWZmaXg7Ci0gICAgICAgICAgICAgICAgaGFzaCAqPSBwcmltZTsKLSAgICAgICAgICAgICAg ICBjb25zdCB1aW50MzJfdCBsb3d7IHN0YXRpY19jYXN0PHVpbnQzMl90PiggaGFzaCApIH07Ci0g ICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaGlnaHsgc3RhdGljX2Nhc3Q8dWludDMyX3Q+ KCBoYXNoID4+IDMyICkgfTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbG93ICogaGlnaDsKLSAg ICAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgaGFzaF90IG1faGFz aFN1ZmZpeDsKLSAgICAgICAgfTsKLSAgICB9IC8vIGVuZCB1bm5hbWVkIG5hbWVzcGFjZQotCi0g ICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRUZXN0cyggSUNvbmZpZyBjb25zdCYgY29uZmln LCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHVuc29ydGVkVGVzdENhc2VzICkgewotICAg ICAgICBzd2l0Y2goIGNvbmZpZy5ydW5PcmRlcigpICkgewotICAgICAgICAgICAgY2FzZSBSdW5U ZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOgotICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaW4g ZGVjbGFyYXRpb24gb3JkZXIKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAg Y2FzZSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjogewotICAgICAgICAgICAgICAg IHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBzb3J0ZWQgPSB1bnNvcnRlZFRlc3RDYXNlczsKLSAgICAg ICAgICAgICAgICBzdGQ6OnNvcnQoIHNvcnRlZC5iZWdpbigpLCBzb3J0ZWQuZW5kKCkgKTsKLSAg ICAgICAgICAgICAgICByZXR1cm4gc29ydGVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg ICBjYXNlIFJ1blRlc3RzOjpJblJhbmRvbU9yZGVyOiB7Ci0gICAgICAgICAgICAgICAgc2VlZFJu ZyggY29uZmlnICk7Ci0gICAgICAgICAgICAgICAgVGVzdEhhc2hlciBoeyBjb25maWcucm5nU2Vl ZCgpIH07Ci0KLSAgICAgICAgICAgICAgICB1c2luZyBoYXNoZWRUZXN0ID0gc3RkOjpwYWlyPFRl c3RIYXNoZXI6Omhhc2hfdCwgVGVzdENhc2UgY29uc3QqPjsKLSAgICAgICAgICAgICAgICBzdGQ6 OnZlY3RvcjxoYXNoZWRUZXN0PiBpbmRleGVkX3Rlc3RzOwotICAgICAgICAgICAgICAgIGluZGV4 ZWRfdGVzdHMucmVzZXJ2ZSggdW5zb3J0ZWRUZXN0Q2FzZXMuc2l6ZSgpICk7Ci0KLSAgICAgICAg ICAgICAgICBmb3IgKGF1dG8gY29uc3QmIHRlc3RDYXNlIDogdW5zb3J0ZWRUZXN0Q2FzZXMpIHsK LSAgICAgICAgICAgICAgICAgICAgaW5kZXhlZF90ZXN0cy5lbXBsYWNlX2JhY2soaCh0ZXN0Q2Fz ZSksICZ0ZXN0Q2FzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3Rk Ojpzb3J0KGluZGV4ZWRfdGVzdHMuYmVnaW4oKSwgaW5kZXhlZF90ZXN0cy5lbmQoKSwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgW10oaGFzaGVkVGVzdCBjb25zdCYgbGhzLCBoYXNoZWRUZXN0 IGNvbnN0JiByaHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxocy5maXJzdCA9 PSByaHMuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMu c2Vjb25kLT5uYW1lIDwgcmhzLnNlY29uZC0+bmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGhzLmZpcnN0IDwgcmhzLmZp cnN0OwotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8 VGVzdENhc2U+IHNvcnRlZDsKLSAgICAgICAgICAgICAgICBzb3J0ZWQucmVzZXJ2ZSggaW5kZXhl ZF90ZXN0cy5zaXplKCkgKTsKLQotICAgICAgICAgICAgICAgIGZvciAoYXV0byBjb25zdCYgaGFz aGVkIDogaW5kZXhlZF90ZXN0cykgewotICAgICAgICAgICAgICAgICAgICBzb3J0ZWQuZW1wbGFj ZV9iYWNrKCpoYXNoZWQuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg ICAgICByZXR1cm4gc29ydGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJl dHVybiB1bnNvcnRlZFRlc3RDYXNlczsKLSAgICB9Ci0KLSAgICBib29sIGlzVGhyb3dTYWZlKCBU ZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UsIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKLSAgICAg ICAgcmV0dXJuICF0ZXN0Q2FzZS50aHJvd3MoKSB8fCBjb25maWcuYWxsb3dUaHJvd3MoKTsKLSAg ICB9Ci0KLSAgICBib29sIG1hdGNoVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0 U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKLSAgICAgICAg cmV0dXJuIHRlc3RTcGVjLm1hdGNoZXMoIHRlc3RDYXNlICkgJiYgaXNUaHJvd1NhZmUoIHRlc3RD YXNlLCBjb25maWcgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RD YXNlcyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBmdW5jdGlvbnMgKSB7Ci0gICAgICAg IHN0ZDo6c2V0PFRlc3RDYXNlPiBzZWVuRnVuY3Rpb25zOwotICAgICAgICBmb3IoIGF1dG8gY29u c3QmIGZ1bmN0aW9uIDogZnVuY3Rpb25zICkgewotICAgICAgICAgICAgYXV0byBwcmV2ID0gc2Vl bkZ1bmN0aW9ucy5pbnNlcnQoIGZ1bmN0aW9uICk7Ci0gICAgICAgICAgICBDQVRDSF9FTkZPUkNF KCBwcmV2LnNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgImVycm9yOiBURVNUX0NBU0UoIFwi IiA8PCBmdW5jdGlvbi5uYW1lIDw8ICJcIiApIGFscmVhZHkgZGVmaW5lZC5cbiIKLSAgICAgICAg ICAgICAgICAgICAgPDwgIlx0Rmlyc3Qgc2VlbiBhdCAiIDw8IHByZXYuZmlyc3QtPmdldFRlc3RD YXNlSW5mbygpLmxpbmVJbmZvIDw8ICJcbiIKLSAgICAgICAgICAgICAgICAgICAgPDwgIlx0UmVk ZWZpbmVkIGF0ICIgPDwgZnVuY3Rpb24uZ2V0VGVzdENhc2VJbmZvKCkubGluZUluZm8gKTsKLSAg ICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cygg c3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0 ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICkgewotICAgICAgICBzdGQ6OnZlY3RvcjxU ZXN0Q2FzZT4gZmlsdGVyZWQ7Ci0gICAgICAgIGZpbHRlcmVkLnJlc2VydmUoIHRlc3RDYXNlcy5z aXplKCkgKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0JiB0ZXN0Q2FzZSA6IHRlc3RDYXNlcykg ewotICAgICAgICAgICAgaWYgKCghdGVzdFNwZWMuaGFzRmlsdGVycygpICYmICF0ZXN0Q2FzZS5p c0hpZGRlbigpKSB8fAotICAgICAgICAgICAgICAgICh0ZXN0U3BlYy5oYXNGaWx0ZXJzKCkgJiYg bWF0Y2hUZXN0KHRlc3RDYXNlLCB0ZXN0U3BlYywgY29uZmlnKSkpIHsKLSAgICAgICAgICAgICAg ICBmaWx0ZXJlZC5wdXNoX2JhY2sodGVzdENhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9 Ci0gICAgICAgIHJldHVybiBmaWx0ZXJlZDsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8VGVzdENh c2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyAp IHsKLSAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGVzdENhc2VSZWdpc3RyeSgp LmdldEFsbFRlc3RzU29ydGVkKCBjb25maWcgKTsKLSAgICB9Ci0KLSAgICB2b2lkIFRlc3RSZWdp c3RyeTo6cmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7Ci0gICAgICAg IHN0ZDo6c3RyaW5nIG5hbWUgPSB0ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lOwotICAg ICAgICBpZiggbmFtZS5lbXB0eSgpICkgewotICAgICAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJl YW0gcnNzOwotICAgICAgICAgICAgcnNzIDw8ICJBbm9ueW1vdXMgdGVzdCBjYXNlICIgPDwgKytt X3VubmFtZWRDb3VudDsKLSAgICAgICAgICAgIHJldHVybiByZWdpc3RlclRlc3QoIHRlc3RDYXNl LndpdGhOYW1lKCByc3Muc3RyKCkgKSApOwotICAgICAgICB9Ci0gICAgICAgIG1fZnVuY3Rpb25z LnB1c2hfYmFjayggdGVzdENhc2UgKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3RvcjxUZXN0Q2Fz ZT4gY29uc3QmIFRlc3RSZWdpc3RyeTo6Z2V0QWxsVGVzdHMoKSBjb25zdCB7Ci0gICAgICAgIHJl dHVybiBtX2Z1bmN0aW9uczsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0 JiBUZXN0UmVnaXN0cnk6OmdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcg KSBjb25zdCB7Ci0gICAgICAgIGlmKCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkKLSAgICAg ICAgICAgIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggbV9mdW5jdGlvbnMgKTsKLQotICAg ICAgICBpZiggIG1fY3VycmVudFNvcnRPcmRlciAhPSBjb25maWcucnVuT3JkZXIoKSB8fCBtX3Nv cnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkgewotICAgICAgICAgICAgbV9zb3J0ZWRGdW5jdGlvbnMg PSBzb3J0VGVzdHMoIGNvbmZpZywgbV9mdW5jdGlvbnMgKTsKLSAgICAgICAgICAgIG1fY3VycmVu dFNvcnRPcmRlciA9IGNvbmZpZy5ydW5PcmRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy biBtX3NvcnRlZEZ1bmN0aW9uczsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAg ICBUZXN0SW52b2tlckFzRnVuY3Rpb246OlRlc3RJbnZva2VyQXNGdW5jdGlvbiggdm9pZCgqdGVz dEFzRnVuY3Rpb24pKCkgKSBub2V4Y2VwdCA6IG1fdGVzdEFzRnVuY3Rpb24oIHRlc3RBc0Z1bmN0 aW9uICkge30KLQotICAgIHZvaWQgVGVzdEludm9rZXJBc0Z1bmN0aW9uOjppbnZva2UoKSBjb25z dCB7Ci0gICAgICAgIG1fdGVzdEFzRnVuY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmlu ZyBleHRyYWN0Q2xhc3NOYW1lKCBTdHJpbmdSZWYgY29uc3QmIGNsYXNzT3JRdWFsaWZpZWRNZXRo b2ROYW1lICkgewotICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWUoY2xhc3NPclF1YWxpZmll ZE1ldGhvZE5hbWUpOwotICAgICAgICBpZiggc3RhcnRzV2l0aCggY2xhc3NOYW1lLCAnJicgKSAp Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGxhc3RDb2xvbnMgPSBjbGFzc05h bWUucmZpbmQoICI6OiIgKTsKLSAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBlbnVsdGltYXRlQ29s b25zID0gY2xhc3NOYW1lLnJmaW5kKCAiOjoiLCBsYXN0Q29sb25zLTEgKTsKLSAgICAgICAgICAg IGlmKCBwZW51bHRpbWF0ZUNvbG9ucyA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCi0gICAgICAgICAg ICAgICAgcGVudWx0aW1hdGVDb2xvbnMgPSAxOwotICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xh c3NOYW1lLnN1YnN0ciggcGVudWx0aW1hdGVDb2xvbnMsIGxhc3RDb2xvbnMtcGVudWx0aW1hdGVD b2xvbnMgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQot fSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5 X2ltcGwuY3BwCi0vLyBzdGFydCBjYXRjaF90ZXN0X2Nhc2VfdHJhY2tlci5jcHAKLQotI2luY2x1 ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4K LSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2lmIGRlZmluZWQoX19j bGFuZ19fKQotIyAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jICAgIHByYWdtYSBj bGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZXhpdC10aW1lLWRlc3RydWN0b3JzIgotI2VuZGlm Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci1uYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7Ci0KLSAg ICBOYW1lQW5kTG9jYXRpb246Ok5hbWVBbmRMb2NhdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIF9u YW1lLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xvY2F0aW9uICkKLSAgICA6ICAgbmFtZSggX25h bWUgKSwKLSAgICAgICAgbG9jYXRpb24oIF9sb2NhdGlvbiApCi0gICAge30KLQotICAgIElUcmFj a2VyOjp+SVRyYWNrZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgICBJVHJhY2tlciYgVHJhY2tlckNvbnRl eHQ6OnN0YXJ0UnVuKCkgewotICAgICAgICBtX3Jvb3RUcmFja2VyID0gc3RkOjptYWtlX3NoYXJl ZDxTZWN0aW9uVHJhY2tlcj4oIE5hbWVBbmRMb2NhdGlvbiggIntyb290fSIsIENBVENIX0lOVEVS TkFMX0xJTkVJTkZPICksICp0aGlzLCBudWxscHRyICk7Ci0gICAgICAgIG1fY3VycmVudFRyYWNr ZXIgPSBudWxscHRyOwotICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOwotICAgICAgICBy ZXR1cm4gKm1fcm9vdFRyYWNrZXI7Ci0gICAgfQotCi0gICAgdm9pZCBUcmFja2VyQ29udGV4dDo6 ZW5kUnVuKCkgewotICAgICAgICBtX3Jvb3RUcmFja2VyLnJlc2V0KCk7Ci0gICAgICAgIG1fY3Vy cmVudFRyYWNrZXIgPSBudWxscHRyOwotICAgICAgICBtX3J1blN0YXRlID0gTm90U3RhcnRlZDsK LSAgICB9Ci0KLSAgICB2b2lkIFRyYWNrZXJDb250ZXh0OjpzdGFydEN5Y2xlKCkgewotICAgICAg ICBtX2N1cnJlbnRUcmFja2VyID0gbV9yb290VHJhY2tlci5nZXQoKTsKLSAgICAgICAgbV9ydW5T dGF0ZSA9IEV4ZWN1dGluZzsKLSAgICB9Ci0gICAgdm9pZCBUcmFja2VyQ29udGV4dDo6Y29tcGxl dGVDeWNsZSgpIHsKLSAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZEN5Y2xlOwotICAgIH0K LQotICAgIGJvb2wgVHJhY2tlckNvbnRleHQ6OmNvbXBsZXRlZEN5Y2xlKCkgY29uc3QgewotICAg ICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRDeWNsZTsKLSAgICB9Ci0gICAgSVRy YWNrZXImIFRyYWNrZXJDb250ZXh0OjpjdXJyZW50VHJhY2tlcigpIHsKLSAgICAgICAgcmV0dXJu ICptX2N1cnJlbnRUcmFja2VyOwotICAgIH0KLSAgICB2b2lkIFRyYWNrZXJDb250ZXh0OjpzZXRD dXJyZW50VHJhY2tlciggSVRyYWNrZXIqIHRyYWNrZXIgKSB7Ci0gICAgICAgIG1fY3VycmVudFRy YWNrZXIgPSB0cmFja2VyOwotICAgIH0KLQotICAgIFRyYWNrZXJCYXNlOjpUcmFja2VyQmFzZSgg TmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBj dHgsIElUcmFja2VyKiBwYXJlbnQgKToKLSAgICAgICAgSVRyYWNrZXIobmFtZUFuZExvY2F0aW9u KSwKLSAgICAgICAgbV9jdHgoIGN0eCApLAotICAgICAgICBtX3BhcmVudCggcGFyZW50ICkKLSAg ICB7fQotCi0gICAgYm9vbCBUcmFja2VyQmFzZTo6aXNDb21wbGV0ZSgpIGNvbnN0IHsKLSAgICAg ICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5IHx8IG1fcnVuU3Rh dGUgPT0gRmFpbGVkOwotICAgIH0KLSAgICBib29sIFRyYWNrZXJCYXNlOjppc1N1Y2Nlc3NmdWxs eUNvbXBsZXRlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxl dGVkU3VjY2Vzc2Z1bGx5OwotICAgIH0KLSAgICBib29sIFRyYWNrZXJCYXNlOjppc09wZW4oKSBj b25zdCB7Ci0gICAgICAgIHJldHVybiBtX3J1blN0YXRlICE9IE5vdFN0YXJ0ZWQgJiYgIWlzQ29t cGxldGUoKTsKLSAgICB9Ci0gICAgYm9vbCBUcmFja2VyQmFzZTo6aGFzQ2hpbGRyZW4oKSBjb25z dCB7Ci0gICAgICAgIHJldHVybiAhbV9jaGlsZHJlbi5lbXB0eSgpOwotICAgIH0KLQotICAgIHZv aWQgVHJhY2tlckJhc2U6OmFkZENoaWxkKCBJVHJhY2tlclB0ciBjb25zdCYgY2hpbGQgKSB7Ci0g ICAgICAgIG1fY2hpbGRyZW4ucHVzaF9iYWNrKCBjaGlsZCApOwotICAgIH0KLQotICAgIElUcmFj a2VyUHRyIFRyYWNrZXJCYXNlOjpmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFt ZUFuZExvY2F0aW9uICkgewotICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKCBtX2NoaWxk cmVuLmJlZ2luKCksIG1fY2hpbGRyZW4uZW5kKCksCi0gICAgICAgICAgICBbJm5hbWVBbmRMb2Nh dGlvbl0oIElUcmFja2VyUHRyIGNvbnN0JiB0cmFja2VyICl7Ci0gICAgICAgICAgICAgICAgcmV0 dXJuCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm5hbWVBbmRMb2NhdGlvbigpLmxvY2F0 aW9uID09IG5hbWVBbmRMb2NhdGlvbi5sb2NhdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICB0 cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5uYW1lID09IG5hbWVBbmRMb2NhdGlvbi5uYW1lOwot ICAgICAgICAgICAgfSApOwotICAgICAgICByZXR1cm4oIGl0ICE9IG1fY2hpbGRyZW4uZW5kKCkg KQotICAgICAgICAgICAgPyAqaXQKLSAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICB9Ci0gICAg SVRyYWNrZXImIFRyYWNrZXJCYXNlOjpwYXJlbnQoKSB7Ci0gICAgICAgIGFzc2VydCggbV9wYXJl bnQgKTsgLy8gU2hvdWxkIGFsd2F5cyBiZSBub24tbnVsbCBleGNlcHQgZm9yIHJvb3QKLSAgICAg ICAgcmV0dXJuICptX3BhcmVudDsKLSAgICB9Ci0KLSAgICB2b2lkIFRyYWNrZXJCYXNlOjpvcGVu Q2hpbGQoKSB7Ci0gICAgICAgIGlmKCBtX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICkg ewotICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZ0NoaWxkcmVuOwotICAgICAgICAg ICAgaWYoIG1fcGFyZW50ICkKLSAgICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7 Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIFRyYWNrZXJCYXNlOjppc1NlY3Rpb25UcmFj a2VyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICBib29sIFRyYWNrZXJCYXNlOjppc0dl bmVyYXRvclRyYWNrZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdm9pZCBUcmFj a2VyQmFzZTo6b3BlbigpIHsKLSAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKLSAgICAg ICAgbW92ZVRvVGhpcygpOwotICAgICAgICBpZiggbV9wYXJlbnQgKQotICAgICAgICAgICAgbV9w YXJlbnQtPm9wZW5DaGlsZCgpOwotICAgIH0KLQotICAgIHZvaWQgVHJhY2tlckJhc2U6OmNsb3Nl KCkgewotCi0gICAgICAgIC8vIENsb3NlIGFueSBzdGlsbCBvcGVuIGNoaWxkcmVuIChlLmcuIGdl bmVyYXRvcnMpCi0gICAgICAgIHdoaWxlKCAmbV9jdHguY3VycmVudFRyYWNrZXIoKSAhPSB0aGlz ICkKLSAgICAgICAgICAgIG1fY3R4LmN1cnJlbnRUcmFja2VyKCkuY2xvc2UoKTsKLQotICAgICAg ICBzd2l0Y2goIG1fcnVuU3RhdGUgKSB7Ci0gICAgICAgICAgICBjYXNlIE5lZWRzQW5vdGhlclJ1 bjoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFeGVjdXRpbmc6 Ci0gICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKLSAg ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nQ2hpbGRyZW46 Ci0gICAgICAgICAgICAgICAgaWYoIHN0ZDo6YWxsX29mKG1fY2hpbGRyZW4uYmVnaW4oKSwgbV9j aGlsZHJlbi5lbmQoKSwgW10oSVRyYWNrZXJQdHIgY29uc3QmIHQpeyByZXR1cm4gdC0+aXNDb21w bGV0ZSgpOyB9KSApCi0gICAgICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRT dWNjZXNzZnVsbHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2Ug Tm90U3RhcnRlZDoKLSAgICAgICAgICAgIGNhc2UgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OgotICAg ICAgICAgICAgY2FzZSBGYWlsZWQ6Ci0gICAgICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJS T1IoICJJbGxvZ2ljYWwgc3RhdGU6ICIgPDwgbV9ydW5TdGF0ZSApOwotCi0gICAgICAgICAgICBk ZWZhdWx0OgotICAgICAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCAiVW5rbm93biBz dGF0ZTogIiA8PCBtX3J1blN0YXRlICk7Ci0gICAgICAgIH0KLSAgICAgICAgbW92ZVRvUGFyZW50 KCk7Ci0gICAgICAgIG1fY3R4LmNvbXBsZXRlQ3ljbGUoKTsKLSAgICB9Ci0gICAgdm9pZCBUcmFj a2VyQmFzZTo6ZmFpbCgpIHsKLSAgICAgICAgbV9ydW5TdGF0ZSA9IEZhaWxlZDsKLSAgICAgICAg aWYoIG1fcGFyZW50ICkKLSAgICAgICAgICAgIG1fcGFyZW50LT5tYXJrQXNOZWVkaW5nQW5vdGhl clJ1bigpOwotICAgICAgICBtb3ZlVG9QYXJlbnQoKTsKLSAgICAgICAgbV9jdHguY29tcGxldGVD eWNsZSgpOwotICAgIH0KLSAgICB2b2lkIFRyYWNrZXJCYXNlOjptYXJrQXNOZWVkaW5nQW5vdGhl clJ1bigpIHsKLSAgICAgICAgbV9ydW5TdGF0ZSA9IE5lZWRzQW5vdGhlclJ1bjsKLSAgICB9Ci0K LSAgICB2b2lkIFRyYWNrZXJCYXNlOjptb3ZlVG9QYXJlbnQoKSB7Ci0gICAgICAgIGFzc2VydCgg bV9wYXJlbnQgKTsKLSAgICAgICAgbV9jdHguc2V0Q3VycmVudFRyYWNrZXIoIG1fcGFyZW50ICk7 Ci0gICAgfQotICAgIHZvaWQgVHJhY2tlckJhc2U6Om1vdmVUb1RoaXMoKSB7Ci0gICAgICAgIG1f Y3R4LnNldEN1cnJlbnRUcmFja2VyKCB0aGlzICk7Ci0gICAgfQotCi0gICAgU2VjdGlvblRyYWNr ZXI6OlNlY3Rpb25UcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlv biwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCi0gICAgOiAgIFRyYWNr ZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICksCi0gICAgICAgIG1fdHJpbW1l ZF9uYW1lKHRyaW0obmFtZUFuZExvY2F0aW9uLm5hbWUpKQotICAgIHsKLSAgICAgICAgaWYoIHBh cmVudCApIHsKLSAgICAgICAgICAgIHdoaWxlKCAhcGFyZW50LT5pc1NlY3Rpb25UcmFja2VyKCkg KQotICAgICAgICAgICAgICAgIHBhcmVudCA9ICZwYXJlbnQtPnBhcmVudCgpOwotCi0gICAgICAg ICAgICBTZWN0aW9uVHJhY2tlciYgcGFyZW50U2VjdGlvbiA9IHN0YXRpY19jYXN0PFNlY3Rpb25U cmFja2VyJj4oICpwYXJlbnQgKTsKLSAgICAgICAgICAgIGFkZE5leHRGaWx0ZXJzKCBwYXJlbnRT ZWN0aW9uLm1fZmlsdGVycyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBTZWN0aW9u VHJhY2tlcjo6aXNDb21wbGV0ZSgpIGNvbnN0IHsKLSAgICAgICAgYm9vbCBjb21wbGV0ZSA9IHRy dWU7Ci0KLSAgICAgICAgaWYgKG1fZmlsdGVycy5lbXB0eSgpCi0gICAgICAgICAgICB8fCBtX2Zp bHRlcnNbMF0gPT0gIiIKLSAgICAgICAgICAgIHx8IHN0ZDo6ZmluZChtX2ZpbHRlcnMuYmVnaW4o KSwgbV9maWx0ZXJzLmVuZCgpLCBtX3RyaW1tZWRfbmFtZSkgIT0gbV9maWx0ZXJzLmVuZCgpKSB7 Ci0gICAgICAgICAgICBjb21wbGV0ZSA9IFRyYWNrZXJCYXNlOjppc0NvbXBsZXRlKCk7Ci0gICAg ICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRlOwotICAgIH0KLQotICAgIGJvb2wgU2VjdGlv blRyYWNrZXI6OmlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAg ICBTZWN0aW9uVHJhY2tlciYgU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUoIFRyYWNrZXJDb250ZXh0 JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgewotICAgICAg ICBzdGQ6OnNoYXJlZF9wdHI8U2VjdGlvblRyYWNrZXI+IHNlY3Rpb247Ci0KLSAgICAgICAgSVRy YWNrZXImIGN1cnJlbnRUcmFja2VyID0gY3R4LmN1cnJlbnRUcmFja2VyKCk7Ci0gICAgICAgIGlm KCBJVHJhY2tlclB0ciBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5h bWVBbmRMb2NhdGlvbiApICkgewotICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXIgKTsK LSAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyLT5pc1NlY3Rpb25UcmFja2VyKCkgKTsK LSAgICAgICAgICAgIHNlY3Rpb24gPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8U2VjdGlvblRy YWNrZXI+KCBjaGlsZFRyYWNrZXIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAg ICAgICAgIHNlY3Rpb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPFNlY3Rpb25UcmFja2VyPiggbmFtZUFu ZExvY2F0aW9uLCBjdHgsICZjdXJyZW50VHJhY2tlciApOwotICAgICAgICAgICAgY3VycmVudFRy YWNrZXIuYWRkQ2hpbGQoIHNlY3Rpb24gKTsKLSAgICAgICAgfQotICAgICAgICBpZiggIWN0eC5j b21wbGV0ZWRDeWNsZSgpICkKLSAgICAgICAgICAgIHNlY3Rpb24tPnRyeU9wZW4oKTsKLSAgICAg ICAgcmV0dXJuICpzZWN0aW9uOwotICAgIH0KLQotICAgIHZvaWQgU2VjdGlvblRyYWNrZXI6OnRy eU9wZW4oKSB7Ci0gICAgICAgIGlmKCAhaXNDb21wbGV0ZSgpICkKLSAgICAgICAgICAgIG9wZW4o KTsKLSAgICB9Ci0KLSAgICB2b2lkIFNlY3Rpb25UcmFja2VyOjphZGRJbml0aWFsRmlsdGVycygg c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgewotICAgICAgICBpZigg IWZpbHRlcnMuZW1wdHkoKSApIHsKLSAgICAgICAgICAgIG1fZmlsdGVycy5yZXNlcnZlKCBtX2Zp bHRlcnMuc2l6ZSgpICsgZmlsdGVycy5zaXplKCkgKyAyICk7Ci0gICAgICAgICAgICBtX2ZpbHRl cnMuZW1wbGFjZV9iYWNrKCIiKTsgLy8gUm9vdCAtIHNob3VsZCBuZXZlciBiZSBjb25zdWx0ZWQK LSAgICAgICAgICAgIG1fZmlsdGVycy5lbXBsYWNlX2JhY2soIiIpOyAvLyBUZXN0IENhc2UgLSBu b3QgYSBzZWN0aW9uIGZpbHRlcgotICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0 ZXJzLmVuZCgpLCBmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKLSAgICAgICAgfQot ICAgIH0KLSAgICB2b2lkIFNlY3Rpb25UcmFja2VyOjphZGROZXh0RmlsdGVycyggc3RkOjp2ZWN0 b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgewotICAgICAgICBpZiggZmlsdGVycy5z aXplKCkgPiAxICkKLSAgICAgICAgICAgIG1fZmlsdGVycy5pbnNlcnQoIG1fZmlsdGVycy5lbmQo KSwgZmlsdGVycy5iZWdpbigpKzEsIGZpbHRlcnMuZW5kKCkgKTsKLSAgICB9Ci0KLSAgICBzdGQ6 OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIFNlY3Rpb25UcmFja2VyOjpnZXRGaWx0ZXJzKCkg Y29uc3QgewotICAgICAgICByZXR1cm4gbV9maWx0ZXJzOwotICAgIH0KLQotICAgIHN0ZDo6c3Ry aW5nIGNvbnN0JiBTZWN0aW9uVHJhY2tlcjo6dHJpbW1lZE5hbWUoKSBjb25zdCB7Ci0gICAgICAg IHJldHVybiBtX3RyaW1tZWRfbmFtZTsKLSAgICB9Ci0KLX0gLy8gbmFtZXNwYWNlIFRlc3RDYXNl VHJhY2tpbmcKLQotdXNpbmcgVGVzdENhc2VUcmFja2luZzo6SVRyYWNrZXI7Ci11c2luZyBUZXN0 Q2FzZVRyYWNraW5nOjpUcmFja2VyQ29udGV4dDsKLXVzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlNl Y3Rpb25UcmFja2VyOwotCi19IC8vIG5hbWVzcGFjZSBDYXRjaAotCi0jaWYgZGVmaW5lZChfX2Ns YW5nX18pCi0jICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0vLyBlbmQg Y2F0Y2hfdGVzdF9jYXNlX3RyYWNrZXIuY3BwCi0vLyBzdGFydCBjYXRjaF90ZXN0X3JlZ2lzdHJ5 LmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgYXV0byBtYWtlVGVzdEludm9rZXIoIHZv aWQoKnRlc3RBc0Z1bmN0aW9uKSgpICkgbm9leGNlcHQgLT4gSVRlc3RJbnZva2VyKiB7Ci0gICAg ICAgIHJldHVybiBuZXcoc3RkOjpub3Rocm93KSBUZXN0SW52b2tlckFzRnVuY3Rpb24oIHRlc3RB c0Z1bmN0aW9uICk7Ci0gICAgfQotCi0gICAgTmFtZUFuZFRhZ3M6Ok5hbWVBbmRUYWdzKCBTdHJp bmdSZWYgY29uc3QmIG5hbWVfICwgU3RyaW5nUmVmIGNvbnN0JiB0YWdzXyApIG5vZXhjZXB0IDog bmFtZSggbmFtZV8gKSwgdGFncyggdGFnc18gKSB7fQotCi0gICAgQXV0b1JlZzo6QXV0b1JlZygg SVRlc3RJbnZva2VyKiBpbnZva2VyLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sIFN0 cmluZ1JlZiBjb25zdCYgY2xhc3NPck1ldGhvZCwgTmFtZUFuZFRhZ3MgY29uc3QmIG5hbWVBbmRU YWdzICkgbm9leGNlcHQgewotICAgICAgICBDQVRDSF9UUlkgewotICAgICAgICAgICAgZ2V0TXV0 YWJsZVJlZ2lzdHJ5SHViKCkKLSAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyVGVzdCgKLSAg ICAgICAgICAgICAgICAgICAgICAgIG1ha2VUZXN0Q2FzZSgKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpbnZva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RDbGFz c05hbWUoIGNsYXNzT3JNZXRob2QgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1l QW5kVGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbykpOwotICAgICAg ICB9IENBVENIX0NBVENIX0FMTCB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdGhyb3cgd2hlbiBj b25zdHJ1Y3RpbmcgZ2xvYmFsIG9iamVjdHMsIGluc3RlYWQgcmVnaXN0ZXIgdGhlIGV4Y2VwdGlv biB0byBiZSBwcm9jZXNzZWQgbGF0ZXIKLSAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1 YigpLnJlZ2lzdGVyU3RhcnR1cEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg QXV0b1JlZzo6fkF1dG9SZWcoKSA9IGRlZmF1bHQ7Ci19Ci0vLyBlbmQgY2F0Y2hfdGVzdF9yZWdp c3RyeS5jcHAKLS8vIHN0YXJ0IGNhdGNoX3Rlc3Rfc3BlYy5jcHAKLQotI2luY2x1ZGUgPGFsZ29y aXRobT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPG1l bW9yeT4KLQotbmFtZXNwYWNlIENhdGNoIHsKLQotICAgIFRlc3RTcGVjOjpQYXR0ZXJuOjpQYXR0 ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApCi0gICAgOiBtX25hbWUoIG5hbWUgKQotICAg IHt9Ci0KLSAgICBUZXN0U3BlYzo6UGF0dGVybjo6flBhdHRlcm4oKSA9IGRlZmF1bHQ7Ci0KLSAg ICBzdGQ6OnN0cmluZyBjb25zdCYgVGVzdFNwZWM6OlBhdHRlcm46Om5hbWUoKSBjb25zdCB7Ci0g ICAgICAgIHJldHVybiBtX25hbWU7Ci0gICAgfQotCi0gICAgVGVzdFNwZWM6Ok5hbWVQYXR0ZXJu OjpOYW1lUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0 JiBmaWx0ZXJTdHJpbmcgKQotICAgIDogUGF0dGVybiggZmlsdGVyU3RyaW5nICkKLSAgICAsIG1f d2lsZGNhcmRQYXR0ZXJuKCB0b0xvd2VyKCBuYW1lICksIENhc2VTZW5zaXRpdmU6Ok5vICkKLSAg ICB7fQotCi0gICAgYm9vbCBUZXN0U3BlYzo6TmFtZVBhdHRlcm46Om1hdGNoZXMoIFRlc3RDYXNl SW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtX3dpbGRjYXJk UGF0dGVybi5tYXRjaGVzKCB0ZXN0Q2FzZS5uYW1lICk7Ci0gICAgfQotCi0gICAgVGVzdFNwZWM6 OlRhZ1BhdHRlcm46OlRhZ1BhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIHN0ZDo6c3Ry aW5nIGNvbnN0JiBmaWx0ZXJTdHJpbmcgKQotICAgIDogUGF0dGVybiggZmlsdGVyU3RyaW5nICkK LSAgICAsIG1fdGFnKCB0b0xvd2VyKCB0YWcgKSApCi0gICAge30KLQotICAgIGJvb2wgVGVzdFNw ZWM6OlRhZ1BhdHRlcm46Om1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBj b25zdCB7Ci0gICAgICAgIHJldHVybiBzdGQ6OmZpbmQoYmVnaW4odGVzdENhc2UubGNhc2VUYWdz KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmQodGVzdENhc2UubGNhc2VUYWdzKSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICBtX3RhZykgIT0gZW5kKHRlc3RDYXNlLmxjYXNlVGFncyk7 Ci0gICAgfQotCi0gICAgVGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybjo6RXhjbHVkZWRQYXR0ZXJu KCBQYXR0ZXJuUHRyIGNvbnN0JiB1bmRlcmx5aW5nUGF0dGVybiApCi0gICAgOiBQYXR0ZXJuKCB1 bmRlcmx5aW5nUGF0dGVybi0+bmFtZSgpICkKLSAgICAsIG1fdW5kZXJseWluZ1BhdHRlcm4oIHVu ZGVybHlpbmdQYXR0ZXJuICkKLSAgICB7fQotCi0gICAgYm9vbCBUZXN0U3BlYzo6RXhjbHVkZWRQ YXR0ZXJuOjptYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3Qgewot ICAgICAgICByZXR1cm4gIW1fdW5kZXJseWluZ1BhdHRlcm4tPm1hdGNoZXMoIHRlc3RDYXNlICk7 Ci0gICAgfQotCi0gICAgYm9vbCBUZXN0U3BlYzo6RmlsdGVyOjptYXRjaGVzKCBUZXN0Q2FzZUlu Zm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgewotICAgICAgICByZXR1cm4gc3RkOjphbGxfb2Yo IG1fcGF0dGVybnMuYmVnaW4oKSwgbV9wYXR0ZXJucy5lbmQoKSwgWyZdKCBQYXR0ZXJuUHRyIGNv bnN0JiBwICl7IHJldHVybiBwLT5tYXRjaGVzKCB0ZXN0Q2FzZSApOyB9ICk7Ci0gICAgfQotCi0g ICAgc3RkOjpzdHJpbmcgVGVzdFNwZWM6OkZpbHRlcjo6bmFtZSgpIGNvbnN0IHsKLSAgICAgICAg c3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgZm9yKCBhdXRvIGNvbnN0JiBwIDogbV9wYXR0ZXJu cyApCi0gICAgICAgICAgICBuYW1lICs9IHAtPm5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG5hbWU7 Ci0gICAgfQotCi0gICAgYm9vbCBUZXN0U3BlYzo6aGFzRmlsdGVycygpIGNvbnN0IHsKLSAgICAg ICAgcmV0dXJuICFtX2ZpbHRlcnMuZW1wdHkoKTsKLSAgICB9Ci0KLSAgICBib29sIFRlc3RTcGVj OjptYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgewotICAgICAg ICByZXR1cm4gc3RkOjphbnlfb2YoIG1fZmlsdGVycy5iZWdpbigpLCBtX2ZpbHRlcnMuZW5kKCks IFsmXSggRmlsdGVyIGNvbnN0JiBmICl7IHJldHVybiBmLm1hdGNoZXMoIHRlc3RDYXNlICk7IH0g KTsKLSAgICB9Ci0KLSAgICBUZXN0U3BlYzo6TWF0Y2hlcyBUZXN0U3BlYzo6bWF0Y2hlc0J5Rmls dGVyKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgSUNvbmZpZyBjb25z dCYgY29uZmlnICkgY29uc3QKLSAgICB7Ci0gICAgICAgIE1hdGNoZXMgbWF0Y2hlcyggbV9maWx0 ZXJzLnNpemUoKSApOwotICAgICAgICBzdGQ6OnRyYW5zZm9ybSggbV9maWx0ZXJzLmJlZ2luKCks IG1fZmlsdGVycy5lbmQoKSwgbWF0Y2hlcy5iZWdpbigpLCBbJl0oIEZpbHRlciBjb25zdCYgZmls dGVyICl7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZSBjb25zdCo+IGN1cnJlbnRN YXRjaGVzOwotICAgICAgICAgICAgZm9yKCBhdXRvIGNvbnN0JiB0ZXN0IDogdGVzdENhc2VzICkK LSAgICAgICAgICAgICAgICBpZiggaXNUaHJvd1NhZmUoIHRlc3QsIGNvbmZpZyApICYmIGZpbHRl ci5tYXRjaGVzKCB0ZXN0ICkgKQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF0Y2hlcy5l bXBsYWNlX2JhY2soICZ0ZXN0ICk7Ci0gICAgICAgICAgICByZXR1cm4gRmlsdGVyTWF0Y2h7IGZp bHRlci5uYW1lKCksIGN1cnJlbnRNYXRjaGVzIH07Ci0gICAgICAgIH0gKTsKLSAgICAgICAgcmV0 dXJuIG1hdGNoZXM7Ci0gICAgfQotCi0gICAgY29uc3QgVGVzdFNwZWM6OnZlY3RvclN0cmluZ3Mm IFRlc3RTcGVjOjpnZXRJbnZhbGlkQXJncygpIGNvbnN0ewotICAgICAgICByZXR1cm4gIChtX2lu dmFsaWRBcmdzKTsKLSAgICB9Ci0KLX0KLS8vIGVuZCBjYXRjaF90ZXN0X3NwZWMuY3BwCi0vLyBz dGFydCBjYXRjaF90ZXN0X3NwZWNfcGFyc2VyLmNwcAotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0g ICAgVGVzdFNwZWNQYXJzZXI6OlRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeSBjb25z dCYgdGFnQWxpYXNlcyApIDogbV90YWdBbGlhc2VzKCAmdGFnQWxpYXNlcyApIHt9Ci0KLSAgICBU ZXN0U3BlY1BhcnNlciYgVGVzdFNwZWNQYXJzZXI6OnBhcnNlKCBzdGQ6OnN0cmluZyBjb25zdCYg YXJnICkgewotICAgICAgICBtX21vZGUgPSBOb25lOwotICAgICAgICBtX2V4Y2x1c2lvbiA9IGZh bHNlOwotICAgICAgICBtX2FyZyA9IG1fdGFnQWxpYXNlcy0+ZXhwYW5kQWxpYXNlcyggYXJnICk7 Ci0gICAgICAgIG1fZXNjYXBlQ2hhcnMuY2xlYXIoKTsKLSAgICAgICAgbV9zdWJzdHJpbmcucmVz ZXJ2ZShtX2FyZy5zaXplKCkpOwotICAgICAgICBtX3BhdHRlcm5OYW1lLnJlc2VydmUobV9hcmcu c2l6ZSgpKTsKLSAgICAgICAgbV9yZWFsUGF0dGVyblBvcyA9IDA7Ci0KLSAgICAgICAgZm9yKCBt X3BvcyA9IDA7IG1fcG9zIDwgbV9hcmcuc2l6ZSgpOyArK21fcG9zICkKLSAgICAgICAgICAvL2lm IHZpc2l0Q2hhciBmYWlscwotICAgICAgICAgICBpZiggIXZpc2l0Q2hhciggbV9hcmdbbV9wb3Nd ICkgKXsKLSAgICAgICAgICAgICAgIG1fdGVzdFNwZWMubV9pbnZhbGlkQXJncy5wdXNoX2JhY2so YXJnKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgIGVuZE1v ZGUoKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBUZXN0U3BlYyBUZXN0U3Bl Y1BhcnNlcjo6dGVzdFNwZWMoKSB7Ci0gICAgICAgIGFkZEZpbHRlcigpOwotICAgICAgICByZXR1 cm4gbV90ZXN0U3BlYzsKLSAgICB9Ci0gICAgYm9vbCBUZXN0U3BlY1BhcnNlcjo6dmlzaXRDaGFy KCBjaGFyIGMgKSB7Ci0gICAgICAgIGlmKCAobV9tb2RlICE9IEVzY2FwZWROYW1lKSAmJiAoYyA9 PSAnXFwnKSApIHsKLSAgICAgICAgICAgIGVzY2FwZSgpOwotICAgICAgICAgICAgYWRkQ2hhclRv UGF0dGVybihjKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9ZWxzZSBpZigo bV9tb2RlICE9IEVzY2FwZWROYW1lKSAmJiAoYyA9PSAnLCcpICkgIHsKLSAgICAgICAgICAgIHJl dHVybiBzZXBhcmF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBtX21vZGUgKSB7 Ci0gICAgICAgIGNhc2UgTm9uZToKLSAgICAgICAgICAgIGlmKCBwcm9jZXNzTm9uZUNoYXIoIGMg KSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAg ICAgICAgY2FzZSBOYW1lOgotICAgICAgICAgICAgcHJvY2Vzc05hbWVDaGFyKCBjICk7Ci0gICAg ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFc2NhcGVkTmFtZToKLSAgICAgICAgICAgIGVu ZE1vZGUoKTsKLSAgICAgICAgICAgIGFkZENoYXJUb1BhdHRlcm4oYyk7Ci0gICAgICAgICAgICBy ZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBUYWc6Ci0gICAgICAg IGNhc2UgUXVvdGVkTmFtZToKLSAgICAgICAgICAgIGlmKCBwcm9jZXNzT3RoZXJDaGFyKCBjICkg KQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg ICAgIH0KLQotICAgICAgICBtX3N1YnN0cmluZyArPSBjOwotICAgICAgICBpZiggIWlzQ29udHJv bENoYXIoIGMgKSApIHsKLSAgICAgICAgICAgIG1fcGF0dGVybk5hbWUgKz0gYzsKLSAgICAgICAg ICAgIG1fcmVhbFBhdHRlcm5Qb3MrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsK LSAgICB9Ci0gICAgLy8gVHdvIG9mIHRoZSBwcm9jZXNzaW5nIG1ldGhvZHMgcmV0dXJuIHRydWUg dG8gc2lnbmFsIHRoZSBjYWxsZXIgdG8gcmV0dXJuCi0gICAgLy8gd2l0aG91dCBhZGRpbmcgdGhl IGdpdmVuIGNoYXJhY3RlciB0byB0aGUgY3VycmVudCBwYXR0ZXJuIHN0cmluZ3MKLSAgICBib29s IFRlc3RTcGVjUGFyc2VyOjpwcm9jZXNzTm9uZUNoYXIoIGNoYXIgYyApIHsKLSAgICAgICAgc3dp dGNoKCBjICkgewotICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwot ICAgICAgICBjYXNlICd+JzoKLSAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKLSAgICAg ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSAnWyc6Ci0gICAgICAgICAgICBzdGFy dE5ld01vZGUoIFRhZyApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNl ICciJzoKLSAgICAgICAgICAgIHN0YXJ0TmV3TW9kZSggUXVvdGVkTmFtZSApOwotICAgICAgICAg ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3RhcnROZXdN b2RlKCBOYW1lICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9 Ci0gICAgdm9pZCBUZXN0U3BlY1BhcnNlcjo6cHJvY2Vzc05hbWVDaGFyKCBjaGFyIGMgKSB7Ci0g ICAgICAgIGlmKCBjID09ICdbJyApIHsKLSAgICAgICAgICAgIGlmKCBtX3N1YnN0cmluZyA9PSAi ZXhjbHVkZToiICkKLSAgICAgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7Ci0gICAgICAg ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5kTW9kZSgpOwotICAgICAgICAgICAgc3RhcnRO ZXdNb2RlKCBUYWcgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBib29sIFRlc3RTcGVjUGFyc2Vy Ojpwcm9jZXNzT3RoZXJDaGFyKCBjaGFyIGMgKSB7Ci0gICAgICAgIGlmKCAhaXNDb250cm9sQ2hh ciggYyApICkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgbV9zdWJzdHJpbmcg Kz0gYzsKLSAgICAgICAgZW5kTW9kZSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g ICAgdm9pZCBUZXN0U3BlY1BhcnNlcjo6c3RhcnROZXdNb2RlKCBNb2RlIG1vZGUgKSB7Ci0gICAg ICAgIG1fbW9kZSA9IG1vZGU7Ci0gICAgfQotICAgIHZvaWQgVGVzdFNwZWNQYXJzZXI6OmVuZE1v ZGUoKSB7Ci0gICAgICAgIHN3aXRjaCggbV9tb2RlICkgewotICAgICAgICBjYXNlIE5hbWU6Ci0g ICAgICAgIGNhc2UgUXVvdGVkTmFtZToKLSAgICAgICAgICAgIHJldHVybiBhZGROYW1lUGF0dGVy bigpOwotICAgICAgICBjYXNlIFRhZzoKLSAgICAgICAgICAgIHJldHVybiBhZGRUYWdQYXR0ZXJu KCk7Ci0gICAgICAgIGNhc2UgRXNjYXBlZE5hbWU6Ci0gICAgICAgICAgICByZXZlcnRCYWNrVG9M YXN0TW9kZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIE5vbmU6Ci0gICAg ICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnROZXdNb2RlKCBOb25lICk7Ci0g ICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBUZXN0U3BlY1BhcnNlcjo6ZXNjYXBlKCkgewotICAg ICAgICBzYXZlTGFzdE1vZGUoKTsKLSAgICAgICAgbV9tb2RlID0gRXNjYXBlZE5hbWU7Ci0gICAg ICAgIG1fZXNjYXBlQ2hhcnMucHVzaF9iYWNrKG1fcmVhbFBhdHRlcm5Qb3MpOwotICAgIH0KLSAg ICBib29sIFRlc3RTcGVjUGFyc2VyOjppc0NvbnRyb2xDaGFyKCBjaGFyIGMgKSBjb25zdCB7Ci0g ICAgICAgIHN3aXRjaCggbV9tb2RlICkgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBjYXNlIE5vbmU6Ci0gICAgICAgICAg ICAgICAgcmV0dXJuIGMgPT0gJ34nOwotICAgICAgICAgICAgY2FzZSBOYW1lOgotICAgICAgICAg ICAgICAgIHJldHVybiBjID09ICdbJzsKLSAgICAgICAgICAgIGNhc2UgRXNjYXBlZE5hbWU6Ci0g ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFF1b3RlZE5hbWU6 Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMgPT0gJyInOwotICAgICAgICAgICAgY2FzZSBUYWc6 Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMgPT0gJ1snIHx8IGMgPT0gJ10nOwotICAgICAgICB9 Ci0gICAgfQotCi0gICAgdm9pZCBUZXN0U3BlY1BhcnNlcjo6YWRkRmlsdGVyKCkgewotICAgICAg ICBpZiggIW1fY3VycmVudEZpbHRlci5tX3BhdHRlcm5zLmVtcHR5KCkgKSB7Ci0gICAgICAgICAg ICBtX3Rlc3RTcGVjLm1fZmlsdGVycy5wdXNoX2JhY2soIG1fY3VycmVudEZpbHRlciApOwotICAg ICAgICAgICAgbV9jdXJyZW50RmlsdGVyID0gVGVzdFNwZWM6OkZpbHRlcigpOwotICAgICAgICB9 Ci0gICAgfQotCi0gICAgdm9pZCBUZXN0U3BlY1BhcnNlcjo6c2F2ZUxhc3RNb2RlKCkgewotICAg ICAgbGFzdE1vZGUgPSBtX21vZGU7Ci0gICAgfQotCi0gICAgdm9pZCBUZXN0U3BlY1BhcnNlcjo6 cmV2ZXJ0QmFja1RvTGFzdE1vZGUoKSB7Ci0gICAgICBtX21vZGUgPSBsYXN0TW9kZTsKLSAgICB9 Ci0KLSAgICBib29sIFRlc3RTcGVjUGFyc2VyOjpzZXBhcmF0ZSgpIHsKLSAgICAgIGlmKCAobV9t b2RlPT1RdW90ZWROYW1lKSB8fCAobV9tb2RlPT1UYWcpICl7Ci0gICAgICAgICAvL2ludmFsaWQg YXJndW1lbnQsIHNpZ25hbCBmYWlsdXJlIHRvIHByZXZpb3VzIHNjb3BlLgotICAgICAgICAgbV9t b2RlID0gTm9uZTsKLSAgICAgICAgIG1fcG9zID0gbV9hcmcuc2l6ZSgpOwotICAgICAgICAgbV9z dWJzdHJpbmcuY2xlYXIoKTsKLSAgICAgICAgIG1fcGF0dGVybk5hbWUuY2xlYXIoKTsKLSAgICAg ICAgIG1fcmVhbFBhdHRlcm5Qb3MgPSAwOwotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg fQotICAgICAgZW5kTW9kZSgpOwotICAgICAgYWRkRmlsdGVyKCk7Ci0gICAgICByZXR1cm4gdHJ1 ZTsgLy9zdWNjZXNzCi0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgVGVzdFNwZWNQYXJzZXI6OnBy ZXByb2Nlc3NQYXR0ZXJuKCkgewotICAgICAgICBzdGQ6OnN0cmluZyB0b2tlbiA9IG1fcGF0dGVy bk5hbWU7Ci0gICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX2VzY2FwZUNoYXJz LnNpemUoKTsgKytpKQotICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoMCwgbV9lc2Nh cGVDaGFyc1tpXSAtIGkpICsgdG9rZW4uc3Vic3RyKG1fZXNjYXBlQ2hhcnNbaV0gLSBpICsgMSk7 Ci0gICAgICAgIG1fZXNjYXBlQ2hhcnMuY2xlYXIoKTsKLSAgICAgICAgaWYgKHN0YXJ0c1dpdGgo dG9rZW4sICJleGNsdWRlOiIpKSB7Ci0gICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7Ci0g ICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0cig4KTsKLSAgICAgICAgfQotCi0gICAgICAg IG1fcGF0dGVybk5hbWUuY2xlYXIoKTsKLSAgICAgICAgbV9yZWFsUGF0dGVyblBvcyA9IDA7Ci0K LSAgICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLQotICAgIHZvaWQgVGVzdFNwZWNQYXJzZXI6 OmFkZE5hbWVQYXR0ZXJuKCkgewotICAgICAgICBhdXRvIHRva2VuID0gcHJlcHJvY2Vzc1BhdHRl cm4oKTsKLQotICAgICAgICBpZiAoIXRva2VuLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIFRlc3RT cGVjOjpQYXR0ZXJuUHRyIHBhdHRlcm4gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RTcGVjOjpOYW1l UGF0dGVybj4odG9rZW4sIG1fc3Vic3RyaW5nKTsKLSAgICAgICAgICAgIGlmIChtX2V4Y2x1c2lv bikKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0U3BlYzo6 RXhjbHVkZWRQYXR0ZXJuPihwYXR0ZXJuKTsKLSAgICAgICAgICAgIG1fY3VycmVudEZpbHRlci5t X3BhdHRlcm5zLnB1c2hfYmFjayhwYXR0ZXJuKTsKLSAgICAgICAgfQotICAgICAgICBtX3N1YnN0 cmluZy5jbGVhcigpOwotICAgICAgICBtX2V4Y2x1c2lvbiA9IGZhbHNlOwotICAgICAgICBtX21v ZGUgPSBOb25lOwotICAgIH0KLQotICAgIHZvaWQgVGVzdFNwZWNQYXJzZXI6OmFkZFRhZ1BhdHRl cm4oKSB7Ci0gICAgICAgIGF1dG8gdG9rZW4gPSBwcmVwcm9jZXNzUGF0dGVybigpOwotCi0gICAg ICAgIGlmICghdG9rZW4uZW1wdHkoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHRhZyBwYXR0 ZXJuIGlzIHRoZSAiaGlkZSBhbmQgdGFnIiBzaG9ydGhhbmQgKGUuZy4gWy5mb29dKQotICAgICAg ICAgICAgLy8gd2UgaGF2ZSB0byBjcmVhdGUgYSBzZXBhcmF0ZSBoaWRlIHRhZyBhbmQgc2hvcnRl biB0aGUgcmVhbCBvbmUKLSAgICAgICAgICAgIGlmICh0b2tlbi5zaXplKCkgPiAxICYmIHRva2Vu WzBdID09ICcuJykgewotICAgICAgICAgICAgICAgIHRva2VuLmVyYXNlKHRva2VuLmJlZ2luKCkp OwotICAgICAgICAgICAgICAgIFRlc3RTcGVjOjpQYXR0ZXJuUHRyIHBhdHRlcm4gPSBzdGQ6Om1h a2Vfc2hhcmVkPFRlc3RTcGVjOjpUYWdQYXR0ZXJuPigiLiIsIG1fc3Vic3RyaW5nKTsKLSAgICAg ICAgICAgICAgICBpZiAobV9leGNsdXNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVy biA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybj4ocGF0dGVybik7 Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlci5tX3Bh dHRlcm5zLnB1c2hfYmFjayhwYXR0ZXJuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg VGVzdFNwZWM6OlBhdHRlcm5QdHIgcGF0dGVybiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdFNwZWM6 OlRhZ1BhdHRlcm4+KHRva2VuLCBtX3N1YnN0cmluZyk7Ci0KLSAgICAgICAgICAgIGlmIChtX2V4 Y2x1c2lvbikgewotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRl c3RTcGVjOjpFeGNsdWRlZFBhdHRlcm4+KHBhdHRlcm4pOwotICAgICAgICAgICAgfQotICAgICAg ICAgICAgbV9jdXJyZW50RmlsdGVyLm1fcGF0dGVybnMucHVzaF9iYWNrKHBhdHRlcm4pOwotICAg ICAgICB9Ci0gICAgICAgIG1fc3Vic3RyaW5nLmNsZWFyKCk7Ci0gICAgICAgIG1fZXhjbHVzaW9u ID0gZmFsc2U7Ci0gICAgICAgIG1fbW9kZSA9IE5vbmU7Ci0gICAgfQotCi0gICAgVGVzdFNwZWMg cGFyc2VUZXN0U3BlYyggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKLSAgICAgICAgcmV0dXJu IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggYXJnICku dGVzdFNwZWMoKTsKLSAgICB9Ci0KLX0gLy8gbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hf dGVzdF9zcGVjX3BhcnNlci5jcHAKLS8vIHN0YXJ0IGNhdGNoX3RpbWVyLmNwcAotCi0jaW5jbHVk ZSA8Y2hyb25vPgotCi1zdGF0aWMgY29uc3QgdWludDY0X3QgbmFub3NlY29uZHNJblNlY29uZCA9 IDEwMDAwMDAwMDA7Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBhdXRvIGdldEN1cnJlbnRO YW5vc2Vjb25kc1NpbmNlRXBvY2goKSAtPiB1aW50NjRfdCB7Ci0gICAgICAgIHJldHVybiBzdGQ6 OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+KCBzdGQ6OmNo cm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkgKS5j b3VudCgpOwotICAgIH0KLQotICAgIG5hbWVzcGFjZSB7Ci0gICAgICAgIGF1dG8gZXN0aW1hdGVD bG9ja1Jlc29sdXRpb24oKSAtPiB1aW50NjRfdCB7Ci0gICAgICAgICAgICB1aW50NjRfdCBzdW0g PSAwOwotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGl0ZXJhdGlvbnMgPSAxMDAw MDAwOwotCi0gICAgICAgICAgICBhdXRvIHN0YXJ0VGltZSA9IGdldEN1cnJlbnROYW5vc2Vjb25k c1NpbmNlRXBvY2goKTsKLQotICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8 IGl0ZXJhdGlvbnM7ICsraSApIHsKLQotICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpY2tzOwot ICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJhc2VUaWNrcyA9IGdldEN1cnJlbnROYW5vc2Vjb25k c1NpbmNlRXBvY2goKTsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAg IHRpY2tzID0gZ2V0Q3VycmVudE5hbm9zZWNvbmRzU2luY2VFcG9jaCgpOwotICAgICAgICAgICAg ICAgIH0gd2hpbGUoIHRpY2tzID09IGJhc2VUaWNrcyApOwotCi0gICAgICAgICAgICAgICAgYXV0 byBkZWx0YSA9IHRpY2tzIC0gYmFzZVRpY2tzOwotICAgICAgICAgICAgICAgIHN1bSArPSBkZWx0 YTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYmVlbiBjYWxpYnJhdGluZyBmb3Ig b3ZlciAzIHNlY29uZHMgLS0gdGhlIGNsb2NrCi0gICAgICAgICAgICAgICAgLy8gaXMgdGVycmli bGUgYW5kIHdlIHNob3VsZCBtb3ZlIG9uLgotICAgICAgICAgICAgICAgIC8vIFRCRDogSG93IHRv IHNpZ25hbCB0aGF0IHRoZSBtZWFzdXJlZCByZXNvbHV0aW9uIGlzIHByb2JhYmx5IHdyb25nPwot ICAgICAgICAgICAgICAgIGlmICh0aWNrcyA+IHN0YXJ0VGltZSArIDMgKiBuYW5vc2Vjb25kc0lu U2Vjb25kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdW0gLyAoIGkgKyAxdSApOwot ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UncmUg anVzdCB0YWtpbmcgdGhlIG1lYW4sIGhlcmUuIFRvIGRvIGJldHRlciB3ZSBjb3VsZCB0YWtlIHRo ZSBzdGQuIGRldiBhbmQgZXhjbHVkZSBvdXRsaWVycwotICAgICAgICAgICAgLy8gLSBhbmQgcG90 ZW50aWFsbHkgZG8gbW9yZSBpdGVyYXRpb25zIGlmIHRoZXJlJ3MgYSBoaWdoIHZhcmlhbmNlLgot ICAgICAgICAgICAgcmV0dXJuIHN1bS9pdGVyYXRpb25zOwotICAgICAgICB9Ci0gICAgfQotICAg IGF1dG8gZ2V0RXN0aW1hdGVkQ2xvY2tSZXNvbHV0aW9uKCkgLT4gdWludDY0X3QgewotICAgICAg ICBzdGF0aWMgYXV0byBzX3Jlc29sdXRpb24gPSBlc3RpbWF0ZUNsb2NrUmVzb2x1dGlvbigpOwot ICAgICAgICByZXR1cm4gc19yZXNvbHV0aW9uOwotICAgIH0KLQotICAgIHZvaWQgVGltZXI6OnN0 YXJ0KCkgewotICAgICAgIG1fbmFub3NlY29uZHMgPSBnZXRDdXJyZW50TmFub3NlY29uZHNTaW5j ZUVwb2NoKCk7Ci0gICAgfQotICAgIGF1dG8gVGltZXI6OmdldEVsYXBzZWROYW5vc2Vjb25kcygp IGNvbnN0IC0+IHVpbnQ2NF90IHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnJlbnROYW5vc2Vjb25k c1NpbmNlRXBvY2goKSAtIG1fbmFub3NlY29uZHM7Ci0gICAgfQotICAgIGF1dG8gVGltZXI6Omdl dEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdCAtPiB1aW50NjRfdCB7Ci0gICAgICAgIHJldHVy biBnZXRFbGFwc2VkTmFub3NlY29uZHMoKS8xMDAwOwotICAgIH0KLSAgICBhdXRvIFRpbWVyOjpn ZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3QgLT4gdW5zaWduZWQgaW50IHsKLSAgICAgICAg cmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygp LzEwMDApOwotICAgIH0KLSAgICBhdXRvIFRpbWVyOjpnZXRFbGFwc2VkU2Vjb25kcygpIGNvbnN0 IC0+IGRvdWJsZSB7Ci0gICAgICAgIHJldHVybiBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkvMTAw MDAwMC4wOwotICAgIH0KLQotfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKLS8vIGVuZCBjYXRjaF90aW1l ci5jcHAKLS8vIHN0YXJ0IGNhdGNoX3Rvc3RyaW5nLmNwcAotCi0jaWYgZGVmaW5lZChfX2NsYW5n X18pCi0jICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSMgICAgcHJhZ21hIGNsYW5n IGRpYWdub3N0aWMgaWdub3JlZCAiLVdleGl0LXRpbWUtZGVzdHJ1Y3RvcnMiCi0jICAgIHByYWdt YSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZ2xvYmFsLWNvbnN0cnVjdG9ycyIKLSNlbmRp ZgotCi0vLyBFbmFibGUgc3BlY2lmaWMgZGVjbHMgbG9jYWxseQotI2lmICFkZWZpbmVkKENBVENI X0NPTkZJR19FTkFCTEVfQ0hST05PX1NUUklOR01BS0VSKQotI2RlZmluZSBDQVRDSF9DT05GSUdf RU5BQkxFX0NIUk9OT19TVFJJTkdNQUtFUgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjbWF0aD4KLSNp bmNsdWRlIDxpb21hbmlwPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi1uYW1lc3BhY2UgRGV0YWls IHsKLQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nID0gIns/fSI7Ci0K LSAgICBuYW1lc3BhY2UgewotICAgICAgICBjb25zdCBpbnQgaGV4VGhyZXNob2xkID0gMjU1Owot Ci0gICAgICAgIHN0cnVjdCBFbmRpYW5uZXNzIHsKLSAgICAgICAgICAgIGVudW0gQXJjaCB7IEJp ZywgTGl0dGxlIH07Ci0KLSAgICAgICAgICAgIHN0YXRpYyBBcmNoIHdoaWNoKCkgewotICAgICAg ICAgICAgICAgIGludCBvbmUgPSAxOwotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsb3dlc3Qg Ynl0ZSB3ZSByZWFkIGlzIG5vbi16ZXJvLCB3ZSBjYW4gYXNzdW1lCi0gICAgICAgICAgICAgICAg Ly8gdGhhdCBsaXR0bGUgZW5kaWFuIGZvcm1hdCBpcyB1c2VkLgotICAgICAgICAgICAgICAgIGF1 dG8gdmFsdWUgPSAqcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm9uZSk7Ci0gICAgICAgICAgICAg ICAgcmV0dXJuIHZhbHVlID8gTGl0dGxlIDogQmlnOwotICAgICAgICAgICAgfQotICAgICAgICB9 OwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lk ICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKSB7Ci0gICAgICAgIC8vIFJldmVyc2Ugb3JkZXIg Zm9yIGxpdHRsZSBlbmRpYW4gYXJjaGl0ZWN0dXJlcwotICAgICAgICBpbnQgaSA9IDAsIGVuZCA9 IHN0YXRpY19jYXN0PGludD4oIHNpemUgKSwgaW5jID0gMTsKLSAgICAgICAgaWYoIEVuZGlhbm5l c3M6OndoaWNoKCkgPT0gRW5kaWFubmVzczo6TGl0dGxlICkgewotICAgICAgICAgICAgaSA9IGVu ZC0xOwotICAgICAgICAgICAgZW5kID0gaW5jID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICB1 bnNpZ25lZCBjaGFyIGNvbnN0ICpieXRlcyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIgY29u c3QgKj4ob2JqZWN0KTsKLSAgICAgICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwotICAgICAg ICByc3MgPDwgIjB4IiA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleDsKLSAgICAgICAg Zm9yKCA7IGkgIT0gZW5kOyBpICs9IGluYyApCi0gICAgICAgICAgICAgcnNzIDw8IHN0ZDo6c2V0 dygyKSA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYnl0ZXNbaV0pOwotICAgICAgIHJldHVybiBy c3Muc3RyKCk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RkOjpzdHJpbmcg ZnBUb1N0cmluZyggVCB2YWx1ZSwgaW50IHByZWNpc2lvbiApIHsKLSAgICBpZiAoQ2F0Y2g6Omlz bmFuKHZhbHVlKSkgewotICAgICAgICByZXR1cm4gIm5hbiI7Ci0gICAgfQotCi0gICAgUmV1c2Fi bGVTdHJpbmdTdHJlYW0gcnNzOwotICAgIHJzcyA8PCBzdGQ6OnNldHByZWNpc2lvbiggcHJlY2lz aW9uICkKLSAgICAgICAgPDwgc3RkOjpmaXhlZAotICAgICAgICA8PCB2YWx1ZTsKLSAgICBzdGQ6 OnN0cmluZyBkID0gcnNzLnN0cigpOwotICAgIHN0ZDo6c2l6ZV90IGkgPSBkLmZpbmRfbGFzdF9u b3Rfb2YoICcwJyApOwotICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGkgIT0gZC5z aXplKCktMSApIHsKLSAgICAgICAgaWYoIGRbaV0gPT0gJy4nICkKLSAgICAgICAgICAgIGkrKzsK LSAgICAgICAgZCA9IGQuc3Vic3RyKCAwLCBpKzEgKTsKLSAgICB9Ci0gICAgcmV0dXJuIGQ7Ci19 Ci0KLS8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PSAvLy8vCi0vLwotLy8gICBPdXQtb2YtbGluZSBkZWZzIGZvciBmdWxsIHNwZWNpYWxp emF0aW9uIG9mIFN0cmluZ01ha2VyCi0vLwotLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8vLy8KLQotc3RkOjpzdHJpbmcgU3RyaW5n TWFrZXI8c3RkOjpzdHJpbmc+Ojpjb252ZXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAg ICBpZiAoIWdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3dJbnZpc2libGVzKCkp IHsKLSAgICAgICAgcmV0dXJuICciJyArIHN0ciArICciJzsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0 cmluZyBzKCJcIiIpOwotICAgIGZvciAoY2hhciBjIDogc3RyKSB7Ci0gICAgICAgIHN3aXRjaCAo YykgewotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXFxuIik7Ci0g ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgcy5hcHBl bmQoIlxcdCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg ICAgICBzLnB1c2hfYmFjayhjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg fQotICAgIHMuYXBwZW5kKCJcIiIpOwotICAgIHJldHVybiBzOwotfQotCi0jaWZkZWYgQ0FUQ0hf Q09ORklHX0NQUDE3X1NUUklOR19WSUVXCi1zdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjxzdGQ6OnN0 cmluZ192aWV3Pjo6Y29udmVydChzdGQ6OnN0cmluZ192aWV3IHN0cikgewotICAgIHJldHVybiA6 OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGQ6OnN0cmluZ3sgc3RyIH0pOwotfQotI2VuZGlm Ci0KLXN0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPGNoYXIgY29uc3QqPjo6Y29udmVydChjaGFyIGNv bnN0KiBzdHIpIHsKLSAgICBpZiAoc3RyKSB7Ci0gICAgICAgIHJldHVybiA6OkNhdGNoOjpEZXRh aWw6OnN0cmluZ2lmeShzdGQ6OnN0cmluZ3sgc3RyIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAg IHJldHVybnsgIntudWxsIHN0cmluZ30iIH07Ci0gICAgfQotfQotc3RkOjpzdHJpbmcgU3RyaW5n TWFrZXI8Y2hhcio+Ojpjb252ZXJ0KGNoYXIqIHN0cikgewotICAgIGlmIChzdHIpIHsKLSAgICAg ICAgcmV0dXJuIDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KHN0ZDo6c3RyaW5neyBzdHIgfSk7 Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJueyAie251bGwgc3RyaW5nfSIgfTsKLSAgICB9 Ci19Ci0KLSNpZmRlZiBDQVRDSF9DT05GSUdfV0NIQVIKLXN0ZDo6c3RyaW5nIFN0cmluZ01ha2Vy PHN0ZDo6d3N0cmluZz46OmNvbnZlcnQoY29uc3Qgc3RkOjp3c3RyaW5nJiB3c3RyKSB7Ci0gICAg c3RkOjpzdHJpbmcgczsKLSAgICBzLnJlc2VydmUod3N0ci5zaXplKCkpOwotICAgIGZvciAoYXV0 byBjIDogd3N0cikgewotICAgICAgICBzICs9IChjIDw9IDB4ZmYpID8gc3RhdGljX2Nhc3Q8Y2hh cj4oYykgOiAnPyc7Ci0gICAgfQotICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lm eShzKTsKLX0KLQotIyBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTdfU1RSSU5HX1ZJRVcKLXN0ZDo6 c3RyaW5nIFN0cmluZ01ha2VyPHN0ZDo6d3N0cmluZ192aWV3Pjo6Y29udmVydChzdGQ6OndzdHJp bmdfdmlldyBzdHIpIHsKLSAgICByZXR1cm4gU3RyaW5nTWFrZXI8c3RkOjp3c3RyaW5nPjo6Y29u dmVydChzdGQ6OndzdHJpbmcoc3RyKSk7Ci19Ci0jIGVuZGlmCi0KLXN0ZDo6c3RyaW5nIFN0cmlu Z01ha2VyPHdjaGFyX3QgY29uc3QqPjo6Y29udmVydCh3Y2hhcl90IGNvbnN0ICogc3RyKSB7Ci0g ICAgaWYgKHN0cikgewotICAgICAgICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnko c3RkOjp3c3RyaW5neyBzdHIgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJueyAie251 bGwgc3RyaW5nfSIgfTsKLSAgICB9Ci19Ci1zdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjx3Y2hhcl90 ICo+Ojpjb252ZXJ0KHdjaGFyX3QgKiBzdHIpIHsKLSAgICBpZiAoc3RyKSB7Ci0gICAgICAgIHJl dHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGQ6OndzdHJpbmd7IHN0ciB9KTsKLSAg ICB9IGVsc2UgewotICAgICAgICByZXR1cm57ICJ7bnVsbCBzdHJpbmd9IiB9OwotICAgIH0KLX0K LSNlbmRpZgotCi0jaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTdfQllURSkKLSNpbmNsdWRl IDxjc3RkZGVmPgotc3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8c3RkOjpieXRlPjo6Y29udmVydChz dGQ6OmJ5dGUgdmFsdWUpIHsKLSAgICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnko c3RkOjp0b19pbnRlZ2VyPHVuc2lnbmVkIGxvbmcgbG9uZz4odmFsdWUpKTsKLX0KLSNlbmRpZiAv LyBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxN19CWVRFKQotCi1zdGQ6OnN0cmluZyBTdHJpbmdN YWtlcjxpbnQ+Ojpjb252ZXJ0KGludCB2YWx1ZSkgewotICAgIHJldHVybiA6OkNhdGNoOjpEZXRh aWw6OnN0cmluZ2lmeShzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHZhbHVlKSk7Ci19Ci1zdGQ6OnN0 cmluZyBTdHJpbmdNYWtlcjxsb25nPjo6Y29udmVydChsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJu IDo6Q2F0Y2g6OkRldGFpbDo6c3RyaW5naWZ5KHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odmFsdWUp KTsKLX0KLXN0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPGxvbmcgbG9uZz46OmNvbnZlcnQobG9uZyBs b25nIHZhbHVlKSB7Ci0gICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwotICAgIHJzcyA8PCB2 YWx1ZTsKLSAgICBpZiAodmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCkgewotICAgICAgICBy c3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKLSAgICB9Ci0gICAgcmV0 dXJuIHJzcy5zdHIoKTsKLX0KLQotc3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8dW5zaWduZWQgaW50 Pjo6Y29udmVydCh1bnNpZ25lZCBpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gOjpDYXRjaDo6RGV0 YWlsOjpzdHJpbmdpZnkoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPih2YWx1ZSkpOwot fQotc3RkOjpzdHJpbmcgU3RyaW5nTWFrZXI8dW5zaWduZWQgbG9uZz46OmNvbnZlcnQodW5zaWdu ZWQgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShz dGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KHZhbHVlKSk7Ci19Ci1zdGQ6OnN0cmluZyBT dHJpbmdNYWtlcjx1bnNpZ25lZCBsb25nIGxvbmc+Ojpjb252ZXJ0KHVuc2lnbmVkIGxvbmcgbG9u ZyB2YWx1ZSkgewotICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKLSAgICByc3MgPDwgdmFs dWU7Ci0gICAgaWYgKHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQpIHsKLSAgICAgICAgcnNz IDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7Ci0gICAgfQotICAgIHJldHVy biByc3Muc3RyKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPGJvb2w+Ojpjb252ZXJ0 KGJvb2wgYikgewotICAgIHJldHVybiBiID8gInRydWUiIDogImZhbHNlIjsKLX0KLQotc3RkOjpz dHJpbmcgU3RyaW5nTWFrZXI8c2lnbmVkIGNoYXI+Ojpjb252ZXJ0KHNpZ25lZCBjaGFyIHZhbHVl KSB7Ci0gICAgaWYgKHZhbHVlID09ICdccicpIHsKLSAgICAgICAgcmV0dXJuICInXFxyJyI7Ci0g ICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAnXGYnKSB7Ci0gICAgICAgIHJldHVybiAiJ1xcZiciOwot ICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJ1xuJykgewotICAgICAgICByZXR1cm4gIidcXG4nIjsK LSAgICB9IGVsc2UgaWYgKHZhbHVlID09ICdcdCcpIHsKLSAgICAgICAgcmV0dXJuICInXFx0JyI7 Ci0gICAgfSBlbHNlIGlmICgnXDAnIDw9IHZhbHVlICYmIHZhbHVlIDwgJyAnKSB7Ci0gICAgICAg IHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmluZ2lmeShzdGF0aWNfY2FzdDx1bnNpZ25lZCBp bnQ+KHZhbHVlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciBjaHN0cltdID0gIicgJyI7 Ci0gICAgICAgIGNoc3RyWzFdID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiBjaHN0cjsKLSAgICB9 Ci19Ci1zdGQ6OnN0cmluZyBTdHJpbmdNYWtlcjxjaGFyPjo6Y29udmVydChjaGFyIGMpIHsKLSAg ICByZXR1cm4gOjpDYXRjaDo6RGV0YWlsOjpzdHJpbmdpZnkoc3RhdGljX2Nhc3Q8c2lnbmVkIGNo YXI+KGMpKTsKLX0KLXN0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPHVuc2lnbmVkIGNoYXI+Ojpjb252 ZXJ0KHVuc2lnbmVkIGNoYXIgYykgewotICAgIHJldHVybiA6OkNhdGNoOjpEZXRhaWw6OnN0cmlu Z2lmeShzdGF0aWNfY2FzdDxjaGFyPihjKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIFN0cmluZ01ha2Vy PHN0ZDo6bnVsbHB0cl90Pjo6Y29udmVydChzdGQ6Om51bGxwdHJfdCkgewotICAgIHJldHVybiAi bnVsbHB0ciI7Ci19Ci0KLWludCBTdHJpbmdNYWtlcjxmbG9hdD46OnByZWNpc2lvbiA9IDU7Ci0K LXN0ZDo6c3RyaW5nIFN0cmluZ01ha2VyPGZsb2F0Pjo6Y29udmVydChmbG9hdCB2YWx1ZSkgewot ICAgIHJldHVybiBmcFRvU3RyaW5nKHZhbHVlLCBwcmVjaXNpb24pICsgJ2YnOwotfQotCi1pbnQg U3RyaW5nTWFrZXI8ZG91YmxlPjo6cHJlY2lzaW9uID0gMTA7Ci0KLXN0ZDo6c3RyaW5nIFN0cmlu Z01ha2VyPGRvdWJsZT46OmNvbnZlcnQoZG91YmxlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGZwVG9T dHJpbmcodmFsdWUsIHByZWNpc2lvbik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHJhdGlvX3N0cmluZzxz dGQ6OmF0dG8+OjpzeW1ib2woKSB7IHJldHVybiAiYSI7IH0KLXN0ZDo6c3RyaW5nIHJhdGlvX3N0 cmluZzxzdGQ6OmZlbXRvPjo6c3ltYm9sKCkgeyByZXR1cm4gImYiOyB9Ci1zdGQ6OnN0cmluZyBy YXRpb19zdHJpbmc8c3RkOjpwaWNvPjo6c3ltYm9sKCkgeyByZXR1cm4gInAiOyB9Ci1zdGQ6OnN0 cmluZyByYXRpb19zdHJpbmc8c3RkOjpuYW5vPjo6c3ltYm9sKCkgeyByZXR1cm4gIm4iOyB9Ci1z dGQ6OnN0cmluZyByYXRpb19zdHJpbmc8c3RkOjptaWNybz46OnN5bWJvbCgpIHsgcmV0dXJuICJ1 IjsgfQotc3RkOjpzdHJpbmcgcmF0aW9fc3RyaW5nPHN0ZDo6bWlsbGk+OjpzeW1ib2woKSB7IHJl dHVybiAibSI7IH0KLQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0KLSNpZiBkZWZpbmVkKF9f Y2xhbmdfXykKLSMgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotLy8g ZW5kIGNhdGNoX3Rvc3RyaW5nLmNwcAotLy8gc3RhcnQgY2F0Y2hfdG90YWxzLmNwcAotCi1uYW1l c3BhY2UgQ2F0Y2ggewotCi0gICAgQ291bnRzIENvdW50czo6b3BlcmF0b3IgLSAoIENvdW50cyBj b25zdCYgb3RoZXIgKSBjb25zdCB7Ci0gICAgICAgIENvdW50cyBkaWZmOwotICAgICAgICBkaWZm LnBhc3NlZCA9IHBhc3NlZCAtIG90aGVyLnBhc3NlZDsKLSAgICAgICAgZGlmZi5mYWlsZWQgPSBm YWlsZWQgLSBvdGhlci5mYWlsZWQ7Ci0gICAgICAgIGRpZmYuZmFpbGVkQnV0T2sgPSBmYWlsZWRC dXRPayAtIG90aGVyLmZhaWxlZEJ1dE9rOwotICAgICAgICByZXR1cm4gZGlmZjsKLSAgICB9Ci0K LSAgICBDb3VudHMmIENvdW50czo6b3BlcmF0b3IgKz0gKCBDb3VudHMgY29uc3QmIG90aGVyICkg ewotICAgICAgICBwYXNzZWQgKz0gb3RoZXIucGFzc2VkOwotICAgICAgICBmYWlsZWQgKz0gb3Ro ZXIuZmFpbGVkOwotICAgICAgICBmYWlsZWRCdXRPayArPSBvdGhlci5mYWlsZWRCdXRPazsKLSAg ICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIHN0ZDo6c2l6ZV90IENvdW50czo6dG90 YWwoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBwYXNzZWQgKyBmYWlsZWQgKyBmYWlsZWRCdXRP azsKLSAgICB9Ci0gICAgYm9vbCBDb3VudHM6OmFsbFBhc3NlZCgpIGNvbnN0IHsKLSAgICAgICAg cmV0dXJuIGZhaWxlZCA9PSAwICYmIGZhaWxlZEJ1dE9rID09IDA7Ci0gICAgfQotICAgIGJvb2wg Q291bnRzOjphbGxPaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwOwotICAg IH0KLQotICAgIFRvdGFscyBUb3RhbHM6Om9wZXJhdG9yIC0gKCBUb3RhbHMgY29uc3QmIG90aGVy ICkgY29uc3QgewotICAgICAgICBUb3RhbHMgZGlmZjsKLSAgICAgICAgZGlmZi5hc3NlcnRpb25z ID0gYXNzZXJ0aW9ucyAtIG90aGVyLmFzc2VydGlvbnM7Ci0gICAgICAgIGRpZmYudGVzdENhc2Vz ID0gdGVzdENhc2VzIC0gb3RoZXIudGVzdENhc2VzOwotICAgICAgICByZXR1cm4gZGlmZjsKLSAg ICB9Ci0KLSAgICBUb3RhbHMmIFRvdGFsczo6b3BlcmF0b3IgKz0gKCBUb3RhbHMgY29uc3QmIG90 aGVyICkgewotICAgICAgICBhc3NlcnRpb25zICs9IG90aGVyLmFzc2VydGlvbnM7Ci0gICAgICAg IHRlc3RDYXNlcyArPSBvdGhlci50ZXN0Q2FzZXM7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAg ICB9Ci0KLSAgICBUb3RhbHMgVG90YWxzOjpkZWx0YSggVG90YWxzIGNvbnN0JiBwcmV2VG90YWxz ICkgY29uc3QgewotICAgICAgICBUb3RhbHMgZGlmZiA9ICp0aGlzIC0gcHJldlRvdGFsczsKLSAg ICAgICAgaWYoIGRpZmYuYXNzZXJ0aW9ucy5mYWlsZWQgPiAwICkKLSAgICAgICAgICAgICsrZGlm Zi50ZXN0Q2FzZXMuZmFpbGVkOwotICAgICAgICBlbHNlIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFp bGVkQnV0T2sgPiAwICkKLSAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkQnV0T2s7 Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMucGFzc2VkOwotICAg ICAgICByZXR1cm4gZGlmZjsKLSAgICB9Ci0KLX0KLS8vIGVuZCBjYXRjaF90b3RhbHMuY3BwCi0v LyBzdGFydCBjYXRjaF91bmNhdWdodF9leGNlcHRpb25zLmNwcAotCi0vLyBzdGFydCBjYXRjaF9j b25maWdfdW5jYXVnaHRfZXhjZXB0aW9ucy5ocHAKLQotLy8gICAgICAgICAgICAgIENvcHlyaWdo dCBDYXRjaDIgQXV0aG9ycwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJl IExpY2Vuc2UsIFZlcnNpb24gMS4wLgotLy8gICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VO U0VfMV8wLnR4dCBvciBjb3B5IGF0Ci0vLyAgICAgICAgaHR0cHM6Ly93d3cuYm9vc3Qub3JnL0xJ Q0VOU0VfMV8wLnR4dCkKLQotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTTC0xLjAKLQot I2lmbmRlZiBDQVRDSF9DT05GSUdfVU5DQVVHSFRfRVhDRVBUSU9OU19IUFAKLSNkZWZpbmUgQ0FU Q0hfQ09ORklHX1VOQ0FVR0hUX0VYQ0VQVElPTlNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVS KQotIyAgaWYgX01TQ19WRVIgPj0gMTkwMCAvLyBWaXN1YWwgU3R1ZGlvIDIwMTUgb3IgbmV3ZXIK LSMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxN19VTkNBVUdIVF9FWENFUFRJ T05TCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0KLSNpZiBkZWZp bmVkKF9fY3BwX2xpYl91bmNhdWdodF9leGNlcHRpb25zKSBcCi0gICAgJiYgIWRlZmluZWQoQ0FU Q0hfSU5URVJOQUxfQ09ORklHX0NQUDE3X1VOQ0FVR0hUX0VYQ0VQVElPTlMpCi0KLSMgIGRlZmlu ZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTdfVU5DQVVHSFRfRVhDRVBUSU9OUwotI2VuZGlm IC8vIF9fY3BwX2xpYl91bmNhdWdodF9leGNlcHRpb25zCi0KLSNpZiBkZWZpbmVkKENBVENIX0lO VEVSTkFMX0NPTkZJR19DUFAxN19VTkNBVUdIVF9FWENFUFRJT05TKSBcCi0gICAgJiYgIWRlZmlu ZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDE3X1VOQ0FVR0hUX0VYQ0VQVElPTlMpIFwKLSAgICAmJiAh ZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTdfVU5DQVVHSFRfRVhDRVBUSU9OUykKLQotIyAgZGVm aW5lIENBVENIX0NPTkZJR19DUFAxN19VTkNBVUdIVF9FWENFUFRJT05TCi0jZW5kaWYKLQotI2Vu ZGlmIC8vIENBVENIX0NPTkZJR19VTkNBVUdIVF9FWENFUFRJT05TX0hQUAotLy8gZW5kIGNhdGNo X2NvbmZpZ191bmNhdWdodF9leGNlcHRpb25zLmhwcAotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLQot bmFtZXNwYWNlIENhdGNoIHsKLSAgICBib29sIHVuY2F1Z2h0X2V4Y2VwdGlvbnMoKSB7Ci0jaWYg ZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9FWENFUFRJT05TKQotICAgICAgICByZXR1cm4g ZmFsc2U7Ci0jZWxpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxN19VTkNBVUdIVF9FWENFUFRJ T05TKQotICAgICAgICByZXR1cm4gc3RkOjp1bmNhdWdodF9leGNlcHRpb25zKCkgPiAwOwotI2Vs c2UKLSAgICAgICAgcmV0dXJuIHN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCk7Ci0jZW5kaWYKLSAg fQotfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCi0vLyBlbmQgY2F0Y2hfdW5jYXVnaHRfZXhjZXB0 aW9ucy5jcHAKLS8vIHN0YXJ0IGNhdGNoX3ZlcnNpb24uY3BwCi0KLSNpbmNsdWRlIDxvc3RyZWFt PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgVmVyc2lvbjo6VmVyc2lvbgotICAgICAgICAo ICAgdW5zaWduZWQgaW50IF9tYWpvclZlcnNpb24sCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQg X21pbm9yVmVyc2lvbiwKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCi0g ICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgX2JyYW5jaE5hbWUsCi0gICAgICAgICAgICB1 bnNpZ25lZCBpbnQgX2J1aWxkTnVtYmVyICkKLSAgICA6ICAgbWFqb3JWZXJzaW9uKCBfbWFqb3JW ZXJzaW9uICksCi0gICAgICAgIG1pbm9yVmVyc2lvbiggX21pbm9yVmVyc2lvbiApLAotICAgICAg ICBwYXRjaE51bWJlciggX3BhdGNoTnVtYmVyICksCi0gICAgICAgIGJyYW5jaE5hbWUoIF9icmFu Y2hOYW1lICksCi0gICAgICAgIGJ1aWxkTnVtYmVyKCBfYnVpbGROdW1iZXIgKQotICAgIHt9Ci0K LSAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lv biBjb25zdCYgdmVyc2lvbiApIHsKLSAgICAgICAgb3MgIDw8IHZlcnNpb24ubWFqb3JWZXJzaW9u IDw8ICcuJwotICAgICAgICAgICAgPDwgdmVyc2lvbi5taW5vclZlcnNpb24gPDwgJy4nCi0gICAg ICAgICAgICA8PCB2ZXJzaW9uLnBhdGNoTnVtYmVyOwotICAgICAgICAvLyBicmFuY2hOYW1lIGlz IG5ldmVyIG51bGwgLT4gMHRoIGNoYXIgaXMgXDAgaWYgaXQgaXMgZW1wdHkKLSAgICAgICAgaWYg KHZlcnNpb24uYnJhbmNoTmFtZVswXSkgewotICAgICAgICAgICAgb3MgPDwgJy0nIDw8IHZlcnNp b24uYnJhbmNoTmFtZQotICAgICAgICAgICAgICAgPDwgJy4nIDw8IHZlcnNpb24uYnVpbGROdW1i ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9zOwotICAgIH0KLQotICAgIFZlcnNpb24g Y29uc3QmIGxpYnJhcnlWZXJzaW9uKCkgewotICAgICAgICBzdGF0aWMgVmVyc2lvbiB2ZXJzaW9u KCAyLCAxMywgOCwgIiIsIDAgKTsKLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgfQotCi19 Ci0vLyBlbmQgY2F0Y2hfdmVyc2lvbi5jcHAKLS8vIHN0YXJ0IGNhdGNoX3dpbGRjYXJkX3BhdHRl cm4uY3BwCi0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLSAgICBXaWxkY2FyZFBhdHRlcm46OldpbGRj YXJkUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIHBhdHRlcm4sCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZp dHkgKQotICAgIDogICBtX2Nhc2VTZW5zaXRpdml0eSggY2FzZVNlbnNpdGl2aXR5ICksCi0gICAg ICAgIG1fcGF0dGVybiggbm9ybWFsaXNlU3RyaW5nKCBwYXR0ZXJuICkgKQotICAgIHsKLSAgICAg ICAgaWYoIHN0YXJ0c1dpdGgoIG1fcGF0dGVybiwgJyonICkgKSB7Ci0gICAgICAgICAgICBtX3Bh dHRlcm4gPSBtX3BhdHRlcm4uc3Vic3RyKCAxICk7Ci0gICAgICAgICAgICBtX3dpbGRjYXJkID0g V2lsZGNhcmRBdFN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIGlmKCBlbmRzV2l0aCggbV9wYXR0 ZXJuLCAnKicgKSApIHsKLSAgICAgICAgICAgIG1fcGF0dGVybiA9IG1fcGF0dGVybi5zdWJzdHIo IDAsIG1fcGF0dGVybi5zaXplKCktMSApOwotICAgICAgICAgICAgbV93aWxkY2FyZCA9IHN0YXRp Y19jYXN0PFdpbGRjYXJkUG9zaXRpb24+KCBtX3dpbGRjYXJkIHwgV2lsZGNhcmRBdEVuZCApOwot ICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBXaWxkY2FyZFBhdHRlcm46Om1hdGNoZXMoIHN0 ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7Ci0gICAgICAgIHN3aXRjaCggbV93aWxkY2Fy ZCApIHsKLSAgICAgICAgICAgIGNhc2UgTm9XaWxkY2FyZDoKLSAgICAgICAgICAgICAgICByZXR1 cm4gbV9wYXR0ZXJuID09IG5vcm1hbGlzZVN0cmluZyggc3RyICk7Ci0gICAgICAgICAgICBjYXNl IFdpbGRjYXJkQXRTdGFydDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZW5kc1dpdGgoIG5vcm1h bGlzZVN0cmluZyggc3RyICksIG1fcGF0dGVybiApOwotICAgICAgICAgICAgY2FzZSBXaWxkY2Fy ZEF0RW5kOgotICAgICAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBub3JtYWxpc2VTdHJp bmcoIHN0ciApLCBtX3BhdHRlcm4gKTsKLSAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEJvdGhF bmRzOgotICAgICAgICAgICAgICAgIHJldHVybiBjb250YWlucyggbm9ybWFsaXNlU3RyaW5nKCBz dHIgKSwgbV9wYXR0ZXJuICk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAg IENBVENIX0lOVEVSTkFMX0VSUk9SKCAiVW5rbm93biBlbnVtIiApOwotICAgICAgICB9Ci0gICAg fQotCi0gICAgc3RkOjpzdHJpbmcgV2lsZGNhcmRQYXR0ZXJuOjpub3JtYWxpc2VTdHJpbmcoIHN0 ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiB0cmltKCBtX2Nh c2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObyA/IHRvTG93ZXIoIHN0ciApIDogc3Ry ICk7Ci0gICAgfQotfQotLy8gZW5kIGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uY3BwCi0vLyBzdGFy dCBjYXRjaF94bWx3cml0ZXIuY3BwCi0KLSNpbmNsdWRlIDxpb21hbmlwPgotI2luY2x1ZGUgPHR5 cGVfdHJhaXRzPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi1uYW1lc3BhY2UgewotCi0gICAgc2l6 ZV90IHRyYWlsaW5nQnl0ZXModW5zaWduZWQgY2hhciBjKSB7Ci0gICAgICAgIGlmICgoYyAmIDB4 RTApID09IDB4QzApIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAg IGlmICgoYyAmIDB4RjApID09IDB4RTApIHsKLSAgICAgICAgICAgIHJldHVybiAzOwotICAgICAg ICB9Ci0gICAgICAgIGlmICgoYyAmIDB4RjgpID09IDB4RjApIHsKLSAgICAgICAgICAgIHJldHVy biA0OwotICAgICAgICB9Ci0gICAgICAgIENBVENIX0lOVEVSTkFMX0VSUk9SKCJJbnZhbGlkIG11 bHRpYnl0ZSB1dGYtOCBzdGFydCBieXRlIGVuY291bnRlcmVkIik7Ci0gICAgfQotCi0gICAgdWlu dDMyX3QgaGVhZGVyVmFsdWUodW5zaWduZWQgY2hhciBjKSB7Ci0gICAgICAgIGlmICgoYyAmIDB4 RTApID09IDB4QzApIHsKLSAgICAgICAgICAgIHJldHVybiBjICYgMHgxRjsKLSAgICAgICAgfQot ICAgICAgICBpZiAoKGMgJiAweEYwKSA9PSAweEUwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYyAm IDB4MEY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChjICYgMHhGOCkgPT0gMHhGMCkgewotICAg ICAgICAgICAgcmV0dXJuIGMgJiAweDA3OwotICAgICAgICB9Ci0gICAgICAgIENBVENIX0lOVEVS TkFMX0VSUk9SKCJJbnZhbGlkIG11bHRpYnl0ZSB1dGYtOCBzdGFydCBieXRlIGVuY291bnRlcmVk Iik7Ci0gICAgfQotCi0gICAgdm9pZCBoZXhFc2NhcGVDaGFyKHN0ZDo6b3N0cmVhbSYgb3MsIHVu c2lnbmVkIGNoYXIgYykgewotICAgICAgICBzdGQ6Omlvc19iYXNlOjpmbXRmbGFncyBmKG9zLmZs YWdzKCkpOwotICAgICAgICBvcyA8PCAiXFx4IgotICAgICAgICAgICAgPDwgc3RkOjp1cHBlcmNh c2UgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpCi0gICAg ICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGMpOwotICAgICAgICBvcy5mbGFncyhmKTsKLSAg ICB9Ci0KLSAgICBib29sIHNob3VsZE5ld2xpbmUoWG1sRm9ybWF0dGluZyBmbXQpIHsKLSAgICAg ICAgcmV0dXJuICEhKHN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPFhtbEZvcm1hdHRp bmc+Ojp0eXBlPihmbXQgJiBYbWxGb3JtYXR0aW5nOjpOZXdsaW5lKSk7Ci0gICAgfQotCi0gICAg Ym9vbCBzaG91bGRJbmRlbnQoWG1sRm9ybWF0dGluZyBmbXQpIHsKLSAgICAgICAgcmV0dXJuICEh KHN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPFhtbEZvcm1hdHRpbmc+Ojp0eXBlPihm bXQgJiBYbWxGb3JtYXR0aW5nOjpJbmRlbnQpKTsKLSAgICB9Ci0KLX0gLy8gYW5vbnltb3VzIG5h bWVzcGFjZQotCi0gICAgWG1sRm9ybWF0dGluZyBvcGVyYXRvciB8IChYbWxGb3JtYXR0aW5nIGxo cywgWG1sRm9ybWF0dGluZyByaHMpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFhtbEZv cm1hdHRpbmc+KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp1bmRlcmx5aW5nX3R5cGU8 WG1sRm9ybWF0dGluZz46OnR5cGU+KGxocykgfAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3Rk Ojp1bmRlcmx5aW5nX3R5cGU8WG1sRm9ybWF0dGluZz46OnR5cGU+KHJocykKLSAgICAgICAgKTsK LSAgICB9Ci0KLSAgICBYbWxGb3JtYXR0aW5nIG9wZXJhdG9yICYgKFhtbEZvcm1hdHRpbmcgbGhz LCBYbWxGb3JtYXR0aW5nIHJocykgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8WG1sRm9y bWF0dGluZz4oCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZTxY bWxGb3JtYXR0aW5nPjo6dHlwZT4obGhzKSAmCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6 OnVuZGVybHlpbmdfdHlwZTxYbWxGb3JtYXR0aW5nPjo6dHlwZT4ocmhzKQotICAgICAgICApOwot ICAgIH0KLQotICAgIFhtbEVuY29kZTo6WG1sRW5jb2RlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3Ry LCBGb3JXaGF0IGZvcldoYXQgKQotICAgIDogICBtX3N0ciggc3RyICksCi0gICAgICAgIG1fZm9y V2hhdCggZm9yV2hhdCApCi0gICAge30KLQotICAgIHZvaWQgWG1sRW5jb2RlOjplbmNvZGVUbygg c3RkOjpvc3RyZWFtJiBvcyApIGNvbnN0IHsKLSAgICAgICAgLy8gQXBvc3Ryb3BoZSBlc2NhcGlu ZyBub3QgbmVjZXNzYXJ5IGlmIHdlIGFsd2F5cyB1c2UgIiB0byB3cml0ZSBhdHRyaWJ1dGVzCi0g ICAgICAgIC8vIChzZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jc3ludGF4KQotCi0gICAg ICAgIGZvciggc3RkOjpzaXplX3QgaWR4ID0gMDsgaWR4IDwgbV9zdHIuc2l6ZSgpOyArKyBpZHgg KSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBtX3N0cltpZHhdOwotICAgICAgICAg ICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICc8JzogICBvcyA8PCAiJmx0OyI7IGJy ZWFrOwotICAgICAgICAgICAgY2FzZSAnJic6ICAgb3MgPDwgIiZhbXA7IjsgYnJlYWs7Ci0KLSAg ICAgICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgICAgIC8vIFNlZTogaHR0cDovL3d3dy53 My5vcmcvVFIveG1sLyNzeW50YXgKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID4gMiAmJiBtX3N0 cltpZHggLSAxXSA9PSAnXScgJiYgbV9zdHJbaWR4IC0gMl0gPT0gJ10nKQotICAgICAgICAgICAg ICAgICAgICBvcyA8PCAiJmd0OyI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg ICAgICAgICBvcyA8PCBjOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBj YXNlICdcIic6Ci0gICAgICAgICAgICAgICAgaWYgKG1fZm9yV2hhdCA9PSBGb3JBdHRyaWJ1dGVz KQotICAgICAgICAgICAgICAgICAgICBvcyA8PCAiJnF1b3Q7IjsKLSAgICAgICAgICAgICAgICBl bHNlCi0gICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7 Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNv bnRyb2wgY2hhcmFjdGVycyBhbmQgaW52YWxpZCB1dGYtOAotCi0gICAgICAgICAgICAgICAgLy8g RXNjYXBlIGNvbnRyb2wgY2hhcmFjdGVycyBpbiBzdGFuZGFyZCBhc2NpaQotICAgICAgICAgICAg ICAgIC8vIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNDEwNy93aHkt YXJlLWNvbnRyb2wtY2hhcmFjdGVycy1pbGxlZ2FsLWluLXhtbC0xLTAKLSAgICAgICAgICAgICAg ICBpZiAoYyA8IDB4MDkgfHwgKGMgPiAweDBEICYmIGMgPCAweDIwKSB8fCBjID09IDB4N0YpIHsK LSAgICAgICAgICAgICAgICAgICAgaGV4RXNjYXBlQ2hhcihvcywgYyk7Ci0gICAgICAgICAgICAg ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFBs YWluIEFTQ0lJOiBXcml0ZSBpdCB0byBzdHJlYW0KLSAgICAgICAgICAgICAgICBpZiAoYyA8IDB4 N0YpIHsKLSAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKLSAgICAgICAgICAgICAgICAgICAg YnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVVRGLTggdGVy cml0b3J5Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVuY29kaW5nIGlzIHZhbGlk IGFuZCBpZiBpdCBpcyBub3QsIGhleCBlc2NhcGUgYnl0ZXMuCi0gICAgICAgICAgICAgICAgLy8g SW1wb3J0YW50OiBXZSBkbyBub3QgY2hlY2sgdGhlIGV4YWN0IGRlY29kZWQgdmFsdWVzIGZvciB2 YWxpZGl0eSwgb25seSB0aGUgZW5jb2RpbmcgZm9ybWF0Ci0gICAgICAgICAgICAgICAgLy8gRmly c3QgY2hlY2sgdGhhdCB0aGlzIGJ5dGVzIGlzIGEgdmFsaWQgbGVhZCBieXRlOgotICAgICAgICAg ICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBub3QgZW5jb2RlZCBhcyAxMTExIDFYWFgK LSAgICAgICAgICAgICAgICAvLyBPciBhcyAxMFhYIFhYWFgKLSAgICAgICAgICAgICAgICBpZiAo YyA8ICAweEMwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGMgPj0gMHhGOCkgewotICAgICAgICAg ICAgICAgICAgICBoZXhFc2NhcGVDaGFyKG9zLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgYnJl YWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXV0byBlbmNCeXRlcyA9 IHRyYWlsaW5nQnl0ZXMoYyk7Ci0gICAgICAgICAgICAgICAgLy8gQXJlIHRoZXJlIGVub3VnaCBi eXRlcyBsZWZ0IHRvIGF2b2lkIGFjY2Vzc2luZyBvdXQtb2YtYm91bmRzIG1lbW9yeT8KLSAgICAg ICAgICAgICAgICBpZiAoaWR4ICsgZW5jQnl0ZXMgLSAxID49IG1fc3RyLnNpemUoKSkgewotICAg ICAgICAgICAgICAgICAgICBoZXhFc2NhcGVDaGFyKG9zLCBjKTsKLSAgICAgICAgICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRoZSBoZWFk ZXIgaXMgdmFsaWQsIGNoZWNrIGRhdGEKLSAgICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBlbmNC eXRlcyBieXRlcyBtdXN0IHRvZ2V0aGVyIGJlIGEgdmFsaWQgdXRmLTgKLSAgICAgICAgICAgICAg ICAvLyBUaGlzIG1lYW5zOiBiaXRwYXR0ZXJuIDEwWFggWFhYWCBhbmQgdGhlIGV4dHJhY3RlZCB2 YWx1ZSBpcyBzYW5lIChpc2gpCi0gICAgICAgICAgICAgICAgYm9vbCB2YWxpZCA9IHRydWU7Ci0g ICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUgPSBoZWFkZXJWYWx1ZShjKTsKLSAgICAgICAg ICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IG4gPSAxOyBuIDwgZW5jQnl0ZXM7ICsrbikgewotICAg ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG5jID0gbV9zdHJbaWR4ICsgbl07Ci0gICAg ICAgICAgICAgICAgICAgIHZhbGlkICY9ICgobmMgJiAweEMwKSA9PSAweDgwKTsKLSAgICAgICAg ICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgNikgfCAobmMgJiAweDNGKTsKLSAgICAgICAg ICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgIC8v IFdyb25nIGJpdCBwYXR0ZXJuIG9mIGZvbGxvd2luZyBieXRlcwotICAgICAgICAgICAgICAgICAg ICAoIXZhbGlkKSB8fAotICAgICAgICAgICAgICAgICAgICAvLyBPdmVybG9uZyBlbmNvZGluZ3MK LSAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDwgMHg4MCkgfHwKLSAgICAgICAgICAgICAgICAg ICAgKDB4ODAgPD0gdmFsdWUgJiYgdmFsdWUgPCAweDgwMCAgICYmIGVuY0J5dGVzID4gMikgfHwK LSAgICAgICAgICAgICAgICAgICAgKDB4ODAwIDwgdmFsdWUgJiYgdmFsdWUgPCAweDEwMDAwICYm IGVuY0J5dGVzID4gMykgfHwKLSAgICAgICAgICAgICAgICAgICAgLy8gRW5jb2RlZCB2YWx1ZSBv dXQgb2YgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgKHZhbHVlID49IDB4MTEwMDAwKQotICAg ICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICAgICAgaGV4RXNjYXBlQ2hhcihv cywgYyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQot ICAgICAgICAgICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGlzIGlzIGluIGZhY3QgYSB2YWxp ZChpc2gpIHV0Zi04IHNlcXVlbmNlCi0gICAgICAgICAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBu ID0gMDsgbiA8IGVuY0J5dGVzOyArK24pIHsKLSAgICAgICAgICAgICAgICAgICAgb3MgPDwgbV9z dHJbaWR4ICsgbl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlkeCArPSBl bmNCeXRlcyAtIDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAg ICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3Ry ZWFtJiBvcywgWG1sRW5jb2RlIGNvbnN0JiB4bWxFbmNvZGUgKSB7Ci0gICAgICAgIHhtbEVuY29k ZS5lbmNvZGVUbyggb3MgKTsKLSAgICAgICAgcmV0dXJuIG9zOwotICAgIH0KLQotICAgIFhtbFdy aXRlcjo6U2NvcGVkRWxlbWVudDo6U2NvcGVkRWxlbWVudCggWG1sV3JpdGVyKiB3cml0ZXIsIFht bEZvcm1hdHRpbmcgZm10ICkKLSAgICA6ICAgbV93cml0ZXIoIHdyaXRlciApLAotICAgICAgICBt X2ZtdChmbXQpCi0gICAge30KLQotICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudDo6U2NvcGVk RWxlbWVudCggU2NvcGVkRWxlbWVudCYmIG90aGVyICkgbm9leGNlcHQKLSAgICA6ICAgbV93cml0 ZXIoIG90aGVyLm1fd3JpdGVyICksCi0gICAgICAgIG1fZm10KG90aGVyLm1fZm10KQotICAgIHsK LSAgICAgICAgb3RoZXIubV93cml0ZXIgPSBudWxscHRyOwotICAgICAgICBvdGhlci5tX2ZtdCA9 IFhtbEZvcm1hdHRpbmc6Ok5vbmU7Ci0gICAgfQotICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVu dCYgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50OjpvcGVyYXRvcj0oIFNjb3BlZEVsZW1lbnQmJiBv dGhlciApIG5vZXhjZXB0IHsKLSAgICAgICAgaWYgKCBtX3dyaXRlciApIHsKLSAgICAgICAgICAg IG1fd3JpdGVyLT5lbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV93cml0ZXIgPSBv dGhlci5tX3dyaXRlcjsKLSAgICAgICAgb3RoZXIubV93cml0ZXIgPSBudWxscHRyOwotICAgICAg ICBtX2ZtdCA9IG90aGVyLm1fZm10OwotICAgICAgICBvdGhlci5tX2ZtdCA9IFhtbEZvcm1hdHRp bmc6Ok5vbmU7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBYbWxXcml0ZXI6 OlNjb3BlZEVsZW1lbnQ6On5TY29wZWRFbGVtZW50KCkgewotICAgICAgICBpZiAobV93cml0ZXIp IHsKLSAgICAgICAgICAgIG1fd3JpdGVyLT5lbmRFbGVtZW50KG1fZm10KTsKLSAgICAgICAgfQot ICAgIH0KLQotICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCYgWG1sV3JpdGVyOjpTY29wZWRF bGVtZW50Ojp3cml0ZVRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0LCBYbWxGb3JtYXR0aW5n IGZtdCApIHsKLSAgICAgICAgbV93cml0ZXItPndyaXRlVGV4dCggdGV4dCwgZm10ICk7Ci0gICAg ICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBYbWxXcml0ZXI6OlhtbFdyaXRlciggc3Rk Ojpvc3RyZWFtJiBvcyApIDogbV9vcyggb3MgKQotICAgIHsKLSAgICAgICAgd3JpdGVEZWNsYXJh dGlvbigpOwotICAgIH0KLQotICAgIFhtbFdyaXRlcjo6flhtbFdyaXRlcigpIHsKLSAgICAgICAg d2hpbGUgKCFtX3RhZ3MuZW1wdHkoKSkgewotICAgICAgICAgICAgZW5kRWxlbWVudCgpOwotICAg ICAgICB9Ci0gICAgICAgIG5ld2xpbmVJZk5lY2Vzc2FyeSgpOwotICAgIH0KLQotICAgIFhtbFdy aXRlciYgWG1sV3JpdGVyOjpzdGFydEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBY bWxGb3JtYXR0aW5nIGZtdCApIHsKLSAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7Ci0gICAgICAg IG5ld2xpbmVJZk5lY2Vzc2FyeSgpOwotICAgICAgICBpZiAoc2hvdWxkSW5kZW50KGZtdCkpIHsK LSAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQ7Ci0gICAgICAgICAgICBtX2luZGVudCArPSAi ICAiOwotICAgICAgICB9Ci0gICAgICAgIG1fb3MgPDwgJzwnIDw8IG5hbWU7Ci0gICAgICAgIG1f dGFncy5wdXNoX2JhY2soIG5hbWUgKTsKLSAgICAgICAgbV90YWdJc09wZW4gPSB0cnVlOwotICAg ICAgICBhcHBseUZvcm1hdHRpbmcoZm10KTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0K LQotICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBYbWxXcml0ZXI6OnNjb3BlZEVsZW1lbnQo IHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBYbWxGb3JtYXR0aW5nIGZtdCApIHsKLSAgICAgICAg U2NvcGVkRWxlbWVudCBzY29wZWQoIHRoaXMsIGZtdCApOwotICAgICAgICBzdGFydEVsZW1lbnQo IG5hbWUsIGZtdCApOwotICAgICAgICByZXR1cm4gc2NvcGVkOwotICAgIH0KLQotICAgIFhtbFdy aXRlciYgWG1sV3JpdGVyOjplbmRFbGVtZW50KFhtbEZvcm1hdHRpbmcgZm10KSB7Ci0gICAgICAg IG1faW5kZW50ID0gbV9pbmRlbnQuc3Vic3RyKDAsIG1faW5kZW50LnNpemUoKSAtIDIpOwotCi0g ICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKLSAgICAgICAgICAgIG1fb3MgPDwgIi8+IjsKLSAg ICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg ICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRJbmRlbnQo Zm10KSkgewotICAgICAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQ7Ci0gICAgICAgICAgICB9 Ci0gICAgICAgICAgICBtX29zIDw8ICI8LyIgPDwgbV90YWdzLmJhY2soKSA8PCAiPiI7Ci0gICAg ICAgIH0KLSAgICAgICAgbV9vcyA8PCBzdGQ6OmZsdXNoOwotICAgICAgICBhcHBseUZvcm1hdHRp bmcoZm10KTsKLSAgICAgICAgbV90YWdzLnBvcF9iYWNrKCk7Ci0gICAgICAgIHJldHVybiAqdGhp czsKLSAgICB9Ci0KLSAgICBYbWxXcml0ZXImIFhtbFdyaXRlcjo6d3JpdGVBdHRyaWJ1dGUoIHN0 ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgYXR0cmlidXRlICkgewot ICAgICAgICBpZiggIW5hbWUuZW1wdHkoKSAmJiAhYXR0cmlidXRlLmVtcHR5KCkgKQotICAgICAg ICAgICAgbV9vcyA8PCAnICcgPDwgbmFtZSA8PCAiPVwiIiA8PCBYbWxFbmNvZGUoIGF0dHJpYnV0 ZSwgWG1sRW5jb2RlOjpGb3JBdHRyaWJ1dGVzICkgPDwgJyInOwotICAgICAgICByZXR1cm4gKnRo aXM7Ci0gICAgfQotCi0gICAgWG1sV3JpdGVyJiBYbWxXcml0ZXI6OndyaXRlQXR0cmlidXRlKCBz dGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgYm9vbCBhdHRyaWJ1dGUgKSB7Ci0gICAgICAgIG1fb3Mg PDwgJyAnIDw8IG5hbWUgPDwgIj1cIiIgPDwgKCBhdHRyaWJ1dGUgPyAidHJ1ZSIgOiAiZmFsc2Ui ICkgPDwgJyInOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgWG1sV3JpdGVy JiBYbWxXcml0ZXI6OndyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIFhtbEZvcm1h dHRpbmcgZm10KSB7Ci0gICAgICAgIGlmKCAhdGV4dC5lbXB0eSgpICl7Ci0gICAgICAgICAgICBi b29sIHRhZ1dhc09wZW4gPSBtX3RhZ0lzT3BlbjsKLSAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3Nl ZCgpOwotICAgICAgICAgICAgaWYgKHRhZ1dhc09wZW4gJiYgc2hvdWxkSW5kZW50KGZtdCkpIHsK LSAgICAgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50OwotICAgICAgICAgICAgfQotICAgICAg ICAgICAgbV9vcyA8PCBYbWxFbmNvZGUoIHRleHQgKTsKLSAgICAgICAgICAgIGFwcGx5Rm9ybWF0 dGluZyhmbXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAg ICBYbWxXcml0ZXImIFhtbFdyaXRlcjo6d3JpdGVDb21tZW50KCBzdGQ6OnN0cmluZyBjb25zdCYg dGV4dCwgWG1sRm9ybWF0dGluZyBmbXQpIHsKLSAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7Ci0g ICAgICAgIGlmIChzaG91bGRJbmRlbnQoZm10KSkgewotICAgICAgICAgICAgbV9vcyA8PCBtX2lu ZGVudDsKLSAgICAgICAgfQotICAgICAgICBtX29zIDw8ICI8IS0tIiA8PCB0ZXh0IDw8ICItLT4i OwotICAgICAgICBhcHBseUZvcm1hdHRpbmcoZm10KTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwot ICAgIH0KLQotICAgIHZvaWQgWG1sV3JpdGVyOjp3cml0ZVN0eWxlc2hlZXRSZWYoIHN0ZDo6c3Ry aW5nIGNvbnN0JiB1cmwgKSB7Ci0gICAgICAgIG1fb3MgPDwgIjw/eG1sLXN0eWxlc2hlZXQgdHlw ZT1cInRleHQveHNsXCIgaHJlZj1cIiIgPDwgdXJsIDw8ICJcIj8+XG4iOwotICAgIH0KLQotICAg IFhtbFdyaXRlciYgWG1sV3JpdGVyOjp3cml0ZUJsYW5rTGluZSgpIHsKLSAgICAgICAgZW5zdXJl VGFnQ2xvc2VkKCk7Ci0gICAgICAgIG1fb3MgPDwgJ1xuJzsKLSAgICAgICAgcmV0dXJuICp0aGlz OwotICAgIH0KLQotICAgIHZvaWQgWG1sV3JpdGVyOjplbnN1cmVUYWdDbG9zZWQoKSB7Ci0gICAg ICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKLSAgICAgICAgICAgIG1fb3MgPDwgJz4nIDw8IHN0ZDo6 Zmx1c2g7Ci0gICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgIG1f dGFnSXNPcGVuID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIFhtbFdyaXRl cjo6YXBwbHlGb3JtYXR0aW5nKFhtbEZvcm1hdHRpbmcgZm10KSB7Ci0gICAgICAgIG1fbmVlZHNO ZXdsaW5lID0gc2hvdWxkTmV3bGluZShmbXQpOwotICAgIH0KLQotICAgIHZvaWQgWG1sV3JpdGVy Ojp3cml0ZURlY2xhcmF0aW9uKCkgewotICAgICAgICBtX29zIDw8ICI8P3htbCB2ZXJzaW9uPVwi MS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiI7Ci0gICAgfQotCi0gICAgdm9pZCBYbWxXcml0 ZXI6Om5ld2xpbmVJZk5lY2Vzc2FyeSgpIHsKLSAgICAgICAgaWYoIG1fbmVlZHNOZXdsaW5lICkg ewotICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICBtX25lZWRzTmV3 bGluZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQotLy8gZW5kIGNhdGNoX3htbHdyaXRl ci5jcHAKLS8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2Jhc2VzLmNwcAotCi0jaW5jbHVkZSA8Y3N0 cmluZz4KLSNpbmNsdWRlIDxjZmxvYXQ+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNh c3NlcnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIHZvaWQg cHJlcGFyZUV4cGFuZGVkRXhwcmVzc2lvbihBc3NlcnRpb25SZXN1bHQmIHJlc3VsdCkgewotICAg ICAgICByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgLy8gQmVj YXVzZSBmb3JtYXR0aW5nIHVzaW5nIGMrKyBzdHJlYW1zIGlzIHN0YXRlZnVsLCBkcm9wIGRvd24g dG8gQyBpcyByZXF1aXJlZAotICAgIC8vIEFsdGVybmF0aXZlbHkgd2UgY291bGQgdXNlIHN0cmlu Z3N0cmVhbSwgYnV0IGl0cyBwZXJmb3JtYW5jZSBpcy4uLiBub3QgZ29vZC4KLSAgICBzdGQ6OnN0 cmluZyBnZXRGb3JtYXR0ZWREdXJhdGlvbiggZG91YmxlIGR1cmF0aW9uICkgewotICAgICAgICAv LyBNYXggZXhwb25lbnQgKyAxIGlzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgcGFy dAotICAgICAgICAvLyArIDEgZm9yIGRlY2ltYWwgcG9pbnQKLSAgICAgICAgLy8gKyAzIGZvciB0 aGUgMyBkZWNpbWFsIHBsYWNlcwotICAgICAgICAvLyArIDEgZm9yIG51bGwgdGVybWluYXRvcgot ICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBtYXhEb3VibGVTaXplID0gREJMX01BWF8xMF9FWFAg KyAxICsgMSArIDMgKyAxOwotICAgICAgICBjaGFyIGJ1ZmZlclttYXhEb3VibGVTaXplXTsKLQot ICAgICAgICAvLyBTYXZlIHByZXZpb3VzIGVycm5vLCB0byBwcmV2ZW50IHNwcmludGYgZnJvbSBv dmVyd3JpdGluZyBpdAotICAgICAgICBFcnJub0d1YXJkIGd1YXJkOwotI2lmZGVmIF9NU0NfVkVS Ci0gICAgICAgIHNwcmludGZfcyhidWZmZXIsICIlLjNmIiwgZHVyYXRpb24pOwotI2Vsc2UKLSAg ICAgICAgc3RkOjpzcHJpbnRmKGJ1ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7Ci0jZW5kaWYKLSAg ICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgYm9vbCBzaG91 bGRTaG93RHVyYXRpb24oIElDb25maWcgY29uc3QmIGNvbmZpZywgZG91YmxlIGR1cmF0aW9uICkg ewotICAgICAgICBpZiAoIGNvbmZpZy5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6 QWx3YXlzICkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAg aWYgKCBjb25maWcuc2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6Ok5ldmVyICkgewot ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGRvdWJs ZSBtaW4gPSBjb25maWcubWluRHVyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIG1pbiA+PSAwICYm IGR1cmF0aW9uID49IG1pbjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVGaWx0 ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGNvbnRhaW5lciApIHsKLSAgICAg ICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gb3NzOwotICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsK LSAgICAgICAgZm9yIChhdXRvJiYgZmlsdGVyIDogY29udGFpbmVyKQotICAgICAgICB7Ci0gICAg ICAgICAgICBpZiAoIWZpcnN0KQotICAgICAgICAgICAgICAgIG9zcyA8PCAnICc7Ci0gICAgICAg ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLQotICAgICAgICAgICAg b3NzIDw8IGZpbHRlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3NzLnN0cigpOwotICAg IH0KLQotICAgIFRlc3RFdmVudExpc3RlbmVyQmFzZTo6VGVzdEV2ZW50TGlzdGVuZXJCYXNlKFJl cG9ydGVyQ29uZmlnIGNvbnN0ICYgX2NvbmZpZykKLSAgICAgICAgOlN0cmVhbWluZ1JlcG9ydGVy QmFzZShfY29uZmlnKSB7fQotCi0gICAgc3RkOjpzZXQ8VmVyYm9zaXR5PiBUZXN0RXZlbnRMaXN0 ZW5lckJhc2U6OmdldFN1cHBvcnRlZFZlcmJvc2l0aWVzKCkgewotICAgICAgICByZXR1cm4geyBW ZXJib3NpdHk6OlF1aWV0LCBWZXJib3NpdHk6Ok5vcm1hbCwgVmVyYm9zaXR5OjpIaWdoIH07Ci0g ICAgfQotCi0gICAgdm9pZCBUZXN0RXZlbnRMaXN0ZW5lckJhc2U6OmFzc2VydGlvblN0YXJ0aW5n KEFzc2VydGlvbkluZm8gY29uc3QgJikge30KLQotICAgIGJvb2wgVGVzdEV2ZW50TGlzdGVuZXJC YXNlOjphc3NlcnRpb25FbmRlZChBc3NlcnRpb25TdGF0cyBjb25zdCAmKSB7Ci0gICAgICAgIHJl dHVybiBmYWxzZTsKLSAgICB9Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotLy8gZW5kIGNh dGNoX3JlcG9ydGVyX2Jhc2VzLmNwcAotLy8gc3RhcnQgY2F0Y2hfcmVwb3J0ZXJfY29tcGFjdC5j cHAKLQotbmFtZXNwYWNlIHsKLQotI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQwotICAgIGNvbnN0 IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJGQUlMRUQiOyB9Ci0gICAgY29uc3QgY2hh ciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gIlBBU1NFRCI7IH0KLSNlbHNlCi0gICAgY29uc3Qg Y2hhciogZmFpbGVkU3RyaW5nKCkgeyByZXR1cm4gImZhaWxlZCI7IH0KLSAgICBjb25zdCBjaGFy KiBwYXNzZWRTdHJpbmcoKSB7IHJldHVybiAicGFzc2VkIjsgfQotI2VuZGlmCi0KLSAgICAvLyBD b2xvdXI6OkxpZ2h0R3JleQotICAgIENhdGNoOjpDb2xvdXI6OkNvZGUgZGltQ29sb3VyKCkgeyBy ZXR1cm4gQ2F0Y2g6OkNvbG91cjo6RmlsZU5hbWU7IH0KLQotICAgIHN0ZDo6c3RyaW5nIGJvdGhP ckFsbCggc3RkOjpzaXplX3QgY291bnQgKSB7Ci0gICAgICAgIHJldHVybiBjb3VudCA9PSAxID8g c3RkOjpzdHJpbmcoKSA6Ci0gICAgICAgICAgICAgICBjb3VudCA9PSAyID8gImJvdGggIiA6ICJh bGwgIiA7Ci0gICAgfQotCi19IC8vIGFub24gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBDYXRjaCB7 Ci1uYW1lc3BhY2UgewotLy8gQ29sb3VyLCBtZXNzYWdlIHZhcmlhbnRzOgotLy8gLSB3aGl0ZTog Tm8gdGVzdHMgcmFuLgotLy8gLSAgIHJlZDogRmFpbGVkIFtib3RoL2FsbF0gTiB0ZXN0IGNhc2Vz LCBmYWlsZWQgW2JvdGgvYWxsXSBNIGFzc2VydGlvbnMuCi0vLyAtIHdoaXRlOiBQYXNzZWQgW2Jv dGgvYWxsXSBOIHRlc3QgY2FzZXMgKG5vIGFzc2VydGlvbnMpLgotLy8gLSAgIHJlZDogRmFpbGVk IE4gdGVzdHMgY2FzZXMsIGZhaWxlZCBNIGFzc2VydGlvbnMuCi0vLyAtIGdyZWVuOiBQYXNzZWQg W2JvdGgvYWxsXSBOIHRlc3RzIGNhc2VzIHdpdGggTSBhc3NlcnRpb25zLgotdm9pZCBwcmludFRv dGFscyhzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgVG90YWxzJiB0b3RhbHMpIHsKLSAgICBpZiAo dG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDApIHsKLSAgICAgICAgb3V0IDw8ICJObyB0ZXN0 cyByYW4uIjsKLSAgICB9IGVsc2UgaWYgKHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID09IHRvdGFs cy50ZXN0Q2FzZXMudG90YWwoKSkgewotICAgICAgICBDb2xvdXIgY29sb3VyKENvbG91cjo6UmVz dWx0RXJyb3IpOwotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBxdWFsaWZ5X2Fzc2VydGlvbnNf ZmFpbGVkID0KLSAgICAgICAgICAgIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCA9PSB0b3RhbHMu YXNzZXJ0aW9ucy50b3RhbCgpID8KLSAgICAgICAgICAgIGJvdGhPckFsbCh0b3RhbHMuYXNzZXJ0 aW9ucy5mYWlsZWQpIDogc3RkOjpzdHJpbmcoKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAg ICAiRmFpbGVkICIgPDwgYm90aE9yQWxsKHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKQotICAgICAg ICAgICAgPDwgcGx1cmFsaXNlKHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCAidGVzdCBjYXNlIikg PDwgIiwgIgotICAgICAgICAgICAgImZhaWxlZCAiIDw8IHF1YWxpZnlfYXNzZXJ0aW9uc19mYWls ZWQgPDwKLSAgICAgICAgICAgIHBsdXJhbGlzZSh0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQsICJh c3NlcnRpb24iKSA8PCAnLic7Ci0gICAgfSBlbHNlIGlmICh0b3RhbHMuYXNzZXJ0aW9ucy50b3Rh bCgpID09IDApIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAiUGFzc2VkICIgPDwgYm90 aE9yQWxsKHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSkKLSAgICAgICAgICAgIDw8IHBsdXJhbGlz ZSh0b3RhbHMudGVzdENhc2VzLnRvdGFsKCksICJ0ZXN0IGNhc2UiKQotICAgICAgICAgICAgPDwg IiAobm8gYXNzZXJ0aW9ucykuIjsKLSAgICB9IGVsc2UgaWYgKHRvdGFscy5hc3NlcnRpb25zLmZh aWxlZCkgewotICAgICAgICBDb2xvdXIgY29sb3VyKENvbG91cjo6UmVzdWx0RXJyb3IpOwotICAg ICAgICBvdXQgPDwKLSAgICAgICAgICAgICJGYWlsZWQgIiA8PCBwbHVyYWxpc2UodG90YWxzLnRl c3RDYXNlcy5mYWlsZWQsICJ0ZXN0IGNhc2UiKSA8PCAiLCAiCi0gICAgICAgICAgICAiZmFpbGVk ICIgPDwgcGx1cmFsaXNlKHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCwgImFzc2VydGlvbiIpIDw8 ICcuJzsKLSAgICB9IGVsc2UgewotICAgICAgICBDb2xvdXIgY29sb3VyKENvbG91cjo6UmVzdWx0 U3VjY2Vzcyk7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhP ckFsbCh0b3RhbHMudGVzdENhc2VzLnBhc3NlZCkKLSAgICAgICAgICAgIDw8IHBsdXJhbGlzZSh0 b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgInRlc3QgY2FzZSIpIDw8Ci0gICAgICAgICAgICAiIHdp dGggIiA8PCBwbHVyYWxpc2UodG90YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIikg PDwgJy4nOwotICAgIH0KLX0KLQotLy8gSW1wbGVtZW50YXRpb24gb2YgQ29tcGFjdFJlcG9ydGVy IGZvcm1hdHRpbmcKLWNsYXNzIEFzc2VydGlvblByaW50ZXIgewotcHVibGljOgotICAgIEFzc2Vy dGlvblByaW50ZXImIG9wZXJhdG9yPSAoQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYpID0gZGVsZXRl OwotICAgIEFzc2VydGlvblByaW50ZXIoQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYpID0gZGVsZXRl OwotICAgIEFzc2VydGlvblByaW50ZXIoc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25T dGF0cyBjb25zdCYgX3N0YXRzLCBib29sIF9wcmludEluZm9NZXNzYWdlcykKLSAgICAgICAgOiBz dHJlYW0oX3N0cmVhbSkKLSAgICAgICAgLCByZXN1bHQoX3N0YXRzLmFzc2VydGlvblJlc3VsdCkK LSAgICAgICAgLCBtZXNzYWdlcyhfc3RhdHMuaW5mb01lc3NhZ2VzKQotICAgICAgICAsIGl0TWVz c2FnZShfc3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCkpCi0gICAgICAgICwgcHJpbnRJbmZvTWVz c2FnZXMoX3ByaW50SW5mb01lc3NhZ2VzKSB7fQotCi0gICAgdm9pZCBwcmludCgpIHsKLSAgICAg ICAgcHJpbnRTb3VyY2VJbmZvKCk7Ci0KLSAgICAgICAgaXRNZXNzYWdlID0gbWVzc2FnZXMuYmVn aW4oKTsKLQotICAgICAgICBzd2l0Y2ggKHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkpIHsKLSAgICAg ICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgotICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKENvbG91 cjo6UmVzdWx0U3VjY2VzcywgcGFzc2VkU3RyaW5nKCkpOwotICAgICAgICAgICAgcHJpbnRPcmln aW5hbEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Np b24oKTsKLSAgICAgICAgICAgIGlmICghcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSkKLSAgICAgICAg ICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKENvbG91cjo6Tm9uZSk7Ci0gICAgICAgICAg ICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOwotICAgICAg ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgot ICAgICAgICAgICAgaWYgKHJlc3VsdC5pc09rKCkpCi0gICAgICAgICAgICAgICAgcHJpbnRSZXN1 bHRUeXBlKENvbG91cjo6UmVzdWx0U3VjY2VzcywgZmFpbGVkU3RyaW5nKCkgKyBzdGQ6OnN0cmlu ZygiIC0gYnV0IHdhcyBvayIpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBw cmludFJlc3VsdFR5cGUoQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkpOwotICAgICAgICAg ICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIHByaW50UmVjb25zdHJ1 Y3RlZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsK LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRp b246Ci0gICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoQ29sb3VyOjpFcnJvciwgZmFpbGVkU3Ry aW5nKCkpOwotICAgICAgICAgICAgcHJpbnRJc3N1ZSgidW5leHBlY3RlZCBleGNlcHRpb24gd2l0 aCBtZXNzYWdlOiIpOwotICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBw cmludEV4cHJlc3Npb25XYXMoKTsKLSAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMo KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJv ckNvbmRpdGlvbjoKLSAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZShDb2xvdXI6OkVycm9yLCBm YWlsZWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBwcmludElzc3VlKCJmYXRhbCBlcnJvciBjb25k aXRpb24gd2l0aCBtZXNzYWdlOiIpOwotICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7Ci0gICAg ICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKLSAgICAgICAgICAgIHByaW50UmVtYWluaW5n TWVzc2FnZXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6 RGlkbnRUaHJvd0V4Y2VwdGlvbjoKLSAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZShDb2xvdXI6 OkVycm9yLCBmYWlsZWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBwcmludElzc3VlKCJleHBlY3Rl ZCBleGNlcHRpb24sIGdvdCBub25lIik7Ci0gICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMo KTsKLSAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKLSAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKLSAgICAgICAgICAgIHByaW50UmVz dWx0VHlwZShDb2xvdXI6Ok5vbmUsICJpbmZvIik7Ci0gICAgICAgICAgICBwcmludE1lc3NhZ2Uo KTsKLSAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKLSAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKLSAgICAgICAgICAgIHByaW50 UmVzdWx0VHlwZShDb2xvdXI6Ok5vbmUsICJ3YXJuaW5nIik7Ci0gICAgICAgICAgICBwcmludE1l c3NhZ2UoKTsKLSAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKLSAgICAgICAg ICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgotICAg ICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpKTsK LSAgICAgICAgICAgIHByaW50SXNzdWUoImV4cGxpY2l0bHkiKTsKLSAgICAgICAgICAgIHByaW50 UmVtYWluaW5nTWVzc2FnZXMoQ29sb3VyOjpOb25lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg ICAgICAgICAgLy8gVGhlc2UgY2FzZXMgYXJlIGhlcmUgdG8gcHJldmVudCBjb21waWxlciB3YXJu aW5ncwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6VW5rbm93bjoKLSAgICAgICAgY2FzZSBSZXN1 bHRXYXM6OkZhaWx1cmVCaXQ6Ci0gICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeGNlcHRpb246Ci0g ICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoQ29sb3VyOjpFcnJvciwgIioqIGludGVybmFsIGVy cm9yICoqIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0 ZToKLSAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKLSAgICAgICAgQ29sb3VyIGNv bG91ckd1YXJkKENvbG91cjo6RmlsZU5hbWUpOwotICAgICAgICBzdHJlYW0gPDwgcmVzdWx0Lmdl dFNvdXJjZUluZm8oKSA8PCAnOic7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFJlc3VsdFR5cGUo Q29sb3VyOjpDb2RlIGNvbG91ciwgc3RkOjpzdHJpbmcgY29uc3QmIHBhc3NPckZhaWwpIGNvbnN0 IHsKLSAgICAgICAgaWYgKCFwYXNzT3JGYWlsLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHsKLSAg ICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoY29sb3VyKTsKLSAgICAgICAgICAgICAg ICBzdHJlYW0gPDwgJyAnIDw8IHBhc3NPckZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg ICBzdHJlYW0gPDwgJzonOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludElzc3Vl KHN0ZDo6c3RyaW5nIGNvbnN0JiBpc3N1ZSkgY29uc3QgewotICAgICAgICBzdHJlYW0gPDwgJyAn IDw8IGlzc3VlOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnRFeHByZXNzaW9uV2FzKCkgewotICAg ICAgICBpZiAocmVzdWx0Lmhhc0V4cHJlc3Npb24oKSkgewotICAgICAgICAgICAgc3RyZWFtIDw8 ICc7JzsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKGRpbUNv bG91cigpKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBleHByZXNzaW9uIHdhczoiOwot ICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKLSAg ICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25z dCB7Ci0gICAgICAgIGlmIChyZXN1bHQuaGFzRXhwcmVzc2lvbigpKSB7Ci0gICAgICAgICAgICBz dHJlYW0gPDwgJyAnIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uKCk7Ci0gICAgICAgIH0KLSAgICB9 Ci0KLSAgICB2b2lkIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7Ci0gICAg ICAgIGlmIChyZXN1bHQuaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkpIHsKLSAgICAgICAgICAgIHsK LSAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKGRpbUNvbG91cigpKTsKLSAgICAgICAgICAg ICAgICBzdHJlYW0gPDwgIiBmb3I6ICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJl YW0gPDwgcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpOwotICAgICAgICB9Ci0gICAgfQot Ci0gICAgdm9pZCBwcmludE1lc3NhZ2UoKSB7Ci0gICAgICAgIGlmIChpdE1lc3NhZ2UgIT0gbWVz c2FnZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+ bWVzc2FnZSA8PCAnXCcnOwotICAgICAgICAgICAgKytpdE1lc3NhZ2U7Ci0gICAgICAgIH0KLSAg ICB9Ci0KLSAgICB2b2lkIHByaW50UmVtYWluaW5nTWVzc2FnZXMoQ29sb3VyOjpDb2RlIGNvbG91 ciA9IGRpbUNvbG91cigpKSB7Ci0gICAgICAgIGlmIChpdE1lc3NhZ2UgPT0gbWVzc2FnZXMuZW5k KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgY29uc3QgYXV0byBpdEVuZCA9IG1l c3NhZ2VzLmNlbmQoKTsKLSAgICAgICAgY29uc3QgYXV0byBOID0gc3RhdGljX2Nhc3Q8c3RkOjpz aXplX3Q+KHN0ZDo6ZGlzdGFuY2UoaXRNZXNzYWdlLCBpdEVuZCkpOwotCi0gICAgICAgIHsKLSAg ICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZChjb2xvdXIpOwotICAgICAgICAgICAgc3RyZWFt IDw8ICIgd2l0aCAiIDw8IHBsdXJhbGlzZShOLCAibWVzc2FnZSIpIDw8ICc6JzsKLSAgICAgICAg fQotCi0gICAgICAgIHdoaWxlIChpdE1lc3NhZ2UgIT0gaXRFbmQpIHsKLSAgICAgICAgICAgIC8v IElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMK LSAgICAgICAgICAgIGlmIChwcmludEluZm9NZXNzYWdlcyB8fCBpdE1lc3NhZ2UtPnR5cGUgIT0g UmVzdWx0V2FzOjpJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7Ci0gICAg ICAgICAgICAgICAgaWYgKGl0TWVzc2FnZSAhPSBpdEVuZCkgewotICAgICAgICAgICAgICAgICAg ICBDb2xvdXIgY29sb3VyR3VhcmQoZGltQ29sb3VyKCkpOwotICAgICAgICAgICAgICAgICAgICBz dHJlYW0gPDwgIiBhbmQiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250 aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsraXRNZXNzYWdlOwotICAgICAgICB9 Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOwotICAgIEFzc2Vy dGlvblJlc3VsdCBjb25zdCYgcmVzdWx0OwotICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBt ZXNzYWdlczsKLSAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0 TWVzc2FnZTsKLSAgICBib29sIHByaW50SW5mb01lc3NhZ2VzOwotfTsKLQotfSAvLyBhbm9uIG5h bWVzcGFjZQotCi0gICAgICAgIHN0ZDo6c3RyaW5nIENvbXBhY3RSZXBvcnRlcjo6Z2V0RGVzY3Jp cHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIGEg c2luZ2xlIGxpbmUsIHN1aXRhYmxlIGZvciBJREVzIjsKLSAgICAgICAgfQotCi0gICAgICAgIHZv aWQgQ29tcGFjdFJlcG9ydGVyOjpub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25z dCYgc3BlYyApIHsKLSAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVk ICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2 b2lkIENvbXBhY3RSZXBvcnRlcjo6YXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29u c3QmICkge30KLQotICAgICAgICBib29sIENvbXBhY3RSZXBvcnRlcjo6YXNzZXJ0aW9uRW5kZWQo IEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMgKSB7Ci0gICAgICAgICAgICBB c3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25S ZXN1bHQ7Ci0KLSAgICAgICAgICAgIGJvb2wgcHJpbnRJbmZvTWVzc2FnZXMgPSB0cnVlOwotCi0g ICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlJ3Jl IG5vdCBwcmludGluZyB0aG9zZQotICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+aW5jbHVkZVN1 Y2Nlc3NmdWxSZXN1bHRzKCkgJiYgcmVzdWx0LmlzT2soKSApIHsKLSAgICAgICAgICAgICAgICBp ZiggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQotICAgICAg ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVz c2FnZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXNzZXJ0aW9uUHJp bnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgcHJpbnRJbmZvTWVzc2FnZXMg KTsKLSAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKLQotICAgICAgICAgICAgc3RyZWFtIDw8 IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAg ICAgdm9pZCBDb21wYWN0UmVwb3J0ZXI6OnNlY3Rpb25FbmRlZChTZWN0aW9uU3RhdHMgY29uc3Qm IF9zZWN0aW9uU3RhdHMpIHsKLSAgICAgICAgICAgIGRvdWJsZSBkdXIgPSBfc2VjdGlvblN0YXRz LmR1cmF0aW9uSW5TZWNvbmRzOwotICAgICAgICAgICAgaWYgKCBzaG91bGRTaG93RHVyYXRpb24o ICptX2NvbmZpZywgZHVyICkgKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1h dHRlZER1cmF0aW9uKCBkdXIgKSA8PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5m by5uYW1lIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAg IHZvaWQgQ29tcGFjdFJlcG9ydGVyOjp0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYg X3Rlc3RSdW5TdGF0cyApIHsKLSAgICAgICAgICAgIHByaW50VG90YWxzKCBzdHJlYW0sIF90ZXN0 UnVuU3RhdHMudG90YWxzICk7Ci0gICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVu ZGw7Ci0gICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rl c3RSdW5TdGF0cyApOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29tcGFjdFJlcG9ydGVyOjp+Q29t cGFjdFJlcG9ydGVyKCkge30KLQotICAgIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29tcGFj dCIsIENvbXBhY3RSZXBvcnRlciApCi0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAotLy8gZW5k IGNhdGNoX3JlcG9ydGVyX2NvbXBhY3QuY3BwCi0vLyBzdGFydCBjYXRjaF9yZXBvcnRlcl9jb25z b2xlLmNwcAotCi0jaW5jbHVkZSA8Y2Zsb2F0PgotI2luY2x1ZGUgPGNzdGRpbz4KLQotI2lmIGRl ZmluZWQoX01TQ19WRVIpCi0jcHJhZ21hIHdhcm5pbmcocHVzaCkKLSNwcmFnbWEgd2FybmluZyhk aXNhYmxlOjQwNjEpIC8vIE5vdCBhbGwgbGFiZWxzIGFyZSBFWFBMSUNJVExZIGhhbmRsZWQgaW4g c3dpdGNoCi0gLy8gTm90ZSB0aGF0IDQwNjIgKG5vdCBhbGwgbGFiZWxzIGFyZSBoYW5kbGVkIGFu ZCBkZWZhdWx0IGlzIG1pc3NpbmcpIGlzIGVuYWJsZWQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChf X2NsYW5nX18pCi0jICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0vLyBGb3Igc2ltcGxp Y2l0eSwgYmVuY2htYXJraW5nLW9ubHkgaGVscGVycyBhcmUgYWx3YXlzIGVuYWJsZWQKLSMgIHBy YWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWZ1bmN0aW9uIgotI2VuZGlm Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEZvcm1hdHRlciBpbXBs IGZvciBDb25zb2xlUmVwb3J0ZXIKLWNsYXNzIENvbnNvbGVBc3NlcnRpb25QcmludGVyIHsKLXB1 YmxpYzoKLSAgICBDb25zb2xlQXNzZXJ0aW9uUHJpbnRlciYgb3BlcmF0b3I9IChDb25zb2xlQXNz ZXJ0aW9uUHJpbnRlciBjb25zdCYpID0gZGVsZXRlOwotICAgIENvbnNvbGVBc3NlcnRpb25Qcmlu dGVyKENvbnNvbGVBc3NlcnRpb25QcmludGVyIGNvbnN0JikgPSBkZWxldGU7Ci0gICAgQ29uc29s ZUFzc2VydGlvblByaW50ZXIoc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBj b25zdCYgX3N0YXRzLCBib29sIF9wcmludEluZm9NZXNzYWdlcykKLSAgICAgICAgOiBzdHJlYW0o X3N0cmVhbSksCi0gICAgICAgIHN0YXRzKF9zdGF0cyksCi0gICAgICAgIHJlc3VsdChfc3RhdHMu YXNzZXJ0aW9uUmVzdWx0KSwKLSAgICAgICAgY29sb3VyKENvbG91cjo6Tm9uZSksCi0gICAgICAg IG1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSksCi0gICAgICAgIG1lc3NhZ2VzKF9zdGF0cy5p bmZvTWVzc2FnZXMpLAotICAgICAgICBwcmludEluZm9NZXNzYWdlcyhfcHJpbnRJbmZvTWVzc2Fn ZXMpIHsKLSAgICAgICAgc3dpdGNoIChyZXN1bHQuZ2V0UmVzdWx0VHlwZSgpKSB7Ci0gICAgICAg IGNhc2UgUmVzdWx0V2FzOjpPazoKLSAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2Vz czsKLSAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiUEFTU0VEIjsKLSAgICAgICAgICAgIC8vaWYo IHJlc3VsdC5oYXNNZXNzYWdlKCkgKQotICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2Fn ZXMuc2l6ZSgpID09IDEpCi0gICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVz c2FnZSI7Ci0gICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQot ICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKLSAgICAgICAg ICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKLSAg ICAgICAgICAgIGlmIChyZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgY29sb3VyID0g Q29sb3VyOjpTdWNjZXNzOwotICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIC0g YnV0IHdhcyBvayI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbG91 ciA9IENvbG91cjo6RXJyb3I7Ci0gICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQi OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6 ZSgpID09IDEpCi0gICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7 Ci0gICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQotICAgICAg ICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKLSAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246Ci0gICAgICAgICAg ICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOwotICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlM RUQiOwotICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImR1ZSB0byB1bmV4cGVjdGVkIGV4Y2Vw dGlvbiB3aXRoICI7Ci0gICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkg PT0gMSkKLSAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2UiOwotICAgICAg ICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSkKLSAgICAgICAgICAgICAg ICBtZXNzYWdlTGFiZWwgKz0gIm1lc3NhZ2VzIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKLSAgICAgICAgICAgIGNvbG91 ciA9IENvbG91cjo6RXJyb3I7Ci0gICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7Ci0g ICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9u IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJv d0V4Y2VwdGlvbjoKLSAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7Ci0gICAgICAg ICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7Ci0gICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAi YmVjYXVzZSBubyBleGNlcHRpb24gd2FzIHRocm93biB3aGVyZSBvbmUgd2FzIGV4cGVjdGVkIjsK LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKLSAgICAg ICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJpbmZvIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKLSAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3 YXJuaW5nIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhw bGljaXRGYWlsdXJlOgotICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOwotICAgICAg ICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKLSAgICAgICAgICAgIGlmIChfc3RhdHMuaW5m b01lc3NhZ2VzLnNpemUoKSA9PSAxKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJl eHBsaWNpdGx5IHdpdGggbWVzc2FnZSI7Ci0gICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNz YWdlcy5zaXplKCkgPiAxKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNp dGx5IHdpdGggbWVzc2FnZXMiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvLyBU aGVzZSBjYXNlcyBhcmUgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCi0gICAgICAg IGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgotICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVy ZUJpdDoKLSAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKLSAgICAgICAgICAgIHBh c3NPckZhaWwgPSAiKiogaW50ZXJuYWwgZXJyb3IgKioiOwotICAgICAgICAgICAgY29sb3VyID0g Q29sb3VyOjpFcnJvcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0g ICAgdm9pZCBwcmludCgpIGNvbnN0IHsKLSAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7Ci0gICAg ICAgIGlmIChzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID4gMCkgewotICAgICAgICAg ICAgcHJpbnRSZXN1bHRUeXBlKCk7Ci0gICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lv bigpOwotICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOwotICAgICAg ICB9IGVsc2UgewotICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7Ci0gICAgICAgIH0KLSAgICAg ICAgcHJpbnRNZXNzYWdlKCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHZvaWQgcHJpbnRSZXN1 bHRUeXBlKCkgY29uc3QgewotICAgICAgICBpZiAoIXBhc3NPckZhaWwuZW1wdHkoKSkgewotICAg ICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKGNvbG91cik7Ci0gICAgICAgICAgICBzdHJlYW0g PDwgcGFzc09yRmFpbCA8PCAiOlxuIjsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIHByaW50 T3JpZ2luYWxFeHByZXNzaW9uKCkgY29uc3QgewotICAgICAgICBpZiAocmVzdWx0Lmhhc0V4cHJl c3Npb24oKSkgewotICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKENvbG91cjo6T3JpZ2lu YWxFeHByZXNzaW9uKTsKLSAgICAgICAgICAgIHN0cmVhbSA8PCAiICAiOwotICAgICAgICAgICAg c3RyZWFtIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uSW5NYWNybygpOwotICAgICAgICAgICAgc3Ry ZWFtIDw8ICdcbic7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBwcmludFJlY29uc3RydWN0 ZWRFeHByZXNzaW9uKCkgY29uc3QgewotICAgICAgICBpZiAocmVzdWx0Lmhhc0V4cGFuZGVkRXhw cmVzc2lvbigpKSB7Ci0gICAgICAgICAgICBzdHJlYW0gPDwgIndpdGggZXhwYW5zaW9uOlxuIjsK LSAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZChDb2xvdXI6OlJlY29uc3RydWN0ZWRFeHBy ZXNzaW9uKTsKLSAgICAgICAgICAgIHN0cmVhbSA8PCBDb2x1bW4ocmVzdWx0LmdldEV4cGFuZGVk RXhwcmVzc2lvbigpKS5pbmRlbnQoMikgPDwgJ1xuJzsKLSAgICAgICAgfQotICAgIH0KLSAgICB2 b2lkIHByaW50TWVzc2FnZSgpIGNvbnN0IHsKLSAgICAgICAgaWYgKCFtZXNzYWdlTGFiZWwuZW1w dHkoKSkKLSAgICAgICAgICAgIHN0cmVhbSA8PCBtZXNzYWdlTGFiZWwgPDwgJzonIDw8ICdcbic7 Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCYgbXNnIDogbWVzc2FnZXMpIHsKLSAgICAgICAgICAg IC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2Fn ZXMKLSAgICAgICAgICAgIGlmIChwcmludEluZm9NZXNzYWdlcyB8fCBtc2cudHlwZSAhPSBSZXN1 bHRXYXM6OkluZm8pCi0gICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbHVtbihtc2cubWVzc2Fn ZSkuaW5kZW50KDIpIDw8ICdcbic7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBwcmludFNv dXJjZUluZm8oKSBjb25zdCB7Ci0gICAgICAgIENvbG91ciBjb2xvdXJHdWFyZChDb2xvdXI6OkZp bGVOYW1lKTsKLSAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgIjog IjsKLSAgICB9Ci0KLSAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKLSAgICBBc3NlcnRpb25TdGF0 cyBjb25zdCYgc3RhdHM7Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7Ci0gICAg Q29sb3VyOjpDb2RlIGNvbG91cjsKLSAgICBzdGQ6OnN0cmluZyBwYXNzT3JGYWlsOwotICAgIHN0 ZDo6c3RyaW5nIG1lc3NhZ2VMYWJlbDsKLSAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOwotICAgIHN0 ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKLSAgICBib29sIHByaW50SW5mb01lc3Nh Z2VzOwotfTsKLQotc3RkOjpzaXplX3QgbWFrZVJhdGlvKHN0ZDo6c2l6ZV90IG51bWJlciwgc3Rk OjpzaXplX3QgdG90YWwpIHsKLSAgICBzdGQ6OnNpemVfdCByYXRpbyA9IHRvdGFsID4gMCA/IENB VENIX0NPTkZJR19DT05TT0xFX1dJRFRIICogbnVtYmVyIC8gdG90YWwgOiAwOwotICAgIHJldHVy biAocmF0aW8gPT0gMCAmJiBudW1iZXIgPiAwKSA/IDEgOiByYXRpbzsKLX0KLQotc3RkOjpzaXpl X3QmIGZpbmRNYXgoc3RkOjpzaXplX3QmIGksIHN0ZDo6c2l6ZV90JiBqLCBzdGQ6OnNpemVfdCYg aykgewotICAgIGlmIChpID4gaiAmJiBpID4gaykKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgZWxz ZSBpZiAoaiA+IGspCi0gICAgICAgIHJldHVybiBqOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJu IGs7Ci19Ci0KLXN0cnVjdCBDb2x1bW5JbmZvIHsKLSAgICBlbnVtIEp1c3RpZmljYXRpb24geyBM ZWZ0LCBSaWdodCB9OwotICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgaW50IHdpZHRoOwotICAg IEp1c3RpZmljYXRpb24ganVzdGlmaWNhdGlvbjsKLX07Ci1zdHJ1Y3QgQ29sdW1uQnJlYWsge307 Ci1zdHJ1Y3QgUm93QnJlYWsge307Ci0KLWNsYXNzIER1cmF0aW9uIHsKLSAgICBlbnVtIGNsYXNz IFVuaXQgewotICAgICAgICBBdXRvLAotICAgICAgICBOYW5vc2Vjb25kcywKLSAgICAgICAgTWlj cm9zZWNvbmRzLAotICAgICAgICBNaWxsaXNlY29uZHMsCi0gICAgICAgIFNlY29uZHMsCi0gICAg ICAgIE1pbnV0ZXMKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBzX25hbm9zZWNv bmRzSW5BTWljcm9zZWNvbmQgPSAxMDAwOwotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBzX25h bm9zZWNvbmRzSW5BTWlsbGlzZWNvbmQgPSAxMDAwICogc19uYW5vc2Vjb25kc0luQU1pY3Jvc2Vj b25kOwotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBzX25hbm9zZWNvbmRzSW5BU2Vjb25kID0g MTAwMCAqIHNfbmFub3NlY29uZHNJbkFNaWxsaXNlY29uZDsKLSAgICBzdGF0aWMgY29uc3QgdWlu dDY0X3Qgc19uYW5vc2Vjb25kc0luQU1pbnV0ZSA9IDYwICogc19uYW5vc2Vjb25kc0luQVNlY29u ZDsKLQotICAgIGRvdWJsZSBtX2luTmFub3NlY29uZHM7Ci0gICAgVW5pdCBtX3VuaXRzOwotCi1w dWJsaWM6Ci0gICAgZXhwbGljaXQgRHVyYXRpb24oZG91YmxlIGluTmFub3NlY29uZHMsIFVuaXQg dW5pdHMgPSBVbml0OjpBdXRvKQotICAgICAgICA6IG1faW5OYW5vc2Vjb25kcyhpbk5hbm9zZWNv bmRzKSwKLSAgICAgICAgbV91bml0cyh1bml0cykgewotICAgICAgICBpZiAobV91bml0cyA9PSBV bml0OjpBdXRvKSB7Ci0gICAgICAgICAgICBpZiAobV9pbk5hbm9zZWNvbmRzIDwgc19uYW5vc2Vj b25kc0luQU1pY3Jvc2Vjb25kKQotICAgICAgICAgICAgICAgIG1fdW5pdHMgPSBVbml0OjpOYW5v c2Vjb25kczsKLSAgICAgICAgICAgIGVsc2UgaWYgKG1faW5OYW5vc2Vjb25kcyA8IHNfbmFub3Nl Y29uZHNJbkFNaWxsaXNlY29uZCkKLSAgICAgICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6TWlj cm9zZWNvbmRzOwotICAgICAgICAgICAgZWxzZSBpZiAobV9pbk5hbm9zZWNvbmRzIDwgc19uYW5v c2Vjb25kc0luQVNlY29uZCkKLSAgICAgICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6TWlsbGlz ZWNvbmRzOwotICAgICAgICAgICAgZWxzZSBpZiAobV9pbk5hbm9zZWNvbmRzIDwgc19uYW5vc2Vj b25kc0luQU1pbnV0ZSkKLSAgICAgICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6U2Vjb25kczsK LSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtX3VuaXRzID0gVW5pdDo6TWludXRl czsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgYXV0byB2YWx1ZSgpIGNvbnN0IC0+IGRvdWJs ZSB7Ci0gICAgICAgIHN3aXRjaCAobV91bml0cykgewotICAgICAgICBjYXNlIFVuaXQ6Ok1pY3Jv c2Vjb25kczoKLSAgICAgICAgICAgIHJldHVybiBtX2luTmFub3NlY29uZHMgLyBzdGF0aWNfY2Fz dDxkb3VibGU+KHNfbmFub3NlY29uZHNJbkFNaWNyb3NlY29uZCk7Ci0gICAgICAgIGNhc2UgVW5p dDo6TWlsbGlzZWNvbmRzOgotICAgICAgICAgICAgcmV0dXJuIG1faW5OYW5vc2Vjb25kcyAvIHN0 YXRpY19jYXN0PGRvdWJsZT4oc19uYW5vc2Vjb25kc0luQU1pbGxpc2Vjb25kKTsKLSAgICAgICAg Y2FzZSBVbml0OjpTZWNvbmRzOgotICAgICAgICAgICAgcmV0dXJuIG1faW5OYW5vc2Vjb25kcyAv IHN0YXRpY19jYXN0PGRvdWJsZT4oc19uYW5vc2Vjb25kc0luQVNlY29uZCk7Ci0gICAgICAgIGNh c2UgVW5pdDo6TWludXRlczoKLSAgICAgICAgICAgIHJldHVybiBtX2luTmFub3NlY29uZHMgLyBz dGF0aWNfY2FzdDxkb3VibGU+KHNfbmFub3NlY29uZHNJbkFNaW51dGUpOwotICAgICAgICBkZWZh dWx0OgotICAgICAgICAgICAgcmV0dXJuIG1faW5OYW5vc2Vjb25kczsKLSAgICAgICAgfQotICAg IH0KLSAgICBhdXRvIHVuaXRzQXNTdHJpbmcoKSBjb25zdCAtPiBzdGQ6OnN0cmluZyB7Ci0gICAg ICAgIHN3aXRjaCAobV91bml0cykgewotICAgICAgICBjYXNlIFVuaXQ6Ok5hbm9zZWNvbmRzOgot ICAgICAgICAgICAgcmV0dXJuICJucyI7Ci0gICAgICAgIGNhc2UgVW5pdDo6TWljcm9zZWNvbmRz OgotICAgICAgICAgICAgcmV0dXJuICJ1cyI7Ci0gICAgICAgIGNhc2UgVW5pdDo6TWlsbGlzZWNv bmRzOgotICAgICAgICAgICAgcmV0dXJuICJtcyI7Ci0gICAgICAgIGNhc2UgVW5pdDo6U2Vjb25k czoKLSAgICAgICAgICAgIHJldHVybiAicyI7Ci0gICAgICAgIGNhc2UgVW5pdDo6TWludXRlczoK LSAgICAgICAgICAgIHJldHVybiAibSI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBy ZXR1cm4gIioqIGludGVybmFsIGVycm9yICoqIjsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGZy aWVuZCBhdXRvIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIG9zLCBEdXJhdGlvbiBjb25zdCYg ZHVyYXRpb24pIC0+IHN0ZDo6b3N0cmVhbSYgewotICAgICAgICByZXR1cm4gb3MgPDwgZHVyYXRp b24udmFsdWUoKSA8PCAnICcgPDwgZHVyYXRpb24udW5pdHNBc1N0cmluZygpOwotICAgIH0KLX07 Ci19IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQotCi1jbGFzcyBUYWJsZVByaW50ZXIgewotICAgIHN0 ZDo6b3N0cmVhbSYgbV9vczsKLSAgICBzdGQ6OnZlY3RvcjxDb2x1bW5JbmZvPiBtX2NvbHVtbklu Zm9zOwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX29zczsKLSAgICBpbnQgbV9jdXJyZW50Q29s dW1uID0gLTE7Ci0gICAgYm9vbCBtX2lzT3BlbiA9IGZhbHNlOwotCi1wdWJsaWM6Ci0gICAgVGFi bGVQcmludGVyKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnZlY3RvcjxDb2x1bW5JbmZvPiBjb2x1 bW5JbmZvcyApCi0gICAgOiAgIG1fb3MoIG9zICksCi0gICAgICAgIG1fY29sdW1uSW5mb3MoIHN0 ZDo6bW92ZSggY29sdW1uSW5mb3MgKSApIHt9Ci0KLSAgICBhdXRvIGNvbHVtbkluZm9zKCkgY29u c3QgLT4gc3RkOjp2ZWN0b3I8Q29sdW1uSW5mbz4gY29uc3QmIHsKLSAgICAgICAgcmV0dXJuIG1f Y29sdW1uSW5mb3M7Ci0gICAgfQotCi0gICAgdm9pZCBvcGVuKCkgewotICAgICAgICBpZiAoIW1f aXNPcGVuKSB7Ci0gICAgICAgICAgICBtX2lzT3BlbiA9IHRydWU7Ci0gICAgICAgICAgICAqdGhp cyA8PCBSb3dCcmVhaygpOwotCi0JCQlDb2x1bW5zIGhlYWRlckNvbHM7Ci0JCQlTcGFjZXIgc3Bh Y2VyKDIpOwotCQkJZm9yIChhdXRvIGNvbnN0JiBpbmZvIDogbV9jb2x1bW5JbmZvcykgewotCQkJ CWhlYWRlckNvbHMgKz0gQ29sdW1uKGluZm8ubmFtZSkud2lkdGgoc3RhdGljX2Nhc3Q8c3RkOjpz aXplX3Q+KGluZm8ud2lkdGggLSAyKSk7Ci0JCQkJaGVhZGVyQ29scyArPSBzcGFjZXI7Ci0JCQl9 Ci0JCQltX29zIDw8IGhlYWRlckNvbHMgPDwgJ1xuJzsKLQotICAgICAgICAgICAgbV9vcyA8PCBD YXRjaDo6Z2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7Ci0gICAgICAgIH0KLSAgICB9Ci0g ICAgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKG1faXNPcGVuKSB7Ci0gICAgICAgICAgICAq dGhpcyA8PCBSb3dCcmVhaygpOwotICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7Ci0gICAg ICAgICAgICBtX2lzT3BlbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdGVtcGxh dGU8dHlwZW5hbWUgVD4KLSAgICBmcmllbmQgVGFibGVQcmludGVyJiBvcGVyYXRvciA8PCAoVGFi bGVQcmludGVyJiB0cCwgVCBjb25zdCYgdmFsdWUpIHsKLSAgICAgICAgdHAubV9vc3MgPDwgdmFs dWU7Ci0gICAgICAgIHJldHVybiB0cDsKLSAgICB9Ci0KLSAgICBmcmllbmQgVGFibGVQcmludGVy JiBvcGVyYXRvciA8PCAoVGFibGVQcmludGVyJiB0cCwgQ29sdW1uQnJlYWspIHsKLSAgICAgICAg YXV0byBjb2xTdHIgPSB0cC5tX29zcy5zdHIoKTsKLSAgICAgICAgY29uc3QgYXV0byBzdHJTaXpl ID0gY29sU3RyLnNpemUoKTsKLSAgICAgICAgdHAubV9vc3Muc3RyKCIiKTsKLSAgICAgICAgdHAu b3BlbigpOwotICAgICAgICBpZiAodHAubV9jdXJyZW50Q29sdW1uID09IHN0YXRpY19jYXN0PGlu dD4odHAubV9jb2x1bW5JbmZvcy5zaXplKCkgLSAxKSkgewotICAgICAgICAgICAgdHAubV9jdXJy ZW50Q29sdW1uID0gLTE7Ci0gICAgICAgICAgICB0cC5tX29zIDw8ICdcbic7Ci0gICAgICAgIH0K LSAgICAgICAgdHAubV9jdXJyZW50Q29sdW1uKys7Ci0KLSAgICAgICAgYXV0byBjb2xJbmZvID0g dHAubV9jb2x1bW5JbmZvc1t0cC5tX2N1cnJlbnRDb2x1bW5dOwotICAgICAgICBhdXRvIHBhZGRp bmcgPSAoc3RyU2l6ZSArIDEgPCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oY29sSW5mby53aWR0 aCkpCi0gICAgICAgICAgICA/IHN0ZDo6c3RyaW5nKGNvbEluZm8ud2lkdGggLSAoc3RyU2l6ZSAr IDEpLCAnICcpCi0gICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7Ci0gICAgICAgIGlmIChjb2xJ bmZvLmp1c3RpZmljYXRpb24gPT0gQ29sdW1uSW5mbzo6TGVmdCkKLSAgICAgICAgICAgIHRwLm1f b3MgPDwgY29sU3RyIDw8IHBhZGRpbmcgPDwgJyAnOwotICAgICAgICBlbHNlCi0gICAgICAgICAg ICB0cC5tX29zIDw8IHBhZGRpbmcgPDwgY29sU3RyIDw8ICcgJzsKLSAgICAgICAgcmV0dXJuIHRw OwotICAgIH0KLQotICAgIGZyaWVuZCBUYWJsZVByaW50ZXImIG9wZXJhdG9yIDw8IChUYWJsZVBy aW50ZXImIHRwLCBSb3dCcmVhaykgewotICAgICAgICBpZiAodHAubV9jdXJyZW50Q29sdW1uID4g MCkgewotICAgICAgICAgICAgdHAubV9vcyA8PCAnXG4nOwotICAgICAgICAgICAgdHAubV9jdXJy ZW50Q29sdW1uID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRwOwotICAgIH0KLX07 Ci0KLUNvbnNvbGVSZXBvcnRlcjo6Q29uc29sZVJlcG9ydGVyKFJlcG9ydGVyQ29uZmlnIGNvbnN0 JiBjb25maWcpCi0gICAgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UoY29uZmlnKSwKLSAgICBtX3Rh YmxlUHJpbnRlcihuZXcgVGFibGVQcmludGVyKGNvbmZpZy5zdHJlYW0oKSwKLSAgICAgICAgWyZj b25maWddKCkgLT4gc3RkOjp2ZWN0b3I8Q29sdW1uSW5mbz4gewotICAgICAgICBpZiAoY29uZmln LmZ1bGxDb25maWcoKS0+YmVuY2htYXJrTm9BbmFseXNpcygpKQotICAgICAgICB7Ci0gICAgICAg ICAgICByZXR1cm57Ci0gICAgICAgICAgICAgICAgeyAiYmVuY2htYXJrIG5hbWUiLCBDQVRDSF9D T05GSUdfQ09OU09MRV9XSURUSCAtIDQzLCBDb2x1bW5JbmZvOjpMZWZ0IH0sCi0gICAgICAgICAg ICAgICAgeyAiICAgICBzYW1wbGVzIiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0sCi0gICAgICAg ICAgICAgICAgeyAiICBpdGVyYXRpb25zIiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0sCi0gICAg ICAgICAgICAgICAgeyAiICAgICAgICBtZWFuIiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0KLSAg ICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAg ICAgICByZXR1cm57Ci0gICAgICAgICAgICAgICAgeyAiYmVuY2htYXJrIG5hbWUiLCBDQVRDSF9D T05GSUdfQ09OU09MRV9XSURUSCAtIDQzLCBDb2x1bW5JbmZvOjpMZWZ0IH0sCi0gICAgICAgICAg ICAgICAgeyAic2FtcGxlcyAgICAgIG1lYW4gICAgICAgc3RkIGRldiIsIDE0LCBDb2x1bW5JbmZv OjpSaWdodCB9LAotICAgICAgICAgICAgICAgIHsgIml0ZXJhdGlvbnMgICBsb3cgbWVhbiAgIGxv dyBzdGQgZGV2IiwgMTQsIENvbHVtbkluZm86OlJpZ2h0IH0sCi0gICAgICAgICAgICAgICAgeyAi ZXN0aW1hdGVkICAgIGhpZ2ggbWVhbiAgaGlnaCBzdGQgZGV2IiwgMTQsIENvbHVtbkluZm86OlJp Z2h0IH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9KCkpKSB7fQotQ29uc29sZVJl cG9ydGVyOjp+Q29uc29sZVJlcG9ydGVyKCkgPSBkZWZhdWx0OwotCi1zdGQ6OnN0cmluZyBDb25z b2xlUmVwb3J0ZXI6OmdldERlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0 IHJlc3VsdHMgYXMgcGxhaW4gbGluZXMgb2YgdGV4dCI7Ci19Ci0KLXZvaWQgQ29uc29sZVJlcG9y dGVyOjpub01hdGNoaW5nVGVzdENhc2VzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjKSB7Ci0gICAg c3RyZWFtIDw8ICJObyB0ZXN0IGNhc2VzIG1hdGNoZWQgJyIgPDwgc3BlYyA8PCAnXCcnIDw8IHN0 ZDo6ZW5kbDsKLX0KLQotdm9pZCBDb25zb2xlUmVwb3J0ZXI6OnJlcG9ydEludmFsaWRBcmd1bWVu dHMoc3RkOjpzdHJpbmcgY29uc3QmYXJnKXsKLSAgICBzdHJlYW0gPDwgIkludmFsaWQgRmlsdGVy OiAiIDw8IGFyZyA8PCBzdGQ6OmVuZGw7Ci19Ci0KLXZvaWQgQ29uc29sZVJlcG9ydGVyOjphc3Nl cnRpb25TdGFydGluZyhBc3NlcnRpb25JbmZvIGNvbnN0Jikge30KLQotYm9vbCBDb25zb2xlUmVw b3J0ZXI6OmFzc2VydGlvbkVuZGVkKEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3Rh dHMpIHsKLSAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0 cy5hc3NlcnRpb25SZXN1bHQ7Ci0KLSAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWct PmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOwotCi0gICAgLy8g RHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcg dGhlbS4KLSAgICBpZiAoIWluY2x1ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkg IT0gUmVzdWx0V2FzOjpXYXJuaW5nKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBsYXp5 UHJpbnQoKTsKLQotICAgIENvbnNvbGVBc3NlcnRpb25QcmludGVyIHByaW50ZXIoc3RyZWFtLCBf YXNzZXJ0aW9uU3RhdHMsIGluY2x1ZGVSZXN1bHRzKTsKLSAgICBwcmludGVyLnByaW50KCk7Ci0g ICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb25z b2xlUmVwb3J0ZXI6OnNlY3Rpb25TdGFydGluZyhTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25J bmZvKSB7Ci0gICAgbV90YWJsZVByaW50ZXItPmNsb3NlKCk7Ci0gICAgbV9oZWFkZXJQcmludGVk ID0gZmFsc2U7Ci0gICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uU3RhcnRpbmcoX3Nl Y3Rpb25JbmZvKTsKLX0KLXZvaWQgQ29uc29sZVJlcG9ydGVyOjpzZWN0aW9uRW5kZWQoU2VjdGlv blN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzKSB7Ci0gICAgbV90YWJsZVByaW50ZXItPmNsb3Nl KCk7Ci0gICAgaWYgKF9zZWN0aW9uU3RhdHMubWlzc2luZ0Fzc2VydGlvbnMpIHsKLSAgICAgICAg bGF6eVByaW50KCk7Ci0gICAgICAgIENvbG91ciBjb2xvdXIoQ29sb3VyOjpSZXN1bHRFcnJvcik7 Ci0gICAgICAgIGlmIChtX3NlY3Rpb25TdGFjay5zaXplKCkgPiAxKQotICAgICAgICAgICAgc3Ry ZWFtIDw8ICJcbk5vIGFzc2VydGlvbnMgaW4gc2VjdGlvbiI7Ci0gICAgICAgIGVsc2UKLSAgICAg ICAgICAgIHN0cmVhbSA8PCAiXG5ObyBhc3NlcnRpb25zIGluIHRlc3QgY2FzZSI7Ci0gICAgICAg IHN0cmVhbSA8PCAiICciIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCAiJ1xu IiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICAgIGRvdWJsZSBkdXIgPSBfc2VjdGlvblN0YXRzLmR1 cmF0aW9uSW5TZWNvbmRzOwotICAgIGlmIChzaG91bGRTaG93RHVyYXRpb24oKm1fY29uZmlnLCBk dXIpKSB7Ci0gICAgICAgIHN0cmVhbSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihkdXIpIDw8ICIg czogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOwotICAg IH0KLSAgICBpZiAobV9oZWFkZXJQcmludGVkKSB7Ci0gICAgICAgIG1faGVhZGVyUHJpbnRlZCA9 IGZhbHNlOwotICAgIH0KLSAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25FbmRlZChf c2VjdGlvblN0YXRzKTsKLX0KLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5D SE1BUktJTkcpCi12b2lkIENvbnNvbGVSZXBvcnRlcjo6YmVuY2htYXJrUHJlcGFyaW5nKHN0ZDo6 c3RyaW5nIGNvbnN0JiBuYW1lKSB7Ci0JbGF6eVByaW50V2l0aG91dENsb3NpbmdCZW5jaG1hcmtU YWJsZSgpOwotCi0JYXV0byBuYW1lQ29sID0gQ29sdW1uKG5hbWUpLndpZHRoKHN0YXRpY19jYXN0 PHN0ZDo6c2l6ZV90PihtX3RhYmxlUHJpbnRlci0+Y29sdW1uSW5mb3MoKVswXS53aWR0aCAtIDIp KTsKLQotCWJvb2wgZmlyc3RMaW5lID0gdHJ1ZTsKLQlmb3IgKGF1dG8gbGluZSA6IG5hbWVDb2wp IHsKLQkJaWYgKCFmaXJzdExpbmUpCi0JCQkoKm1fdGFibGVQcmludGVyKSA8PCBDb2x1bW5CcmVh aygpIDw8IENvbHVtbkJyZWFrKCkgPDwgQ29sdW1uQnJlYWsoKTsKLQkJZWxzZQotCQkJZmlyc3RM aW5lID0gZmFsc2U7Ci0KLQkJKCptX3RhYmxlUHJpbnRlcikgPDwgbGluZSA8PCBDb2x1bW5CcmVh aygpOwotCX0KLX0KLQotdm9pZCBDb25zb2xlUmVwb3J0ZXI6OmJlbmNobWFya1N0YXJ0aW5nKEJl bmNobWFya0luZm8gY29uc3QmIGluZm8pIHsKLSAgICAoKm1fdGFibGVQcmludGVyKSA8PCBpbmZv LnNhbXBsZXMgPDwgQ29sdW1uQnJlYWsoKQotICAgICAgICA8PCBpbmZvLml0ZXJhdGlvbnMgPDwg Q29sdW1uQnJlYWsoKTsKLSAgICBpZiAoIW1fY29uZmlnLT5iZW5jaG1hcmtOb0FuYWx5c2lzKCkp Ci0gICAgICAgICgqbV90YWJsZVByaW50ZXIpIDw8IER1cmF0aW9uKGluZm8uZXN0aW1hdGVkRHVy YXRpb24pIDw8IENvbHVtbkJyZWFrKCk7Ci19Ci12b2lkIENvbnNvbGVSZXBvcnRlcjo6YmVuY2ht YXJrRW5kZWQoQmVuY2htYXJrU3RhdHM8PiBjb25zdCYgc3RhdHMpIHsKLSAgICBpZiAobV9jb25m aWctPmJlbmNobWFya05vQW5hbHlzaXMoKSkKLSAgICB7Ci0gICAgICAgICgqbV90YWJsZVByaW50 ZXIpIDw8IER1cmF0aW9uKHN0YXRzLm1lYW4ucG9pbnQuY291bnQoKSkgPDwgQ29sdW1uQnJlYWso KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKCptX3RhYmxlUHJpbnRlcikgPDwg Q29sdW1uQnJlYWsoKQotICAgICAgICAgICAgPDwgRHVyYXRpb24oc3RhdHMubWVhbi5wb2ludC5j b3VudCgpKSA8PCBDb2x1bW5CcmVhaygpCi0gICAgICAgICAgICA8PCBEdXJhdGlvbihzdGF0cy5t ZWFuLmxvd2VyX2JvdW5kLmNvdW50KCkpIDw8IENvbHVtbkJyZWFrKCkKLSAgICAgICAgICAgIDw8 IER1cmF0aW9uKHN0YXRzLm1lYW4udXBwZXJfYm91bmQuY291bnQoKSkgPDwgQ29sdW1uQnJlYWso KSA8PCBDb2x1bW5CcmVhaygpCi0gICAgICAgICAgICA8PCBEdXJhdGlvbihzdGF0cy5zdGFuZGFy ZERldmlhdGlvbi5wb2ludC5jb3VudCgpKSA8PCBDb2x1bW5CcmVhaygpCi0gICAgICAgICAgICA8 PCBEdXJhdGlvbihzdGF0cy5zdGFuZGFyZERldmlhdGlvbi5sb3dlcl9ib3VuZC5jb3VudCgpKSA8 PCBDb2x1bW5CcmVhaygpCi0gICAgICAgICAgICA8PCBEdXJhdGlvbihzdGF0cy5zdGFuZGFyZERl dmlhdGlvbi51cHBlcl9ib3VuZC5jb3VudCgpKSA8PCBDb2x1bW5CcmVhaygpIDw8IENvbHVtbkJy ZWFrKCkgPDwgQ29sdW1uQnJlYWsoKSA8PCBDb2x1bW5CcmVhaygpIDw8IENvbHVtbkJyZWFrKCk7 Ci0gICAgfQotfQotCi12b2lkIENvbnNvbGVSZXBvcnRlcjo6YmVuY2htYXJrRmFpbGVkKHN0ZDo6 c3RyaW5nIGNvbnN0JiBlcnJvcikgewotCUNvbG91ciBjb2xvdXIoQ29sb3VyOjpSZWQpOwotICAg ICgqbV90YWJsZVByaW50ZXIpCi0gICAgICAgIDw8ICJCZW5jaG1hcmsgZmFpbGVkICgiIDw8IGVy cm9yIDw8ICcpJwotICAgICAgICA8PCBDb2x1bW5CcmVhaygpIDw8IFJvd0JyZWFrKCk7Ci19Ci0j ZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcKLQotdm9pZCBDb25zb2xl UmVwb3J0ZXI6OnRlc3RDYXNlRW5kZWQoVGVzdENhc2VTdGF0cyBjb25zdCYgX3Rlc3RDYXNlU3Rh dHMpIHsKLSAgICBtX3RhYmxlUHJpbnRlci0+Y2xvc2UoKTsKLSAgICBTdHJlYW1pbmdSZXBvcnRl ckJhc2U6OnRlc3RDYXNlRW5kZWQoX3Rlc3RDYXNlU3RhdHMpOwotICAgIG1faGVhZGVyUHJpbnRl ZCA9IGZhbHNlOwotfQotdm9pZCBDb25zb2xlUmVwb3J0ZXI6OnRlc3RHcm91cEVuZGVkKFRlc3RH cm91cFN0YXRzIGNvbnN0JiBfdGVzdEdyb3VwU3RhdHMpIHsKLSAgICBpZiAoY3VycmVudEdyb3Vw SW5mby51c2VkKSB7Ci0gICAgICAgIHByaW50U3VtbWFyeURpdmlkZXIoKTsKLSAgICAgICAgc3Ry ZWFtIDw8ICJTdW1tYXJ5IGZvciBncm91cCAnIiA8PCBfdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZv Lm5hbWUgPDwgIic6XG4iOwotICAgICAgICBwcmludFRvdGFscyhfdGVzdEdyb3VwU3RhdHMudG90 YWxzKTsKLSAgICAgICAgc3RyZWFtIDw8ICdcbicgPDwgc3RkOjplbmRsOwotICAgIH0KLSAgICBT dHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKF90ZXN0R3JvdXBTdGF0cyk7Ci19 Ci12b2lkIENvbnNvbGVSZXBvcnRlcjo6dGVzdFJ1bkVuZGVkKFRlc3RSdW5TdGF0cyBjb25zdCYg X3Rlc3RSdW5TdGF0cykgewotICAgIHByaW50VG90YWxzRGl2aWRlcihfdGVzdFJ1blN0YXRzLnRv dGFscyk7Ci0gICAgcHJpbnRUb3RhbHMoX3Rlc3RSdW5TdGF0cy50b3RhbHMpOwotICAgIHN0cmVh bSA8PCBzdGQ6OmVuZGw7Ci0gICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQo X3Rlc3RSdW5TdGF0cyk7Ci19Ci12b2lkIENvbnNvbGVSZXBvcnRlcjo6dGVzdFJ1blN0YXJ0aW5n KFRlc3RSdW5JbmZvIGNvbnN0JiBfdGVzdEluZm8pIHsKLSAgICBTdHJlYW1pbmdSZXBvcnRlckJh c2U6OnRlc3RSdW5TdGFydGluZyhfdGVzdEluZm8pOwotICAgIHByaW50VGVzdEZpbHRlcnMoKTsK LX0KLQotdm9pZCBDb25zb2xlUmVwb3J0ZXI6OmxhenlQcmludCgpIHsKLQotICAgIG1fdGFibGVQ cmludGVyLT5jbG9zZSgpOwotICAgIGxhenlQcmludFdpdGhvdXRDbG9zaW5nQmVuY2htYXJrVGFi bGUoKTsKLX0KLQotdm9pZCBDb25zb2xlUmVwb3J0ZXI6OmxhenlQcmludFdpdGhvdXRDbG9zaW5n QmVuY2htYXJrVGFibGUoKSB7Ci0KLSAgICBpZiAoIWN1cnJlbnRUZXN0UnVuSW5mby51c2VkKQot ICAgICAgICBsYXp5UHJpbnRSdW5JbmZvKCk7Ci0gICAgaWYgKCFjdXJyZW50R3JvdXBJbmZvLnVz ZWQpCi0gICAgICAgIGxhenlQcmludEdyb3VwSW5mbygpOwotCi0gICAgaWYgKCFtX2hlYWRlclBy aW50ZWQpIHsKLSAgICAgICAgcHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKTsKLSAgICAg ICAgbV9oZWFkZXJQcmludGVkID0gdHJ1ZTsKLSAgICB9Ci19Ci12b2lkIENvbnNvbGVSZXBvcnRl cjo6bGF6eVByaW50UnVuSW5mbygpIHsKLSAgICBzdHJlYW0gPDwgJ1xuJyA8PCBnZXRMaW5lT2ZD aGFyczwnfic+KCkgPDwgJ1xuJzsKLSAgICBDb2xvdXIgY29sb3VyKENvbG91cjo6U2Vjb25kYXJ5 VGV4dCk7Ci0gICAgc3RyZWFtIDw8IGN1cnJlbnRUZXN0UnVuSW5mby0+bmFtZQotICAgICAgICA8 PCAiIGlzIGEgQ2F0Y2ggdiIgPDwgbGlicmFyeVZlcnNpb24oKSA8PCAiIGhvc3QgYXBwbGljYXRp b24uXG4iCi0gICAgICAgIDw8ICJSdW4gd2l0aCAtPyBmb3Igb3B0aW9uc1xuXG4iOwotCi0gICAg aWYgKG1fY29uZmlnLT5ybmdTZWVkKCkgIT0gMCkKLSAgICAgICAgc3RyZWFtIDw8ICJSYW5kb21u ZXNzIHNlZWRlZCB0bzogIiA8PCBtX2NvbmZpZy0+cm5nU2VlZCgpIDw8ICJcblxuIjsKLQotICAg IGN1cnJlbnRUZXN0UnVuSW5mby51c2VkID0gdHJ1ZTsKLX0KLXZvaWQgQ29uc29sZVJlcG9ydGVy OjpsYXp5UHJpbnRHcm91cEluZm8oKSB7Ci0gICAgaWYgKCFjdXJyZW50R3JvdXBJbmZvLT5uYW1l LmVtcHR5KCkgJiYgY3VycmVudEdyb3VwSW5mby0+Z3JvdXBzQ291bnRzID4gMSkgewotICAgICAg ICBwcmludENsb3NlZEhlYWRlcigiR3JvdXA6ICIgKyBjdXJyZW50R3JvdXBJbmZvLT5uYW1lKTsK LSAgICAgICAgY3VycmVudEdyb3VwSW5mby51c2VkID0gdHJ1ZTsKLSAgICB9Ci19Ci12b2lkIENv bnNvbGVSZXBvcnRlcjo6cHJpbnRUZXN0Q2FzZUFuZFNlY3Rpb25IZWFkZXIoKSB7Ci0gICAgYXNz ZXJ0KCFtX3NlY3Rpb25TdGFjay5lbXB0eSgpKTsKLSAgICBwcmludE9wZW5IZWFkZXIoY3VycmVu dFRlc3RDYXNlSW5mby0+bmFtZSk7Ci0KLSAgICBpZiAobV9zZWN0aW9uU3RhY2suc2l6ZSgpID4g MSkgewotICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoQ29sb3VyOjpIZWFkZXJzKTsKLQotICAg ICAgICBhdXRvCi0gICAgICAgICAgICBpdCA9IG1fc2VjdGlvblN0YWNrLmJlZ2luKCkgKyAxLCAv LyBTa2lwIGZpcnN0IHNlY3Rpb24gKHRlc3QgY2FzZSkKLSAgICAgICAgICAgIGl0RW5kID0gbV9z ZWN0aW9uU3RhY2suZW5kKCk7Ci0gICAgICAgIGZvciAoOyBpdCAhPSBpdEVuZDsgKytpdCkKLSAg ICAgICAgICAgIHByaW50SGVhZGVyU3RyaW5nKGl0LT5uYW1lLCAyKTsKLSAgICB9Ci0KLSAgICBT b3VyY2VMaW5lSW5mbyBsaW5lSW5mbyA9IG1fc2VjdGlvblN0YWNrLmJhY2soKS5saW5lSW5mbzsK LQotICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKLSAgICBDb2xv dXIgY29sb3VyR3VhcmQoQ29sb3VyOjpGaWxlTmFtZSk7Ci0gICAgc3RyZWFtIDw8IGxpbmVJbmZv IDw8ICdcbic7Ci0gICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nIDw8 IHN0ZDo6ZW5kbDsKLX0KLQotdm9pZCBDb25zb2xlUmVwb3J0ZXI6OnByaW50Q2xvc2VkSGVhZGVy KHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSkgewotICAgIHByaW50T3BlbkhlYWRlcihfbmFtZSk7 Ci0gICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nOwotfQotdm9pZCBD b25zb2xlUmVwb3J0ZXI6OnByaW50T3BlbkhlYWRlcihzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUp IHsKLSAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7Ci0gICAgewot ICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoQ29sb3VyOjpIZWFkZXJzKTsKLSAgICAgICAgcHJp bnRIZWFkZXJTdHJpbmcoX25hbWUpOwotICAgIH0KLX0KLQotLy8gaWYgc3RyaW5nIGhhcyBhIDog aW4gZmlyc3QgbGluZSB3aWxsIHNldCBpbmRlbnQgdG8gZm9sbG93IGl0IG9uCi0vLyBzdWJzZXF1 ZW50IGxpbmVzCi12b2lkIENvbnNvbGVSZXBvcnRlcjo6cHJpbnRIZWFkZXJTdHJpbmcoc3RkOjpz dHJpbmcgY29uc3QmIF9zdHJpbmcsIHN0ZDo6c2l6ZV90IGluZGVudCkgewotICAgIHN0ZDo6c2l6 ZV90IGkgPSBfc3RyaW5nLmZpbmQoIjogIik7Ci0gICAgaWYgKGkgIT0gc3RkOjpzdHJpbmc6Om5w b3MpCi0gICAgICAgIGkgKz0gMjsKLSAgICBlbHNlCi0gICAgICAgIGkgPSAwOwotICAgIHN0cmVh bSA8PCBDb2x1bW4oX3N0cmluZykuaW5kZW50KGluZGVudCArIGkpLmluaXRpYWxJbmRlbnQoaW5k ZW50KSA8PCAnXG4nOwotfQotCi1zdHJ1Y3QgU3VtbWFyeUNvbHVtbiB7Ci0KLSAgICBTdW1tYXJ5 Q29sdW1uKCBzdGQ6OnN0cmluZyBfbGFiZWwsIENvbG91cjo6Q29kZSBfY29sb3VyICkKLSAgICA6 ICAgbGFiZWwoIHN0ZDo6bW92ZSggX2xhYmVsICkgKSwKLSAgICAgICAgY29sb3VyKCBfY29sb3Vy ICkge30KLSAgICBTdW1tYXJ5Q29sdW1uIGFkZFJvdyggc3RkOjpzaXplX3QgY291bnQgKSB7Ci0g ICAgICAgIFJldXNhYmxlU3RyaW5nU3RyZWFtIHJzczsKLSAgICAgICAgcnNzIDw8IGNvdW50Owot ICAgICAgICBzdGQ6OnN0cmluZyByb3cgPSByc3Muc3RyKCk7Ci0gICAgICAgIGZvciAoYXV0byYg b2xkUm93IDogcm93cykgewotICAgICAgICAgICAgd2hpbGUgKG9sZFJvdy5zaXplKCkgPCByb3cu c2l6ZSgpKQotICAgICAgICAgICAgICAgIG9sZFJvdyA9ICcgJyArIG9sZFJvdzsKLSAgICAgICAg ICAgIHdoaWxlIChvbGRSb3cuc2l6ZSgpID4gcm93LnNpemUoKSkKLSAgICAgICAgICAgICAgICBy b3cgPSAnICcgKyByb3c7Ci0gICAgICAgIH0KLSAgICAgICAgcm93cy5wdXNoX2JhY2socm93KTsK LSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGxhYmVsOwot ICAgIENvbG91cjo6Q29kZSBjb2xvdXI7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJv d3M7Ci0KLX07Ci0KLXZvaWQgQ29uc29sZVJlcG9ydGVyOjpwcmludFRvdGFscyggVG90YWxzIGNv bnN0JiB0b3RhbHMgKSB7Ci0gICAgaWYgKHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwKSB7 Ci0gICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoQ29sb3VyOjpXYXJuaW5nKSA8PCAiTm8gdGVzdHMg cmFuXG4iOwotICAgIH0gZWxzZSBpZiAodG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA+IDAgJiYg dG90YWxzLnRlc3RDYXNlcy5hbGxQYXNzZWQoKSkgewotICAgICAgICBzdHJlYW0gPDwgQ29sb3Vy KENvbG91cjo6UmVzdWx0U3VjY2VzcykgPDwgIkFsbCB0ZXN0cyBwYXNzZWQiOwotICAgICAgICBz dHJlYW0gPDwgIiAoIgotICAgICAgICAgICAgPDwgcGx1cmFsaXNlKHRvdGFscy5hc3NlcnRpb25z LnBhc3NlZCwgImFzc2VydGlvbiIpIDw8ICIgaW4gIgotICAgICAgICAgICAgPDwgcGx1cmFsaXNl KHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIikgPDwgJyknCi0gICAgICAgICAg ICA8PCAnXG4nOwotICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgc3RkOjp2ZWN0b3I8U3VtbWFyeUNv bHVtbj4gY29sdW1uczsKLSAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soU3VtbWFyeUNvbHVtbigi IiwgQ29sb3VyOjpOb25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KHRvdGFs cy50ZXN0Q2FzZXMudG90YWwoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyh0 b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpKSk7Ci0gICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKFN1 bW1hcnlDb2x1bW4oInBhc3NlZCIsIENvbG91cjo6U3VjY2VzcykKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgLmFkZFJvdyh0b3RhbHMudGVzdENhc2VzLnBhc3NlZCkKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgLmFkZFJvdyh0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQpKTsKLSAgICAgICAg Y29sdW1ucy5wdXNoX2JhY2soU3VtbWFyeUNvbHVtbigiZmFpbGVkIiwgQ29sb3VyOjpSZXN1bHRF cnJvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyh0b3RhbHMudGVzdENhc2Vz LmZhaWxlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyh0b3RhbHMuYXNzZXJ0 aW9ucy5mYWlsZWQpKTsKLSAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soU3VtbWFyeUNvbHVtbigi ZmFpbGVkIGFzIGV4cGVjdGVkIiwgQ29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUpCi0gICAg ICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3codG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRP aykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyh0b3RhbHMuYXNzZXJ0aW9ucy5m YWlsZWRCdXRPaykpOwotCi0gICAgICAgIHByaW50U3VtbWFyeVJvdygidGVzdCBjYXNlcyIsIGNv bHVtbnMsIDApOwotICAgICAgICBwcmludFN1bW1hcnlSb3coImFzc2VydGlvbnMiLCBjb2x1bW5z LCAxKTsKLSAgICB9Ci19Ci12b2lkIENvbnNvbGVSZXBvcnRlcjo6cHJpbnRTdW1tYXJ5Um93KHN0 ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCwgc3RkOjp2ZWN0b3I8U3VtbWFyeUNvbHVtbj4gY29uc3Qm IGNvbHMsIHN0ZDo6c2l6ZV90IHJvdykgewotICAgIGZvciAoYXV0byBjb2wgOiBjb2xzKSB7Ci0g ICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gY29sLnJvd3Nbcm93XTsKLSAgICAgICAgaWYgKGNv bC5sYWJlbC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJlYW0gPDwgbGFiZWwgPDwgIjogIjsK LSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAiMCIpCi0gICAgICAgICAgICAgICAgc3RyZWFtIDw8 IHZhbHVlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xv dXIoQ29sb3VyOjpXYXJuaW5nKSA8PCAiLSBub25lIC0iOwotICAgICAgICB9IGVsc2UgaWYgKHZh bHVlICE9ICIwIikgewotICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91cihDb2xvdXI6OkxpZ2h0 R3JleSkgPDwgIiB8ICI7Ci0gICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKGNvbC5jb2xvdXIp Ci0gICAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgJyAnIDw8IGNvbC5sYWJlbDsKLSAgICAgICAg fQotICAgIH0KLSAgICBzdHJlYW0gPDwgJ1xuJzsKLX0KLQotdm9pZCBDb25zb2xlUmVwb3J0ZXI6 OnByaW50VG90YWxzRGl2aWRlcihUb3RhbHMgY29uc3QmIHRvdGFscykgewotICAgIGlmICh0b3Rh bHMudGVzdENhc2VzLnRvdGFsKCkgPiAwKSB7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZFJh dGlvID0gbWFrZVJhdGlvKHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCB0b3RhbHMudGVzdENhc2Vz LnRvdGFsKCkpOwotICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRCdXRPa1JhdGlvID0gbWFrZVJh dGlvKHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkQnV0T2ssIHRvdGFscy50ZXN0Q2FzZXMudG90YWwo KSk7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IHBhc3NlZFJhdGlvID0gbWFrZVJhdGlvKHRvdGFscy50 ZXN0Q2FzZXMucGFzc2VkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkpOwotICAgICAgICB3aGls ZSAoZmFpbGVkUmF0aW8gKyBmYWlsZWRCdXRPa1JhdGlvICsgcGFzc2VkUmF0aW8gPCBDQVRDSF9D T05GSUdfQ09OU09MRV9XSURUSCAtIDEpCi0gICAgICAgICAgICBmaW5kTWF4KGZhaWxlZFJhdGlv LCBmYWlsZWRCdXRPa1JhdGlvLCBwYXNzZWRSYXRpbykrKzsKLSAgICAgICAgd2hpbGUgKGZhaWxl ZFJhdGlvICsgZmFpbGVkQnV0T2tSYXRpbyArIHBhc3NlZFJhdGlvID4gQ0FUQ0hfQ09ORklHX0NP TlNPTEVfV0lEVEggLSAxKQotICAgICAgICAgICAgZmluZE1heChmYWlsZWRSYXRpbywgZmFpbGVk QnV0T2tSYXRpbywgcGFzc2VkUmF0aW8pLS07Ci0KLSAgICAgICAgc3RyZWFtIDw8IENvbG91cihD b2xvdXI6OkVycm9yKSA8PCBzdGQ6OnN0cmluZyhmYWlsZWRSYXRpbywgJz0nKTsKLSAgICAgICAg c3RyZWFtIDw8IENvbG91cihDb2xvdXI6OlJlc3VsdEV4cGVjdGVkRmFpbHVyZSkgPDwgc3RkOjpz dHJpbmcoZmFpbGVkQnV0T2tSYXRpbywgJz0nKTsKLSAgICAgICAgaWYgKHRvdGFscy50ZXN0Q2Fz ZXMuYWxsUGFzc2VkKCkpCi0gICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKENvbG91cjo6UmVz dWx0U3VjY2VzcykgPDwgc3RkOjpzdHJpbmcocGFzc2VkUmF0aW8sICc9Jyk7Ci0gICAgICAgIGVs c2UKLSAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoQ29sb3VyOjpTdWNjZXNzKSA8PCBzdGQ6 OnN0cmluZyhwYXNzZWRSYXRpbywgJz0nKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdHJlYW0g PDwgQ29sb3VyKENvbG91cjo6V2FybmluZykgPDwgc3RkOjpzdHJpbmcoQ0FUQ0hfQ09ORklHX0NP TlNPTEVfV0lEVEggLSAxLCAnPScpOwotICAgIH0KLSAgICBzdHJlYW0gPDwgJ1xuJzsKLX0KLXZv aWQgQ29uc29sZVJlcG9ydGVyOjpwcmludFN1bW1hcnlEaXZpZGVyKCkgewotICAgIHN0cmVhbSA8 PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKLX0KLQotdm9pZCBDb25zb2xlUmVwb3J0 ZXI6OnByaW50VGVzdEZpbHRlcnMoKSB7Ci0gICAgaWYgKG1fY29uZmlnLT50ZXN0U3BlYygpLmhh c0ZpbHRlcnMoKSkgewotICAgICAgICBDb2xvdXIgZ3VhcmQoQ29sb3VyOjpCcmlnaHRZZWxsb3cp OwotICAgICAgICBzdHJlYW0gPDwgIkZpbHRlcnM6ICIgPDwgc2VyaWFsaXplRmlsdGVycyhtX2Nv bmZpZy0+Z2V0VGVzdHNPclRhZ3MoKSkgPDwgJ1xuJzsKLSAgICB9Ci19Ci0KLUNBVENIX1JFR0lT VEVSX1JFUE9SVEVSKCJjb25zb2xlIiwgQ29uc29sZVJlcG9ydGVyKQotCi19IC8vIGVuZCBuYW1l c3BhY2UgQ2F0Y2gKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jcHJhZ21hIHdhcm5pbmcocG9w KQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIHByYWdtYSBjbGFuZyBkaWFn bm9zdGljIHBvcAotI2VuZGlmCi0vLyBlbmQgY2F0Y2hfcmVwb3J0ZXJfY29uc29sZS5jcHAKLS8v IHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2p1bml0LmNwcAotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNp bmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGN0aW1lPgotI2luY2x1ZGUgPGFsZ29yaXRobT4K LSNpbmNsdWRlIDxpb21hbmlwPgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotCi0gICAgbmFtZXNwYWNl IHsKLSAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRpbWVzdGFtcCgpIHsKLSAgICAgICAg ICAgIC8vIEJld2FyZSwgdGhpcyBpcyBub3QgcmVlbnRyYW50IGJlY2F1c2Ugb2YgYmFja3dhcmQg Y29tcGF0aWJpbGl0eSBpc3N1ZXMKLSAgICAgICAgICAgIC8vIEFsc28sIFVUQyBvbmx5LCBhZ2Fp biBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKCV6IGlzIEMrKzExKQotICAgICAg ICAgICAgdGltZV90IHJhd3RpbWU7Ci0gICAgICAgICAgICBzdGQ6OnRpbWUoJnJhd3RpbWUpOwot ICAgICAgICAgICAgYXV0byBjb25zdCB0aW1lU3RhbXBTaXplID0gc2l6ZW9mKCIyMDE3LTAxLTE2 VDE3OjA2OjQ1WiIpOwotCi0jaWZkZWYgX01TQ19WRVIKLSAgICAgICAgICAgIHN0ZDo6dG0gdGlt ZUluZm8gPSB7fTsKLSAgICAgICAgICAgIGdtdGltZV9zKCZ0aW1lSW5mbywgJnJhd3RpbWUpOwot I2Vsc2UKLSAgICAgICAgICAgIHN0ZDo6dG0qIHRpbWVJbmZvOwotICAgICAgICAgICAgdGltZUlu Zm8gPSBzdGQ6OmdtdGltZSgmcmF3dGltZSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgY2hhciB0 aW1lU3RhbXBbdGltZVN0YW1wU2l6ZV07Ci0gICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3Qg Zm10ID0gIiVZLSVtLSVkVCVIOiVNOiVTWiI7Ci0KLSNpZmRlZiBfTVNDX1ZFUgotICAgICAgICAg ICAgc3RkOjpzdHJmdGltZSh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgJnRpbWVJbmZv KTsKLSNlbHNlCi0gICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1w U2l6ZSwgZm10LCB0aW1lSW5mbyk7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0 cmluZyh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBz dGQ6OnN0cmluZyBmaWxlTmFtZVRhZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnRh Z3MpIHsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoYmVnaW4odGFncyksCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCh0YWdzKSwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgW10gKHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcpIHtyZXR1 cm4gdGFnLmZyb250KCkgPT0gJyMnOyB9KTsKLSAgICAgICAgICAgIGlmIChpdCAhPSB0YWdzLmVu ZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c3Vic3RyKDEpOwotICAgICAgICAgICAg cmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3JtYXRzIHRo ZSBkdXJhdGlvbiBpbiBzZWNvbmRzIHRvIDMgZGVjaW1hbCBwbGFjZXMuCi0gICAgICAgIC8vIFRo aXMgaXMgZG9uZSBiZWNhdXNlIHNvbWUgZ2VuaXVzIGRlZmluZWQgTWF2ZW4gU3VyZWZpcmUgc2No ZW1hCi0gICAgICAgIC8vIGluIGEgd2F5IHRoYXQgb25seSBhY2NlcHRzIDMgZGVjaW1hbCBwbGFj ZXMsIGFuZCB0b29scyBsaWtlCi0gICAgICAgIC8vIEplbmtpbnMgdXNlIHRoYXQgc2NoZW1hIGZv ciB2YWxpZGF0aW9uIEpVbml0IHJlcG9ydGVyIG91dHB1dC4KLSAgICAgICAgc3RkOjpzdHJpbmcg Zm9ybWF0RHVyYXRpb24oIGRvdWJsZSBzZWNvbmRzICkgewotICAgICAgICAgICAgUmV1c2FibGVT dHJpbmdTdHJlYW0gcnNzOwotICAgICAgICAgICAgcnNzIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpz ZXRwcmVjaXNpb24oIDMgKSA8PCBzZWNvbmRzOwotICAgICAgICAgICAgcmV0dXJuIHJzcy5zdHIo KTsKLSAgICAgICAgfQotCi0gICAgfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLSAgICBKdW5p dFJlcG9ydGVyOjpKdW5pdFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyAp Ci0gICAgICAgIDogICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCi0gICAgICAg ICAgICB4bWwoIF9jb25maWcuc3RyZWFtKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3Jl cG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSB0cnVlOwotICAgICAgICAgICAgbV9y ZXBvcnRlclByZWZzLnNob3VsZFJlcG9ydEFsbEFzc2VydGlvbnMgPSB0cnVlOwotICAgICAgICB9 Ci0KLSAgICBKdW5pdFJlcG9ydGVyOjp+SnVuaXRSZXBvcnRlcigpIHt9Ci0KLSAgICBzdGQ6OnN0 cmluZyBKdW5pdFJlcG9ydGVyOjpnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICJS ZXBvcnRzIHRlc3QgcmVzdWx0cyBpbiBhbiBYTUwgZm9ybWF0IHRoYXQgbG9va3MgbGlrZSBBbnQn cyBqdW5pdHJlcG9ydCB0YXJnZXQiOwotICAgIH0KLQotICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6 bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIC8qc3BlYyovICkge30KLQot ICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6dGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25z dCYgcnVuSW5mbyApICB7Ci0gICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RSdW5T dGFydGluZyggcnVuSW5mbyApOwotICAgICAgICB4bWwuc3RhcnRFbGVtZW50KCAidGVzdHN1aXRl cyIgKTsKLSAgICB9Ci0KLSAgICB2b2lkIEp1bml0UmVwb3J0ZXI6OnRlc3RHcm91cFN0YXJ0aW5n KCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIHsKLSAgICAgICAgc3VpdGVUaW1lci5zdGFy dCgpOwotICAgICAgICBzdGRPdXRGb3JTdWl0ZS5jbGVhcigpOwotICAgICAgICBzdGRFcnJGb3JT dWl0ZS5jbGVhcigpOwotICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9ucyA9IDA7Ci0gICAgICAg IEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsK LSAgICB9Ci0KLSAgICB2b2lkIEp1bml0UmVwb3J0ZXI6OnRlc3RDYXNlU3RhcnRpbmcoIFRlc3RD YXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvICkgewotICAgICAgICBtX29rVG9GYWlsID0gdGVz dENhc2VJbmZvLm9rVG9GYWlsKCk7Ci0gICAgfQotCi0gICAgYm9vbCBKdW5pdFJlcG9ydGVyOjph c3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgewot ICAgICAgICBpZiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUo KSA9PSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICYmICFtX29rVG9GYWlsICkKLSAgICAgICAg ICAgIHVuZXhwZWN0ZWRFeGNlcHRpb25zKys7Ci0gICAgICAgIHJldHVybiBDdW11bGF0aXZlUmVw b3J0ZXJCYXNlOjphc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKLSAgICB9Ci0KLSAg ICB2b2lkIEp1bml0UmVwb3J0ZXI6OnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3Qm IHRlc3RDYXNlU3RhdHMgKSB7Ci0gICAgICAgIHN0ZE91dEZvclN1aXRlICs9IHRlc3RDYXNlU3Rh dHMuc3RkT3V0OwotICAgICAgICBzdGRFcnJGb3JTdWl0ZSArPSB0ZXN0Q2FzZVN0YXRzLnN0ZEVy cjsKLSAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENh c2VTdGF0cyApOwotICAgIH0KLQotICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6dGVzdEdyb3VwRW5k ZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIHsKLSAgICAgICAgZG91 YmxlIHN1aXRlVGltZSA9IHN1aXRlVGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKLSAgICAgICAg Q3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7 Ci0gICAgICAgIHdyaXRlR3JvdXAoICptX3Rlc3RHcm91cHMuYmFjaygpLCBzdWl0ZVRpbWUgKTsK LSAgICB9Ci0KLSAgICB2b2lkIEp1bml0UmVwb3J0ZXI6OnRlc3RSdW5FbmRlZEN1bXVsYXRpdmUo KSB7Ci0gICAgICAgIHhtbC5lbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBKdW5pdFJl cG9ydGVyOjp3cml0ZUdyb3VwKCBUZXN0R3JvdXBOb2RlIGNvbnN0JiBncm91cE5vZGUsIGRvdWJs ZSBzdWl0ZVRpbWUgKSB7Ci0gICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1s LnNjb3BlZEVsZW1lbnQoICJ0ZXN0c3VpdGUiICk7Ci0KLSAgICAgICAgVGVzdEdyb3VwU3RhdHMg Y29uc3QmIHN0YXRzID0gZ3JvdXBOb2RlLnZhbHVlOwotICAgICAgICB4bWwud3JpdGVBdHRyaWJ1 dGUoICJuYW1lIiwgc3RhdHMuZ3JvdXBJbmZvLm5hbWUgKTsKLSAgICAgICAgeG1sLndyaXRlQXR0 cmlidXRlKCAiZXJyb3JzIiwgdW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKLSAgICAgICAgeG1sLndy aXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQt dW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKLSAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGVz dHMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICk7Ci0gICAgICAgIHhtbC53cml0 ZUF0dHJpYnV0ZSggImhvc3RuYW1lIiwgInRiZCIgKTsgLy8gIVRCRAotICAgICAgICBpZiggbV9j b25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpOZXZlciApCi0gICAgICAg ICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgIiIgKTsKLSAgICAgICAgZWxzZQotICAg ICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIGZvcm1hdER1cmF0aW9uKCBzdWl0 ZVRpbWUgKSApOwotICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lc3RhbXAiLCBnZXRD dXJyZW50VGltZXN0YW1wKCkgKTsKLQotICAgICAgICAvLyBXcml0ZSBwcm9wZXJ0aWVzIGlmIHRo ZXJlIGFyZSBhbnkKLSAgICAgICAgaWYgKG1fY29uZmlnLT5oYXNUZXN0RmlsdGVycygpIHx8IG1f Y29uZmlnLT5ybmdTZWVkKCkgIT0gMCkgewotICAgICAgICAgICAgYXV0byBwcm9wZXJ0aWVzID0g eG1sLnNjb3BlZEVsZW1lbnQoInByb3BlcnRpZXMiKTsKLSAgICAgICAgICAgIGlmIChtX2NvbmZp Zy0+aGFzVGVzdEZpbHRlcnMoKSkgewotICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50 KCJwcm9wZXJ0eSIpCi0gICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgibmFtZSIs ICJmaWx0ZXJzIikKLSAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJ2YWx1ZSIs IHNlcmlhbGl6ZUZpbHRlcnMobV9jb25maWctPmdldFRlc3RzT3JUYWdzKCkpKTsKLSAgICAgICAg ICAgIH0KLSAgICAgICAgICAgIGlmIChtX2NvbmZpZy0+cm5nU2VlZCgpICE9IDApIHsKLSAgICAg ICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCgicHJvcGVydHkiKQotICAgICAgICAgICAgICAg ICAgICAud3JpdGVBdHRyaWJ1dGUoIm5hbWUiLCAicmFuZG9tLXNlZWQiKQotICAgICAgICAgICAg ICAgICAgICAud3JpdGVBdHRyaWJ1dGUoInZhbHVlIiwgbV9jb25maWctPnJuZ1NlZWQoKSk7Ci0g ICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXcml0ZSB0ZXN0IGNhc2VzCi0g ICAgICAgIGZvciggYXV0byBjb25zdCYgY2hpbGQgOiBncm91cE5vZGUuY2hpbGRyZW4gKQotICAg ICAgICAgICAgd3JpdGVUZXN0Q2FzZSggKmNoaWxkICk7Ci0KLSAgICAgICAgeG1sLnNjb3BlZEVs ZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc3RkT3V0Rm9yU3VpdGUgKSwg WG1sRm9ybWF0dGluZzo6TmV3bGluZSApOwotICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5 c3RlbS1lcnIiICkud3JpdGVUZXh0KCB0cmltKCBzdGRFcnJGb3JTdWl0ZSApLCBYbWxGb3JtYXR0 aW5nOjpOZXdsaW5lICk7Ci0gICAgfQotCi0gICAgdm9pZCBKdW5pdFJlcG9ydGVyOjp3cml0ZVRl c3RDYXNlKCBUZXN0Q2FzZU5vZGUgY29uc3QmIHRlc3RDYXNlTm9kZSApIHsKLSAgICAgICAgVGVz dENhc2VTdGF0cyBjb25zdCYgc3RhdHMgPSB0ZXN0Q2FzZU5vZGUudmFsdWU7Ci0KLSAgICAgICAg Ly8gQWxsIHRlc3QgY2FzZXMgaGF2ZSBleGFjdGx5IG9uZSBzZWN0aW9uIC0gd2hpY2ggcmVwcmVz ZW50cyB0aGUKLSAgICAgICAgLy8gdGVzdCBjYXNlIGl0c2VsZi4gVGhhdCBzZWN0aW9uIG1heSBo YXZlIDAtbiBuZXN0ZWQgc2VjdGlvbnMKLSAgICAgICAgYXNzZXJ0KCB0ZXN0Q2FzZU5vZGUuY2hp bGRyZW4uc2l6ZSgpID09IDEgKTsKLSAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHJvb3RTZWN0 aW9uID0gKnRlc3RDYXNlTm9kZS5jaGlsZHJlbi5mcm9udCgpOwotCi0gICAgICAgIHN0ZDo6c3Ry aW5nIGNsYXNzTmFtZSA9IHN0YXRzLnRlc3RJbmZvLmNsYXNzTmFtZTsKLQotICAgICAgICBpZigg Y2xhc3NOYW1lLmVtcHR5KCkgKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBmaWxlTmFtZVRh ZyhzdGF0cy50ZXN0SW5mby50YWdzKTsKLSAgICAgICAgICAgIGlmICggY2xhc3NOYW1lLmVtcHR5 KCkgKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJnbG9iYWwiOwotICAgICAgICB9Ci0K LSAgICAgICAgaWYgKCAhbV9jb25maWctPm5hbWUoKS5lbXB0eSgpICkKLSAgICAgICAgICAgIGNs YXNzTmFtZSA9IG1fY29uZmlnLT5uYW1lKCkgKyAiLiIgKyBjbGFzc05hbWU7Ci0KLSAgICAgICAg d3JpdGVTZWN0aW9uKCBjbGFzc05hbWUsICIiLCByb290U2VjdGlvbiwgc3RhdHMudGVzdEluZm8u b2tUb0ZhaWwoKSApOwotICAgIH0KLQotICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6d3JpdGVTZWN0 aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgcm9vdE5hbWUsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9k ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXN0T2tUb0Zh aWwpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHRyaW0oIHNlY3Rpb25Ob2RlLnN0YXRz LnNlY3Rpb25JbmZvLm5hbWUgKTsKLSAgICAgICAgaWYoICFyb290TmFtZS5lbXB0eSgpICkKLSAg ICAgICAgICAgIG5hbWUgPSByb290TmFtZSArICcvJyArIG5hbWU7Ci0KLSAgICAgICAgaWYoICFz ZWN0aW9uTm9kZS5hc3NlcnRpb25zLmVtcHR5KCkgfHwKLSAgICAgICAgICAgICFzZWN0aW9uTm9k ZS5zdGRPdXQuZW1wdHkoKSB8fAotICAgICAgICAgICAgIXNlY3Rpb25Ob2RlLnN0ZEVyci5lbXB0 eSgpICkgewotICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2Nv cGVkRWxlbWVudCggInRlc3RjYXNlIiApOwotICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0 eSgpICkgewotICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImNsYXNzbmFtZSIs IG5hbWUgKTsKLSAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgInJv b3QiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAg ICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBjbGFzc05hbWUgKTsKLSAgICAgICAg ICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbmFtZSApOwotICAgICAgICAgICAg fQotICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGltZSIsIGZvcm1hdER1cmF0aW9u KCBzZWN0aW9uTm9kZS5zdGF0cy5kdXJhdGlvbkluU2Vjb25kcyApICk7Ci0gICAgICAgICAgICAv LyBUaGlzIGlzIG5vdCBpZGVhbCwgYnV0IGl0IHNob3VsZCBiZSBlbm91Z2ggdG8gbWltaWMgZ3Rl c3QncwotICAgICAgICAgICAgLy8ganVuaXQgb3V0cHV0LgotICAgICAgICAgICAgLy8gSWRlYWxs eSB0aGUgSlVuaXQgcmVwb3J0ZXIgd291bGQgYWxzbyBoYW5kbGUgYHNraXBUZXN0YAotICAgICAg ICAgICAgLy8gZXZlbnRzIGFuZCB3cml0ZSB0aG9zZSBvdXQgYXBwcm9wcmlhdGVseS4KLSAgICAg ICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInN0YXR1cyIsICJydW4iICk7Ci0KLSAgICAgICAg ICAgIGlmIChzZWN0aW9uTm9kZS5zdGF0cy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rKSB7Ci0gICAg ICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoInNraXBwZWQiKQotICAgICAgICAgICAgICAg ICAgICAud3JpdGVBdHRyaWJ1dGUoIm1lc3NhZ2UiLCAiVEVTVF9DQVNFIHRhZ2dlZCB3aXRoICFt YXlmYWlsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlQXNzZXJ0aW9ucygg c2VjdGlvbk5vZGUgKTsKLQotICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1w dHkoKSApCi0gICAgICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiAp LndyaXRlVGV4dCggdHJpbSggc2VjdGlvbk5vZGUuc3RkT3V0ICksIFhtbEZvcm1hdHRpbmc6Ok5l d2xpbmUgKTsKLSAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuc3RkRXJyLmVtcHR5KCkgKQot ICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRl eHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZEVyciApLCBYbWxGb3JtYXR0aW5nOjpOZXdsaW5lICk7 Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKCBhdXRvIGNvbnN0JiBjaGlsZE5vZGUgOiBzZWN0aW9u Tm9kZS5jaGlsZFNlY3Rpb25zICkKLSAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSAp Ci0gICAgICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBuYW1lLCAiIiwgKmNoaWxkTm9kZSwgdGVz dE9rVG9GYWlsICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd3JpdGVTZWN0 aW9uKCBjbGFzc05hbWUsIG5hbWUsICpjaGlsZE5vZGUsIHRlc3RPa1RvRmFpbCApOwotICAgIH0K LQotICAgIHZvaWQgSnVuaXRSZXBvcnRlcjo6d3JpdGVBc3NlcnRpb25zKCBTZWN0aW9uTm9kZSBj b25zdCYgc2VjdGlvbk5vZGUgKSB7Ci0gICAgICAgIGZvciggYXV0byBjb25zdCYgYXNzZXJ0aW9u IDogc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucyApCi0gICAgICAgICAgICB3cml0ZUFzc2VydGlvbigg YXNzZXJ0aW9uICk7Ci0gICAgfQotCi0gICAgdm9pZCBKdW5pdFJlcG9ydGVyOjp3cml0ZUFzc2Vy dGlvbiggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzICkgewotICAgICAgICBBc3NlcnRpb25S ZXN1bHQgY29uc3QmIHJlc3VsdCA9IHN0YXRzLmFzc2VydGlvblJlc3VsdDsKLSAgICAgICAgaWYo ICFyZXN1bHQuaXNPaygpICkgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgZWxlbWVudE5hbWU7 Ci0gICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7Ci0gICAgICAg ICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgotICAgICAgICAgICAgICAg IGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgotICAgICAgICAgICAgICAgICAg ICBlbGVtZW50TmFtZSA9ICJlcnJvciI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg ICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6Ci0gICAgICAgICAg ICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6Ci0gICAgICAgICAgICAgICAg Y2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgICAg IGVsZW1lbnROYW1lID0gImZhaWx1cmUiOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQot ICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBzZWUgdGhlc2UgaGVyZToKLSAgICAg ICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKLSAgICAgICAgICAgICAgICBjYXNlIFJl c3VsdFdhczo6V2FybmluZzoKLSAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6Ci0g ICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlVua25vd246Ci0gICAgICAgICAgICAgICAg Y2FzZSBSZXN1bHRXYXM6OkZhaWx1cmVCaXQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRX YXM6OkV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiaW50ZXJu YWxFcnJvciI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0g ICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50 KCBlbGVtZW50TmFtZSApOwotCi0gICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJtZXNz YWdlIiwgcmVzdWx0LmdldEV4cHJlc3Npb24oKSApOwotICAgICAgICAgICAgeG1sLndyaXRlQXR0 cmlidXRlKCAidHlwZSIsIHJlc3VsdC5nZXRUZXN0TWFjcm9OYW1lKCkgKTsKLQotICAgICAgICAg ICAgUmV1c2FibGVTdHJpbmdTdHJlYW0gcnNzOwotICAgICAgICAgICAgaWYgKHN0YXRzLnRvdGFs cy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcnNzIDw8ICJGQUlM RUQiIDw8ICI6XG4iOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzRXhwcmVzc2lvbigp KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJzcyA8PCAiICAiOwotICAgICAgICAgICAgICAgICAg ICByc3MgPDwgcmVzdWx0LmdldEV4cHJlc3Npb25Jbk1hY3JvKCk7Ci0gICAgICAgICAgICAgICAg ICAgIHJzcyA8PCAnXG4nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAo cmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJz cyA8PCAid2l0aCBleHBhbnNpb246XG4iOwotICAgICAgICAgICAgICAgICAgICByc3MgPDwgQ29s dW1uKHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSkuaW5kZW50KDIpIDw8ICdcbic7Ci0g ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBy c3MgPDwgJ1xuJzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICFyZXN1bHQuZ2V0 TWVzc2FnZSgpLmVtcHR5KCkgKQotICAgICAgICAgICAgICAgIHJzcyA8PCByZXN1bHQuZ2V0TWVz c2FnZSgpIDw8ICdcbic7Ci0gICAgICAgICAgICBmb3IoIGF1dG8gY29uc3QmIG1zZyA6IHN0YXRz LmluZm9NZXNzYWdlcyApCi0gICAgICAgICAgICAgICAgaWYoIG1zZy50eXBlID09IFJlc3VsdFdh czo6SW5mbyApCi0gICAgICAgICAgICAgICAgICAgIHJzcyA8PCBtc2cubWVzc2FnZSA8PCAnXG4n OwotCi0gICAgICAgICAgICByc3MgPDwgImF0ICIgPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKTsK LSAgICAgICAgICAgIHhtbC53cml0ZVRleHQoIHJzcy5zdHIoKSwgWG1sRm9ybWF0dGluZzo6TmV3 bGluZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIo ICJqdW5pdCIsIEp1bml0UmVwb3J0ZXIgKQotCi19IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKLS8v IGVuZCBjYXRjaF9yZXBvcnRlcl9qdW5pdC5jcHAKLS8vIHN0YXJ0IGNhdGNoX3JlcG9ydGVyX2xp c3RlbmluZy5jcHAKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLW5hbWVzcGFjZSBDYXRjaCB7Ci0K LSAgICBMaXN0ZW5pbmdSZXBvcnRlcjo6TGlzdGVuaW5nUmVwb3J0ZXIoKSB7Ci0gICAgICAgIC8v IFdlIHdpbGwgYXNzdW1lIHRoYXQgbGlzdGVuZXJzIHdpbGwgYWx3YXlzIHdhbnQgYWxsIGFzc2Vy dGlvbnMKLSAgICAgICAgbV9wcmVmZXJlbmNlcy5zaG91bGRSZXBvcnRBbGxBc3NlcnRpb25zID0g dHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjphZGRMaXN0ZW5lcigg SVN0cmVhbWluZ1JlcG9ydGVyUHRyJiYgbGlzdGVuZXIgKSB7Ci0gICAgICAgIG1fbGlzdGVuZXJz LnB1c2hfYmFjayggc3RkOjptb3ZlKCBsaXN0ZW5lciApICk7Ci0gICAgfQotCi0gICAgdm9pZCBM aXN0ZW5pbmdSZXBvcnRlcjo6YWRkUmVwb3J0ZXIoSVN0cmVhbWluZ1JlcG9ydGVyUHRyJiYgcmVw b3J0ZXIpIHsKLSAgICAgICAgYXNzZXJ0KCFtX3JlcG9ydGVyICYmICJMaXN0ZW5pbmcgcmVwb3J0 ZXIgY2FuIHdyYXAgb25seSAxIHJlYWwgcmVwb3J0ZXIiKTsKLSAgICAgICAgbV9yZXBvcnRlciA9 IHN0ZDo6bW92ZSggcmVwb3J0ZXIgKTsKLSAgICAgICAgbV9wcmVmZXJlbmNlcy5zaG91bGRSZWRp cmVjdFN0ZE91dCA9IG1fcmVwb3J0ZXItPmdldFByZWZlcmVuY2VzKCkuc2hvdWxkUmVkaXJlY3RT dGRPdXQ7Ci0gICAgfQotCi0gICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBMaXN0ZW5pbmdSZXBvcnRl cjo6Z2V0UHJlZmVyZW5jZXMoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtX3ByZWZlcmVuY2Vz OwotICAgIH0KLQotICAgIHN0ZDo6c2V0PFZlcmJvc2l0eT4gTGlzdGVuaW5nUmVwb3J0ZXI6Omdl dFN1cHBvcnRlZFZlcmJvc2l0aWVzKCkgewotICAgICAgICByZXR1cm4gc3RkOjpzZXQ8VmVyYm9z aXR5PnsgfTsKLSAgICB9Ci0KLSAgICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjpub01hdGNoaW5n VGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIHsKLSAgICAgICAgZm9yICggYXV0 byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycyApIHsKLSAgICAgICAgICAgIGxpc3RlbmVy LT5ub01hdGNoaW5nVGVzdENhc2VzKCBzcGVjICk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9yZXBv cnRlci0+bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3BlYyApOwotICAgIH0KLQotICAgIHZvaWQgTGlz dGVuaW5nUmVwb3J0ZXI6OnJlcG9ydEludmFsaWRBcmd1bWVudHMoc3RkOjpzdHJpbmcgY29uc3Qm YXJnKXsKLSAgICAgICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycyAp IHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5yZXBvcnRJbnZhbGlkQXJndW1lbnRzKCBhcmcgKTsK LSAgICAgICAgfQotICAgICAgICBtX3JlcG9ydGVyLT5yZXBvcnRJbnZhbGlkQXJndW1lbnRzKCBh cmcgKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJL SU5HKQotICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OmJlbmNobWFya1ByZXBhcmluZyggc3Rk OjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7Ci0JCWZvciAoYXV0byBjb25zdCYgbGlzdGVuZXIgOiBt X2xpc3RlbmVycykgewotCQkJbGlzdGVuZXItPmJlbmNobWFya1ByZXBhcmluZyhuYW1lKTsKLQkJ fQotCQltX3JlcG9ydGVyLT5iZW5jaG1hcmtQcmVwYXJpbmcobmFtZSk7Ci0JfQotICAgIHZvaWQg TGlzdGVuaW5nUmVwb3J0ZXI6OmJlbmNobWFya1N0YXJ0aW5nKCBCZW5jaG1hcmtJbmZvIGNvbnN0 JiBiZW5jaG1hcmtJbmZvICkgewotICAgICAgICBmb3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6 IG1fbGlzdGVuZXJzICkgewotICAgICAgICAgICAgbGlzdGVuZXItPmJlbmNobWFya1N0YXJ0aW5n KCBiZW5jaG1hcmtJbmZvICk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9yZXBvcnRlci0+YmVuY2ht YXJrU3RhcnRpbmcoIGJlbmNobWFya0luZm8gKTsKLSAgICB9Ci0gICAgdm9pZCBMaXN0ZW5pbmdS ZXBvcnRlcjo6YmVuY2htYXJrRW5kZWQoIEJlbmNobWFya1N0YXRzPD4gY29uc3QmIGJlbmNobWFy a1N0YXRzICkgewotICAgICAgICBmb3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVu ZXJzICkgewotICAgICAgICAgICAgbGlzdGVuZXItPmJlbmNobWFya0VuZGVkKCBiZW5jaG1hcmtT dGF0cyApOwotICAgICAgICB9Ci0gICAgICAgIG1fcmVwb3J0ZXItPmJlbmNobWFya0VuZGVkKCBi ZW5jaG1hcmtTdGF0cyApOwotICAgIH0KLQotCXZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OmJlbmNo bWFya0ZhaWxlZCggc3RkOjpzdHJpbmcgY29uc3QmIGVycm9yICkgewotCQlmb3IgKGF1dG8gY29u c3QmIGxpc3RlbmVyIDogbV9saXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVyLT5iZW5jaG1hcmtGYWls ZWQoZXJyb3IpOwotCQl9Ci0JCW1fcmVwb3J0ZXItPmJlbmNobWFya0ZhaWxlZChlcnJvcik7Ci0J fQotI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCi0KLSAgICB2b2lk IExpc3RlbmluZ1JlcG9ydGVyOjp0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0 ZXN0UnVuSW5mbyApIHsKLSAgICAgICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xp c3RlbmVycyApIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT50ZXN0UnVuU3RhcnRpbmcoIHRlc3RS dW5JbmZvICk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1blN0YXJ0aW5n KCB0ZXN0UnVuSW5mbyApOwotICAgIH0KLQotICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OnRl c3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIHsKLSAgICAgICAg Zm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBtX2xpc3RlbmVycyApIHsKLSAgICAgICAgICAg IGxpc3RlbmVyLT50ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7Ci0gICAgICAgIH0KLSAg ICAgICAgbV9yZXBvcnRlci0+dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOwotICAgIH0K LQotICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0ZXI6OnRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNl SW5mbyBjb25zdCYgdGVzdEluZm8gKSB7Ci0gICAgICAgIGZvciAoIGF1dG8gY29uc3QmIGxpc3Rl bmVyIDogbV9saXN0ZW5lcnMgKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+dGVzdENhc2VTdGFy dGluZyggdGVzdEluZm8gKTsKLSAgICAgICAgfQotICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2Fz ZVN0YXJ0aW5nKCB0ZXN0SW5mbyApOwotICAgIH0KLQotICAgIHZvaWQgTGlzdGVuaW5nUmVwb3J0 ZXI6OnNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgewot ICAgICAgICBmb3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgewotICAg ICAgICAgICAgbGlzdGVuZXItPnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKLSAgICAg ICAgfQotICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7 Ci0gICAgfQotCi0gICAgdm9pZCBMaXN0ZW5pbmdSZXBvcnRlcjo6YXNzZXJ0aW9uU3RhcnRpbmco IEFzc2VydGlvbkluZm8gY29uc3QmIGFzc2VydGlvbkluZm8gKSB7Ci0gICAgICAgIGZvciAoIGF1 dG8gY29uc3QmIGxpc3RlbmVyIDogbV9saXN0ZW5lcnMgKSB7Ci0gICAgICAgICAgICBsaXN0ZW5l ci0+YXNzZXJ0aW9uU3RhcnRpbmcoIGFzc2VydGlvbkluZm8gKTsKLSAgICAgICAgfQotICAgICAg ICBtX3JlcG9ydGVyLT5hc3NlcnRpb25TdGFydGluZyggYXNzZXJ0aW9uSW5mbyApOwotICAgIH0K LQotICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlcyBidWZm ZXIgc2hvdWxkIGJlIGNsZWFyZWQ6Ci0gICAgYm9vbCBMaXN0ZW5pbmdSZXBvcnRlcjo6YXNzZXJ0 aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKLSAgICAg ICAgZm9yKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgewotICAgICAgICAg ICAgc3RhdGljX2Nhc3Q8dm9pZD4oIGxpc3RlbmVyLT5hc3NlcnRpb25FbmRlZCggYXNzZXJ0aW9u U3RhdHMgKSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX3JlcG9ydGVyLT5hc3NlcnRp b25FbmRlZCggYXNzZXJ0aW9uU3RhdHMgKTsKLSAgICB9Ci0KLSAgICB2b2lkIExpc3RlbmluZ1Jl cG9ydGVyOjpzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkg ewotICAgICAgICBmb3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgewot ICAgICAgICAgICAgbGlzdGVuZXItPnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7Ci0gICAg ICAgIH0KLSAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsK LSAgICB9Ci0KLSAgICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjp0ZXN0Q2FzZUVuZGVkKCBUZXN0 Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgewotICAgICAgICBmb3IgKCBhdXRvIGNv bnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgewotICAgICAgICAgICAgbGlzdGVuZXItPnRl c3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKLSAgICAgICAgfQotICAgICAgICBtX3JlcG9y dGVyLT50ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7Ci0gICAgfQotCi0gICAgdm9pZCBM aXN0ZW5pbmdSZXBvcnRlcjo6dGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0 ZXN0R3JvdXBTdGF0cyApIHsKLSAgICAgICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIgOiBt X2xpc3RlbmVycyApIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT50ZXN0R3JvdXBFbmRlZCggdGVz dEdyb3VwU3RhdHMgKTsKLSAgICAgICAgfQotICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBF bmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKLSAgICB9Ci0KLSAgICB2b2lkIExpc3RlbmluZ1JlcG9y dGVyOjp0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgewot ICAgICAgICBmb3IgKCBhdXRvIGNvbnN0JiBsaXN0ZW5lciA6IG1fbGlzdGVuZXJzICkgewotICAg ICAgICAgICAgbGlzdGVuZXItPnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7Ci0gICAgICAg IH0KLSAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKLSAg ICB9Ci0KLSAgICB2b2lkIExpc3RlbmluZ1JlcG9ydGVyOjpza2lwVGVzdCggVGVzdENhc2VJbmZv IGNvbnN0JiB0ZXN0SW5mbyApIHsKLSAgICAgICAgZm9yICggYXV0byBjb25zdCYgbGlzdGVuZXIg OiBtX2xpc3RlbmVycyApIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5za2lwVGVzdCggdGVzdElu Zm8gKTsKLSAgICAgICAgfQotICAgICAgICBtX3JlcG9ydGVyLT5za2lwVGVzdCggdGVzdEluZm8g KTsKLSAgICB9Ci0KLSAgICBib29sIExpc3RlbmluZ1JlcG9ydGVyOjppc011bHRpKCkgY29uc3Qg ewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0gLy8gZW5kIG5hbWVzcGFjZSBDYXRj aAotLy8gZW5kIGNhdGNoX3JlcG9ydGVyX2xpc3RlbmluZy5jcHAKLS8vIHN0YXJ0IGNhdGNoX3Jl cG9ydGVyX3htbC5jcHAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jcHJhZ21hIHdhcm5pbmco cHVzaCkKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNjEpIC8vIE5vdCBhbGwgbGFiZWxzIGFy ZSBFWFBMSUNJVExZIGhhbmRsZWQgaW4gc3dpdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAvLyBOb3RlIHRoYXQgNDA2MiAobm90IGFsbCBsYWJlbHMgYXJlIGhhbmRsZWQKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkZWZhdWx0IGlzIG1pc3NpbmcpIGlzIGVu YWJsZWQKLSNlbmRpZgotCi1uYW1lc3BhY2UgQ2F0Y2ggewotICAgIFhtbFJlcG9ydGVyOjpYbWxS ZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQotICAgIDogICBTdHJlYW1p bmdSZXBvcnRlckJhc2UoIF9jb25maWcgKSwKLSAgICAgICAgbV94bWwoX2NvbmZpZy5zdHJlYW0o KSkKLSAgICB7Ci0gICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9 IHRydWU7Ci0gICAgICAgIG1fcmVwb3J0ZXJQcmVmcy5zaG91bGRSZXBvcnRBbGxBc3NlcnRpb25z ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBYbWxSZXBvcnRlcjo6flhtbFJlcG9ydGVyKCkgPSBkZWZh dWx0OwotCi0gICAgc3RkOjpzdHJpbmcgWG1sUmVwb3J0ZXI6OmdldERlc2NyaXB0aW9uKCkgewot ICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGFzIGFuIFhNTCBkb2N1bWVudCI7 Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgWG1sUmVwb3J0ZXI6OmdldFN0eWxlc2hlZXRSZWYo KSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICAgIH0KLQotICAgIHZv aWQgWG1sUmVwb3J0ZXI6OndyaXRlU291cmNlSW5mbyggU291cmNlTGluZUluZm8gY29uc3QmIHNv dXJjZUluZm8gKSB7Ci0gICAgICAgIG1feG1sCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUo ICJmaWxlbmFtZSIsIHNvdXJjZUluZm8uZmlsZSApCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1 dGUoICJsaW5lIiwgc291cmNlSW5mby5saW5lICk7Ci0gICAgfQotCi0gICAgdm9pZCBYbWxSZXBv cnRlcjo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHMgKSB7Ci0gICAg ICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggcyApOwotICAg IH0KLQotICAgIHZvaWQgWG1sUmVwb3J0ZXI6OnRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8g Y29uc3QmIHRlc3RJbmZvICkgewotICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RS dW5TdGFydGluZyggdGVzdEluZm8gKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgc3R5bGVzaGVldFJl ZiA9IGdldFN0eWxlc2hlZXRSZWYoKTsKLSAgICAgICAgaWYoICFzdHlsZXNoZWV0UmVmLmVtcHR5 KCkgKQotICAgICAgICAgICAgbV94bWwud3JpdGVTdHlsZXNoZWV0UmVmKCBzdHlsZXNoZWV0UmVm ICk7Ci0gICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkNhdGNoIiApOwotICAgICAgICBpZigg IW1fY29uZmlnLT5uYW1lKCkuZW1wdHkoKSApCi0gICAgICAgICAgICBtX3htbC53cml0ZUF0dHJp YnV0ZSggIm5hbWUiLCBtX2NvbmZpZy0+bmFtZSgpICk7Ci0gICAgICAgIGlmIChtX2NvbmZpZy0+ dGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkpCi0gICAgICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0 ZSggImZpbHRlcnMiLCBzZXJpYWxpemVGaWx0ZXJzKCBtX2NvbmZpZy0+Z2V0VGVzdHNPclRhZ3Mo KSApICk7Ci0gICAgICAgIGlmKCBtX2NvbmZpZy0+cm5nU2VlZCgpICE9IDAgKQotICAgICAgICAg ICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlJhbmRvbW5lc3MiICkKLSAgICAgICAgICAgICAgICAu d3JpdGVBdHRyaWJ1dGUoICJzZWVkIiwgbV9jb25maWctPnJuZ1NlZWQoKSApOwotICAgIH0KLQot ICAgIHZvaWQgWG1sUmVwb3J0ZXI6OnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3Qm IGdyb3VwSW5mbyApIHsKLSAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBT dGFydGluZyggZ3JvdXBJbmZvICk7Ci0gICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkdyb3Vw IiApCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgZ3JvdXBJbmZvLm5hbWUg KTsKLSAgICB9Ci0KLSAgICB2b2lkIFhtbFJlcG9ydGVyOjp0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0 Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgewotICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJh c2U6OnRlc3RDYXNlU3RhcnRpbmcodGVzdEluZm8pOwotICAgICAgICBtX3htbC5zdGFydEVsZW1l bnQoICJUZXN0Q2FzZSIgKQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRy aW0oIHRlc3RJbmZvLm5hbWUgKSApCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNj cmlwdGlvbiIsIHRlc3RJbmZvLmRlc2NyaXB0aW9uICkKLSAgICAgICAgICAgIC53cml0ZUF0dHJp YnV0ZSggInRhZ3MiLCB0ZXN0SW5mby50YWdzQXNTdHJpbmcoKSApOwotCi0gICAgICAgIHdyaXRl U291cmNlSW5mbyggdGVzdEluZm8ubGluZUluZm8gKTsKLQotICAgICAgICBpZiAoIG1fY29uZmln LT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKLSAgICAgICAgICAg IG1fdGVzdENhc2VUaW1lci5zdGFydCgpOwotICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQo KTsKLSAgICB9Ci0KLSAgICB2b2lkIFhtbFJlcG9ydGVyOjpzZWN0aW9uU3RhcnRpbmcoIFNlY3Rp b25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIHsKLSAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJC YXNlOjpzZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7Ci0gICAgICAgIGlmKCBtX3NlY3Rp b25EZXB0aCsrID4gMCApIHsKLSAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlNlY3Rp b24iICkKLSAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgdHJpbSggc2Vj dGlvbkluZm8ubmFtZSApICk7Ci0gICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHNlY3Rpb25J bmZvLmxpbmVJbmZvICk7Ci0gICAgICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKLSAg ICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgWG1sUmVwb3J0ZXI6OmFzc2VydGlvblN0YXJ0aW5n KCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIHsgfQotCi0gICAgYm9vbCBYbWxSZXBvcnRlcjo6YXNz ZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIHsKLQot ICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IGFzc2VydGlvblN0YXRzLmFz c2VydGlvblJlc3VsdDsKLQotICAgICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWct PmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOwotCi0gICAgICAg IGlmKCBpbmNsdWRlUmVzdWx0cyB8fCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpID09IFJlc3VsdFdh czo6V2FybmluZyApIHsKLSAgICAgICAgICAgIC8vIFByaW50IGFueSBpbmZvIG1lc3NhZ2VzIGlu IDxJbmZvPiB0YWdzLgotICAgICAgICAgICAgZm9yKCBhdXRvIGNvbnN0JiBtc2cgOiBhc3NlcnRp b25TdGF0cy5pbmZvTWVzc2FnZXMgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIG1zZy50eXBlID09 IFJlc3VsdFdhczo6SW5mbyAmJiBpbmNsdWRlUmVzdWx0cyApIHsKLSAgICAgICAgICAgICAgICAg ICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkluZm8iICkKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAud3JpdGVUZXh0KCBtc2cubWVzc2FnZSApOwotICAgICAgICAgICAgICAgIH0gZWxzZSBp ZiAoIG1zZy50eXBlID09IFJlc3VsdFdhczo6V2FybmluZyApIHsKLSAgICAgICAgICAgICAgICAg ICAgbV94bWwuc2NvcGVkRWxlbWVudCggIldhcm5pbmciICkKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAud3JpdGVUZXh0KCBtc2cubWVzc2FnZSApOwotICAgICAgICAgICAgICAgIH0KLSAg ICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3 YXMgc3VjY2Vzc2Z1bCBidXQgd2UncmUgbm90IHByaW50aW5nIHRoZW0uCi0gICAgICAgIGlmKCAh aW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldh cm5pbmcgKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gUHJpbnQgdGhl IGV4cHJlc3Npb24gaWYgdGhlcmUgaXMgb25lLgotICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJl c3Npb24oKSApIHsKLSAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkV4cHJlc3Npb24i ICkKLSAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzIiwgcmVzdWx0LnN1 Y2NlZWRlZCgpICkKLSAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVz dWx0LmdldFRlc3RNYWNyb05hbWUoKSApOwotCi0gICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8o IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKLQotICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxl bWVudCggIk9yaWdpbmFsIiApCi0gICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0Lmdl dEV4cHJlc3Npb24oKSApOwotICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkV4cGFu ZGVkIiApCi0gICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhw cmVzc2lvbigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbmQuLi4gUHJpbnQgYSByZXN1 bHQgYXBwbGljYWJsZSB0byBlYWNoIHJlc3VsdCB0eXBlLgotICAgICAgICBzd2l0Y2goIHJlc3Vs dC5nZXRSZXN1bHRUeXBlKCkgKSB7Ci0gICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdF eGNlcHRpb246Ci0gICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhjZXB0aW9u IiApOwotICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUlu Zm8oKSApOwotICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3Nh Z2UoKSApOwotICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAg ICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0 aW9uOgotICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkZhdGFsRXJyb3JDb25k aXRpb24iICk7Ci0gICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291 cmNlSW5mbygpICk7Ci0gICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0 TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOwotICAgICAg ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86Ci0gICAg ICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkluZm8iICkKLSAgICAgICAgICAgICAg ICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgICAg IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6Ci0gICAgICAgICAg ICAgICAgLy8gV2FybmluZyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIHdyaXR0ZW4KLSAgICAgICAg ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1 cmU6Ci0gICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRmFpbHVyZSIgKTsKLSAg ICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsK LSAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsK LSAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYnJl YWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICB9Ci0KLSAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKQotICAgICAgICAgICAg bV94bWwuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAg IHZvaWQgWG1sUmVwb3J0ZXI6OnNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0 aW9uU3RhdHMgKSB7Ci0gICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVk KCBzZWN0aW9uU3RhdHMgKTsKLSAgICAgICAgaWYoIC0tbV9zZWN0aW9uRGVwdGggPiAwICkgewot ICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVt ZW50KCAiT3ZlcmFsbFJlc3VsdHMiICk7Ci0gICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAi c3VjY2Vzc2VzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMucGFzc2VkICk7Ci0gICAgICAgICAg ICBlLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5m YWlsZWQgKTsKLSAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVz Iiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKLQotICAgICAgICAgICAg aWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyAp Ci0gICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwg c2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzICk7Ci0KLSAgICAgICAgICAgIG1feG1sLmVu ZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgWG1sUmVwb3J0ZXI6OnRl c3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSB7Ci0gICAg ICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyAp OwotICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IG1feG1sLnNjb3BlZEVsZW1l bnQoICJPdmVyYWxsUmVzdWx0IiApOwotICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAic3VjY2Vz cyIsIHRlc3RDYXNlU3RhdHMudG90YWxzLmFzc2VydGlvbnMuYWxsT2soKSApOwotCi0gICAgICAg IGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMg KQotICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgbV90 ZXN0Q2FzZVRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCkgKTsKLQotICAgICAgICBpZiggIXRlc3RD YXNlU3RhdHMuc3RkT3V0LmVtcHR5KCkgKQotICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVu dCggIlN0ZE91dCIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkT3V0ICksIFht bEZvcm1hdHRpbmc6Ok5ld2xpbmUgKTsKLSAgICAgICAgaWYoICF0ZXN0Q2FzZVN0YXRzLnN0ZEVy ci5lbXB0eSgpICkKLSAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRFcnIiICku d3JpdGVUZXh0KCB0cmltKCB0ZXN0Q2FzZVN0YXRzLnN0ZEVyciApLCBYbWxGb3JtYXR0aW5nOjpO ZXdsaW5lICk7Ci0KLSAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHZv aWQgWG1sUmVwb3J0ZXI6OnRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVz dEdyb3VwU3RhdHMgKSB7Ci0gICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3Vw RW5kZWQoIHRlc3RHcm91cFN0YXRzICk7Ci0gICAgICAgIC8vIFRPRE86IENoZWNrIHRlc3RHcm91 cFN0YXRzLmFib3J0aW5nIGFuZCBhY3QgYWNjb3JkaW5nbHkuCi0gICAgICAgIG1feG1sLnNjb3Bl ZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRl KCAic3VjY2Vzc2VzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkK LSAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMu dG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkKLSAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgg ImV4cGVjdGVkRmFpbHVyZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWls ZWRCdXRPayApOwotICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHND YXNlcyIpCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0R3Jv dXBTdGF0cy50b3RhbHMudGVzdENhc2VzLnBhc3NlZCApCi0gICAgICAgICAgICAud3JpdGVBdHRy aWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy50ZXN0Q2FzZXMuZmFpbGVk ICkKLSAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCB0ZXN0 R3JvdXBTdGF0cy50b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rICk7Ci0gICAgICAgIG1feG1s LmVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIFhtbFJlcG9ydGVyOjp0ZXN0UnVuRW5k ZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgewotICAgICAgICBTdHJlYW1p bmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7Ci0gICAgICAgIG1f eG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQotICAgICAgICAgICAgLndyaXRl QXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnBh c3NlZCApCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RSdW5T dGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKQotICAgICAgICAgICAgLndyaXRlQXR0cmli dXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5m YWlsZWRCdXRPayApOwotICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3Vs dHNDYXNlcyIpCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0 UnVuU3RhdHMudG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgKQotICAgICAgICAgICAgLndyaXRlQXR0 cmlidXRlKCAiZmFpbHVyZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLnRlc3RDYXNlcy5mYWlsZWQg KQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZXhwZWN0ZWRGYWlsdXJlcyIsIHRlc3RS dW5TdGF0cy50b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rICk7Ci0gICAgICAgIG1feG1sLmVu ZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFCTEVfQkVO Q0hNQVJLSU5HKQotICAgIHZvaWQgWG1sUmVwb3J0ZXI6OmJlbmNobWFya1ByZXBhcmluZyhzdGQ6 OnN0cmluZyBjb25zdCYgbmFtZSkgewotICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoIkJlbmNo bWFya1Jlc3VsdHMiKQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7 Ci0gICAgfQotCi0gICAgdm9pZCBYbWxSZXBvcnRlcjo6YmVuY2htYXJrU3RhcnRpbmcoQmVuY2ht YXJrSW5mbyBjb25zdCAmaW5mbykgewotICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0ZSgic2Ft cGxlcyIsIGluZm8uc2FtcGxlcykKLSAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgicmVzYW1w bGVzIiwgaW5mby5yZXNhbXBsZXMpCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoIml0ZXJh dGlvbnMiLCBpbmZvLml0ZXJhdGlvbnMpCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoImNs b2NrUmVzb2x1dGlvbiIsIGluZm8uY2xvY2tSZXNvbHV0aW9uKQotICAgICAgICAgICAgLndyaXRl QXR0cmlidXRlKCJlc3RpbWF0ZWREdXJhdGlvbiIsIGluZm8uZXN0aW1hdGVkRHVyYXRpb24pCi0g ICAgICAgICAgICAud3JpdGVDb21tZW50KCJBbGwgdmFsdWVzIGluIG5hbm8gc2Vjb25kcyIpOwot ICAgIH0KLQotICAgIHZvaWQgWG1sUmVwb3J0ZXI6OmJlbmNobWFya0VuZGVkKEJlbmNobWFya1N0 YXRzPD4gY29uc3QmIGJlbmNobWFya1N0YXRzKSB7Ci0gICAgICAgIG1feG1sLnN0YXJ0RWxlbWVu dCgibWVhbiIpCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoInZhbHVlIiwgYmVuY2htYXJr U3RhdHMubWVhbi5wb2ludC5jb3VudCgpKQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJs b3dlckJvdW5kIiwgYmVuY2htYXJrU3RhdHMubWVhbi5sb3dlcl9ib3VuZC5jb3VudCgpKQotICAg ICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJ1cHBlckJvdW5kIiwgYmVuY2htYXJrU3RhdHMubWVh bi51cHBlcl9ib3VuZC5jb3VudCgpKQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJjaSIs IGJlbmNobWFya1N0YXRzLm1lYW4uY29uZmlkZW5jZV9pbnRlcnZhbCk7Ci0gICAgICAgIG1feG1s LmVuZEVsZW1lbnQoKTsKLSAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCJzdGFuZGFyZERldmlh dGlvbiIpCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoInZhbHVlIiwgYmVuY2htYXJrU3Rh dHMuc3RhbmRhcmREZXZpYXRpb24ucG9pbnQuY291bnQoKSkKLSAgICAgICAgICAgIC53cml0ZUF0 dHJpYnV0ZSgibG93ZXJCb3VuZCIsIGJlbmNobWFya1N0YXRzLnN0YW5kYXJkRGV2aWF0aW9uLmxv d2VyX2JvdW5kLmNvdW50KCkpCi0gICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoInVwcGVyQm91 bmQiLCBiZW5jaG1hcmtTdGF0cy5zdGFuZGFyZERldmlhdGlvbi51cHBlcl9ib3VuZC5jb3VudCgp KQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJjaSIsIGJlbmNobWFya1N0YXRzLnN0YW5k YXJkRGV2aWF0aW9uLmNvbmZpZGVuY2VfaW50ZXJ2YWwpOwotICAgICAgICBtX3htbC5lbmRFbGVt ZW50KCk7Ci0gICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCgib3V0bGllcnMiKQotICAgICAgICAg ICAgLndyaXRlQXR0cmlidXRlKCJ2YXJpYW5jZSIsIGJlbmNobWFya1N0YXRzLm91dGxpZXJWYXJp YW5jZSkKLSAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgibG93TWlsZCIsIGJlbmNobWFya1N0 YXRzLm91dGxpZXJzLmxvd19taWxkKQotICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCJsb3dT ZXZlcmUiLCBiZW5jaG1hcmtTdGF0cy5vdXRsaWVycy5sb3dfc2V2ZXJlKQotICAgICAgICAgICAg LndyaXRlQXR0cmlidXRlKCJoaWdoTWlsZCIsIGJlbmNobWFya1N0YXRzLm91dGxpZXJzLmhpZ2hf bWlsZCkKLSAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSgiaGlnaFNldmVyZSIsIGJlbmNobWFy a1N0YXRzLm91dGxpZXJzLmhpZ2hfc2V2ZXJlKTsKLSAgICAgICAgbV94bWwuZW5kRWxlbWVudCgp OwotICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBYbWxSZXBv cnRlcjo6YmVuY2htYXJrRmFpbGVkKHN0ZDo6c3RyaW5nIGNvbnN0ICZlcnJvcikgewotICAgICAg ICBtX3htbC5zY29wZWRFbGVtZW50KCJmYWlsZWQiKS4KLSAgICAgICAgICAgIHdyaXRlQXR0cmli dXRlKCJtZXNzYWdlIiwgZXJyb3IpOwotICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7Ci0gICAg fQotI2VuZGlmIC8vIENBVENIX0NPTkZJR19FTkFCTEVfQkVOQ0hNQVJLSU5HCi0KLSAgICBDQVRD SF9SRUdJU1RFUl9SRVBPUlRFUiggInhtbCIsIFhtbFJlcG9ydGVyICkKLQotfSAvLyBlbmQgbmFt ZXNwYWNlIENhdGNoCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotI3ByYWdtYSB3YXJuaW5nKHBv cCkKLSNlbmRpZgotLy8gZW5kIGNhdGNoX3JlcG9ydGVyX3htbC5jcHAKLQotbmFtZXNwYWNlIENh dGNoIHsKLSAgICBMZWFrRGV0ZWN0b3IgbGVha0RldGVjdG9yOwotfQotCi0jaWZkZWYgX19jbGFu Z19fCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotLy8gZW5kIGNhdGNo X2ltcGwuaHBwCi0jZW5kaWYKLQotI2lmZGVmIENBVENIX0NPTkZJR19NQUlOCi0vLyBzdGFydCBj YXRjaF9kZWZhdWx0X21haW4uaHBwCi0KLSNpZm5kZWYgX19PQkpDX18KLQotI2lmIGRlZmluZWQo Q0FUQ0hfQ09ORklHX1dDSEFSKSAmJiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX1dJTkRPV1MpICYm IGRlZmluZWQoX1VOSUNPREUpICYmICFkZWZpbmVkKERPX05PVF9VU0VfV01BSU4pCi0vLyBTdGFu ZGFyZCBDL0MrKyBXaW4zMiBVbmljb2RlIHdtYWluIGVudHJ5IHBvaW50Ci1leHRlcm4gIkMiIGlu dCB3bWFpbiAoaW50IGFyZ2MsIHdjaGFyX3QgKiBhcmd2W10sIHdjaGFyX3QgKiBbXSkgewotI2Vs c2UKLS8vIFN0YW5kYXJkIEMvQysrIG1haW4gZW50cnkgcG9pbnQKLWludCBtYWluIChpbnQgYXJn YywgY2hhciAqIGFyZ3ZbXSkgewotI2VuZGlmCi0KLSAgICByZXR1cm4gQ2F0Y2g6OlNlc3Npb24o KS5ydW4oIGFyZ2MsIGFyZ3YgKTsKLX0KLQotI2Vsc2UgLy8gX19PQkpDX18KLQotLy8gT2JqZWN0 aXZlLUMgZW50cnkgcG9pbnQKLWludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3Zb XSkgewotI2lmICFDQVRDSF9BUkNfRU5BQkxFRAotICAgIE5TQXV0b3JlbGVhc2VQb29sICogcG9v bCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotI2VuZGlmCi0KLSAgICBDYXRj aDo6cmVnaXN0ZXJUZXN0TWV0aG9kcygpOwotICAgIGludCByZXN1bHQgPSBDYXRjaDo6U2Vzc2lv bigpLnJ1biggYXJnYywgKGNoYXIqKilhcmd2ICk7Ci0KLSNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQK LSAgICBbcG9vbCBkcmFpbl07Ci0jZW5kaWYKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNl bmRpZiAvLyBfX09CSkNfXwotCi0vLyBlbmQgY2F0Y2hfZGVmYXVsdF9tYWluLmhwcAotI2VuZGlm Ci0KLSNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfSU1QTF9PTkxZKQotCi0jaWZkZWYgQ0xBUkFf Q09ORklHX01BSU5fTk9UX0RFRklORUQKLSMgIHVuZGVmIENMQVJBX0NPTkZJR19NQUlOCi0jZW5k aWYKLQotI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFKQotLy8vLy8vCi0vLyBJZiB0 aGlzIGNvbmZpZyBpZGVudGlmaWVyIGlzIGRlZmluZWQgdGhlbiBhbGwgQ0FUQ0ggbWFjcm9zIGFy ZSBwcmVmaXhlZCB3aXRoIENBVENIXwotI2lmZGVmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMCi0K LSNkZWZpbmUgQ0FUQ0hfUkVRVUlSRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENI X1JFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18g KQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNU KCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFs IHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIF9fVkFfQVJHU19fICkKLQot I2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XUyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dT KCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1h bCwgX19WQV9BUkdTX18gKQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyggZXhwciwg ZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX1JFUVVJUkVf VEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3Jt YWwsIGV4cHIgKQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRj aGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX1NUUl9NQVRDSEVTKCAiQ0FUQ0hfUkVRVUlSRV9U SFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBl eHByICkKLSNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUykKLSNkZWZp bmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1NfTUFUQ0hFUyggZXhwciwgZXhjZXB0aW9uVHlwZSwgbWF0 Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XU19NQVRDSEVTKCAiQ0FUQ0hfUkVRVUlSRV9USFJP V1NfTUFUQ0hFUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9y bWFsLCBtYXRjaGVyLCBleHByICkKLSNlbmRpZi8vIENBVENIX0NPTkZJR19ESVNBQkxFX01BVENI RVJTCi0jZGVmaW5lIENBVENIX1JFUVVJUkVfTk9USFJPVyggLi4uICkgSU5URVJOQUxfQ0FUQ0hf Tk9fVEhST1coICJDQVRDSF9SRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRp b246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQotCi0jZGVmaW5lIENBVENIX0NIRUNLKCAuLi4gKSBJ TlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRp b246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIENBVENIX0NIRUNL X0ZBTFNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0tfRkFMU0UiLCBD YXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3Vs dERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfQ0hF Q0tFRF9JRiggLi4uICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDQVRDSF9DSEVDS0VEX0lGIiwgQ2F0 Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQot I2RlZmluZSBDQVRDSF9DSEVDS0VEX0VMU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX0VMU0UoICJD QVRDSF9DSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25G YWlsdXJlLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIENBVENIX0NIRUNLX05PRkFJTCggLi4uICkg SU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHRE aXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246 OlN1cHByZXNzRmFpbCwgX19WQV9BUkdTX18gKQotCi0jZGVmaW5lIENBVENIX0NIRUNLX1RIUk9X UyggLi4uICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XUyIsIENh dGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkK LSNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5U RVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9u VHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciAp Ci0jZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJO QUxfQ0FUQ0hfVEhST1dTX1NUUl9NQVRDSEVTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgiLCBD YXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHBy ICkKLSNpZiAhZGVmaW5lZChDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUykKLSNkZWZpbmUg Q0FUQ0hfQ0hFQ0tfVEhST1dTX01BVENIRVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUsIG1hdGNoZXIg KSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfTUFUQ0hFUyggIkNBVENIX0NIRUNLX1RIUk9XU19NQVRD SEVTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9u RmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCi0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVf TUFUQ0hFUlMKLSNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9USFJPVyggLi4uICkgSU5URVJOQUxfQ0FU Q0hfTk9fVEhST1coICJDQVRDSF9DSEVDS19OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0 aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQotCi0jaWYgIWRlZmluZWQoQ0FU Q0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMpCi0jZGVmaW5lIENBVENIX0NIRUNLX1RIQVQoIGFy ZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDQVRDSF9DSEVDS19USEFUIiwgbWF0 Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkK LQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NI RUNLX1RIQVQoICJDQVRDSF9SRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlz cG9zaXRpb246Ok5vcm1hbCwgYXJnICkKLSNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRElTQUJMRV9N QVRDSEVSUwotCi0jZGVmaW5lIENBVENIX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8o ICJDQVRDSF9JTkZPIiwgbXNnICkKLSNkZWZpbmUgQ0FUQ0hfVU5TQ09QRURfSU5GTyggbXNnICkg SU5URVJOQUxfQ0FUQ0hfVU5TQ09QRURfSU5GTyggIkNBVENIX1VOU0NPUEVEX0lORk8iLCBtc2cg KQotI2RlZmluZSBDQVRDSF9XQVJOKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9X QVJOIiwgQ2F0Y2g6OlJlc3VsdFdhczo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9u OjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKLSNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggLi4uICkg SU5URVJOQUxfQ0FUQ0hfQ0FQVFVSRSggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoY2FwdHVy ZXIpLCAiQ0FUQ0hfQ0FQVFVSRSIsX19WQV9BUkdTX18gKQotCi0jZGVmaW5lIENBVENIX1RFU1Rf Q0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKLSNkZWZp bmUgQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRD SF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FU Q0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NRVRI T0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfUkVH SVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJf VEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIENBVENIX1NFQ1RJT04o IC4uLiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FU Q0hfRFlOQU1JQ19TRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04o IF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hf TVNHKCAiQ0FUQ0hfRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0 Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FU Q0hfRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVD SyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bv c2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQotI2RlZmluZSBDQVRDSF9T VUNDRUVEKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6 OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1 cmUsIF9fVkFfQVJHU19fICkKLQotI2RlZmluZSBDQVRDSF9BTk9OX1RFU1RfQ0FTRSgpIElOVEVS TkFMX0NBVENIX1RFU1RDQVNFKCkKLQotI2lmbmRlZiBDQVRDSF9DT05GSUdfVFJBRElUSU9OQUxf TVNWQ19QUkVQUk9DRVNTT1IKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFKCAuLi4g KSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkKLSNkZWZp bmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVN UExBVEVfVEVTVF9DQVNFX1NJRyggX19WQV9BUkdTX18gKQotI2RlZmluZSBDQVRDSF9URU1QTEFU RV9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFTVBM QVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQotI2RlZmluZSBD QVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCAuLi4gKSBJTlRF Uk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCBfX1ZB X0FSR1NfXyApCi0jZGVmaW5lIENBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFKCAuLi4g KSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggX19WQV9BUkdTX18g KQotI2RlZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9TSUcoIC4uLiApIElO VEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX1NJRyggX19WQV9BUkdTX18g KQotI2RlZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNz TmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVU SE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJP RFVDVF9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRD SF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIF9fVkFf QVJHU19fICkKLSNlbHNlCi0jZGVmaW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggLi4uICkg SU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNU X0NBU0UoIF9fVkFfQVJHU19fICkgKQotI2RlZmluZSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0Vf U0lHKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RF TVBMQVRFX1RFU1RfQ0FTRV9TSUcoIF9fVkFfQVJHU19fICkgKQotI2RlZmluZSBDQVRDSF9URU1Q TEFURV9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX0VY UEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRCggY2xh c3NOYW1lLCBfX1ZBX0FSR1NfXyApICkKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNF X01FVEhPRF9TSUcoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdT KCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1l LCBfX1ZBX0FSR1NfXyApICkKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NB U0UoIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVN UExBVEVfUFJPRFVDVF9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkgKQotI2RlZmluZSBDQVRDSF9U RU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9TSUcoIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFO RF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfU0lHKCBf X1ZBX0FSR1NfXyApICkKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0Vf TUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5U RVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUs IF9fVkFfQVJHU19fICkgKQotI2RlZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FT RV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJH UyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EX1NJRygg Y2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApICkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoQ0FUQ0hf Q09ORklHX1JVTlRJTUVfU1RBVElDX1JFUVVJUkUpCi0jZGVmaW5lIENBVENIX1NUQVRJQ19SRVFV SVJFKCAuLi4gKSAgICAgICBzdGF0aWNfYXNzZXJ0KCAgIF9fVkFfQVJHU19fICwgICAgICAjX19W QV9BUkdTX18gKTsgICAgIENBVENIX1NVQ0NFRUQoICNfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIENB VENIX1NUQVRJQ19SRVFVSVJFX0ZBTFNFKCAuLi4gKSBzdGF0aWNfYXNzZXJ0KCAhKF9fVkFfQVJH U19fKSwgIiEoIiAjX19WQV9BUkdTX18gIikiICk7IENBVENIX1NVQ0NFRUQoICNfX1ZBX0FSR1Nf XyApCi0jZWxzZQotI2RlZmluZSBDQVRDSF9TVEFUSUNfUkVRVUlSRSggLi4uICkgICAgICAgQ0FU Q0hfUkVRVUlSRSggX19WQV9BUkdTX18gKQotI2RlZmluZSBDQVRDSF9TVEFUSUNfUkVRVUlSRV9G QUxTRSggLi4uICkgQ0FUQ0hfUkVRVUlSRV9GQUxTRSggX19WQV9BUkdTX18gKQotI2VuZGlmCi0K LS8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCi0jZGVmaW5lIENBVENIX1NDRU5B UklPKCAuLi4gKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCi0j ZGVmaW5lIENBVENIX1NDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9D QVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1Nf XyApCi0jZGVmaW5lIENBVENIX0dJVkVOKCBkZXNjICkgICAgIElOVEVSTkFMX0NBVENIX0RZTkFN SUNfU0VDVElPTiggIiAgICBHaXZlbjogIiA8PCBkZXNjICkKLSNkZWZpbmUgQ0FUQ0hfQU5EX0dJ VkVOKCBkZXNjICkgSU5URVJOQUxfQ0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCAiQW5kIGdpdmVuOiAi IDw8IGRlc2MgKQotI2RlZmluZSBDQVRDSF9XSEVOKCBkZXNjICkgICAgICBJTlRFUk5BTF9DQVRD SF9EWU5BTUlDX1NFQ1RJT04oICIgICAgIFdoZW46ICIgPDwgZGVzYyApCi0jZGVmaW5lIENBVENI X0FORF9XSEVOKCBkZXNjICkgIElOVEVSTkFMX0NBVENIX0RZTkFNSUNfU0VDVElPTiggIiBBbmQg d2hlbjogIiA8PCBkZXNjICkKLSNkZWZpbmUgQ0FUQ0hfVEhFTiggZGVzYyApICAgICAgSU5URVJO QUxfQ0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCAiICAgICBUaGVuOiAiIDw8IGRlc2MgKQotI2RlZmlu ZSBDQVRDSF9BTkRfVEhFTiggZGVzYyApICBJTlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04o ICIgICAgICBBbmQ6ICIgPDwgZGVzYyApCi0KLSNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19FTkFC TEVfQkVOQ0hNQVJLSU5HKQotI2RlZmluZSBDQVRDSF9CRU5DSE1BUksoLi4uKSBcCi0gICAgSU5U RVJOQUxfQ0FUQ0hfQkVOQ0hNQVJLKElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKENfQV9UX0Nf SF9CX0VfTl9DX0hfKSwgSU5URVJOQUxfQ0FUQ0hfR0VUXzFfQVJHKF9fVkFfQVJHU19fLCwpLCBJ TlRFUk5BTF9DQVRDSF9HRVRfMl9BUkcoX19WQV9BUkdTX18sLCkpCi0jZGVmaW5lIENBVENIX0JF TkNITUFSS19BRFZBTkNFRChuYW1lKSBcCi0gICAgSU5URVJOQUxfQ0FUQ0hfQkVOQ0hNQVJLX0FE VkFOQ0VEKElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKENfQV9UX0NfSF9CX0VfTl9DX0hfKSwg bmFtZSkKLSNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRU5BQkxFX0JFTkNITUFSS0lORwotCi0vLyBJ ZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoZSBDQVRDSF8g cHJlZml4IGlzIG5vdCByZXF1aXJlZAotI2Vsc2UKLQotI2RlZmluZSBSRVFVSVJFKCAuLi4gKSBJ TlRFUk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6 Tm9ybWFsLCBfX1ZBX0FSR1NfXyAgKQotI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCAuLi4gKSBJTlRF Uk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlv bjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIF9fVkFfQVJH U19fICkKLQotI2RlZmluZSBSRVFVSVJFX1RIUk9XUyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEhS T1dTKCAiUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwg X19WQV9BUkdTX18gKQotI2RlZmluZSBSRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9u VHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIlJFUVVJUkVfVEhST1dTX0FTIiwgZXhj ZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQotI2Rl ZmluZSBSRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hf VEhST1dTX1NUUl9NQVRDSEVTKCAiUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHRE aXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKLSNpZiAhZGVmaW5lZChDQVRDSF9D T05GSUdfRElTQUJMRV9NQVRDSEVSUykKLSNkZWZpbmUgUkVRVUlSRV9USFJPV1NfTUFUQ0hFUygg ZXhwciwgZXhjZXB0aW9uVHlwZSwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XU19NQVRD SEVTKCAiUkVRVUlSRV9USFJPV1NfTUFUQ0hFUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1 bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKLSNlbmRpZiAvLyBDQVRDSF9D T05GSUdfRElTQUJMRV9NQVRDSEVSUwotI2RlZmluZSBSRVFVSVJFX05PVEhST1coIC4uLiApIElO VEVSTkFMX0NBVENIX05PX1RIUk9XKCAiUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERp c3Bvc2l0aW9uOjpOb3JtYWwsIF9fVkFfQVJHU19fICkKLQotI2RlZmluZSBDSEVDSyggLi4uICkg SU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpD b250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQotI2RlZmluZSBDSEVDS19GQUxTRSggLi4u ICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bv c2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFs c2VUZXN0LCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIENIRUNLRURfSUYoIC4uLiApIElOVEVSTkFM X0NBVENIX0lGKCAiQ0hFQ0tFRF9JRiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGlu dWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0hFQ0tFRF9FTFNFKCAuLi4gKSBJ TlRFUk5BTF9DQVRDSF9FTFNFKCAiQ0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0 aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQotI2RlZmluZSBDSEVDS19OT0ZB SUwoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVz dWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0 aW9uOjpTdXBwcmVzc0ZhaWwsIF9fVkFfQVJHU19fICkKLQotI2RlZmluZSBDSEVDS19USFJPV1Mo IC4uLiApICBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDSEVDS19USFJPV1MiLCBDYXRjaDo6UmVz dWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5l IENIRUNLX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RI Uk9XU19BUyggIkNIRUNLX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHRE aXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQotI2RlZmluZSBDSEVDS19USFJP V1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XU19TVFJfTUFUQ0hF UyggIkNIRUNLX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51 ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCi0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJ U0FCTEVfTUFUQ0hFUlMpCi0jZGVmaW5lIENIRUNLX1RIUk9XU19NQVRDSEVTKCBleHByLCBleGNl cHRpb25UeXBlLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX01BVENIRVMoICJDSEVD S19USFJPV1NfTUFUQ0hFUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlv bjo6Q29udGludWVPbkZhaWx1cmUsIG1hdGNoZXIsIGV4cHIgKQotI2VuZGlmIC8vIENBVENIX0NP TkZJR19ESVNBQkxFX01BVENIRVJTCi0jZGVmaW5lIENIRUNLX05PVEhST1coIC4uLiApIElOVEVS TkFMX0NBVENIX05PX1RIUk9XKCAiQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3Np dGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKLQotI2lmICFkZWZpbmVkKENB VENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJTKQotI2RlZmluZSBDSEVDS19USEFUKCBhcmcsIG1h dGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNo OjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGFyZyApCi0KLSNkZWZpbmUg UkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiUkVRVUlS RV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyAp Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMKLQotI2RlZmluZSBJTkZP KCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCi0jZGVmaW5lIFVOU0NP UEVEX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX1VOU0NPUEVEX0lORk8oICJVTlNDT1BFRF9J TkZPIiwgbXNnICkKLSNkZWZpbmUgV0FSTiggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiV0FS TiIsIENhdGNoOjpSZXN1bHRXYXM6Oldhcm5pbmcsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6 Q29udGludWVPbkZhaWx1cmUsIG1zZyApCi0jZGVmaW5lIENBUFRVUkUoIC4uLiApIElOVEVSTkFM X0NBVENIX0NBUFRVUkUoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKGNhcHR1cmVyKSwgIkNB UFRVUkUiLF9fVkFfQVJHU19fICkKLQotI2RlZmluZSBURVNUX0NBU0UoIC4uLiApIElOVEVSTkFM X0NBVENIX1RFU1RDQVNFKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0Qo IGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NO YW1lLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIE1FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwg Li4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FS R1NfXyApCi0jZGVmaW5lIFJFR0lTVEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVS TkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQotI2Rl ZmluZSBTRUNUSU9OKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBfX1ZBX0FSR1NfXyAp Ci0jZGVmaW5lIERZTkFNSUNfU0VDVElPTiggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRFlOQU1JQ19T RUNUSU9OKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIEZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENI X01TRyggIkZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpS ZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIEZBSUxfQ0hF Q0soIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0 V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVP bkZhaWx1cmUsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgU1VDQ0VFRCggLi4uICkgSU5URVJOQUxf Q0FUQ0hfTVNHKCAiU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0 RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIEFO T05fVEVTVF9DQVNFKCkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoKQotCi0jaWZuZGVmIENBVENI X0NPTkZJR19UUkFESVRJT05BTF9NU1ZDX1BSRVBST0NFU1NPUgotI2RlZmluZSBURU1QTEFURV9U RVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggX19WQV9B UkdTX18gKQotI2RlZmluZSBURU1QTEFURV9URVNUX0NBU0VfU0lHKCAuLi4gKSBJTlRFUk5BTF9D QVRDSF9URU1QTEFURV9URVNUX0NBU0VfU0lHKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIFRFTVBM QVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVN UExBVEVfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5l IFRFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFM X0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIF9fVkFfQVJH U19fICkKLSNkZWZpbmUgVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0UoIC4uLiApIElOVEVSTkFM X0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5l IFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVN UExBVEVfUFJPRFVDVF9URVNUX0NBU0VfU0lHKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIFRFTVBM QVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9D QVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9B UkdTX18gKQotI2RlZmluZSBURU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBj bGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNF X01FVEhPRF9TSUcoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQotI2RlZmluZSBURU1QTEFURV9M SVNUX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfTElTVF9URVNUX0NB U0UoX19WQV9BUkdTX18pCi0jZGVmaW5lIFRFTVBMQVRFX0xJU1RfVEVTVF9DQVNFX01FVEhPRCgg Y2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9MSVNUX1RFU1RfQ0FTRV9N RVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQotI2Vsc2UKLSNkZWZpbmUgVEVNUExBVEVf VEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NB VENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggX19WQV9BUkdTX18gKSApCi0jZGVmaW5lIFRFTVBMQVRF X1RFU1RfQ0FTRV9TSUcoIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJO QUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJRyggX19WQV9BUkdTX18gKSApCi0jZGVmaW5l IFRFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FU Q0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVUSE9E KCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkgKQotI2RlZmluZSBURU1QTEFURV9URVNUX0NBU0Vf TUVUSE9EX1NJRyggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1Mo IElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUs IF9fVkFfQVJHU19fICkgKQotI2RlZmluZSBURU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggLi4u ICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9Q Uk9EVUNUX1RFU1RfQ0FTRSggX19WQV9BUkdTX18gKSApCi0jZGVmaW5lIFRFTVBMQVRFX1BST0RV Q1RfVEVTVF9DQVNFX1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRF Uk5BTF9DQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9TSUcoIF9fVkFfQVJHU19fICkg KQotI2RlZmluZSBURU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwg Li4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFU RV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKSApCi0j ZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX01FVEhPRF9TSUcoIGNsYXNzTmFtZSwg Li4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFU RV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkg KQotI2RlZmluZSBURU1QTEFURV9MSVNUX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hf RVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9MSVNUX1RFU1RfQ0FTRSggX19W QV9BUkdTX18gKSApCi0jZGVmaW5lIFRFTVBMQVRFX0xJU1RfVEVTVF9DQVNFX01FVEhPRCggY2xh c3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENI X1RFTVBMQVRFX0xJU1RfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXyAp ICkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1JVTlRJTUVfU1RBVElDX1JF UVVJUkUpCi0jZGVmaW5lIFNUQVRJQ19SRVFVSVJFKCAuLi4gKSAgICAgICBzdGF0aWNfYXNzZXJ0 KCAgIF9fVkFfQVJHU19fLCAgI19fVkFfQVJHU19fICk7IFNVQ0NFRUQoICNfX1ZBX0FSR1NfXyAp Ci0jZGVmaW5lIFNUQVRJQ19SRVFVSVJFX0ZBTFNFKCAuLi4gKSBzdGF0aWNfYXNzZXJ0KCAhKF9f VkFfQVJHU19fKSwgIiEoIiAjX19WQV9BUkdTX18gIikiICk7IFNVQ0NFRUQoICIhKCIgI19fVkFf QVJHU19fICIpIiApCi0jZWxzZQotI2RlZmluZSBTVEFUSUNfUkVRVUlSRSggLi4uICkgICAgICAg UkVRVUlSRSggX19WQV9BUkdTX18gKQotI2RlZmluZSBTVEFUSUNfUkVRVUlSRV9GQUxTRSggLi4u ICkgUkVRVUlSRV9GQUxTRSggX19WQV9BUkdTX18gKQotI2VuZGlmCi0KLSNlbmRpZgotCi0jZGVm aW5lIENBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENI X1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApCi0KLS8vICJCREQtc3R5bGUiIGNvbnZl bmllbmNlIHdyYXBwZXJzCi0jZGVmaW5lIFNDRU5BUklPKCAuLi4gKSBURVNUX0NBU0UoICJTY2Vu YXJpbzogIiBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1l LCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2Vu YXJpbzogIiBfX1ZBX0FSR1NfXyApCi0KLSNkZWZpbmUgR0lWRU4oIGRlc2MgKSAgICAgSU5URVJO QUxfQ0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCAiICAgIEdpdmVuOiAiIDw8IGRlc2MgKQotI2RlZmlu ZSBBTkRfR0lWRU4oIGRlc2MgKSBJTlRFUk5BTF9DQVRDSF9EWU5BTUlDX1NFQ1RJT04oICJBbmQg Z2l2ZW46ICIgPDwgZGVzYyApCi0jZGVmaW5lIFdIRU4oIGRlc2MgKSAgICAgIElOVEVSTkFMX0NB VENIX0RZTkFNSUNfU0VDVElPTiggIiAgICAgV2hlbjogIiA8PCBkZXNjICkKLSNkZWZpbmUgQU5E X1dIRU4oIGRlc2MgKSAgSU5URVJOQUxfQ0FUQ0hfRFlOQU1JQ19TRUNUSU9OKCAiIEFuZCB3aGVu OiAiIDw8IGRlc2MgKQotI2RlZmluZSBUSEVOKCBkZXNjICkgICAgICBJTlRFUk5BTF9DQVRDSF9E WU5BTUlDX1NFQ1RJT04oICIgICAgIFRoZW46ICIgPDwgZGVzYyApCi0jZGVmaW5lIEFORF9USEVO KCBkZXNjICkgIElOVEVSTkFMX0NBVENIX0RZTkFNSUNfU0VDVElPTiggIiAgICAgIEFuZDogIiA8 PCBkZXNjICkKLQotI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0VOQUJMRV9CRU5DSE1BUktJTkcp Ci0jZGVmaW5lIEJFTkNITUFSSyguLi4pIFwKLSAgICBJTlRFUk5BTF9DQVRDSF9CRU5DSE1BUkso SU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoQ19BX1RfQ19IX0JfRV9OX0NfSF8pLCBJTlRFUk5B TF9DQVRDSF9HRVRfMV9BUkcoX19WQV9BUkdTX18sLCksIElOVEVSTkFMX0NBVENIX0dFVF8yX0FS RyhfX1ZBX0FSR1NfXywsKSkKLSNkZWZpbmUgQkVOQ0hNQVJLX0FEVkFOQ0VEKG5hbWUpIFwKLSAg ICBJTlRFUk5BTF9DQVRDSF9CRU5DSE1BUktfQURWQU5DRUQoSU5URVJOQUxfQ0FUQ0hfVU5JUVVF X05BTUUoQ19BX1RfQ19IX0JfRV9OX0NfSF8pLCBuYW1lKQotI2VuZGlmIC8vIENBVENIX0NPTkZJ R19FTkFCTEVfQkVOQ0hNQVJLSU5HCi0KLXVzaW5nIENhdGNoOjpEZXRhaWw6OkFwcHJveDsKLQot I2Vsc2UgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEUKLQotLy8vLy8vCi0vLyBJZiB0aGlzIGNvbmZp ZyBpZGVudGlmaWVyIGlzIGRlZmluZWQgdGhlbiBhbGwgQ0FUQ0ggbWFjcm9zIGFyZSBwcmVmaXhl ZCB3aXRoIENBVENIXwotI2lmZGVmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMCi0KLSNkZWZpbmUg Q0FUQ0hfUkVRVUlSRSggLi4uICkgICAgICAgICh2b2lkKSgwKQotI2RlZmluZSBDQVRDSF9SRVFV SVJFX0ZBTFNFKCAuLi4gKSAgKHZvaWQpKDApCi0KLSNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJP V1MoIC4uLiApICh2b2lkKSgwKQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyggZXhw ciwgZXhjZXB0aW9uVHlwZSApICh2b2lkKSgwKQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9X U19XSVRIKCBleHByLCBtYXRjaGVyICkgICAgICh2b2lkKSgwKQotI2lmICFkZWZpbmVkKENBVENI X0NPTkZJR19ESVNBQkxFX01BVENIRVJTKQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19N QVRDSEVTKCBleHByLCBleGNlcHRpb25UeXBlLCBtYXRjaGVyICkgKHZvaWQpKDApCi0jZW5kaWYv LyBDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUwotI2RlZmluZSBDQVRDSF9SRVFVSVJFX05P VEhST1coIC4uLiApICh2b2lkKSgwKQotCi0jZGVmaW5lIENBVENIX0NIRUNLKCAuLi4gKSAgICAg ICAgICh2b2lkKSgwKQotI2RlZmluZSBDQVRDSF9DSEVDS19GQUxTRSggLi4uICkgICAodm9pZCko MCkKLSNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9JRiggLi4uICkgICAgaWYgKF9fVkFfQVJHU19fKQot I2RlZmluZSBDQVRDSF9DSEVDS0VEX0VMU0UoIC4uLiApICBpZiAoIShfX1ZBX0FSR1NfXykpCi0j ZGVmaW5lIENBVENIX0NIRUNLX05PRkFJTCggLi4uICkgICh2b2lkKSgwKQotCi0jZGVmaW5lIENB VENIX0NIRUNLX1RIUk9XUyggLi4uICkgICh2b2lkKSgwKQotI2RlZmluZSBDQVRDSF9DSEVDS19U SFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSAodm9pZCkoMCkKLSNkZWZpbmUgQ0FUQ0hf Q0hFQ0tfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSAgICAgKHZvaWQpKDApCi0jaWYgIWRl ZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMpCi0jZGVmaW5lIENBVENIX0NIRUNL X1RIUk9XU19NQVRDSEVTKCBleHByLCBleGNlcHRpb25UeXBlLCBtYXRjaGVyICkgKHZvaWQpKDAp Ci0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMKLSNkZWZpbmUgQ0FUQ0hf Q0hFQ0tfTk9USFJPVyggLi4uICkgKHZvaWQpKDApCi0KLSNpZiAhZGVmaW5lZChDQVRDSF9DT05G SUdfRElTQUJMRV9NQVRDSEVSUykKLSNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhBVCggYXJnLCBtYXRj aGVyICkgICAodm9pZCkoMCkKLQotI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIQVQoIGFyZywgbWF0 Y2hlciApICh2b2lkKSgwKQotI2VuZGlmIC8vIENBVENIX0NPTkZJR19ESVNBQkxFX01BVENIRVJT Ci0KLSNkZWZpbmUgQ0FUQ0hfSU5GTyggbXNnICkgICAgICAgICAgKHZvaWQpKDApCi0jZGVmaW5l IENBVENIX1VOU0NPUEVEX0lORk8oIG1zZyApICh2b2lkKSgwKQotI2RlZmluZSBDQVRDSF9XQVJO KCBtc2cgKSAgICAgICAgICAodm9pZCkoMCkKLSNkZWZpbmUgQ0FUQ0hfQ0FQVFVSRSggbXNnICkg ICAgICAgKHZvaWQpKDApCi0KLSNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5B TF9DQVRDSF9URVNUQ0FTRV9OT19SRUdJU1RSQVRJT04oSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05B TUUoIENfQV9UX0NfSF9UX0VfU19UXyApKQotI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9E KCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFX05PX1JFR0lTVFJBVElP TihJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9TX1RfICkpCi0jZGVm aW5lIENBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkKLSNkZWZpbmUgQ0FU Q0hfUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgKHZvaWQpKDApCi0jZGVmaW5l IENBVENIX1NFQ1RJT04oIC4uLiApCi0jZGVmaW5lIENBVENIX0RZTkFNSUNfU0VDVElPTiggLi4u ICkKLSNkZWZpbmUgQ0FUQ0hfRkFJTCggLi4uICkgKHZvaWQpKDApCi0jZGVmaW5lIENBVENIX0ZB SUxfQ0hFQ0soIC4uLiApICh2b2lkKSgwKQotI2RlZmluZSBDQVRDSF9TVUNDRUVEKCAuLi4gKSAo dm9pZCkoMCkKLQotI2RlZmluZSBDQVRDSF9BTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENI X1RFU1RDQVNFX05PX1JFR0lTVFJBVElPTihJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19B X1RfQ19IX1RfRV9TX1RfICkpCi0KLSNpZm5kZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01T VkNfUFJFUFJPQ0VTU09SCi0jZGVmaW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggLi4uICkg SU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX05PX1JFR0lTVFJBVElPTihfX1ZBX0FS R1NfXykKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJRyggLi4uICkgSU5URVJO QUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJR19OT19SRUdJU1RSQVRJT04oX19WQV9BUkdT X18pCi0jZGVmaW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwg Li4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9OT19SRUdJU1RS QVRJT04oY2xhc3NOYW1lLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfVEVT VF9DQVNFX01FVEhPRF9TSUcoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExB VEVfVEVTVF9DQVNFX01FVEhPRF9TSUdfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9B UkdTX18gKQotI2RlZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRSggLi4uICkg Q0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIENBVENIX1RF TVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX1NJRyggLi4uICkgQ0FUQ0hfVEVNUExBVEVfVEVTVF9D QVNFKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIENBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9D QVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTUVU SE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJP RFVDVF9URVNUX0NBU0VfTUVUSE9EX1NJRyggY2xhc3NOYW1lLCAuLi4gKSBDQVRDSF9URU1QTEFU RV9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKLSNlbHNlCi0jZGVm aW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5E X1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1QTEFURV9URVNUX0NBU0VfTk9fUkVHSVNUUkFUSU9O KF9fVkFfQVJHU19fKSApCi0jZGVmaW5lIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9TSUcoIC4u LiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf VEVTVF9DQVNFX1NJR19OT19SRUdJU1RSQVRJT04oX19WQV9BUkdTX18pICkKLSNkZWZpbmUgQ0FU Q0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9D QVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRI T0RfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKSApCi0jZGVmaW5lIENB VENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIElOVEVS TkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNF X01FVEhPRF9TSUdfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKSApCi0j ZGVmaW5lIENBVENIX1RFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFKCAuLi4gKSBDQVRDSF9URU1Q TEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJP RFVDVF9URVNUX0NBU0VfU0lHKCAuLi4gKSBDQVRDSF9URU1QTEFURV9URVNUX0NBU0UoIF9fVkFf QVJHU19fICkKLSNkZWZpbmUgQ0FUQ0hfVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9E KCBjbGFzc05hbWUsIC4uLiApIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNz TmFtZSwgX19WQV9BUkdTX18gKQotI2RlZmluZSBDQVRDSF9URU1QTEFURV9QUk9EVUNUX1RFU1Rf Q0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4uLiApIENBVENIX1RFTVBMQVRFX1RFU1RfQ0FT RV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQotI2VuZGlmCi0KLS8vICJCREQtc3R5 bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCi0jZGVmaW5lIENBVENIX1NDRU5BUklPKCAuLi4gKSBJ TlRFUk5BTF9DQVRDSF9URVNUQ0FTRV9OT19SRUdJU1RSQVRJT04oSU5URVJOQUxfQ0FUQ0hfVU5J UVVFX05BTUUoIENfQV9UX0NfSF9UX0VfU19UXyApKQotI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19N RVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0VfTUVUSE9EX05P X1JFR0lTVFJBVElPTihJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19IX1RfRV9T X1RfICksIGNsYXNzTmFtZSApCi0jZGVmaW5lIENBVENIX0dJVkVOKCBkZXNjICkKLSNkZWZpbmUg Q0FUQ0hfQU5EX0dJVkVOKCBkZXNjICkKLSNkZWZpbmUgQ0FUQ0hfV0hFTiggZGVzYyApCi0jZGVm aW5lIENBVENIX0FORF9XSEVOKCBkZXNjICkKLSNkZWZpbmUgQ0FUQ0hfVEhFTiggZGVzYyApCi0j ZGVmaW5lIENBVENIX0FORF9USEVOKCBkZXNjICkKLQotI2RlZmluZSBDQVRDSF9TVEFUSUNfUkVR VUlSRSggLi4uICkgICAgICAgKHZvaWQpKDApCi0jZGVmaW5lIENBVENIX1NUQVRJQ19SRVFVSVJF X0ZBTFNFKCAuLi4gKSAodm9pZCkoMCkKLQotLy8gSWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwg aXMgbm90IGRlZmluZWQgdGhlbiB0aGUgQ0FUQ0hfIHByZWZpeCBpcyBub3QgcmVxdWlyZWQKLSNl bHNlCi0KLSNkZWZpbmUgUkVRVUlSRSggLi4uICkgICAgICAgKHZvaWQpKDApCi0jZGVmaW5lIFJF UVVJUkVfRkFMU0UoIC4uLiApICh2b2lkKSgwKQotCi0jZGVmaW5lIFJFUVVJUkVfVEhST1dTKCAu Li4gKSAodm9pZCkoMCkKLSNkZWZpbmUgUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlv blR5cGUgKSAodm9pZCkoMCkKLSNkZWZpbmUgUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0 Y2hlciApICh2b2lkKSgwKQotI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19ESVNBQkxFX01BVENI RVJTKQotI2RlZmluZSBSRVFVSVJFX1RIUk9XU19NQVRDSEVTKCBleHByLCBleGNlcHRpb25UeXBl LCBtYXRjaGVyICkgKHZvaWQpKDApCi0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFU Q0hFUlMKLSNkZWZpbmUgUkVRVUlSRV9OT1RIUk9XKCAuLi4gKSAodm9pZCkoMCkKLQotI2RlZmlu ZSBDSEVDSyggLi4uICkgKHZvaWQpKDApCi0jZGVmaW5lIENIRUNLX0ZBTFNFKCAuLi4gKSAodm9p ZCkoMCkKLSNkZWZpbmUgQ0hFQ0tFRF9JRiggLi4uICkgaWYgKF9fVkFfQVJHU19fKQotI2RlZmlu ZSBDSEVDS0VEX0VMU0UoIC4uLiApIGlmICghKF9fVkFfQVJHU19fKSkKLSNkZWZpbmUgQ0hFQ0tf Tk9GQUlMKCAuLi4gKSAodm9pZCkoMCkKLQotI2RlZmluZSBDSEVDS19USFJPV1MoIC4uLiApICAo dm9pZCkoMCkKLSNkZWZpbmUgQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkg KHZvaWQpKDApCi0jZGVmaW5lIENIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgKHZv aWQpKDApCi0jaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMpCi0jZGVm aW5lIENIRUNLX1RIUk9XU19NQVRDSEVTKCBleHByLCBleGNlcHRpb25UeXBlLCBtYXRjaGVyICkg KHZvaWQpKDApCi0jZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0RJU0FCTEVfTUFUQ0hFUlMKLSNkZWZp bmUgQ0hFQ0tfTk9USFJPVyggLi4uICkgKHZvaWQpKDApCi0KLSNpZiAhZGVmaW5lZChDQVRDSF9D T05GSUdfRElTQUJMRV9NQVRDSEVSUykKLSNkZWZpbmUgQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVy ICkgKHZvaWQpKDApCi0KLSNkZWZpbmUgUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSAodm9p ZCkoMCkKLSNlbmRpZiAvLyBDQVRDSF9DT05GSUdfRElTQUJMRV9NQVRDSEVSUwotCi0jZGVmaW5l IElORk8oIG1zZyApICh2b2lkKSgwKQotI2RlZmluZSBVTlNDT1BFRF9JTkZPKCBtc2cgKSAodm9p ZCkoMCkKLSNkZWZpbmUgV0FSTiggbXNnICkgKHZvaWQpKDApCi0jZGVmaW5lIENBUFRVUkUoIG1z ZyApICh2b2lkKSgwKQotCi0jZGVmaW5lIFRFU1RfQ0FTRSggLi4uICkgIElOVEVSTkFMX0NBVENI X1RFU1RDQVNFX05PX1JFR0lTVFJBVElPTihJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19B X1RfQ19IX1RfRV9TX1RfICkpCi0jZGVmaW5lIFRFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwg Li4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0VfTk9fUkVHSVNUUkFUSU9OKElOVEVSTkFMX0NB VENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX1NfVF8gKSkKLSNkZWZpbmUgTUVUSE9EX0FT X1RFU1RfQ0FTRSggbWV0aG9kLCAuLi4gKQotI2RlZmluZSBSRUdJU1RFUl9URVNUX0NBU0UoIEZ1 bmN0aW9uLCAuLi4gKSAodm9pZCkoMCkKLSNkZWZpbmUgU0VDVElPTiggLi4uICkKLSNkZWZpbmUg RFlOQU1JQ19TRUNUSU9OKCAuLi4gKQotI2RlZmluZSBGQUlMKCAuLi4gKSAodm9pZCkoMCkKLSNk ZWZpbmUgRkFJTF9DSEVDSyggLi4uICkgKHZvaWQpKDApCi0jZGVmaW5lIFNVQ0NFRUQoIC4uLiAp ICh2b2lkKSgwKQotI2RlZmluZSBBTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RD QVNFX05PX1JFR0lTVFJBVElPTihJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ19BX1RfQ19I X1RfRV9TX1RfICkpCi0KLSNpZm5kZWYgQ0FUQ0hfQ09ORklHX1RSQURJVElPTkFMX01TVkNfUFJF UFJPQ0VTU09SCi0jZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FU Q0hfVEVNUExBVEVfVEVTVF9DQVNFX05PX1JFR0lTVFJBVElPTihfX1ZBX0FSR1NfXykKLSNkZWZp bmUgVEVNUExBVEVfVEVTVF9DQVNFX1NJRyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVf VEVTVF9DQVNFX1NJR19OT19SRUdJU1RSQVRJT04oX19WQV9BUkdTX18pCi0jZGVmaW5lIFRFTVBM QVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVN UExBVEVfVEVTVF9DQVNFX01FVEhPRF9OT19SRUdJU1RSQVRJT04oY2xhc3NOYW1lLCBfX1ZBX0FS R1NfXykKLSNkZWZpbmUgVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9TSUcoIGNsYXNzTmFtZSwg Li4uICkgSU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRF9TSUdfTk9fUkVH SVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQotI2RlZmluZSBURU1QTEFURV9QUk9E VUNUX1RFU1RfQ0FTRSggLi4uICkgVEVNUExBVEVfVEVTVF9DQVNFKCBfX1ZBX0FSR1NfXyApCi0j ZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFX1NJRyggLi4uICkgVEVNUExBVEVfVEVT VF9DQVNFKCBfX1ZBX0FSR1NfXyApCi0jZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNF X01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBURU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBjbGFz c05hbWUsIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0Vf TUVUSE9EX1NJRyggY2xhc3NOYW1lLCAuLi4gKSBURU1QTEFURV9URVNUX0NBU0VfTUVUSE9EKCBj bGFzc05hbWUsIF9fVkFfQVJHU19fICkKLSNlbHNlCi0jZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FT RSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfRVhQQU5EX1ZBUkdTKCBJTlRFUk5BTF9DQVRDSF9URU1Q TEFURV9URVNUX0NBU0VfTk9fUkVHSVNUUkFUSU9OKF9fVkFfQVJHU19fKSApCi0jZGVmaW5lIFRF TVBMQVRFX1RFU1RfQ0FTRV9TSUcoIC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUygg SU5URVJOQUxfQ0FUQ0hfVEVNUExBVEVfVEVTVF9DQVNFX1NJR19OT19SRUdJU1RSQVRJT04oX19W QV9BUkdTX18pICkKLSNkZWZpbmUgVEVNUExBVEVfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1l LCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9FWFBBTkRfVkFSR1MoIElOVEVSTkFMX0NBVENIX1RFTVBM QVRFX1RFU1RfQ0FTRV9NRVRIT0RfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9BUkdT X18gKSApCi0jZGVmaW5lIFRFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUs IC4uLiApIElOVEVSTkFMX0NBVENIX0VYUEFORF9WQVJHUyggSU5URVJOQUxfQ0FUQ0hfVEVNUExB VEVfVEVTVF9DQVNFX01FVEhPRF9TSUdfTk9fUkVHSVNUUkFUSU9OKGNsYXNzTmFtZSwgX19WQV9B UkdTX18gKSApCi0jZGVmaW5lIFRFTVBMQVRFX1BST0RVQ1RfVEVTVF9DQVNFKCAuLi4gKSBURU1Q TEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkKLSNkZWZpbmUgVEVNUExBVEVfUFJPRFVDVF9U RVNUX0NBU0VfU0lHKCAuLi4gKSBURU1QTEFURV9URVNUX0NBU0UoIF9fVkFfQVJHU19fICkKLSNk ZWZpbmUgVEVNUExBVEVfUFJPRFVDVF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiAp IFRFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQotI2Rl ZmluZSBURU1QTEFURV9QUk9EVUNUX1RFU1RfQ0FTRV9NRVRIT0RfU0lHKCBjbGFzc05hbWUsIC4u LiApIFRFTVBMQVRFX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQot I2VuZGlmCi0KLSNkZWZpbmUgU1RBVElDX1JFUVVJUkUoIC4uLiApICAgICAgICh2b2lkKSgwKQot I2RlZmluZSBTVEFUSUNfUkVRVUlSRV9GQUxTRSggLi4uICkgKHZvaWQpKDApCi0KLSNlbmRpZgot Ci0jZGVmaW5lIENBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFM X0NBVENIX1RSQU5TTEFURV9FWENFUFRJT05fTk9fUkVHKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVf TkFNRSggY2F0Y2hfaW50ZXJuYWxfRXhjZXB0aW9uVHJhbnNsYXRvciApLCBzaWduYXR1cmUgKQot Ci0vLyAiQkRELXN0eWxlIiBjb252ZW5pZW5jZSB3cmFwcGVycwotI2RlZmluZSBTQ0VOQVJJTygg Li4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0VfTk9fUkVHSVNUUkFUSU9OKElOVEVSTkFMX0NB VENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9FX1NfVF8gKSApCi0jZGVmaW5lIFNDRU5BUklP X01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRV9NRVRIT0Rf Tk9fUkVHSVNUUkFUSU9OKElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDX0FfVF9DX0hfVF9F X1NfVF8gKSwgY2xhc3NOYW1lICkKLQotI2RlZmluZSBHSVZFTiggZGVzYyApCi0jZGVmaW5lIEFO RF9HSVZFTiggZGVzYyApCi0jZGVmaW5lIFdIRU4oIGRlc2MgKQotI2RlZmluZSBBTkRfV0hFTigg ZGVzYyApCi0jZGVmaW5lIFRIRU4oIGRlc2MgKQotI2RlZmluZSBBTkRfVEhFTiggZGVzYyApCi0K LXVzaW5nIENhdGNoOjpEZXRhaWw6OkFwcHJveDsKLQotI2VuZGlmCi0KLSNlbmRpZiAvLyAhIENB VENIX0NPTkZJR19JTVBMX09OTFkKLQotLy8gc3RhcnQgY2F0Y2hfcmVlbmFibGVfd2FybmluZ3Mu aAotCi0KLSNpZmRlZiBfX2NsYW5nX18KLSMgICAgaWZkZWYgX19JQ0MgLy8gaWNwYyBkZWZpbmVz IHRoZSBfX2NsYW5nX18gbWFjcm8KLSMgICAgICAgIHByYWdtYSB3YXJuaW5nKHBvcCkKLSMgICAg ZWxzZQotIyAgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0jICAgIGVuZGlmCi0j ZWxpZiBkZWZpbmVkIF9fR05VQ19fCi0jICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKLSNl bmRpZgotCi0vLyBlbmQgY2F0Y2hfcmVlbmFibGVfd2FybmluZ3MuaAotLy8gZW5kIGNhdGNoLmhw cAotI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVE RUQKLQoKZGlmZiAtLWdpdCBhL2djYzEyLWNzdHJpbmcucGF0Y2ggYi9nY2MxMi1jc3RyaW5nLnBh dGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNkZDNmLi4wMDAwMDAwCi0tLSBh L2djYzEyLWNzdHJpbmcucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0tLS0g cGx1Z2lucy9leHBlcmltZW50YWwvaWNhcC9pY2FwX3BsdWdpbi5jYy5vcmlnCTIwMjItMDQtMTEg MDI6MTM6MDkuNjI0ODk2NTgxICswMDAwCi0rKysgcGx1Z2lucy9leHBlcmltZW50YWwvaWNhcC9p Y2FwX3BsdWdpbi5jYwkyMDIyLTA0LTExIDAyOjE0OjE2LjMyNjI3Mzg2NyArMDAwMAotQEAgLTI2 LDYgKzI2LDcgQEAKLSAqLwotIAotICNpbmNsdWRlIDxzdHJpbmc+Ci0rI2luY2x1ZGUgPGNzdHJp bmc+Ci0gI2luY2x1ZGUgPHJlZ2V4PgotIAotICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0tLS0g cGx1Z2lucy9leHBlcmltZW50YWwvcmVkb19jYWNoZV9sb29rdXAvcmVkb19jYWNoZV9sb29rdXAu Y2Mub3JpZwkyMDIyLTA0LTExIDAyOjE3OjAwLjUyODQzMjE0MyArMDAwMAotKysrIHBsdWdpbnMv ZXhwZXJpbWVudGFsL3JlZG9fY2FjaGVfbG9va3VwL3JlZG9fY2FjaGVfbG9va3VwLmNjCTIwMjIt MDQtMTEgMDI6MTc6MTguNjYyOTAzNDY0ICswMDAwCi1AQCAtMjMsNiArMjMsNyBAQAotIAotICNp bmNsdWRlIDxpb3N0cmVhbT4KLSAjaW5jbHVkZSA8cmVnZXg+Ci0rI2luY2x1ZGUgPGNzdHJpbmc+ Ci0gI2luY2x1ZGUgPHNldD4KLSAjaW5jbHVkZSA8c3N0cmVhbT4KLSAjaW5jbHVkZSA8Z2V0b3B0 Lmg+CgpkaWZmIC0tZ2l0IGEvZ2xpYmMtMi4zNi5wYXRjaCBiL2dsaWJjLTIuMzYucGF0Y2gKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkYWJhNgotLS0gL2Rldi9udWxsCisr KyBiL2dsaWJjLTIuMzYucGF0Y2gKQEAgLTAsMCArMSwyNyBAQAorLS0tIGNvbmZpZ3VyZS5hYwor KysrIGNvbmZpZ3VyZS5hYworQEAgLTE4NjMsOCArMTg2Myw4IEBAIEFDX0NIRUNLX0hFQURFUlMo W3N5cy90eXBlcy5oIFwKKyAKKyAjIE9uIE9wZW5CU0QsIHB0aHJlYWQuaCBtdXN0IGJlIGluY2x1 ZGVkIGJlZm9yZSBwdGhyZWFkX25wLmgKKyBBQ19DSEVDS19IRUFERVJTKFtwdGhyZWFkX25wLmhd LCBbXSwgW10sIFsjaW5jbHVkZSA8cHRocmVhZC5oPl0pCistQUNfQ0hFQ0tfSEVBREVSUyhbc3lz L3N0YXRmcy5oIHN5cy9zdGF0dmZzLmggc3lzL2Rpc2suaCBzeXMvZGlza2xhYmVsLmhdKQorLUFD X0NIRUNLX0hFQURFUlMoW2xpbnV4L2hkcmVnLmggbGludXgvZnMuaCBsaW51eC9tYWpvci5oXSkK KytBQ19DSEVDS19IRUFERVJTKFtzeXMvc3RhdGZzLmggc3lzL3N0YXR2ZnMuaCBzeXMvZGlzay5o IHN5cy9kaXNrbGFiZWwuaCBzeXMvbW91bnQuaF0pCisrQUNfQ0hFQ0tfSEVBREVSUyhbbGludXgv aGRyZWcuaCBsaW51eC9tYWpvci5oXSkKKyAKKyBBQ19DSEVDS19IRUFERVJTKFtzeXMvc3lzY3Rs LmhdLCBbXSwgW10sCisgICAgICAgICAgICAgICAgICBbWyNpZmRlZiBIQVZFX1NZU19QQVJBTV9I CitpbmRleCAzNzk5NWIwYmUuLjZlOTYwYWFhNyAxMDA2NDQKKy0tLSBzcmMvdHNjb3JlL2lua19m aWxlLmNjCisrKysgc3JjL3RzY29yZS9pbmtfZmlsZS5jYworQEAgLTUyLDggKzUyLDggQEAKKyAj aW5jbHVkZSA8bGludXgvaGRyZWcuaD4gLyogZm9yIHN0cnVjdCBoZF9nZW9tZXRyeSAqLworICNl bmRpZgorIAorLSNpZiBIQVZFX0xJTlVYX0ZTX0gKKy0jaW5jbHVkZSA8bGludXgvZnMuaD4gLyog Zm9yIEJMS0dFVFNJWkUuICBzeXMvbW91bnQuaCBpcyBhbm90aGVyIGNhbmRpZGF0ZSAqLworKyNp ZiBIQVZFX1NZU19NT1VOVF9ICisrI2luY2x1ZGUgPHN5cy9tb3VudC5oPiAvKiBmb3IgQkxLR0VU U0laRSAqLworICNlbmRpZgorIAorIHVzaW5nIGlvY3RsX2FyZ190ID0gdW5pb24gewoKZGlmZiAt LWdpdCBhL3NvdXJjZXMgYi9zb3VyY2VzCmluZGV4IDM3NTMzNmYuLmY1NTE4MDQgMTAwNjQ0Ci0t LSBhL3NvdXJjZXMKKysrIGIvc291cmNlcwpAQCAtMSArMSwyIEBACi1TSEE1MTIgKHRyYWZmaWNz ZXJ2ZXItOS4xLjIudGFyLmJ6MikgPSAwNWVjMTEwY2QyNWY5Mzg2MWExNjA5NjA4ZGQ4MjAzMGVk OWIyMWNjNTYxZmIxYTY2Yzc2YzA2MzE3YmMxNjIzNWQ3OTM4OWE3ZmZjNzYyMTg1MjdkN2I1MjQ1 ODU0NzM4OTdiZWU2ZTAxNTI5ZjFjOGY0ZjFiODQ0Y2RlNDM1OQorU0hBNTEyICh0cmFmZmljc2Vy dmVyLTkuMS4zLnRhci5iejIpID0gOTUzNjU4NDQ2OTJhMTJhZTNkNjVkODBhMWM3NmM4NzNhZjIy YmUyZDFiMDI4NGQyMjk1MmNhYzFiM2U2Y2Q1MTE4MGZhNjk2OTdlZjRiMTNiZTY5Njg5OTk3MTQ1 ZWQyYWYxNmNiMjM2Mjg4NDIwY2Q4YTM3OWRjYWE2YjdmNGEKK1NIQTUxMiAodHJhZmZpY3NlcnZl ci05LjEuMy50YXIuYnoyLmFzYykgPSBlOWI0ZWRlZDJlYzZkZWMzZjYxOGY2OWVkZTY2NmI5NjVj Y2Y4OTczN2FiNmE5NzRjZDcwZDQ0Zjc2YTFkNzUwZDA1YjFmZTU2ZWI4YTJhOTE5NzBhMzRkMWJl MThlOWZjYmYzZWFjMjRjNmRiMjY4Mzk0OGMwY2RmZGNhZWRmNwoKZGlmZiAtLWdpdCBhL3RyYWZm aWNzZXJ2ZXItOS4xLjIudGFyLmJ6Mi5hc2MgYi90cmFmZmljc2VydmVyLTkuMS4yLnRhci5iejIu YXNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzc4OTY0Li4wMDAwMDAwCi0tLSBh L3RyYWZmaWNzZXJ2ZXItOS4xLjIudGFyLmJ6Mi5hc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOCAr MCwwIEBACi0tLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLQotCi1pUUtUQkFBQkNnQjlGaUVF ZXJGZVg5NFpWYVVOcVlZRlV6M3ZGVjE3dkZvRkFtSW1aVTVmRklBQUFBQUFMZ0FvCi1hWE56ZFdW eUxXWndja0J1YjNSaGRHbHZibk11YjNCbGJuQm5jQzVtYVdaMGFHaHZjbk5sYldGdUxtNWxkRGRC Ci1RakUxUlRWR1JFVXhPVFUxUVRVd1JFRTVPRFl3TlRVek0wUkZSakUxTlVRM1FrSkROVUVBQ2dr UVV6M3ZGVjE3Ci12RnJKc3hBQW9sQ2lnMjFFQ00zOWM0cElIQnY3RHh5VzZER0xDN1VoaG1yb0tO b0ZiYWtDUlBzdXkvY1huNEtnCi0rOGovRHhlZEQzUFZIU2xPczB5WjlwSEI4UGVUV2hOUWxmd2I2 YU5xdnRtY21nT053bWVJUHowczFDNHAvVGJZCi1UOVBOclVBdHpoNUdVVXQveGl2WGJDSWVJVmp2 ZE1KRXFaR2FjcFFuNkxLbCtZa3FFMFk1SzVlUkJQc2NLOTA1Ci1BbSswNnNnKzRUSXZIdzU1c0p2 NFNZMFVZZ2gremNRYnExSUtyL2k1QVRwMW5OVTVZenREVUkwL0dUc2JHZURDCi1zSUV2ZEwybS9u TzQrZ1VaTzFqc296NjNBYXVkZVNmMU0vclRjNThGcGQzejlMbE5qRlJ2QVZPcHpsVDUreUxYCi1z Q1hDMUYvVG9adU4zaDQwNEpIN21xdmJWWGljVDNaeWRBcE80WlBhSUtNK1k5a3NWQVNNOUpvamhv TUM4VDlvCi1RMUJSSmhxQVNzY2xtS1hjc21SZ0Qrd1Y2WFVORkxCNEM0QVlTaEZZSzVPRE9heFFY VXZNWk53aHpvdjBpdlpYCi00c2JPMGFWOWdSZ3Y1TEJ3ZHJldkNmQjZaMW0wQW1XbzRTRUswNHZy ZFVaNm56TzAzTWlWb0RzNURGam5TZXI4Ci1JSExyME5hVW5uOU9kVjNsQitrVktpOFJwMXpUR2VS b1ZwRDhwVWhpSVUrTlBDdmMyZThYS2xpL0NvRk9OcjZqCi1US2ZiakJvNnZtM2d6dGl6V1owc1hu eVVaeVlQMFl5NWZqU1ZYS2t4bmpMRGtaMllsalNIMzgyNW1TeGRqQWFaCi1iSkdaSEVaa1VyUjhO a3poZDNkZWpqWG5rbFZqV0p4b2xTcHM1THg4d2RGQUxoWjhVR289Ci09cFFkTgotLS0tLS1FTkQg UEdQIFNJR05BVFVSRS0tLS0tCgpkaWZmIC0tZ2l0IGEvdHJhZmZpY3NlcnZlci5zcGVjIGIvdHJh ZmZpY3NlcnZlci5zcGVjCmluZGV4IDQ4YzRiZWEuLjcwYzBiNTUgMTAwNjQ0Ci0tLSBhL3RyYWZm aWNzZXJ2ZXIuc3BlYworKysgYi90cmFmZmljc2VydmVyLnNwZWMKQEAgLTMsOCArMyw4IEBACiAl Z2xvYmFsIHNlbGludXh0eXBlIHRhcmdldGVkCiAKIE5hbWU6ICAgICAgICAgICB0cmFmZmljc2Vy dmVyCi1WZXJzaW9uOiAgICAgICAgOS4xLjIKLVJlbGVhc2U6ICAgICAgICAxMCV7P2Rpc3R9CitW ZXJzaW9uOiAgICAgICAgOS4xLjMKK1JlbGVhc2U6ICAgICAgICAxJXs/ZGlzdH0KIFN1bW1hcnk6 ICAgICAgICBGYXN0LCBzY2FsYWJsZSBhbmQgZXh0ZW5zaWJsZSBIVFRQLzEuMSBhbmQgSFRUUC8y IGNhY2hpbmcgcHJveHkgc2VydmVyCiAKIExpY2Vuc2U6ICAgICAgICBBU0wgMi4wCkBAIC0xMiwz NiArMTIsMzIgQEAgVVJMOiAgICAgICAgICAgIGh0dHBzOi8vdHJhZmZpY3NlcnZlci5hcGFjaGUu b3JnLwogU291cmNlMDogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0LyV7bmFtZX0v JXtuYW1lfS0le3ZlcnNpb259LnRhci5iejIKIFNvdXJjZTE6ICAgICAgICBodHRwOi8vd3d3LmFw YWNoZS5vcmcvZGlzdC8le25hbWV9LyV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuYnoyLmFzYwogU291 cmNlMjogICAgICAgIGh0dHBzOi8vZG93bmxvYWRzLmFwYWNoZS5vcmcvdHJhZmZpY3NlcnZlci9L RVlTCi0jIE1JTlNJR1NUS1NaIGlzIG5vIGxvbmdlciBjb25zdCBhcyBvZiBnbGliYyAyLjMzLCB3 aGljaCBicmVha3MgdGhlIHVuaXQgdGVzdCBzb2Z0d2FyZQotIyBVcGRhdGUgdG8gdGhlIG5ld2Vz dCB2ZXJzaW9uIG9mIHRoZSB1bml0IHRlc3QgZnJhbWV3b3JrCi1Tb3VyY2UzOiAgICAgICAgaHR0 cHM6Ly9naXRodWIuY29tL2NhdGNob3JnL0NhdGNoMi9yZWxlYXNlcy9kb3dubG9hZC92Mi4xMy44 L2NhdGNoLmhwcAotU291cmNlNDogICAgICAgICV7bmFtZX0uc2VydmljZQotU291cmNlNTogICAg ICAgICV7bmFtZX0uc3lzdXNlcnMKLVNvdXJjZTY6ICAgICAgICAle25hbWV9LnN5c2NvbmYKLVNv dXJjZTc6ICAgICAgICAle25hbWV9LnRtcGZpbGVzZAotU291cmNlODogICAgICAgICV7bW9kdWxl bmFtZX0udGUKLVNvdXJjZTk6ICAgICAgICAle21vZHVsZW5hbWV9LmlmCi1Tb3VyY2UxMDogICAg ICAgJXttb2R1bGVuYW1lfS5mYwotCi0jIFRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgdGVzdCBmcmFt ZXdvcmsgY2hhbmdlcyBzb21lIHN5bWJvbHMgbmVlZGVkIGZvciB0aGUgdGVzdHMKLVBhdGNoMDog ICAgICAgICB1bml0X3Rlc3RzLnBhdGNoCitTb3VyY2UzOiAgICAgICAgJXtuYW1lfS5zZXJ2aWNl CitTb3VyY2U0OiAgICAgICAgJXtuYW1lfS5zeXN1c2VycworU291cmNlNTogICAgICAgICV7bmFt ZX0uc3lzY29uZgorU291cmNlNjogICAgICAgICV7bmFtZX0udG1wZmlsZXNkCitTb3VyY2U3OiAg ICAgICAgJXttb2R1bGVuYW1lfS50ZQorU291cmNlODogICAgICAgICV7bW9kdWxlbmFtZX0uaWYK K1NvdXJjZTk6ICAgICAgICAle21vZHVsZW5hbWV9LmZjCisKICMgVXNlIENyeXB0byBQb2xpY2ll cyB3aGVyZSBzdXBwb3J0ZWQKICVpZiAwJXs/ZmVkb3JhfSA+PSAyMSB8fCAwJXs/cmhlbH0gPj0g OAotUGF0Y2gxOiAgICAgICAgIHRyYWZmaWNzZXJ2ZXItY3J5cHRvLXBvbGljeS5wYXRjaAorUGF0 Y2gwOiAgICAgICAgIHRyYWZmaWNzZXJ2ZXItY3J5cHRvLXBvbGljeS5wYXRjaAogJWVuZGlmCi0j IGZjMzYgdXBncmFkZXMgdG8gZ2NjIDEyLCB3aGljaCBubyBsb25nZXIgaGFzIGNzdHJpbmcgY29t cGF0YmlsaXR5IGluIHN0cmluZwotIyBVcHN0ZWFtIFBSOiBodHRwczovL2dpdGh1Yi5jb20vYXBh Y2hlL3RyYWZmaWNzZXJ2ZXIvcHVsbC84Nzg2Ci1QYXRjaDI6ICAgICAgICAgZ2NjMTItY3N0cmlu Zy5wYXRjaAogIyBGZW5jZXBvc3QgZXJyb3Igd2hlbiBwYXJzaW5nIGJyYWNrZXRlZCBJUCBhZGRy ZXNzIHdpdGggbm8gcG9ydDsgT09CIHN0cmluZ192aWV3IGFjY2VzcwogIyBVcHN0cmVhbSBQUjog aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90cmFmZmljc2VydmVyL3B1bGwvODQ2OCAKLVBhdGNo MzogICAgICAgICBzdHJpbmctaW5kZXgtb29iLnBhdGNoCitQYXRjaDE6ICAgICAgICAgc3RyaW5n LWluZGV4LW9vYi5wYXRjaAogIyBEZWZpbmUgc3RhbmRhcmQgY29uZmlnIGxheW91dCBmb3IgRmVk b3JhL1JIRUwgc3lzdGVtcwogIyBVcHN0cmVhbSBQUjogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNo ZS90cmFmZmljc2VydmVyL3B1bGwvODgxNQotUGF0Y2g0OiAgICAgICAgIGNvbmZpZy1sYXlvdXQt cmVkaGF0LnBhdGNoCitQYXRjaDI6ICAgICAgICAgY29uZmlnLWxheW91dC1yZWRoYXQucGF0Y2gK ICMgQ2hlcnJ5LXBpY2sgT3BlblNTTCAzIGNvbXBhdCAobmVlZGVkIGZvciBFTDkpCiAjIFVwc3Ry ZWFtIFBSOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RyYWZmaWNzZXJ2ZXIvcHVsbC84ODM3 CiAjIFVwc3RyZWFtIFBSOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RyYWZmaWNzZXJ2ZXIv cHVsbC84OTA5Ci1QYXRjaDU6ICAgICAgICAgb3BlbnNzbDMtaGtkZi5wYXRjaAorUGF0Y2gzOiAg ICAgICAgIG9wZW5zc2wzLWhrZGYucGF0Y2gKKyMgZ2xpYmMgMi4zNiAoRmVkb3JhIDM3KSBpbnRy b2R1Y2VzIG1vdW50LmggY29uZmxpY3QKKyMgQ2hhbmdlIGRvYzogaHR0cHM6Ly9zb3VyY2V3YXJl Lm9yZy9nbGliYy93aWtpL1JlbGVhc2UvMi4zNiNVc2FnZV9vZl8uM0NsaW51eC4yRm1vdW50Lmgu M0VfYW5kXy4zQ3N5cy4yRm1vdW50LmguM0UKKyMgVXBzdHJlYW0gUFI6IGh0dHBzOi8vZ2l0aHVi LmNvbS9hcGFjaGUvdHJhZmZpY3NlcnZlci9wdWxsLzkwMjcKK1BhdGNoNDogICAgICAgICBnbGli Yy0yLjM2LnBhdGNoCiAKICMgVXBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCAzMi1iaXQgYXJjaGl0 ZWN0dXJlczoKICMgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90cmFmZmljc2VydmVyL2lzc3Vl cy80NDMyCkBAIC0xNDUsOCArMTQxLDYgQEAgaW5zdGFsbGF0aW9ucy4KICV7Z3BndmVyaWZ5fSAt LWtleXJpbmc9JyV7U09VUkNFMn0nIC0tc2lnbmF0dXJlPScle1NPVVJDRTF9JyAtLWRhdGE9JyV7 U09VUkNFMH0nCiAKICVhdXRvc2V0dXAgLXAwCi0jIFJlcGxhY2UgdGhlIENhdGNoMiB0ZXN0aW5n IGhlYWRlciB3aXRoIHRoZSBtb3JlIHJlY2VudCB2ZXJzaW9uIHVzZWQgdXBzdHJlYW0KLWNwICV7 U09VUkNFM30gdGVzdHMvaW5jbHVkZS8KIAogJWJ1aWxkCiAKQEAgLTE2OSw5ICsxNjMsOSBAQCBh dXRvcmVjb25mCiAKICVpZiAwJXs/d2l0aF9zZWxpbnV4fQogbWtkaXIgc2VsaW51eAorY3AgLXAg JXtTT1VSQ0U3fSBzZWxpbnV4LwogY3AgLXAgJXtTT1VSQ0U4fSBzZWxpbnV4LwogY3AgLXAgJXtT T1VSQ0U5fSBzZWxpbnV4LwotY3AgLXAgJXtTT1VSQ0UxMH0gc2VsaW51eC8KIAogbWFrZSAtZiAl e19kYXRhZGlyfS9zZWxpbnV4L2RldmVsL01ha2VmaWxlICV7bW9kdWxlbmFtZX0ucHAKIGJ6aXAy IC05ICV7bW9kdWxlbmFtZX0ucHAKQEAgLTE5NCwxMCArMTg4LDEwIEBAIGluc3RhbGwgLUQgLXAg LW0gMDY0NCBzZWxpbnV4LyV7bW9kdWxlbmFtZX0uaWYgJXtidWlsZHJvb3R9JXtfZGF0YWRpcn0v c2VsaW51eC9kCiAlZW5kaWYKIAogIyBpbnN0YWxsIHN5c3RlbWQgdW5pdCwgZXRjLgotaW5zdGFs bCAtRCAtbSAwNjQ0IC1wICV7U09VUkNFNH0gJXtidWlsZHJvb3R9JXtfdW5pdGRpcn0vJXtuYW1l fS5zZXJ2aWNlCi1pbnN0YWxsIC1EIC1tIDA2NDQgLXAgJXtTT1VSQ0U1fSAle2J1aWxkcm9vdH0l e19zeXN1c2Vyc2Rpcn0vJXtuYW1lfS5jb25mCi1pbnN0YWxsIC1EIC1tIDA2NDQgLXAgJXtTT1VS Q0U2fSAle2J1aWxkcm9vdH0le19zeXNjb25mZGlyfS9zeXNjb25maWcvJXtuYW1lfQotaW5zdGFs bCAtRCAtbSAwNjQ0ICV7U09VUkNFN30gJXtidWlsZHJvb3R9JXtfdG1wZmlsZXNkaXJ9LyV7bmFt ZX0uY29uZgoraW5zdGFsbCAtRCAtbSAwNjQ0IC1wICV7U09VUkNFM30gJXtidWlsZHJvb3R9JXtf dW5pdGRpcn0vJXtuYW1lfS5zZXJ2aWNlCitpbnN0YWxsIC1EIC1tIDA2NDQgLXAgJXtTT1VSQ0U0 fSAle2J1aWxkcm9vdH0le19zeXN1c2Vyc2Rpcn0vJXtuYW1lfS5jb25mCitpbnN0YWxsIC1EIC1t IDA2NDQgLXAgJXtTT1VSQ0U1fSAle2J1aWxkcm9vdH0le19zeXNjb25mZGlyfS9zeXNjb25maWcv JXtuYW1lfQoraW5zdGFsbCAtRCAtbSAwNjQ0ICV7U09VUkNFNn0gJXtidWlsZHJvb3R9JXtfdG1w ZmlsZXNkaXJ9LyV7bmFtZX0uY29uZgogaW5zdGFsbCAtZCAtbSAwNzU1ICV7YnVpbGRyb290fS9y dW4vJXtuYW1lfS8KIAogIyBEaXNjYXJkIHRoZSBpbml0LmQgc2NyaXB0CkBAIC0yMjMsNyArMjE3 LDcgQEAgaW5zdGFsbCAtRCAtbSAwNjQ0IC1wICV7YnVpbGRyb290fSV7X2xpYmRpcn0vJXtuYW1l fS9wa2djb25maWcvJXtuYW1lfS5wYyAle2J1aWwKIHJtIC1yZiAle2J1aWxkcm9vdH0le19saWJk aXJ9LyV7bmFtZX0vcGtnY29uZmlnCiAKICVwcmUKLSVzeXN1c2Vyc19jcmVhdGVfY29tcGF0ICV7 U09VUkNFNX0KKyVzeXN1c2Vyc19jcmVhdGVfY29tcGF0ICV7U09VUkNFNH0KIAogJXBvc3QKICU/ bGRjb25maWcKQEAgLTMxNiw4ICszMTAsMTAgQEAgZmkKIAogCiAlY2hhbmdlbG9nCi0qIFNhdCBK dWwgMjMgMjAyMiBGZWRvcmEgUmVsZWFzZSBFbmdpbmVlcmluZyA8cmVsZW5nQGZlZG9yYXByb2pl Y3Qub3JnPiAtIDkuMS4yLTEwCi0tIFJlYnVpbHQgZm9yIGh0dHBzOi8vZmVkb3JhcHJvamVjdC5v cmcvd2lraS9GZWRvcmFfMzdfTWFzc19SZWJ1aWxkCisqIFRodSBBdWcgMTEgMjAyMiBKZXJlZCBG bG95ZCA8amVyZWRAcmVkaGF0LmNvbT4gOS4xLjMtMQorLSBVcGRhdGUgdG8gOS4xLjMsIHJlc29s dmVzIENWRS0yMDIyLTI1NzYzLCBDVkUtMjAyMi0zMTc3OSwgQ1ZFLTIwMjEtMzcxNTAsCisgIENW RS0yMDIyLTI4MTI5LCBDVkUtMjAyMi0zMTc4MAorLSBSZXNvbHZlIGdsaWJjIDIuMzYgKGYzNykg aGVhZGVyIGluY29tcGF0aWJpbGl0eSB0aGF0IGNhdXNlZCBGVEJGUyBSSEJaIzIxMTIyODIKIAog KiBNb24gSnVsIDExIDIwMjIgSmVyZWQgRmxveWQgPGplcmVkQHJlZGhhdC5jb20+IDkuMS4yLTkK IC0gRG9uJ3QgdHJ5IHRvIHVzZSBDcnlwdG8gUG9saWNpZXMgb24gUkhFTCA3CgpkaWZmIC0tZ2l0 IGEvdW5pdF90ZXN0cy5wYXRjaCBiL3VuaXRfdGVzdHMucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDkyMDEwZjguLjAwMDAwMDAKLS0tIGEvdW5pdF90ZXN0cy5wYXRjaAorKysg L2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS0tLSBzcmMvdHNjb3JlL3VuaXRfdGVzdHMvdGVz dF9IaXN0b3J5LmNjLm9yaWcJMjAyMi0wNC0wOCAxNDozOTo1NC41NDkxOTMwOTAgKzAwMDAKLSsr KyBzcmMvdHNjb3JlL3VuaXRfdGVzdHMvdGVzdF9IaXN0b3J5LmNjCTIwMjItMDQtMDggMTQ6NDY6 NDIuMTA1OTY2ODAzICswMDAwCi1AQCAtNTksMTAgKzU5LDEwIEBACi0gICBSRVFVSVJFKGhpc3Rv cnlbMl0ucmVlbnRyYW5jeSA9PSBzdGF0aWNfY2FzdDxzaG9ydD4oTk9fUkVFTlRSQU5UKSk7Ci0g Ci0gICBoaXN0b3J5WzBdLmxvY2F0aW9uLnN0cihidWYsIHNpemVvZihidWYpKTsKLS0gIFJFUVVJ UkUoc3RyaW5nX3ZpZXd7YnVmfSA9PSAidGVzdF9IaXN0b3J5LmNjOjQ4IChfX19fQ19BX1RfQ19I X19fX1RfRV9TX1RfX19fMCkiKTsKLSsgIFJFUVVJUkUoc3RyaW5nX3ZpZXd7YnVmfSA9PSAidGVz dF9IaXN0b3J5LmNjOjQ4IChDX0FfVF9DX0hfVF9FX1NfVF8wKSIpOwotIAotICAgaGlzdG9yeVsx XS5sb2NhdGlvbi5zdHIoYnVmLCBzaXplb2YoYnVmKSk7Ci0tICBSRVFVSVJFKHN0cmluZ192aWV3 e2J1Zn0gPT0gInRlc3RfSGlzdG9yeS5jYzo0OSAoX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19f XzApIik7Ci0rICBSRVFVSVJFKHN0cmluZ192aWV3e2J1Zn0gPT0gInRlc3RfSGlzdG9yeS5jYzo0 OSAoQ19BX1RfQ19IX1RfRV9TX1RfMCkiKTsKLSAKLSAgIHRzOjpMb2NhbEJ1ZmZlcldyaXRlcjwx Mjg+IHc7Ci0gICBTTTxISVNUT1JZX0RFRkFVTFRfU0laRT4gKnNtID0gbmV3IFNNPEhJU1RPUllf REVGQVVMVF9TSVpFPjsKLUBAIC03MSwxMCArNzEsMTAgQEAKLSAgIFNNX1JFTUVNQkVSKHNtLCAz LCBOT19SRUVOVFJBTlQpOwotIAotICAgdy5wcmludCgie30iLCBzbS0+aGlzdG9yeVswXS5sb2Nh dGlvbik7Ci0tICBSRVFVSVJFKHcudmlldygpID09ICJ0ZXN0X0hpc3RvcnkuY2M6NjkgKF9fX19D X0FfVF9DX0hfX19fVF9FX1NfVF9fX18wKSIpOwotKyAgUkVRVUlSRSh3LnZpZXcoKSA9PSAidGVz dF9IaXN0b3J5LmNjOjY5IChDX0FfVF9DX0hfVF9FX1NfVF8wKSIpOwotIAotICAgdy5yZXNldCgp LnByaW50KCJ7fSIsIHNtLT5oaXN0b3J5WzFdLmxvY2F0aW9uKTsKLS0gIFJFUVVJUkUody52aWV3 KCkgPT0gInRlc3RfSGlzdG9yeS5jYzo3MCAoX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXzAp Iik7Ci0rICBSRVFVSVJFKHcudmlldygpID09ICJ0ZXN0X0hpc3RvcnkuY2M6NzAgKENfQV9UX0Nf SF9UX0VfU19UXzApIik7Ci0gCi0gICBSRVFVSVJFKHNtLT5oaXN0b3J5WzBdLmV2ZW50ID09IDEp OwotICAgUkVRVUlSRShzbS0+aGlzdG9yeVswXS5yZWVudHJhbmN5ID09IDEpOwotQEAgLTEwNiwx MCArMTA2LDEwIEBACi0gICBSRVFVSVJFKHNtMi0+aGlzdG9yeS5vdmVyZmxvd2VkKCkgPT0gdHJ1 ZSk7Ci0gCi0gICB3LnJlc2V0KCkucHJpbnQoInt9Iiwgc20yLT5oaXN0b3J5WzBdLmxvY2F0aW9u KTsKLS0gIFJFUVVJUkUody52aWV3KCkgPT0gInRlc3RfSGlzdG9yeS5jYzoxMDMgKF9fX19DX0Ff VF9DX0hfX19fVF9FX1NfVF9fX18wKSIpOwotKyAgUkVRVUlSRSh3LnZpZXcoKSA9PSAidGVzdF9I aXN0b3J5LmNjOjEwMyAoQ19BX1RfQ19IX1RfRV9TX1RfMCkiKTsKLSAKLSAgIHcucmVzZXQoKS5w cmludCgie30iLCBzbTItPmhpc3RvcnlbMV0ubG9jYXRpb24pOwotLSAgUkVRVUlSRSh3LnZpZXco KSA9PSAidGVzdF9IaXN0b3J5LmNjOjk4IChfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fMCki KTsKLSsgIFJFUVVJUkUody52aWV3KCkgPT0gInRlc3RfSGlzdG9yeS5jYzo5OCAoQ19BX1RfQ19I X1RfRV9TX1RfMCkiKTsKLSAKLSAgIHNtMi0+aGlzdG9yeS5jbGVhcigpOwotICAgUkVRVUlSRShz bTItPmhpc3Rvcnkuc2l6ZSgpID09IDApOwo=