Lyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKICoKICogVklNIC0gVmkgSU1wcm92ZWQJCWJ5IEJyYW0gTW9vbGVuYWFyCiAqCQkJCUdVSS9Nb3RpZiBzdXBwb3J0IGJ5IFJvYmVydCBXZWJiCiAqCQkJCU1hY2ludG9zaCBwb3J0IGJ5IERhbnkgU3QtQW1hbnQKICoJCQkJCSAgICAgIGFuZCBBeGVsIEtpZWxob3JuCiAqCQkJCVBvcnQgdG8gTVBXIGJ5IEJlcm5oYXJkIFByn21tZXIKICoJCQkJSW5pdGlhbCBDYXJib24gcG9ydCBieSBBbW1vbiBTa2lkbW9yZQogKgogKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCiAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgogKi8KCi8qCiAqIE5PVEU6IENvbW1lbnQgbWVudGlvbm5pbmcgRkFRIHJlZmVyIHRvIHRoZSBib29rOgogKiAgICAgICAiTWFjd29ybGQgTWFjIFByb2dyYW1taW5nIEZBUXMiIGZyb20gIklERyBCb29rcyIKICovCgovKgogKiBXQVJOSU5HOiBWaW0gbXVzdCBiZSBhYmxlIHRvIGNvbXBpbGUgd2l0aG91dCBDYXJib24KICoJICAgIEFzIHRoZSBkZXNpcmVkIG1pbmltdW0gcmVxdWlyZW1lbnQgYXJlIGNpcmNhIFN5c3RlbSA3CiAqCSAgICAoSSB3YW50IHRvIHJ1biBpdCBvbiBteSBNYWMgQ2xhc3NpYykgKERhbnkpCiAqLwoKLyoKICogVE9ETzogQ2hhbmdlIHN0aWxsIHRvIG1lcmdlIGZyb20gdGhlIG1hY3ZpbSdzIGlEaXNrCiAqCiAqIGVycm9yX2dhLCBtY2hfZXJybXNnLCBOYXZpZ2F0aW9uJ3MgY2hhbmdlcyBpbiBndWlfbWNoX2Jyb3dzZQogKiB1c2VzIG9mIE1lbnVJdGVtSW5kZXgsIGNoYW5nZXMgaW4gZ3VpX21jaF9zZXRfc2hlbGxzaXplLAogKiBTY3JhcE1hbmFnZXIgZXJyb3IgaGFuZGxpbmcuCiAqIENvbW1lbnRzIGFib3V0IGZ1bmN0aW9uIHJlbWFpbmluZyB0byBDYXJib25pemUuCiAqCiAqLwoKLyogVE9ETzogZmluZCB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyAoRGFueSkgKi8KI2lmIDAKIyAgaWYgISBUQVJHRVRfQVBJX01BQ19DQVJCT04KLyogRW5hYmxlIHRoZSBuZXcgQVBJIGZ1bmN0aW9ucyBldmVuIHdoZW4gbm90IGNvbXBpbGluZyBmb3IgQ2FyYm9uICovCi8qIEFwcGxlIHJlY29tZW5kcyBVbml2ZXJzYWwgSW50ZXJmYWNlIDMuMy4yIG9yIGxhdGVyICovCiMgIGRlZmluZSBPUEFRVUVfVE9PTEJPWF9TVFJVQ1RTCQkxCiMgIGRlZmluZSBBQ0NFU1NPUl9DQUxMU19BUkVfRlVOQ1RJT05TCTEKLyogSGVscCBNZW51IG5vdCBzdXBwb3J0ZWQgYnkgQ2FyYm9uICovCiMgIGRlZmluZSBVU0VfSEVMUE1FTlUKIyBlbmRpZgojZW5kaWYKCiNpbmNsdWRlIDxEZXZpY2VzLmg+IC8qIGluY2x1ZGVkIGZpcnN0IHRvIGF2b2lkIENSIHByb2JsZW1zICovCiNpbmNsdWRlICJ2aW0uaCIKCi8qIEVuYWJsZSBDb250ZXh0dWFsIE1lbnUgU3VwcG9ydCAqLwojaWYgVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+PSAweDAzMjAKIyBkZWZpbmUgVVNFX0NUUkxDTElDS01FTlUKI2VuZGlmCgovKiBQdXQgVmltIEhlbHAgaW4gTWFjT1MgSGVscCAqLwojZGVmaW5lIFVTRV9IRUxQTUVOVQoKLyogRW5hYmxlIEFFVkVOVCAqLwojZGVmaW5lIFVTRV9BRVZFTlQKCi8qIENvbXBpbGUgYXMgQ29kZVdhcmlvciBFeHRlcm5hbCBFZGl0b3IgKi8KI2lmIGRlZmluZWQoRkVBVF9DV19FRElUT1IpICYmICFkZWZpbmVkKFVTRV9BRVZFTlQpCiMgZGVmaW5lIFVTRV9BRVZFTlQgLyogTmVlZCBBcHBsZSBFdmVudCBTdXBwb3J0ICovCiNlbmRpZgoKLyogVGhlIFZJTSBjcmVhdG9yIGlzIENvZGVXYXJpb3Igc3BlY2lmaWMgKi8KI2lmICEoZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykgfHwgZGVmaW5lZChfX0FQUExFX0NDX18pKQojIGRlZmluZSBVU0VfVklNX0NSRUFUT1JfSUQKI2Vsc2UKIyBpZiAwIC8qIFdhcyB0aGlzIHVzZWZ1bGwgZm9yIHNvbWUgY29tcGlsZXI/IChEYW55KSAqLwpzdGF0aWMgICAgT1NUeXBlCV9mY3JlYXRvciA9ICdWSU0hJzsKc3RhdGljICAgIE9TVHlwZQlfZnR5cGUgPSAnVEVYVCc7CiMgZW5kaWYKI2VuZGlmCgovKiBWaW0ncyBTY3JhcCBmbGF2b3IuICovCiNkZWZpbmUgVklNU0NSQVBGTEFWT1IgJ1ZJTSEnCgovKiBDQVJCT04gdmVyc2lvbiBvbmx5IHRlc3RlZCB3aXRoIFByb2plY3QgQnVpbGRlciB1bmRlciBNYWNPUyBYICovCiN1bmRlZiBVU0VfQ0FSQk9OSVpFRAojaWYgKGRlZmluZWQoX19BUFBMRV9DQ19fKSB8fCBkZWZpbmVkKF9fTVJDX18pKSAmJiBkZWZpbmVkKFRBUkdFVF9BUElfTUFDX0NBUkJPTikKIyBpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KIyAgZGVmaW5lIFVTRV9DQVJCT05JWkVECiMgZW5kaWYKI2VuZGlmCgojdW5kZWYgVVNFX01PVVNFV0hFRUwKI2lmIGRlZmluZWQoTUFDT1NfWCkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkKIyBkZWZpbmUgVVNFX01PVVNFV0hFRUwKc3RhdGljIEV2ZW50SGFuZGxlclVQUCBtb3VzZVdoZWVsSGFuZGxlclVQUCA9IE5VTEw7CiNlbmRpZgoKI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKIyBkZWZpbmUgVVNFX0NBUkJPTktFWUhBTkRMRVIKc3RhdGljIEV2ZW50SGFuZGxlclVQUCBrZXlFdmVudEhhbmRsZXJVUFAgPSBOVUxMOwovKiBEZWZpbmVkIGluIG9zX21hY19jb252LmMgKi8KZXh0ZXJuIGNoYXJfdSAqbWFjX3V0ZjE2X3RvX2VuYyBfX0FSR1MoKFVuaUNoYXIgKmZyb20sIHNpemVfdCBmcm9tTGVuLCBzaXplX3QgKmFjdHVhbExlbikpOwpleHRlcm4gVW5pQ2hhciAqbWFjX2VuY190b191dGYxNiBfX0FSR1MoKGNoYXJfdSAqZnJvbSwgc2l6ZV90IGZyb21MZW4sIHNpemVfdCAqYWN0dWFsTGVuKSk7CmV4dGVybiBDRlN0cmluZ1JlZiBtYWNfZW5jX3RvX2Nmc3RyaW5nIF9fQVJHUygoY2hhcl91ICpmcm9tLCBzaXplX3QgZnJvbUxlbikpOwojZW5kaWYKCiNpZmRlZiBNQUNPU19YClNJbnQzMiBnTWFjU3lzdGVtVmVyc2lvbjsKI2VuZGlmCgovKiBEZWJ1Z2dpbmcgZmVhdHVyZTogc3RhcnQgVmltIHdpbmRvdyBPRkZTRVRlZCAqLwojdW5kZWYgVVNFX09GRlNFVEVEX1dJTkRPVwoKLyogRGVidWdnaW5nIGZlYXR1cmU6IHVzZSBDb2RlV2FyaW9yIFNJT1VYICovCiN1bmRlZiBVU0VfU0lPVVgKCgovKiBJbmNsdWRlIHNvbWUgZmlsZS4gVE9ETzogbW92ZSBpbnRvIG9zX21hYy5oICovCiNpbmNsdWRlIDxNZW51cy5oPgojaW5jbHVkZSA8UmVzb3VyY2VzLmg+CiNpZiAhVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCiNpbmNsdWRlIDxTdGFuZGFyZEZpbGUuaD4KI2luY2x1ZGUgPFRyYXBzLmg+CiNlbmRpZgojaW5jbHVkZSA8QmFsbG9vbnMuaD4KI2luY2x1ZGUgPFByb2Nlc3Nlcy5oPgojaWZkZWYgVVNFX0FFVkVOVAojIGluY2x1ZGUgPEFwcGxlRXZlbnRzLmg+CiMgaW5jbHVkZSA8QUVSZWdpc3RyeS5oPgojZW5kaWYKI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCiMgaW5jbHVkZSA8R2VzdGFsdC5oPgojZW5kaWYKI2lmZGVmIFVTRV9TSU9VWAojIGluY2x1ZGUgPHN0ZGlvLmg+CiMgaW5jbHVkZSA8c2lvdXguaD4KIyBpbmNsdWRlIDxjb25zb2xlLmg+CiNlbmRpZgojaWYgVU5JVkVSU0FMX0lOVEVSRkFDRVNfVkVSU0lPTiA+PSAweDAzMzAKIyBpbmNsdWRlIDxDb250cm9sRGVmaW5pdGlvbnMuaD4KIyBpbmNsdWRlIDxOYXZpZ2F0aW9uLmg+ICAvKiBOYXZpZ2F0aW9uIG9ubHkgcGFydCBvZiA/PyAqLwojZW5kaWYKCiNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04gJiYgMAovKiBOZXcgSGVscCBJbnRlcmZhY2UgZm9yIE1hYywgbm90IGltcGxlbWVudGVkIHlldC4qLwojIGluY2x1ZGUgPE1hY0hlbHAuaD4KI2VuZGlmCgovKgogKiBUcmFuc2xhdGUgbmV3IG5hbWUgdG8gb2xkIG9uZXMKICogTmV3IGZ1bmN0aW9uIG9ubHkgYXZhaWxhYmxlIGluIE1hY09TIDguNSwKICogU28gdXNlIG9sZCBvbmUgdG8gYmUgY29tcGF0aWJsZSBiYWNrIHRvIFN5c3RlbSA3CiAqLwojaWZuZGVmIFVTRV9DQVJCT05JWkVECiMgdW5kZWYgIEVuYWJsZU1lbnVJdGVtCiMgZGVmaW5lIEVuYWJsZU1lbnVJdGVtIEVuYWJsZUl0ZW0KIyB1bmRlZiAgRGlzYWJsZU1lbnVJdGVtCiMgZGVmaW5lIERpc2FibGVNZW51SXRlbSBEaXNhYmxlSXRlbQojZW5kaWYKCi8qIENhcmJvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBHZXQvU2V0Q29udHJvbGwgZnVuY3Rpb25zLAogKiB1c2UgR2V0L1NldENvbnRyb2wzMkJpdCBpbnN0ZWFkIGFuZCByZW5hbWUgZm9yIG5vbi1jYXJib24KICogc3lzdGVtcy4KICovCgojaWZuZGVmIFVTRV9DQVJCT05JWkVECiMgdW5kZWYgICAgU2V0Q29udHJvbDMyQml0TWF4aW11bQojIGRlZmluZSAgIFNldENvbnRyb2wzMkJpdE1heGltdW0gU2V0Q29udHJvbE1heGltdW0KIyB1bmRlZiAgICBTZXRDb250cm9sMzJCaXRNaW5pbXVtCiMgZGVmaW5lICAgU2V0Q29udHJvbDMyQml0TWluaW11bSBTZXRDb250cm9sTWluaW11bQojIHVuZGVmICAgIFNldENvbnRyb2wzMkJpdFZhbHVlCiMgZGVmaW5lICAgU2V0Q29udHJvbDMyQml0VmFsdWUgU2V0Q29udHJvbFZhbHVlCiMgdW5kZWYgICAgR2V0Q29udHJvbDMyQml0VmFsdWUKIyBkZWZpbmUgICBHZXRDb250cm9sMzJCaXRWYWx1ZSBHZXRDb250cm9sVmFsdWUKI2VuZGlmCgovKgogKiA/Pz8KICovCgojZGVmaW5lIGtOb3RoaW5nIDAKI2RlZmluZSBrQ3JlYXRlRW1wdHkgMiAvKjEqLwojZGVmaW5lIGtDcmVhdGVSZWN0IDIKI2RlZmluZSBrRGVzdHJveSAzCgovKgogKiBEYW55OiBEb24ndCBsaWtlIHRob3NlLi4uCiAqLwoKI2RlZmluZSB0b3BMZWZ0KHIpCSgoKFBvaW50KikmKHIpKVswXSkKI2RlZmluZSBib3RSaWdodChyKQkoKChQb2ludCopJihyKSlbMV0pCgoKLyogVGltZSBvZiBsYXN0IG1vdXNlIGNsaWNrLCB0byBkZXRlY3QgZG91YmxlLWNsaWNrICovCnN0YXRpYyBsb25nIGxhc3RNb3VzZVRpY2sgPSAwOwoKLyogPz8/ICovCnN0YXRpYyBSZ25IYW5kbGUgY3Vyc29yUmduOwpzdGF0aWMgUmduSGFuZGxlIGRyYWdSZ247CnN0YXRpYyBSZWN0IGRyYWdSZWN0OwpzdGF0aWMgc2hvcnQgZHJhZ1JlY3RFbmJsOwpzdGF0aWMgc2hvcnQgZHJhZ1JlY3RDb250cm9sOwoKLyogVGhpcyB2YXJpYWJsZSBpcyBzZXQgd2hlbiB3YWl0aW5nIGZvciBhbiBldmVudCwgd2hpY2ggaXMgdGhlIG9ubHkgbW9tZW50CiAqIHNjcm9sbGJhciBkcmFnZ2luZyBjYW4gYmUgZG9uZSBkaXJlY3RseS4gIEl0J3Mgbm90IGFsbG93ZWQgd2hpbGUgY29tbWFuZHMKICogYXJlIGV4ZWN1dGVkLCBiZWNhdXNlIGl0IG1heSBtb3ZlIHRoZSBjdXJzb3IgYW5kIHRoYXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQKICogcHJvYmxlbXMgKGUuZy4sIHdoaWxlICI6cyIgaXMgd29ya2luZykuCiAqLwpzdGF0aWMgaW50IGFsbG93X3Njcm9sbGJhciA9IEZBTFNFOwoKLyogTGFzdCBtb3VzZSBjbGljayBjYXVzZWQgY29udGV4dHVhbCBtZW51LCAodG8gcHJvdmlkZSBwcm9wZXIgcmVsZWFzZSkgKi8KI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCnN0YXRpYyBzaG9ydCBjbGlja0lzUG9wdXA7CiNlbmRpZgoKLyogRmVlZGJhY2sgQWN0aW9uIGZvciBTY3JvbGxiYXIgKi8KQ29udHJvbEFjdGlvblVQUCBnU2Nyb2xsQWN0aW9uOwpDb250cm9sQWN0aW9uVVBQIGdTY3JvbGxEcmFnOwoKLyogS2VlcGluZyB0cmFjayBvZiB3aGljaCBzY3JvbGxiYXIgaXMgYmVpbmcgZHJhZ2dlZCAqLwpzdGF0aWMgQ29udHJvbEhhbmRsZSBkcmFnZ2VkX3NiID0gTlVMTDsKCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKE1BQ09TX1gpCnN0YXRpYyBzdHJ1Y3QKewogICAgRk1Gb250RmFtaWx5IGZhbWlseTsKICAgIEZNRm9udFNpemUgc2l6ZTsKICAgIEZNRm9udFN0eWxlIHN0eWxlOwogICAgQm9vbGVhbiBpc1BhbmVsVmlzaWJsZTsKfSBnRm9udFBhbmVsSW5mbyA9IHsgMCwgMCwgMCwgZmFsc2UgfTsKI2VuZGlmCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQojIGRlZmluZSBVU0VfQVRTVUlfRFJBV0lORwpBVFNVU3R5bGUgICBnRm9udFN0eWxlOwpCb29sZWFuCSAgICBnSXNGb250RmFsbGJhY2tTZXQ7CiNlbmRpZgoKLyoKICogVGhlIFF1aWNrZHJhdyBnbG9iYWwgaXMgcHJlZGVmaW5lZCBpbiBDb2RlV2FyaW9yCiAqIGJ1dCBpcyBub3QgaW4gQXBwbGUgTVBXCiAqLwojaWYgKGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pKQojIGlmICEoZGVmaW5lZChUQVJHRVRfQVBJX01BQ19DQVJCT04pICYmIFRBUkdFVF9BUElfTUFDX0NBUkJPTikKUURHbG9iYWxzIHFkOwojIGVuZGlmCiNlbmRpZgoKLyogQ29sb3JzIE1hY3JvcyAqLwojZGVmaW5lIFJHQihyLGcsYikJKChyKSA8PCAxNikgKyAoKGcpIDw8IDgpICsgKGIpCiNkZWZpbmUgUmVkKGMpCQkoKGMgJiAweDAwRkYwMDAwKSA+PiAxNikKI2RlZmluZSBHcmVlbihjKQkoKGMgJiAweDAwMDBGRjAwKSA+PiAgOCkKI2RlZmluZSBCbHVlKGMpCQkoKGMgJiAweDAwMDAwMEZGKSA+PiAgMCkKCi8qIEtleSBtYXBwaW5nICovCgojZGVmaW5lIHZrX0VzYwkJMHgzNQkvKiAtPiAxQiAqLwoKI2RlZmluZSB2a19GMQkJMHg3QQkvKiAtPiAxMCAqLwojZGVmaW5lIHZrX0YyCQkweDc4ICAvKjB4NjMqLwojZGVmaW5lIHZrX0YzCQkweDYzICAvKjB4NzYqLwojZGVmaW5lIHZrX0Y0CQkweDc2ICAvKjB4NjAqLwojZGVmaW5lIHZrX0Y1CQkweDYwICAvKjB4NjEqLwojZGVmaW5lIHZrX0Y2CQkweDYxICAvKjB4NjIqLwojZGVmaW5lIHZrX0Y3CQkweDYyICAvKjB4NjMqLyAgLyo/Ki8KI2RlZmluZSB2a19GOAkJMHg2NAojZGVmaW5lIHZrX0Y5CQkweDY1CiNkZWZpbmUgdmtfRjEwCQkweDZECiNkZWZpbmUgdmtfRjExCQkweDY3CiNkZWZpbmUgdmtfRjEyCQkweDZGCiNkZWZpbmUgdmtfRjEzCQkweDY5CiNkZWZpbmUgdmtfRjE0CQkweDZCCiNkZWZpbmUgdmtfRjE1CQkweDcxCgojZGVmaW5lIHZrX0NscgkJMHg0NwkvKiAtPiAxQiAoRVNDKSAqLwojZGVmaW5lIHZrX0VudGVyCTB4NEMJLyogLT4gMDMgKi8KCiNkZWZpbmUgdmtfU3BhY2UJMHgzMQkvKiAtPiAyMCAqLwojZGVmaW5lIHZrX1RhYgkJMHgzMAkvKiAtPiAwOSAqLwojZGVmaW5lIHZrX1JldHVybgkweDI0CS8qIC0+IDBEICovCi8qIFRoaXMgaXMgd3JvbmcgZm9yIE9TWCwgd2hhdCBpcyBpdCBmb3I/ICovCiNkZWZpbmUgdmtfRGVsZXRlCTBYMDgJLyogLT4gMDggQmFja1NwYWNlICovCgojZGVmaW5lIHZrX0hlbHAJCTB4NzIJLyogLT4gMDUgKi8KI2RlZmluZSB2a19Ib21lCQkweDczCS8qIC0+IDAxICovCiNkZWZpbmUJdmtfUGFnZVVwCTB4NzQJLyogLT4gMEQgKi8KI2RlZmluZSB2a19Gd2REZWxldGUJMHg3NQkvKiAtPiA3RiAqLwojZGVmaW5lCXZrX0VuZAkJMHg3NwkvKiAtPiAwNCAqLwojZGVmaW5lIHZrX1BhZ2VEb3duCTB4NzkJLyogLT4gMEMgKi8KCiNkZWZpbmUgdmtfVXAJCTB4N0UJLyogLT4gMUUgKi8KI2RlZmluZSB2a19Eb3duCQkweDdECS8qIC0+IDFGICovCiNkZWZpbmUJdmtfTGVmdAkJMHg3QgkvKiAtPiAxQyAqLwojZGVmaW5lIHZrX1JpZ2h0CTB4N0MJLyogLT4gMUQgKi8KCiNkZWZpbmUgdmtfVW5kbwkJdmtfRjEKI2RlZmluZSB2a19DdXQJCXZrX0YyCiNkZWZpbmUJdmtfQ29weQkJdmtfRjMKI2RlZmluZQl2a19QYXN0ZQl2a19GNAojZGVmaW5lIHZrX1ByaW50U2NyZWVuCXZrX0YxMwojZGVmaW5lIHZrX1NDcm9sbExvY2sJdmtfRjE0CiNkZWZpbmUJdmtfUGF1c2UJdmtfRjE1CiNkZWZpbmUJdmtfTnVtTG9jawl2a19DbHIKI2RlZmluZSB2a19JbnNlcnQJdmtfSGVscAoKI2RlZmluZSBLZXlTeW0JY2hhcgoKc3RhdGljIHN0cnVjdAp7CiAgICBLZXlTeW0gIGtleV9zeW07CiAgICBjaGFyX3UgIHZpbV9jb2RlMDsKICAgIGNoYXJfdSAgdmltX2NvZGUxOwp9IHNwZWNpYWxfa2V5c1tdID0KewogICAge3ZrX1VwLAkJJ2snLCAndSd9LAogICAge3ZrX0Rvd24sCQknaycsICdkJ30sCiAgICB7dmtfTGVmdCwJCSdrJywgJ2wnfSwKICAgIHt2a19SaWdodCwJCSdrJywgJ3InfSwKCiAgICB7dmtfRjEsCQknaycsICcxJ30sCiAgICB7dmtfRjIsCQknaycsICcyJ30sCiAgICB7dmtfRjMsCQknaycsICczJ30sCiAgICB7dmtfRjQsCQknaycsICc0J30sCiAgICB7dmtfRjUsCQknaycsICc1J30sCiAgICB7dmtfRjYsCQknaycsICc2J30sCiAgICB7dmtfRjcsCQknaycsICc3J30sCiAgICB7dmtfRjgsCQknaycsICc4J30sCiAgICB7dmtfRjksCQknaycsICc5J30sCiAgICB7dmtfRjEwLAkJJ2snLCAnOyd9LAoKICAgIHt2a19GMTEsCQknRicsICcxJ30sCiAgICB7dmtfRjEyLAkJJ0YnLCAnMid9LAogICAge3ZrX0YxMywJCSdGJywgJzMnfSwKICAgIHt2a19GMTQsCQknRicsICc0J30sCiAgICB7dmtfRjE1LAkJJ0YnLCAnNSd9LAoKLyogIHtYS19IZWxwLAkJJyUnLCAnMSd9LCAqLwovKiAge1hLX1VuZG8sCQknJicsICc4J30sICovCi8qICB7WEtfQmFja1NwYWNlLAknaycsICdiJ30sICovCiNpZm5kZWYgTUFDT1NfWAogICAge3ZrX0RlbGV0ZSwJCSdrJywgJ2InfSwKI2VuZGlmCiAgICB7dmtfSW5zZXJ0LAkJJ2snLCAnSSd9LAogICAge3ZrX0Z3ZERlbGV0ZSwJJ2snLCAnRCd9LAogICAge3ZrX0hvbWUsCQknaycsICdoJ30sCiAgICB7dmtfRW5kLAkJJ0AnLCAnNyd9LAovKiAge1hLX1ByaW9yLAkJJ2snLCAnUCd9LCAqLwovKiAge1hLX05leHQsCQknaycsICdOJ30sICovCi8qICB7WEtfUHJpbnQsCQknJScsICc5J30sICovCgogICAge3ZrX1BhZ2VVcCwJCSdrJywgJ1AnfSwKICAgIHt2a19QYWdlRG93biwJJ2snLCAnTid9LAoKICAgIC8qIEVuZCBvZiBsaXN0IG1hcmtlcjogKi8KICAgIHsoS2V5U3ltKTAsCQkwLCAwfQp9OwoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEZvcndhcmQgZGVjbGFyYXRpb24gKGZvciB0aG9zZSBuZWVkZWQpCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCiNpZmRlZiBVU0VfQUVWRU5UCk9TRXJyIEhhbmRsZVVudXNlZFBhcm1zKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCk7CiNlbmRpZgoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvbnZlcnNpb24gVXRpbGl0eQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiBDMlBhc2NhbF9zYXZlCiAqCiAqIEFsbG9jYXRlIG1lbW9yeSBhbmQgY29udmVydCB0aGUgQy1TdHJpbmcgcGFzc2VkIGluCiAqIGludG8gYSBwYXNjYWwgc3RyaW5nCiAqCiAqLwoKY2hhcl91ICpDMlBhc2NhbF9zYXZlKGNoYXJfdSAqQ3N0cmluZykKewogICAgY2hhcl91ICAqUGFzY2FsU3RyaW5nOwogICAgaW50CSAgICBsZW47CgogICAgaWYgKENzdHJpbmcgPT0gTlVMTCkKCXJldHVybiBOVUxMOwoKICAgIGxlbiA9IFNUUkxFTihDc3RyaW5nKTsKCiAgICBpZiAobGVuID4gMjU1KSAvKiBUcnVuY2F0ZSBpZiBuZWNlc3NhcnkgKi8KCWxlbiA9IDI1NTsKCiAgICBQYXNjYWxTdHJpbmcgPSBhbGxvYyhsZW4gKyAxKTsKICAgIGlmIChQYXNjYWxTdHJpbmcgIT0gTlVMTCkKICAgIHsKCW1jaF9tZW1tb3ZlKFBhc2NhbFN0cmluZyArIDEsIENzdHJpbmcsIGxlbik7CglQYXNjYWxTdHJpbmdbMF0gPSBsZW47CiAgICB9CgogICAgcmV0dXJuIFBhc2NhbFN0cmluZzsKfQoKLyoKICogQzJQYXNjYWxfc2F2ZV9hbmRfcmVtb3ZlX2JhY2tzbGFzaAogKgogKiBBbGxvY2F0ZSBtZW1vcnkgYW5kIGNvbnZlcnQgdGhlIEMtU3RyaW5nIHBhc3NlZCBpbgogKiBpbnRvIGEgcGFzY2FsIHN0cmluZy4gQWxzbyByZW1vdmUgdGhlIGJhY2tzbGFzaCBhdCB0aGUgc2FtZSB0aW1lCiAqCiAqLwoKY2hhcl91ICpDMlBhc2NhbF9zYXZlX2FuZF9yZW1vdmVfYmFja3NsYXNoKGNoYXJfdSAqQ3N0cmluZykKewogICAgY2hhcl91ICAqUGFzY2FsU3RyaW5nOwogICAgaW50CSAgICBsZW47CiAgICBjaGFyX3UgICpwLCAqYzsKCiAgICBsZW4gPSBTVFJMRU4oQ3N0cmluZyk7CgogICAgaWYgKGxlbiA+IDI1NSkgLyogVHJ1bmNhdGUgaWYgbmVjZXNzYXJ5ICovCglsZW4gPSAyNTU7CgogICAgUGFzY2FsU3RyaW5nID0gYWxsb2MobGVuICsgMSk7CiAgICBpZiAoUGFzY2FsU3RyaW5nICE9IE5VTEwpCiAgICB7Cglmb3IgKGMgPSBDc3RyaW5nLCBwID0gUGFzY2FsU3RyaW5nKzEsIGxlbiA9IDA7ICgqYyAhPSAwKSAmJiAobGVuIDwgMjU1KTsgYysrKQoJewoJICAgIGlmICgoKmMgPT0gJ1xcJykgJiYgKGNbMV0gIT0gMCkpCgkgICAgewoJCWMrKzsKCSAgICB9CgkgICAgKnAgPSAqYzsKCSAgICBwKys7CgkgICAgbGVuKys7Cgl9CglQYXNjYWxTdHJpbmdbMF0gPSBsZW47CiAgICB9CgogICAgcmV0dXJuIFBhc2NhbFN0cmluZzsKfQoKLyoKICogQ29udmVydCB0aGUgbW9kaWZpZXJzIG9mIGFuIEV2ZW50IGludG8gdmltJ3MgbW9kaWZpZXJzIChtb3VzZSkKICovCgogICAgaW50X3UKRXZlbnRNb2RpZmllcnMyVmltTW91c2VNb2RpZmllcnMoRXZlbnRNb2RpZmllcnMgbWFjTW9kaWZpZXJzKQp7CiAgICBpbnRfdSB2aW1Nb2RpZmllcnMgPSAweDAwOwoKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoc2hpZnRLZXkgfCByaWdodFNoaWZ0S2V5KSkKCXZpbU1vZGlmaWVycyB8PSBNT1VTRV9TSElGVDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoY29udHJvbEtleSB8IHJpZ2h0Q29udHJvbEtleSkpCgl2aW1Nb2RpZmllcnMgfD0gTU9VU0VfQ1RSTDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAob3B0aW9uS2V5IHwgcmlnaHRPcHRpb25LZXkpKQoJdmltTW9kaWZpZXJzIHw9IE1PVVNFX0FMVDsKI2lmIDAKICAgIC8qIE5vdCB5ZXQgc3VwcG9ydGVkICovCiAgICBpZiAobWFjTW9kaWZpZXJzICYgKGNtZEtleSkpIC8qIFRoZXJlJ3Mgbm8gcmlnaHRDbWRLZXkgKi8KCXZpbU1vZGlmaWVycyB8PSBNT1VTRV9DTUQ7CiNlbmRpZgogICAgcmV0dXJuICh2aW1Nb2RpZmllcnMpOwp9CgovKgogKiBDb252ZXJ0IHRoZSBtb2RpZmllcnMgb2YgYW4gRXZlbnQgaW50byB2aW0ncyBtb2RpZmllcnMgKGtleXMpCiAqLwoKICAgIHN0YXRpYyBpbnRfdQpFdmVudE1vZGlmaWVyczJWaW1Nb2RpZmllcnMoRXZlbnRNb2RpZmllcnMgbWFjTW9kaWZpZXJzKQp7CiAgICBpbnRfdSB2aW1Nb2RpZmllcnMgPSAweDAwOwoKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoc2hpZnRLZXkgfCByaWdodFNoaWZ0S2V5KSkKCXZpbU1vZGlmaWVycyB8PSBNT0RfTUFTS19TSElGVDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAoY29udHJvbEtleSB8IHJpZ2h0Q29udHJvbEtleSkpCgl2aW1Nb2RpZmllcnMgfD0gTU9EX01BU0tfQ1RSTDsKICAgIGlmIChtYWNNb2RpZmllcnMgJiAob3B0aW9uS2V5IHwgcmlnaHRPcHRpb25LZXkpKQoJdmltTW9kaWZpZXJzIHw9IE1PRF9NQVNLX0FMVDsKI2lmZGVmIFVTRV9DTURfS0VZCiAgICBpZiAobWFjTW9kaWZpZXJzICYgKGNtZEtleSkpIC8qIFRoZXJlJ3Mgbm8gcmlnaHRDbWRLZXkgKi8KCXZpbU1vZGlmaWVycyB8PSBNT0RfTUFTS19DTUQ7CiNlbmRpZgogICAgcmV0dXJuICh2aW1Nb2RpZmllcnMpOwp9CgovKiBDb252ZXJ0IGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIHBvaW50IHNpemUgaW50byBwaXhlbHMuIFRoZSBzdHJpbmcgc2hvdWxkCiAqIGJlIGEgcG9zaXRpdmUgZGVjaW1hbCBudW1iZXIsIHdpdGggYW4gb3B0aW9uYWwgZGVjaW1hbCBwb2ludCAoZWcsICIxMiIsIG9yCiAqICIxMC41IikuIFRoZSBwaXhlbCB2YWx1ZSBpcyByZXR1cm5lZCwgYW5kIGEgcG9pbnRlciB0byB0aGUgbmV4dCB1bmNvbnZlcnRlZAogKiBjaGFyYWN0ZXIgaXMgc3RvcmVkIGluICplbmQuIFRoZSBmbGFnICJ2ZXJ0aWNhbCIgc2F5cyB3aGV0aGVyIHRoaXMKICogY2FsY3VsYXRpb24gaXMgZm9yIGEgdmVydGljYWwgKGhlaWdodCkgc2l6ZSBvciBhIGhvcml6b250YWwgKHdpZHRoKSBvbmUuCiAqCiAqIEZyb20gZ3VpX3c0OC5jCiAqLwogICAgc3RhdGljIGludApwb2ludHNfdG9fcGl4ZWxzKGNoYXJfdSAqc3RyLCBjaGFyX3UgKiplbmQsIGludCB2ZXJ0aWNhbCkKewogICAgaW50CQlwaXhlbHM7CiAgICBpbnQJCXBvaW50cyA9IDA7CiAgICBpbnQJCWRpdmlzb3IgPSAwOwoKICAgIHdoaWxlICgqc3RyKQogICAgewoJaWYgKCpzdHIgPT0gJy4nICYmIGRpdmlzb3IgPT0gMCkKCXsKCSAgICAvKiBTdGFydCBrZWVwaW5nIGEgZGl2aXNvciwgZm9yIGxhdGVyICovCgkgICAgZGl2aXNvciA9IDE7CgkgICAgY29udGludWU7Cgl9CgoJaWYgKCFpc2RpZ2l0KCpzdHIpKQoJICAgIGJyZWFrOwoKCXBvaW50cyAqPSAxMDsKCXBvaW50cyArPSAqc3RyIC0gJzAnOwoJZGl2aXNvciAqPSAxMDsKCgkrK3N0cjsKICAgIH0KCiAgICBpZiAoZGl2aXNvciA9PSAwKQoJZGl2aXNvciA9IDE7CgogICAgcGl4ZWxzID0gcG9pbnRzL2Rpdmlzb3I7CiAgICAqZW5kID0gc3RyOwogICAgcmV0dXJuIHBpeGVsczsKfQoKI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKLyoKICogRGVsZXRlcyBhbGwgdHJhY2VzIG9mIGFueSBXaW5kb3dzLXN0eWxlIG1uZW1vbmljIHRleHQgKGluY2x1ZGluZyBhbnkKICogcGFyZW50aGVzZXMpIGZyb20gYSBtZW51IGl0ZW0gYW5kIHJldHVybnMgdGhlIGNsZWFuZWQgbWVudSBpdGVtIHRpdGxlLgogKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIHJldHVybmVkIHN0cmluZy4KICovCiAgICBzdGF0aWMgQ0ZTdHJpbmdSZWYKbWVudV90aXRsZV9yZW1vdmluZ19tbmVtb25pYyhtZW51KQogICAgdmltbWVudV9UCSptZW51Owp7CiAgICBDRlN0cmluZ1JlZgkJbmFtZTsKICAgIHNpemVfdAkJbWVudVRpdGxlTGVuOwogICAgQ0ZJbmRleAkJZGlzcGxheUxlbjsKICAgIENGUmFuZ2UJCW1uZW1vbmljU3RhcnQ7CiAgICBDRlJhbmdlCQltbmVtb25pY0VuZDsKICAgIENGTXV0YWJsZVN0cmluZ1JlZgljbGVhbmVkTmFtZTsKCiAgICBtZW51VGl0bGVMZW4gPSBTVFJMRU4obWVudS0+ZG5hbWUpOwogICAgbmFtZSA9IG1hY19lbmNfdG9fY2ZzdHJpbmcobWVudS0+ZG5hbWUsIG1lbnVUaXRsZUxlbik7CgogICAgaWYgKG5hbWUpCiAgICB7CgkvKiBTaW1wbGUgbW5lbW9uaWMtcmVtb3ZhbCBhbGdvcml0aG0sIGFzc3VtZXMgc2luZ2xlIHBhcmVudGhlc2l6ZWQKCSAqIG1uZW1vbmljIGNoYXJhY3RlciB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIG1lbnUgdGV4dCAqLwoJbW5lbW9uaWNTdGFydCA9IENGU3RyaW5nRmluZChuYW1lLCBDRlNUUigiKCIpLCBrQ0ZDb21wYXJlQmFja3dhcmRzKTsKCWRpc3BsYXlMZW4gPSBDRlN0cmluZ0dldExlbmd0aChuYW1lKTsKCglpZiAobW5lbW9uaWNTdGFydC5sb2NhdGlvbiAhPSBrQ0ZOb3RGb3VuZAoJCSYmIChtbmVtb25pY1N0YXJ0LmxvY2F0aW9uICsgMikgPCBkaXNwbGF5TGVuCgkJJiYgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJBdEluZGV4KG5hbWUsCgkJICAgICAgIG1uZW1vbmljU3RhcnQubG9jYXRpb24gKyAxKSA9PSAoVW5pQ2hhciltZW51LT5tbmVtb25pYykKCXsKCSAgICBpZiAoQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMobmFtZSwgQ0ZTVFIoIikiKSwKCQkJQ0ZSYW5nZU1ha2UobW5lbW9uaWNTdGFydC5sb2NhdGlvbiArIDEsCgkJCSAgICBkaXNwbGF5TGVuIC0gbW5lbW9uaWNTdGFydC5sb2NhdGlvbiAtIDEpLAoJCQlrQ0ZDb21wYXJlQmFja3dhcmRzLCAmbW5lbW9uaWNFbmQpICYmCgkJICAgIChtbmVtb25pY1N0YXJ0LmxvY2F0aW9uICsgMikgPT0gbW5lbW9uaWNFbmQubG9jYXRpb24pCgkgICAgewoJCWNsZWFuZWROYW1lID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weShOVUxMLCAwLCBuYW1lKTsKCQlpZiAoY2xlYW5lZE5hbWUpCgkJewoJCSAgICBDRlN0cmluZ0RlbGV0ZShjbGVhbmVkTmFtZSwKCQkJICAgIENGUmFuZ2VNYWtlKG1uZW1vbmljU3RhcnQubG9jYXRpb24sCgkJCQltbmVtb25pY0VuZC5sb2NhdGlvbiArIDEgLQoJCQkJbW5lbW9uaWNTdGFydC5sb2NhdGlvbikpOwoKCQkgICAgQ0ZSZWxlYXNlKG5hbWUpOwoJCSAgICBuYW1lID0gY2xlYW5lZE5hbWU7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICByZXR1cm4gbmFtZTsKfQojZW5kaWYKCi8qCiAqIENvbnZlcnQgYSBsaXN0IG9mIEZTU3BlYyBhbGlhc2VzIGludG8gYSBsaXN0IG9mIGZ1bGxwYXRobmFtZQogKiBjaGFyYWN0ZXIgc3RyaW5ncy4KICovCgpjaGFyX3UgKipuZXdfZm5hbWVzX2Zyb21fQUVEZXNjKEFFRGVzYyAqdGhlTGlzdCwgbG9uZyAqbnVtRmlsZXMsIE9TRXJyICplcnJvcikKewogICAgY2hhcl91CSoqZm5hbWVzID0gTlVMTDsKICAgIE9TRXJyCW5ld0Vycm9yOwogICAgbG9uZwlmaWxlQ291bnQ7CiAgICBGU1NwZWMJZmlsZVRvT3BlbjsKICAgIGxvbmcJYWN0dWFsU2l6ZTsKICAgIEFFS2V5d29yZAlkdW1teUtleXdvcmQ7CiAgICBEZXNjVHlwZQlkdW1teVR5cGU7CgogICAgLyogR2V0IG51bWJlciBvZiBmaWxlcyBpbiBsaXN0ICovCiAgICAqZXJyb3IgPSBBRUNvdW50SXRlbXModGhlTGlzdCwgbnVtRmlsZXMpOwogICAgaWYgKCplcnJvcikKICAgIHsKI2lmZGVmIFVTRV9TSU9VWAoJcHJpbnRmKCJmbmFtZV9mcm9tX0FFRGVzYzogQUVDb3VudEl0ZW1zIGVycm9yOiAlZFxuIiwgZXJyb3IpOwojZW5kaWYKCXJldHVybihmbmFtZXMpOwogICAgfQoKICAgIC8qIEFsbG9jYXRlIHRoZSBwb2ludGVyIGxpc3QgKi8KICAgIGZuYW1lcyA9IChjaGFyX3UgKiopIGFsbG9jKCpudW1GaWxlcyAqIHNpemVvZihjaGFyX3UgKikpOwoKICAgIC8qIEVtcHR5IG91dCB0aGUgbGlzdCAqLwogICAgZm9yIChmaWxlQ291bnQgPSAwOyBmaWxlQ291bnQgPCAqbnVtRmlsZXM7IGZpbGVDb3VudCsrKQoJZm5hbWVzW2ZpbGVDb3VudF0gPSBOVUxMOwoKICAgIC8qIFNjYW4gdGhlIGxpc3Qgb2YgRlNTcGVjICovCiAgICBmb3IgKGZpbGVDb3VudCA9IDE7IGZpbGVDb3VudCA8PSAqbnVtRmlsZXM7IGZpbGVDb3VudCsrKQogICAgewoJLyogR2V0IHRoZSBhbGlhcyBmb3IgdGhlIG50aCBmaWxlLCBjb252ZXJ0IHRvIGFuIEZTU3BlYyAqLwoJbmV3RXJyb3IgPSBBRUdldE50aFB0cih0aGVMaXN0LCBmaWxlQ291bnQsIHR5cGVGU1MsCgkJCQkmZHVtbXlLZXl3b3JkLCAmZHVtbXlUeXBlLAoJCQkJKFB0cikgJmZpbGVUb09wZW4sIHNpemVvZihGU1NwZWMpLCAmYWN0dWFsU2l6ZSk7CglpZiAobmV3RXJyb3IpCgl7CgkgICAgLyogQ2FsbGVyIGlzIGFibGUgdG8gY2xlYW4gdXAgKi8KCSAgICAvKiBUT0RPOiBTaG91bGQgYmUgY2xlYW4gdXAgb3Igbm90PyBGb3Igc2FmZXR5LiAqLwojaWZkZWYgVVNFX1NJT1VYCgkgICAgcHJpbnRmKCJhZXZ0X29kb2M6IEFFR2V0TnRoUHRyIGVycm9yOiAlbGRcbiIsIChsb25nKW5ld0Vycm9yKTsKI2VuZGlmCgkgICAgcmV0dXJuKGZuYW1lcyk7Cgl9CgoJLyogQ29udmVydCB0aGUgRlNTcGVjIHRvIGEgcGF0aG5hbWUgKi8KCWZuYW1lc1tmaWxlQ291bnQgLSAxXSA9IEZ1bGxQYXRoRnJvbUZTU3BlY19zYXZlKGZpbGVUb09wZW4pOwogICAgfQoKICAgIHJldHVybiAoZm5hbWVzKTsKfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvZGVXYXJyaW9yIEV4dGVybmFsIEVkaXRvciBTdXBwb3J0CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2lmZGVmIEZFQVRfQ1dfRURJVE9SCgovKgogKiBIYW5kbGUgdGhlIFdpbmRvdyBTZWFyY2ggZXZlbnQgZnJvbSBDb2RlV2FycmlvcgogKgogKiBEZXNjcmlwdGlvbgogKiAtLS0tLS0tLS0tLQogKgogKiBUaGUgSURFIHNlbmRzIHRoZSBXaW5kb3cgU2VhcmNoIEFwcGxlRXZlbnQgdG8gdGhlIGVkaXRvciB3aGVuIGl0CiAqIG5lZWRzIHRvIGtub3cgd2hldGhlciBhIHBhcnRpY3VsYXIgZmlsZSBpcyBvcGVuIGluIHRoZSBlZGl0b3IuCiAqCiAqIEV2ZW50IFJlcGx5CiAqIC0tLS0tLS0tLS0tCiAqCiAqIE5vbmUuIFB1dCBkYXRhIGluIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZSByZWNlaXZlZC4KICoKICogUmVtYXJrcwogKiAtLS0tLS0tCiAqCiAqIFdoZW4gdGhlIGVkaXRvciByZWNlaXZlcyB0aGlzIGV2ZW50LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkCiAqIGZpbGUgaXMgb3Blbi4gSWYgaXQgaXMsIHJldHVybiB0aGUgbW9kaWZpY2F0aW9uIGRhdGUvdGltZSBmb3IgdGhhdCBmaWxlCiAqIGluIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZS4gSWYgdGhlIGZpbGUgaXMKICogbm90IG9wZW5lZCwgcHV0IHRoZSB2YWx1ZSBmbmZFcnIoZmlsZSBub3QgZm91bmQpIGluIHRoYXQgbG9jYXRpb24uCiAqCiAqLwoKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKI2VuZGlmCnR5cGVkZWYgc3RydWN0IFdpbmRvd1NlYXJjaCBXaW5kb3dTZWFyY2g7CnN0cnVjdCBXaW5kb3dTZWFyY2ggLyogZm9yIGhhbmRsaW5nIGNsYXNzICdLQUhMJywgZXZlbnQgJ1NSQ0gnLCBrZXlEaXJlY3RPYmplY3QgdHlwZUNoYXIqLwp7CiAgICBGU1NwZWMgdGhlRmlsZTsgLy8gaWRlbnRpZmllcyB0aGUgZmlsZQogICAgbG9uZyAqdGhlRGF0ZTsgLy8gd2hlcmUgdG8gcHV0IHRoZSBtb2RpZmljYXRpb24gZGF0ZS90aW1lCn07CiNpZiBkZWZpbmVkKF9fTVdFUktTX18pICAvKiBvbmx5IGluIENvZGV3YXJyaW9yICovCiMgcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKI2VuZGlmCgogICAgcGFzY2FsIE9TRXJyCkhhbmRsZV9LQUhMX1NSQ0hfQUUoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCnsKICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CiAgICBidWZfVAkqYnVmOwogICAgaW50CQlmb3VuZEZpbGUgPSBmYWxzZTsKICAgIERlc2NUeXBlCXR5cGVDb2RlOwogICAgV2luZG93U2VhcmNoIFNlYXJjaERhdGE7CiAgICBTaXplCWFjdHVhbFNpemU7CgogICAgZXJyb3IgPSBBRUdldFBhcmFtUHRyKHRoZUFFdmVudCwga2V5RGlyZWN0T2JqZWN0LCB0eXBlQ2hhciwgJnR5cGVDb2RlLCAoUHRyKSAmU2VhcmNoRGF0YSwgc2l6ZW9mKFdpbmRvd1NlYXJjaCksICZhY3R1YWxTaXplKTsKICAgIGlmIChlcnJvcikKICAgIHsKI2lmZGVmIFVTRV9TSU9VWAoJcHJpbnRmKCJLQUhMX1NSQ0g6IEFFR2V0UGFyYW1QdHIgZXJyb3I6ICVkXG4iLCBlcnJvcik7CiNlbmRpZgoJcmV0dXJuKGVycm9yKTsKICAgIH0KCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9TUkNIOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwKCQkmJiBTZWFyY2hEYXRhLnRoZUZpbGUucGFySUQgPT0gYnVmLT5iX0ZTU3BlYy5wYXJJRAoJCSYmIFNlYXJjaERhdGEudGhlRmlsZS5uYW1lWzBdID09IGJ1Zi0+Yl9GU1NwZWMubmFtZVswXQoJCSYmIFNUUk5DTVAoU2VhcmNoRGF0YS50aGVGaWxlLm5hbWUsIGJ1Zi0+Yl9GU1NwZWMubmFtZSwgYnVmLT5iX0ZTU3BlYy5uYW1lWzBdICsgMSkgPT0gMCkKCSAgICB7CgkJZm91bmRGaWxlID0gdHJ1ZTsKCQlicmVhazsKCSAgICB9CgogICAgaWYgKGZvdW5kRmlsZSA9PSBmYWxzZSkKCSpTZWFyY2hEYXRhLnRoZURhdGUgPSBmbmZFcnI7CiAgICBlbHNlCgkqU2VhcmNoRGF0YS50aGVEYXRlID0gYnVmLT5iX210aW1lOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJLQUhMX1NSQ0g6IGZpbGUgXCIlI3NcIiB7JWR9IiwgU2VhcmNoRGF0YS50aGVGaWxlLm5hbWUsU2VhcmNoRGF0YS50aGVGaWxlLnBhcklEKTsKICAgIGlmIChmb3VuZEZpbGUgPT0gZmFsc2UpCglwcmludGYoIiBOT1QiKTsKICAgIHByaW50ZigiIGZvdW5kLiBbZGF0ZSAlbHgsICVseF1cbiIsICpTZWFyY2hEYXRhLnRoZURhdGUsIGJ1Zi0+Yl9tdGltZV9yZWFkKTsKI2VuZGlmCgogICAgcmV0dXJuIGVycm9yOwp9OwoKLyoKICogSGFuZGxlIHRoZSBNb2RpZmllZCAoZnJvbSBJREUgdG8gRWRpdG9yKSBldmVudCBmcm9tIENvZGVXYXJyaW9yCiAqCiAqIERlc2NyaXB0aW9uCiAqIC0tLS0tLS0tLS0tCiAqCiAqIFRoZSBJREUgc2VuZHMgdGhpcyBldmVudCB0byB0aGUgZXh0ZXJuYWwgZWRpdG9yIHdoZW4gaXQgd2FudHMgdG8KICoga25vdyB3aGljaCBmaWxlcyB0aGF0IGFyZSBvcGVuIGluIHRoZSBlZGl0b3IgaGF2ZSBiZWVuIG1vZGlmaWVkLgogKgogKiBQYXJhbWV0ZXJzICAgTm9uZS4KICogLS0tLS0tLS0tLQogKgogKiBFdmVudCBSZXBseQogKiAtLS0tLS0tLS0tLQogKiBUaGUgcmVwbHkgZm9yIHRoaXMgZXZlbnQgaXM6CiAqCiAqIGtleURpcmVjdE9iamVjdCB0eXBlQUVMaXN0IHJlcXVpcmVkCiAqICBlYWNoIGVsZW1lbnQgaW4gdGhlIGxpc3QgaXMgYSBzdHJ1Y3R1cmUgb2YgdHlwZUNoYXIKICoKICogUmVtYXJrcwogKiAtLS0tLS0tCiAqCiAqIFdoZW4gYnVpbGRpbmcgdGhlIHJlcGx5IGV2ZW50LCBpbmNsdWRlIG9uZSBlbGVtZW50IGluIHRoZSBsaXN0IGZvcgogKiBlYWNoIG9wZW4gZmlsZSB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkLgogKgogKi8KCiNpZiBkZWZpbmVkKF9fTVdFUktTX18pICAvKiBvbmx5IGluIENvZGV3YXJyaW9yICovCiMgcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrCiNlbmRpZgp0eXBlZGVmIHN0cnVjdCBNb2RpZmljYXRpb25JbmZvIE1vZGlmaWNhdGlvbkluZm87CnN0cnVjdCBNb2RpZmljYXRpb25JbmZvIC8qIGZvciByZXBseWluZyB0byBjbGFzcyAnS0FITCcsIGV2ZW50ICdNT0QgJywga2V5RGlyZWN0T2JqZWN0IHR5cGVBRUxpc3QqLwp7CiAgICBGU1NwZWMgdGhlRmlsZTsgLy8gaWRlbnRpZmllcyB0aGUgZmlsZQogICAgbG9uZyB0aGVEYXRlOyAvLyB0aGUgZGF0ZS90aW1lIHRoZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkCiAgICBzaG9ydCBzYXZlZDsgLy8gc2V0IHRoaXMgdG8gemVybyB3aGVuIHJlcGx5aW5nLCB1bnVzZWQKfTsKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAojZW5kaWYKCiAgICBwYXNjYWwgT1NFcnIKSGFuZGxlX0tBSExfTU9EX0FFKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQp7CiAgICBPU0VycgllcnJvciA9IG5vRXJyOwogICAgQUVEZXNjTGlzdAlyZXBseUxpc3Q7CiAgICBsb25nCW51bUZpbGVzOwogICAgTW9kaWZpY2F0aW9uSW5mbyB0aGVGaWxlOwogICAgYnVmX1QJKmJ1ZjsKCiAgICB0aGVGaWxlLnNhdmVkID0gMDsKCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9NT0Q6IEhhbmRsZVVudXNlZFBhcm1zIGVycm9yOiAlZFxuIiwgZXJyb3IpOwojZW5kaWYKCXJldHVybihlcnJvcik7CiAgICB9CgogICAgLyogU2VuZCB0aGUgcmVwbHkgKi8KLyogIHJlcGx5T2JqZWN0LmRlc2NyaXB0b3JUeXBlID0gdHlwZU51bGw7CiAgICByZXBseU9iamVjdC5kYXRhSGFuZGxlICAgICA9IG5pbDsqLwoKLyogQUVDcmVhdGVEZXNjKHR5cGVDaGFyLCAoUHRyKSZ0aXRsZVsxXSwgdGl0bGVbMF0sICZkYXRhKSAqLwogICAgZXJyb3IgPSBBRUNyZWF0ZUxpc3QobmlsLCAwLCBmYWxzZSwgJnJlcGx5TGlzdCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9NT0Q6IEFFQ3JlYXRlTGlzdCBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKI2lmIDAKICAgIGVycm9yID0gQUVDb3VudEl0ZW1zKCZyZXBseUxpc3QsICZudW1GaWxlcyk7CiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiS0FITF9NT0QgUmVwbHlMaXN0OiAleCAleFxuIiwgcmVwbHlMaXN0LmRlc2NyaXB0b3JUeXBlLCByZXBseUxpc3QuZGF0YUhhbmRsZSk7CiAgICBwcmludGYoIktBSExfTU9EIEl0ZW1Jbkxpc3Q6ICVkXG4iLCBudW1GaWxlcyk7CiNlbmRpZgoKICAgIC8qIEFFUHV0S2V5RGVzYygmcmVwbHlMaXN0LCBrZXlBRVBuamVjdCwgJmFEZXNjKQogICAgICogQUVQdXRLZXlQdHIoJnJlcGx5TGlzdCwga2V5QUVQb3NpdGlvbiwgdHlwZUNoYXIsIChQdHIpJnRoZVR5cGUsCiAgICAgKiBzaXplb2YoRGVzY1R5cGUpKQogICAgICovCgogICAgLyogQUVQdXREZXNjICovCiNlbmRpZgoKICAgIG51bUZpbGVzID0gMDsKICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwpCgl7CgkgICAgLyogQWRkIHRoaXMgZmlsZSB0byB0aGUgbGlzdCAqLwoJICAgIHRoZUZpbGUudGhlRmlsZSA9IGJ1Zi0+Yl9GU1NwZWM7CgkgICAgdGhlRmlsZS50aGVEYXRlID0gYnVmLT5iX210aW1lOwovKgkgICAgdGhlRmlsZS50aGVEYXRlID0gdGltZShOVUxMKSAmICh0aW1lX3QpIDB4RkZGRkZGRjA7ICovCgkgICAgZXJyb3IgPSBBRVB1dFB0cigmcmVwbHlMaXN0LCBudW1GaWxlcywgdHlwZUNoYXIsIChQdHIpICZ0aGVGaWxlLCBzaXplb2YodGhlRmlsZSkpOwojaWZkZWYgVVNFX1NJT1VYCgkgICAgaWYgKG51bUZpbGVzID09IDApCgkJcHJpbnRmKCJLQUhMX01PRDogIik7CgkgICAgZWxzZQoJCXByaW50ZigiLCAiKTsKCSAgICBwcmludGYoIlwiJSNzXCIgeyVkfSBbZGF0ZSAlbHgsICVseF0iLCB0aGVGaWxlLnRoZUZpbGUubmFtZSwgdGhlRmlsZS50aGVGaWxlLnBhcklELCB0aGVGaWxlLnRoZURhdGUsIGJ1Zi0+Yl9tdGltZV9yZWFkKTsKCSAgICBpZiAoZXJyb3IpCgkJcHJpbnRmKCIgKCVkKSIsIGVycm9yKTsKCSAgICBudW1GaWxlcysrOwojZW5kaWYKCX07CgojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoIlxuIik7CiNlbmRpZgoKI2lmIDAKICAgIGVycm9yID0gQUVDb3VudEl0ZW1zKCZyZXBseUxpc3QsICZudW1GaWxlcyk7CiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiS0FITF9NT0QgSXRlbUluTGlzdDogJWRcbiIsIG51bUZpbGVzKTsKI2VuZGlmCiNlbmRpZgoKICAgIC8qIFdlIGNhbiBhZGQgZGF0YSBvbmx5IGlmIHNvbWV0aGluZyB0byByZXBseSAqLwogICAgZXJyb3IgPSBBRVB1dFBhcmFtRGVzYyh0aGVSZXBseSwga2V5RGlyZWN0T2JqZWN0LCAmcmVwbHlMaXN0KTsKCiNpZmRlZiBVU0VfU0lPVVgKICAgIGlmIChlcnJvcikKCXByaW50ZigiS0FITF9NT0Q6IEFFUHV0UGFyYW1EZXNjIGVycm9yOiAlZFxuIiwgZXJyb3IpOwojZW5kaWYKCiAgICBpZiAocmVwbHlMaXN0LmRhdGFIYW5kbGUpCglBRURpc3Bvc2VEZXNjKCZyZXBseUxpc3QpOwoKICAgIHJldHVybiBlcnJvcjsKfTsKCi8qCiAqIEhhbmRsZSB0aGUgR2V0IFRleHQgZXZlbnQgZnJvbSBDb2RlV2FycmlvcgogKgogKiBEZXNjcmlwdGlvbgogKiAtLS0tLS0tLS0tLQogKgogKiBUaGUgSURFIHNlbmRzIHRoZSBHZXQgVGV4dCBBcHBsZUV2ZW50IHRvIHRoZSBlZGl0b3Igd2hlbiBpdCBuZWVkcwogKiB0aGUgc291cmNlIGNvZGUgZnJvbSBhIGZpbGUuIEZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyIGlzc3VlcyBhCiAqIENoZWNrIFN5bnRheCBvciBDb21waWxlIGNvbW1hbmQsIHRoZSBjb21waWxlciBuZWVkcyBhY2Nlc3MgdG8KICogdGhlIHNvdXJjZSBjb2RlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZS4KICoKICogRXZlbnQgUmVwbHkKICogLS0tLS0tLS0tLS0KICoKICogTm9uZS4gUHV0IGRhdGEgaW4gbG9jYXRpb25zIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0dXJlIHJlY2VpdmVkLgogKgogKiBSZW1hcmtzCiAqIC0tLS0tLS0KICoKICogV2hlbiB0aGUgZWRpdG9yIHJlY2VpdmVzIHRoaXMgZXZlbnQsIGl0IG11c3Qgc2V0IHRoZSBzaXplIG9mIHRoZSBoYW5kbGUKICogaW4gdGhlVGV4dCB0byBmaXQgdGhlIGRhdGEgaW4gdGhlIGZpbGUuIEl0IG11c3QgdGhlbiBjb3B5IHRoZSBlbnRpcmUKICogY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gdGhlIG1lbW9yeSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4KICogdGhlVGV4dC4KICoKICovCgojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4awojZW5kaWYKdHlwZWRlZiBzdHJ1Y3QgQ1dfR2V0VGV4dCBDV19HZXRUZXh0OwpzdHJ1Y3QgQ1dfR2V0VGV4dCAvKiBmb3IgaGFuZGxpbmcgY2xhc3MgJ0tBSEwnLCBldmVudCAnR1RUWCcsIGtleURpcmVjdE9iamVjdCB0eXBlQ2hhciovCnsKICAgIEZTU3BlYyB0aGVGaWxlOyAvKiBpZGVudGlmaWVzIHRoZSBmaWxlICovCiAgICBIYW5kbGUgdGhlVGV4dDsgLyogdGhlIGxvY2F0aW9uIHdoZXJlIHlvdSByZXR1cm4gdGhlIHRleHQgKG11c3QgYmUgcmVzaXplZCBwcm9wZXJseSkgKi8KICAgIGxvbmcgKnVudXNlZDsgICAvKiAwIChub3QgdXNlZCkgKi8KICAgIGxvbmcgKnRoZURhdGU7ICAvKiB3aGVyZSB0byBwdXQgdGhlIG1vZGlmaWNhdGlvbiBkYXRlL3RpbWUgKi8KfTsKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAojZW5kaWYKCiAgICBwYXNjYWwgT1NFcnIKSGFuZGxlX0tBSExfR1RUWF9BRShjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbikKewogICAgT1NFcnIJZXJyb3IgPSBub0VycjsKICAgIGJ1Zl9UCSpidWY7CiAgICBpbnQJCWZvdW5kRmlsZSA9IGZhbHNlOwogICAgRGVzY1R5cGUJdHlwZUNvZGU7CiAgICBDV19HZXRUZXh0CUdldFRleHREYXRhOwogICAgU2l6ZQlhY3R1YWxTaXplOwogICAgY2hhcl91CSpsaW5lOwogICAgY2hhcl91CSpmdWxsYnVmZmVyID0gTlVMTDsKICAgIGxvbmcJbGluZXNpemU7CiAgICBsb25nCWxpbmVTdGFydDsKICAgIGxvbmcJQnVmZmVyU2l6ZTsKICAgIGxvbmcJbGluZW5vOwoKICAgIGVycm9yID0gQUVHZXRQYXJhbVB0cih0aGVBRXZlbnQsIGtleURpcmVjdE9iamVjdCwgdHlwZUNoYXIsICZ0eXBlQ29kZSwgKFB0cikgJkdldFRleHREYXRhLCBzaXplb2YoR2V0VGV4dERhdGEpLCAmYWN0dWFsU2l6ZSk7CgogICAgaWYgKGVycm9yKQogICAgewojaWZkZWYgVVNFX1NJT1VYCglwcmludGYoIktBSExfR1RUWDogQUVHZXRQYXJhbVB0ciBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKCWlmIChidWYtPmJfbWwubWxfbWZwICE9IE5VTEwpCgkgICAgaWYgKEdldFRleHREYXRhLnRoZUZpbGUucGFySUQgPT0gYnVmLT5iX0ZTU3BlYy5wYXJJRCkKCSAgICB7CgkJZm91bmRGaWxlID0gdHJ1ZTsKCQlicmVhazsKCSAgICB9CgogICAgaWYgKGZvdW5kRmlsZSkKICAgIHsKCUJ1ZmZlclNpemUgPSAwOyAvKiBHZXRIYW5kbGVTaXplKEdldFRleHREYXRhLnRoZVRleHQpOyAqLwoJZm9yIChsaW5lbm8gPSAwOyBsaW5lbm8gPD0gYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7IGxpbmVubysrKQoJewoJICAgIC8qIE11c3QgdXNlIHRoZSByaWdodCBidWZmZXIgKi8KCSAgICBsaW5lID0gbWxfZ2V0X2J1ZihidWYsIChsaW5lbnJfVCkgbGluZW5vLCBGQUxTRSk7CgkgICAgbGluZXNpemUgPSBTVFJMRU4obGluZSkgKyAxOwoJICAgIGxpbmVTdGFydCA9IEJ1ZmZlclNpemU7CgkgICAgQnVmZmVyU2l6ZSArPSBsaW5lc2l6ZTsKCSAgICAvKiBSZXNpemUgaGFuZGxlIHRvIGxpbmVzaXplKzEgdG8gaW5jbHVkZSB0aGUgbGluZWZlZWQgKi8KCSAgICBTZXRIYW5kbGVTaXplKEdldFRleHREYXRhLnRoZVRleHQsIEJ1ZmZlclNpemUpOwoJICAgIGlmIChHZXRIYW5kbGVTaXplKEdldFRleHREYXRhLnRoZVRleHQpICE9IEJ1ZmZlclNpemUpCgkgICAgewoJI2lmZGVmIFVTRV9TSU9VWAoJCXByaW50ZigiS0FITF9HVFRYOiBTZXRIYW5kbGVTaXplIGluY3JlYXNlOiAlZCwgc2l6ZSAlZFxuIiwKCQkJbGluZXNpemUsIEJ1ZmZlclNpemUpOwoJI2VuZGlmCgkJYnJlYWs7IC8qIFNpbXBsZSBoYW5kbGluZyBmb3Igbm93ICovCgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJSExvY2soR2V0VGV4dERhdGEudGhlVGV4dCk7CgkJZnVsbGJ1ZmZlciA9IChjaGFyX3UgKikgKkdldFRleHREYXRhLnRoZVRleHQ7CgkJU1RSQ1BZKChjaGFyX3UgKikoZnVsbGJ1ZmZlciArIGxpbmVTdGFydCksIGxpbmUpOwoJCWZ1bGxidWZmZXJbQnVmZmVyU2l6ZS0xXSA9ICdccic7CgkJSFVubG9jayhHZXRUZXh0RGF0YS50aGVUZXh0KTsKCSAgICB9Cgl9CglpZiAoZnVsbGJ1ZmZlciAhPSBOVUxMKQoJewoJICAgIEhMb2NrKEdldFRleHREYXRhLnRoZVRleHQpOwoJICAgIGZ1bGxidWZmZXJbQnVmZmVyU2l6ZS0xXSA9IDA7CgkgICAgSFVubG9jayhHZXRUZXh0RGF0YS50aGVUZXh0KTsKCX0KCWlmIChmb3VuZEZpbGUgPT0gZmFsc2UpCgkgICAgKkdldFRleHREYXRhLnRoZURhdGUgPSBmbmZFcnI7CgllbHNlCi8qCSAgICAqR2V0VGV4dERhdGEudGhlRGF0ZSA9IHRpbWUoTlVMTCkgJiAodGltZV90KSAweEZGRkZGRkYwOyovCgkgICAgKkdldFRleHREYXRhLnRoZURhdGUgPSBidWYtPmJfbXRpbWU7CiAgICB9CiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiS0FITF9HVFRYOiBmaWxlIFwiJSNzXCIgeyVkfSBbZGF0ZSAlbHgsICVseF0iLCBHZXRUZXh0RGF0YS50aGVGaWxlLm5hbWUsIEdldFRleHREYXRhLnRoZUZpbGUucGFySUQsICpHZXRUZXh0RGF0YS50aGVEYXRlLCBidWYtPmJfbXRpbWVfcmVhZCk7CiAgICBpZiAoZm91bmRGaWxlID09IGZhbHNlKQoJcHJpbnRmKCIgTk9UIik7CiAgICBwcmludGYoIiBmb3VuZC4gKEJ1ZmZlclNpemUgPSAlZClcbiIsIEJ1ZmZlclNpemUpOwojZW5kaWYKCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiS0FITF9HVFRYOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWRcbiIsIGVycm9yKTsKI2VuZGlmCglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIHJldHVybihlcnJvcik7Cn0KCi8qCiAqCiAqLwoKLyogVGFrZW4gZnJvbSBNb3JlQXBwbGVFdmVudHM6UHJvY2Vzc0hlbHBlcnMqLwpwYXNjYWwJT1NFcnIJRmluZFByb2Nlc3NCeVNpZ25hdHVyZShjb25zdCBPU1R5cGUgdGFyZ2V0VHlwZSwKCQkJCQljb25zdCBPU1R5cGUgdGFyZ2V0Q3JlYXRvciwKCQkJCQkgICAgICBQcm9jZXNzU2VyaWFsTnVtYmVyUHRyIHBzblB0cikKewogICAgT1NFcnIJYW5FcnIgPSBub0VycjsKICAgIEJvb2xlYW4JbG9va2luZ0ZvclByb2Nlc3MgPSB0cnVlOwoKICAgIFByb2Nlc3NJbmZvUmVjICBpbmZvUmVjOwoKICAgIGluZm9SZWMucHJvY2Vzc0luZm9MZW5ndGggPSBzaXplb2YoUHJvY2Vzc0luZm9SZWMpOwogICAgaW5mb1JlYy5wcm9jZXNzTmFtZSA9IG5pbDsKICAgIGluZm9SZWMucHJvY2Vzc0FwcFNwZWMgPSBuaWw7CgogICAgcHNuUHRyLT5sb3dMb25nT2ZQU04gPSBrTm9Qcm9jZXNzOwogICAgcHNuUHRyLT5oaWdoTG9uZ09mUFNOID0ga05vUHJvY2VzczsKCiAgICB3aGlsZSAobG9va2luZ0ZvclByb2Nlc3MpCiAgICB7CglhbkVyciA9IEdldE5leHRQcm9jZXNzKHBzblB0cik7CglpZiAoYW5FcnIgIT0gbm9FcnIpCgkgICAgbG9va2luZ0ZvclByb2Nlc3MgPSBmYWxzZTsKCWVsc2UKCXsKCSAgICBhbkVyciA9IEdldFByb2Nlc3NJbmZvcm1hdGlvbihwc25QdHIsICZpbmZvUmVjKTsKCSAgICBpZiAoKGFuRXJyID09IG5vRXJyKQoJCSAgICAmJiAoaW5mb1JlYy5wcm9jZXNzVHlwZSA9PSB0YXJnZXRUeXBlKQoJCSAgICAmJiAoaW5mb1JlYy5wcm9jZXNzU2lnbmF0dXJlID09IHRhcmdldENyZWF0b3IpKQoJCWxvb2tpbmdGb3JQcm9jZXNzID0gZmFsc2U7Cgl9CiAgICB9CgogICAgcmV0dXJuIGFuRXJyOwp9Ly9lbmQgRmluZFByb2Nlc3NCeVNpZ25hdHVyZQoKICAgIHZvaWQKU2VuZF9LQUhMX01PRF9BRShidWZfVCAqYnVmKQp7CiAgICBPU0VycglhbkVyciA9IG5vRXJyOwogICAgQUVEZXNjCXRhcmdldEFwcERlc2MgPSB7IHR5cGVOdWxsLCBuaWwgfTsKICAgIFByb2Nlc3NTZXJpYWxOdW1iZXIJICAgIHBzbiA9IHsga05vUHJvY2Vzcywga05vUHJvY2VzcyB9OwogICAgQXBwbGVFdmVudAl0aGVSZXBseSA9IHsgdHlwZU51bGwsIG5pbCB9OwogICAgQUVTZW5kTW9kZQlzZW5kTW9kZTsKICAgIEFwcGxlRXZlbnQgIHRoZUV2ZW50ID0ge3R5cGVOdWxsLCBuaWwgfTsKICAgIEFFSWRsZVVQUCAgIGlkbGVQcm9jVVBQID0gbmlsOwogICAgTW9kaWZpY2F0aW9uSW5mbyBNb2REYXRhOwoKCiAgICBhbkVyciA9IEZpbmRQcm9jZXNzQnlTaWduYXR1cmUoJ0FQUEwnLCAnQ1dJRScsICZwc24pOwojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoIkNvZGVXYXJyaW9yIGlzIik7CiAgICBpZiAoYW5FcnIgIT0gbm9FcnIpCglwcmludGYoIiBOT1QiKTsKICAgIHByaW50ZigiIHJ1bm5pbmdcbiIpOwojZW5kaWYKICAgIGlmIChhbkVyciA9PSBub0VycikKICAgIHsKCWFuRXJyID0gQUVDcmVhdGVEZXNjKHR5cGVQcm9jZXNzU2VyaWFsTnVtYmVyLCAmcHNuLAoJCQkgICAgICBzaXplb2YoUHJvY2Vzc1NlcmlhbE51bWJlciksICZ0YXJnZXRBcHBEZXNjKTsKCglpZiAoYW5FcnIgPT0gbm9FcnIpCgl7CgkgICAgYW5FcnIgPSBBRUNyZWF0ZUFwcGxlRXZlbnQoICdLQUhMJywgJ01PRCAnLCAmdGFyZ2V0QXBwRGVzYywKCQkJCQlrQXV0b0dlbmVyYXRlUmV0dXJuSUQsIGtBbnlUcmFuc2FjdGlvbklELCAmdGhlRXZlbnQpOwoJfQoKCUFFRGlzcG9zZURlc2MoJnRhcmdldEFwcERlc2MpOwoKCS8qIEFkZCB0aGUgcGFybXMgKi8KCU1vZERhdGEudGhlRmlsZSA9IGJ1Zi0+Yl9GU1NwZWM7CglNb2REYXRhLnRoZURhdGUgPSBidWYtPmJfbXRpbWU7CgoJaWYgKGFuRXJyID09IG5vRXJyKQoJICAgIGFuRXJyID0gQUVQdXRQYXJhbVB0cigmdGhlRXZlbnQsIGtleURpcmVjdE9iamVjdCwgdHlwZUNoYXIsICZNb2REYXRhLCBzaXplb2YoTW9kRGF0YSkpOwoKCWlmIChpZGxlUHJvY1VQUCA9PSBuaWwpCgkgICAgc2VuZE1vZGUgPSBrQUVOb1JlcGx5OwoJZWxzZQoJICAgIHNlbmRNb2RlID0ga0FFV2FpdFJlcGx5OwoKCWlmIChhbkVyciA9PSBub0VycikKCSAgICBhbkVyciA9IEFFU2VuZCgmdGhlRXZlbnQsICZ0aGVSZXBseSwgc2VuZE1vZGUsIGtBRU5vcm1hbFByaW9yaXR5LCBrTm9UaW1lT3V0LCBpZGxlUHJvY1VQUCwgbmlsKTsKCWlmIChhbkVyciA9PSBub0VyciAgJiYgIHNlbmRNb2RlID09IGtBRVdhaXRSZXBseSkKCXsKI2lmZGVmIFVTRV9TSU9VWAoJICAgIHByaW50ZigiS0FITF9NT0Q6IFNlbmQgZXJyb3I6ICVkXG4iLCBhbkVycik7CiNlbmRpZgovKgkgICAgYW5FcnIgPSAgQUVIR2V0SGFuZGxlckVycm9yKCZ0aGVSZXBseSk7Ki8KCX0KCSh2b2lkKSBBRURpc3Bvc2VEZXNjKCZ0aGVSZXBseSk7CiAgICB9Cn0KI2VuZGlmIC8qIEZFQVRfQ1dfRURJVE9SICovCgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogQXBwbGUgRXZlbnQgSGFuZGxpbmcgcHJvY2VkdXJlCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KI2lmZGVmIFVTRV9BRVZFTlQKCi8qCiAqIEhhbmRsZSB0aGUgVW51c2VkIHBhcm1zIG9mIGFuIEFwcGxlRXZlbnQKICovCgogICAgT1NFcnIKSGFuZGxlVW51c2VkUGFybXMoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50KQp7CiAgICBPU0VycgllcnJvcjsKICAgIGxvbmcJYWN0dWFsU2l6ZTsKICAgIERlc2NUeXBlCWR1bW15VHlwZTsKICAgIEFFS2V5d29yZAltaXNzZWRLZXl3b3JkOwoKICAgIC8qIEdldCB0aGUgIm1pc3NlZCBrZXl3b3JkIiBhdHRyaWJ1dGUgZnJvbSB0aGUgQXBwbGVFdmVudC4gKi8KICAgIGVycm9yID0gQUVHZXRBdHRyaWJ1dGVQdHIodGhlQUV2ZW50LCBrZXlNaXNzZWRLZXl3b3JkQXR0ciwKCQkJICAgICAgdHlwZUtleXdvcmQsICZkdW1teVR5cGUsCgkJCSAgICAgIChQdHIpJm1pc3NlZEtleXdvcmQsIHNpemVvZihtaXNzZWRLZXl3b3JkKSwKCQkJICAgICAgJmFjdHVhbFNpemUpOwoKICAgIC8qIElmIHRoZSBkZXNjcmlwdG9yIGlzbid0IGZvdW5kLCB0aGVuIHdlIGdvdCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycy4gKi8KICAgIGlmIChlcnJvciA9PSBlcnJBRURlc2NOb3RGb3VuZCkKICAgIHsKCWVycm9yID0gbm9FcnI7CiAgICB9CiAgICBlbHNlCiAgICB7CiNpZiAwCgkvKiBXaHkgaXMgdGhpcyByZW1vdmVkPyAqLwoJZXJyb3IgPSBlcnJBRUV2ZW50Tm90SGFuZGxlZDsKI2VuZGlmCiAgICB9CgogICAgcmV0dXJuIGVycm9yOwp9CgoKLyoKICogSGFuZGxlIHRoZSBPRG9jIEFwcGxlRXZlbnQKICoKICogRGVhbHMgd2l0aCBhbGwgZmlsZXMgZHJhZ2dlZCB0byB0aGUgYXBwbGljYXRpb24gaWNvbi4KICoKICovCgojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4awojZW5kaWYKdHlwZWRlZiBzdHJ1Y3QgU2VsZWN0aW9uUmFuZ2UgU2VsZWN0aW9uUmFuZ2U7CnN0cnVjdCBTZWxlY3Rpb25SYW5nZSAvKiBmb3IgaGFuZGxpbmcga0NvcmVDbGFzc0V2ZW50OmtPcGVuRG9jdW1lbnRzOmtleUFFUG9zaXRpb24gdHlwZUNoYXIgKi8KewogICAgc2hvcnQgdW51c2VkMTsgLy8gMCAobm90IHVzZWQpCiAgICBzaG9ydCBsaW5lTnVtOyAvLyBsaW5lIHRvIHNlbGVjdCAoPDAgdG8gc3BlY2lmeSByYW5nZSkKICAgIGxvbmcgc3RhcnRSYW5nZTsgLy8gc3RhcnQgb2Ygc2VsZWN0aW9uIHJhbmdlIChpZiBsaW5lIDwgMCkKICAgIGxvbmcgZW5kUmFuZ2U7IC8vIGVuZCBvZiBzZWxlY3Rpb24gcmFuZ2UgKGlmIGxpbmUgPCAwKQogICAgbG9uZyB1bnVzZWQyOyAvLyAwIChub3QgdXNlZCkKICAgIGxvbmcgdGhlRGF0ZTsgLy8gbW9kaWZpY2F0aW9uIGRhdGUvdGltZQp9OwojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBvcHRpb25zIGFsaWduPXJlc2V0CiNlbmRpZgoKLyogVGhlIElERSB1c2VzIHRoZSBvcHRpb25hbCBrZXlBRVBvc2l0aW9uIHBhcmFtZXRlciB0byB0ZWxsIHRoZSBlZC0KICAgaXRvciB0aGUgc2VsZWN0aW9uIHJhbmdlLiBJZiBsaW5lTnVtIGlzIHplcm8gb3IgZ3JlYXRlciwgc2Nyb2xsIHRoZSB0ZXh0CiAgIHRvIHRoZSBzcGVjaWZpZWQgbGluZS4gSWYgbGluZU51bSBpcyBsZXNzIHRoYW4gemVybywgdXNlIHRoZSB2YWx1ZXMgaW4KICAgc3RhcnRSYW5nZSBhbmQgZW5kUmFuZ2UgdG8gc2VsZWN0IHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycy4gU2Nyb2xsCiAgIHRoZSB0ZXh0IHRvIGRpc3BsYXkgdGhlIHNlbGVjdGlvbi4gSWYgbGluZU51bSwgc3RhcnRSYW5nZSwgYW5kCiAgIGVuZFJhbmdlIGFyZSBhbGwgbmVnYXRpdmUsIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiByYW5nZSBzcGVjaWZpZWQuCiAqLwoKICAgIHBhc2NhbCBPU0VycgpIYW5kbGVPRG9jQUUoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCnsKICAgIC8qCiAgICAgKiBUT0RPOiBDbGVhbiB1cCB0aGUgY29kZSB3aXRoIGNvbnZlcnQgdGhlIEFwcGxlRXZlbnQgaW50bwogICAgICogICAgICAgYSAiOmFyZ3MiCiAgICAgKi8KICAgIE9TRXJyCWVycm9yID0gbm9FcnI7Ci8vICAgIE9TRXJyCWZpcnN0RXJyb3IgPSBub0VycjsKLy8gICAgc2hvcnQJbnVtRXJyb3JzID0gMDsKICAgIEFFRGVzYwl0aGVMaXN0OwogICAgRGVzY1R5cGUJdHlwZUNvZGU7CiAgICBsb25nCW51bUZpbGVzOwogLy8gICBsb25nCSBmaWxlQ291bnQ7CiAgICBjaGFyX3UJKipmbmFtZXM7Ci8vICAgIGNoYXJfdQlmbmFtZVsyNTZdOwogICAgU2l6ZQlhY3R1YWxTaXplOwogICAgU2VsZWN0aW9uUmFuZ2UgdGhlUG9zaXRpb247CiAgICBzaG9ydAlnb3RQb3NpdGlvbiA9IGZhbHNlOwogICAgbG9uZwlsbnVtOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJhZXZ0X29kb2M6XG4iKTsKI2VuZGlmCgogICAgLyogdGhlIGRpcmVjdCBvYmplY3QgcGFyYW1ldGVyIGlzIHRoZSBsaXN0IG9mIGFsaWFzZXMgdG8gZmlsZXMgKG9uZSBvciBtb3JlKSAqLwogICAgZXJyb3IgPSBBRUdldFBhcmFtRGVzYyh0aGVBRXZlbnQsIGtleURpcmVjdE9iamVjdCwgdHlwZUFFTGlzdCwgJnRoZUxpc3QpOwogICAgaWYgKGVycm9yKQogICAgewojaWZkZWYgVVNFX1NJT1VYCglwcmludGYoImFldnRfb2RvYzogQUVHZXRQYXJhbURlc2MgZXJyb3I6ICVsZFxuIiwgKGxvbmcpZXJyb3IpOwojZW5kaWYKCXJldHVybihlcnJvcik7CiAgICB9CgoKICAgIGVycm9yID0gQUVHZXRQYXJhbVB0cih0aGVBRXZlbnQsIGtleUFFUG9zaXRpb24sIHR5cGVDaGFyLCAmdHlwZUNvZGUsIChQdHIpICZ0aGVQb3NpdGlvbiwgc2l6ZW9mKFNlbGVjdGlvblJhbmdlKSwgJmFjdHVhbFNpemUpOwogICAgaWYgKGVycm9yID09IG5vRXJyKQoJZ290UG9zaXRpb24gPSB0cnVlOwogICAgaWYgKGVycm9yID09IGVyckFFRGVzY05vdEZvdW5kKQoJZXJyb3IgPSBub0VycjsKICAgIGlmIChlcnJvcikKICAgIHsKI2lmZGVmIFVTRV9TSU9VWAoJcHJpbnRmKCJhZXZ0X29kb2M6IEFFR2V0UGFyYW1QdHIgZXJyb3I6ICVsZFxuIiwgKGxvbmcpZXJyb3IpOwojZW5kaWYKCXJldHVybihlcnJvcik7CiAgICB9CgojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoImFldnRfb2RvYzogbGluZU51bTogJWQsIHN0YXJ0UmFuZ2UgJWxkLCBlbmRSYW5nZSAlbGQsIFtkYXRlICVseF1cbiIsCgkgICAgKGludCl0aGVQb3NpdGlvbi5saW5lTnVtLAoJICAgIChsb25nKXRoZVBvc2l0aW9uLnN0YXJ0UmFuZ2UsIChsb25nKXRoZVBvc2l0aW9uLmVuZFJhbmdlLAoJICAgIChsb25nKXRoZVBvc2l0aW9uLnRoZURhdGUpOwojZW5kaWYKLyoKICAgIGVycm9yID0gQUVHZXRQYXJhbURlc2ModGhlQUV2ZW50LCBrZXlBRVBvc2l0aW9uLCB0eXBlQ2hhciwgJnRoZVBvc2l0aW9uKTsKCiAgICBpZiAoXmVycm9yKSB0aGVuCiAgICB7CglpZiAodGhlUG9zaXRpb24ubGluZU51bSA+PSAwKQoJewoJICAvLyBHb3RvIHRoaXMgbGluZQoJfQoJZWxzZQoJewoJICAvLyBTZXQgdGhlIHJhbmdlIGNoYXIgd2lzZQoJfQogICAgfQogKi8KCgojaWZkZWYgRkVBVF9WSVNVQUwKICAgIHJlc2V0X1ZJc3VhbCgpOwojZW5kaWYKCiAgICBmbmFtZXMgPSBuZXdfZm5hbWVzX2Zyb21fQUVEZXNjKCZ0aGVMaXN0LCAmbnVtRmlsZXMsICZlcnJvcik7CgogICAgaWYgKGVycm9yKQogICAgewogICAgICAvKiBUT0RPOiBlbXB0eSBmbmFtZXNbXSBmaXJzdCAqLwogICAgICB2aW1fZnJlZShmbmFtZXMpOwogICAgICByZXR1cm4gKGVycm9yKTsKICAgIH0KCiAgICBpZiAoc3RhcnRpbmcgPiAwKQogICAgewoJaW50IGk7CgljaGFyX3UgKnA7CgoJLyogdGhlc2UgYXJlIHRoZSBpbml0aWFsIGZpbGVzIGRyb3BwZWQgb24gdGhlIFZpbSBpY29uICovCglmb3IgKGkgPSAwIDsgaSA8IG51bUZpbGVzOyBpKyspCgl7CgkgICAgaWYgKGdhX2dyb3coJmdsb2JhbF9hbGlzdC5hbF9nYSwgMSkgPT0gRkFJTAoJCQkJICAgICAgfHwgKHAgPSB2aW1fc3Ryc2F2ZShmbmFtZXNbaV0pKSA9PSBOVUxMKQoJCW1jaF9leGl0KDIpOwoJICAgIGVsc2UKCQlhbGlzdF9hZGQoJmdsb2JhbF9hbGlzdCwgcCwgMik7Cgl9Cglnb3RvIGZpbmlzaGVkOwogICAgfQoKICAgIC8qIEhhbmRsZSB0aGUgZHJvcCwgOmVkaXQgdG8gZ2V0IHRvIHRoZSBmaWxlICovCiAgICBoYW5kbGVfZHJvcChudW1GaWxlcywgZm5hbWVzLCBGQUxTRSk7CgogICAgLyogVE9ETzogSGFuZGxlIHRoZSBnb3RvL3NlbGVjdCBsaW5lIG1vcmUgY2xlYW5seSAqLwogICAgaWYgKChudW1GaWxlcyA9PSAxKSAmIChnb3RQb3NpdGlvbikpCiAgICB7CglpZiAodGhlUG9zaXRpb24ubGluZU51bSA+PSAwKQoJewoJICAgIGxudW0gPSB0aGVQb3NpdGlvbi5saW5lTnVtICsgMTsKCS8qICBvYXAtPm1vdGlvbl90eXBlID0gTUxJTkU7CgkgICAgc2V0cGNtYXJrKCk7Ki8KCSAgICBpZiAobG51bSA8IDFMKQoJCWxudW0gPSAxTDsKCSAgICBlbHNlIGlmIChsbnVtID4gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQpCgkJbG51bSA9IGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50OwoJICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IGxudW07CgkgICAgY3Vyd2luLT53X2N1cnNvci5jb2wgPSAwOwoJLyogIGJlZ2lubGluZShCTF9TT0wgfCBCTF9GSVgpOyovCgl9CgllbHNlCgkgICAgZ290b19ieXRlKHRoZVBvc2l0aW9uLnN0YXJ0UmFuZ2UgKyAxKTsKICAgIH0KCiAgICAvKiBVcGRhdGUgdGhlIHNjcmVlbiBkaXNwbGF5ICovCiAgICB1cGRhdGVfc2NyZWVuKE5PVF9WQUxJRCk7CiNpZmRlZiBGRUFUX1ZJU1VBTAogICAgLyogU2VsZWN0IHRoZSB0ZXh0IGlmIHBvc3NpYmxlICovCiAgICBpZiAoZ290UG9zaXRpb24pCiAgICB7CglWSXN1YWxfYWN0aXZlID0gVFJVRTsKCVZJc3VhbF9zZWxlY3QgPSBGQUxTRTsKCVZJc3VhbCA9IGN1cndpbi0+d19jdXJzb3I7CglpZiAodGhlUG9zaXRpb24ubGluZU51bSA8IDApCgl7CgkgICAgVklzdWFsX21vZGUgPSAndic7CgkgICAgZ290b19ieXRlKHRoZVBvc2l0aW9uLmVuZFJhbmdlKTsKCX0KCWVsc2UKCXsKCSAgICBWSXN1YWxfbW9kZSA9ICdWJzsKCSAgICBWSXN1YWwuY29sID0gMDsKCX0KICAgIH0KI2VuZGlmCiAgICBzZXRjdXJzb3IoKTsKICAgIG91dF9mbHVzaCgpOwoKICAgIC8qIEZha2UgbW91c2UgZXZlbnQgdG8gd2FrZSBmcm9tIHN0YWxsICovCiAgICBQb3N0RXZlbnQobW91c2VVcCwgMCk7CgogIGZpbmlzaGVkOgogICAgQUVEaXNwb3NlRGVzYygmdGhlTGlzdCk7IC8qIGRpc3Bvc2Ugd2hhdCB3ZSBhbGxvY2F0ZWQgKi8KCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CiNpZmRlZiBVU0VfU0lPVVgKCXByaW50ZigiYWV2dF9vZG9jOiBIYW5kbGVVbnVzZWRQYXJtcyBlcnJvcjogJWxkXG4iLCAobG9uZyllcnJvcik7CiNlbmRpZgoJcmV0dXJuKGVycm9yKTsKICAgIH0KICAgIHJldHVybihlcnJvcik7Cn0KCi8qCiAqCiAqLwoKICAgIHBhc2NhbCBPU0VycgpIYW5kbGVfYWV2dF9vYXBwX0FFKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQp7CiAgICBPU0VycgllcnJvciA9IG5vRXJyOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJhZXZ0X29hcHA6XG4iKTsKI2VuZGlmCgogICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyh0aGVBRXZlbnQpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuKGVycm9yKTsKICAgIH0KCiAgICByZXR1cm4oZXJyb3IpOwp9CgovKgogKgogKi8KCiAgICBwYXNjYWwgT1NFcnIKSGFuZGxlX2FldnRfcXVpdF9BRShjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQsIEFwcGxlRXZlbnQgKnRoZVJlcGx5LCBsb25nIHJlZkNvbikKewogICAgT1NFcnIJZXJyb3IgPSBub0VycjsKCiNpZmRlZiBVU0VfU0lPVVgKICAgIHByaW50ZigiYWV2dF9xdWl0XG4iKTsKI2VuZGlmCgogICAgZXJyb3IgPSBIYW5kbGVVbnVzZWRQYXJtcyh0aGVBRXZlbnQpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuKGVycm9yKTsKICAgIH0KCiAgICAvKiBOZWVkIHRvIGZha2UgYSA6Y29uZmlybSBxYSAqLwogICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJjb25maXJtIHFhIik7CgogICAgcmV0dXJuKGVycm9yKTsKfQoKLyoKICoKICovCgogICAgcGFzY2FsIE9TRXJyCkhhbmRsZV9hZXZ0X3Bkb2NfQUUoY29uc3QgQXBwbGVFdmVudCAqdGhlQUV2ZW50LCBBcHBsZUV2ZW50ICp0aGVSZXBseSwgbG9uZyByZWZDb24pCnsKICAgIE9TRXJyCWVycm9yID0gbm9FcnI7CgojaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoImFldnRfcGRvYzpcbiIpOwojZW5kaWYKCiAgICBlcnJvciA9IEhhbmRsZVVudXNlZFBhcm1zKHRoZUFFdmVudCk7CiAgICBpZiAoZXJyb3IpCiAgICB7CglyZXR1cm4oZXJyb3IpOwogICAgfQoKICAgIHJldHVybihlcnJvcik7Cn0KCi8qCiAqIEhhbmRsaW5nIG9mIHVua25vd24gQXBwbGVFdmVudAogKgogKiAoSnVzdCBnZXQgcmlkIG9mIGFsbCB0aGUgcGFybXMpCiAqLwogICAgcGFzY2FsIE9TRXJyCkhhbmRsZV91bmtub3duX0FFKGNvbnN0IEFwcGxlRXZlbnQgKnRoZUFFdmVudCwgQXBwbGVFdmVudCAqdGhlUmVwbHksIGxvbmcgcmVmQ29uKQp7CiAgICBPU0VycgllcnJvciA9IG5vRXJyOwoKI2lmZGVmIFVTRV9TSU9VWAogICAgcHJpbnRmKCJVbmtub3duIEV2ZW50OiAleFxuIiwgdGhlQUV2ZW50LT5kZXNjcmlwdG9yVHlwZSk7CiNlbmRpZgoKICAgIGVycm9yID0gSGFuZGxlVW51c2VkUGFybXModGhlQUV2ZW50KTsKICAgIGlmIChlcnJvcikKICAgIHsKCXJldHVybihlcnJvcik7CiAgICB9CgogICAgcmV0dXJuKGVycm9yKTsKfQoKCgojaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCiMgZGVmaW5lIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyh4KSBOZXdBRUV2ZW50SGFuZGxlclVQUCh4KQojZW5kaWYKCi8qCiAqIEluc3RhbGwgdGhlIHZhcmlvdXMgQXBwbGVFdmVudCBIYW5kbGVycwogKi8KICAgIE9TRXJyCkluc3RhbGxBRUhhbmRsZXJzKHZvaWQpCnsKICAgIE9TRXJyICAgZXJyb3I7CgogICAgLyogaW5zdGFsbCBvcGVuIGFwcGxpY2F0aW9uIGhhbmRsZXIgKi8KICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtDb3JlRXZlbnRDbGFzcywga0FFT3BlbkFwcGxpY2F0aW9uLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX2FldnRfb2FwcF9BRSksIDAsIGZhbHNlKTsKICAgIGlmIChlcnJvcikKICAgIHsKCXJldHVybiBlcnJvcjsKICAgIH0KCiAgICAvKiBpbnN0YWxsIHF1aXQgYXBwbGljYXRpb24gaGFuZGxlciAqLwogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0NvcmVFdmVudENsYXNzLCBrQUVRdWl0QXBwbGljYXRpb24sCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfYWV2dF9xdWl0X0FFKSwgMCwgZmFsc2UpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuIGVycm9yOwogICAgfQoKICAgIC8qIGluc3RhbGwgb3BlbiBkb2N1bWVudCBoYW5kbGVyICovCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRU9wZW5Eb2N1bWVudHMsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVPRG9jQUUpLCAwLCBmYWxzZSk7CiAgICBpZiAoZXJyb3IpCiAgICB7CglyZXR1cm4gZXJyb3I7CiAgICB9CgogICAgLyogaW5zdGFsbCBwcmludCBkb2N1bWVudCBoYW5kbGVyICovCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRVByaW50RG9jdW1lbnRzLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX2FldnRfcGRvY19BRSksIDAsIGZhbHNlKTsKCi8qIEluc3RhbGwgQ29yZSBTdWl0ZSAqLwovKiAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVDbG9uZSwKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CgogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVDbG9zZSwKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CgogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVDb3VudEVsZW1lbnRzLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUNyZWF0ZUVsZW1lbnQsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOwoKICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFRGVsZXRlLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRURvT2JqZWN0c0V4aXN0LAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUdldERhdGEsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIGtBRUdldERhdGEsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUdldERhdGFTaXplLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBrQUVHZXREYXRhU2l6ZSwgZmFsc2UpOwoKICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFR2V0Q2xhc3NJbmZvLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRUdldEV2ZW50SW5mbywKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CgogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoa0FFQ29yZVN1aXRlLCBrQUVNb3ZlLAoJCSAgICBOZXdBRUV2ZW50SGFuZGxlclByb2MoSGFuZGxlX3Vua25vd25fQUUpLCBuaWwsIGZhbHNlKTsKCiAgICBlcnJvciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcihrQUVDb3JlU3VpdGUsIGtBRVNhdmUsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfdW5rbm93bl9BRSksIG5pbCwgZmFsc2UpOwoKICAgIGVycm9yID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtBRUNvcmVTdWl0ZSwga0FFU2V0RGF0YSwKCQkgICAgTmV3QUVFdmVudEhhbmRsZXJQcm9jKEhhbmRsZV91bmtub3duX0FFKSwgbmlsLCBmYWxzZSk7CiovCgojaWZkZWYgRkVBVF9DV19FRElUT1IKICAgIC8qCiAgICAgKiBCaW5kIGNvZGV3YXJyaW9yIHN1cHBvcnQgaGFuZGxlcnMKICAgICAqLwogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnR1RUWCcsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfS0FITF9HVFRYX0FFKSwgMCwgZmFsc2UpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuIGVycm9yOwogICAgfQogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnU1JDSCcsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfS0FITF9TUkNIX0FFKSwgMCwgZmFsc2UpOwogICAgaWYgKGVycm9yKQogICAgewoJcmV0dXJuIGVycm9yOwogICAgfQogICAgZXJyb3IgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIoJ0tBSEwnLCAnTU9EICcsCgkJICAgIE5ld0FFRXZlbnRIYW5kbGVyUHJvYyhIYW5kbGVfS0FITF9NT0RfQUUpLCAwLCBmYWxzZSk7CiAgICBpZiAoZXJyb3IpCiAgICB7CglyZXR1cm4gZXJyb3I7CiAgICB9CiNlbmRpZgoKICAgIHJldHVybiBlcnJvcjsKCn0KI2VuZGlmIC8qIFVTRV9BRVZFTlQgKi8KCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChNQUNPU19YKQovKgogKiBDYWxsYmFjayBmdW5jdGlvbiwgaW5zdGFsbGVkIGJ5IEluc3RhbGxGb250UGFuZWxIYW5kbGVyKCksIGJlbG93LAogKiB0byBoYW5kbGUgRm9udCBQYW5lbCBldmVudHMuCiAqLwogICAgc3RhdGljIE9TU3RhdHVzCkZvbnRQYW5lbEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBpbkhhbmRsZXJDYWxsUmVmLCBFdmVudFJlZiBpbkV2ZW50LAogICAgdm9pZCAqaW5Vc2VyRGF0YSkKewogICAgaWYgKEdldEV2ZW50S2luZChpbkV2ZW50KSA9PSBrRXZlbnRGb250UGFuZWxDbG9zZWQpCiAgICB7CglnRm9udFBhbmVsSW5mby5pc1BhbmVsVmlzaWJsZSA9IGZhbHNlOwoJcmV0dXJuIG5vRXJyOwogICAgfQoKICAgIGlmIChHZXRFdmVudEtpbmQoaW5FdmVudCkgPT0ga0V2ZW50Rm9udFNlbGVjdGlvbikKICAgIHsKCU9TU3RhdHVzIHN0YXR1czsKCUZNRm9udEZhbWlseSBuZXdGYW1pbHk7CglGTUZvbnRTaXplIG5ld1NpemU7CglGTUZvbnRTdHlsZSBuZXdTdHlsZTsKCgkvKiBSZXRyaWV2ZSB0aGUgZm9udCBmYW1pbHkgSUQgbnVtYmVyLiAqLwoJc3RhdHVzID0gR2V0RXZlbnRQYXJhbWV0ZXIoaW5FdmVudCwga0V2ZW50UGFyYW1GTUZvbnRGYW1pbHksCgkJLyppbkRlc2lyZWRUeXBlPSovdHlwZUZNRm9udEZhbWlseSwgLypvdXRBY3R1YWxUeXBlPSovTlVMTCwKCQkvKmluQnVmZmVyU2l6ZT0qL3NpemVvZihGTUZvbnRGYW1pbHkpLCAvKm91dEFjdHVhbFNpemU9Ki9OVUxMLAoJCSZuZXdGYW1pbHkpOwoJaWYgKHN0YXR1cyA9PSBub0VycikKCSAgICBnRm9udFBhbmVsSW5mby5mYW1pbHkgPSBuZXdGYW1pbHk7CgoJLyogUmV0cmlldmUgdGhlIGZvbnQgc2l6ZS4gKi8KCXN0YXR1cyA9IEdldEV2ZW50UGFyYW1ldGVyKGluRXZlbnQsIGtFdmVudFBhcmFtRk1Gb250U2l6ZSwKCQl0eXBlRk1Gb250U2l6ZSwgTlVMTCwgc2l6ZW9mKEZNRm9udFNpemUpLCBOVUxMLCAmbmV3U2l6ZSk7CglpZiAoc3RhdHVzID09IG5vRXJyKQoJICAgIGdGb250UGFuZWxJbmZvLnNpemUgPSBuZXdTaXplOwoKCS8qIFJldHJpZXZlIHRoZSBmb250IHN0eWxlIChib2xkLCBldGMuKS4gIEN1cnJlbnRseSB1bnVzZWQuICovCglzdGF0dXMgPSBHZXRFdmVudFBhcmFtZXRlcihpbkV2ZW50LCBrRXZlbnRQYXJhbUZNRm9udFN0eWxlLAoJCXR5cGVGTUZvbnRTdHlsZSwgTlVMTCwgc2l6ZW9mKEZNRm9udFN0eWxlKSwgTlVMTCwgJm5ld1N0eWxlKTsKCWlmIChzdGF0dXMgPT0gbm9FcnIpCgkgICAgZ0ZvbnRQYW5lbEluZm8uc3R5bGUgPSBuZXdTdHlsZTsKICAgIH0KICAgIHJldHVybiBub0VycjsKfQoKCiAgICBzdGF0aWMgdm9pZApJbnN0YWxsRm9udFBhbmVsSGFuZGxlcigpCnsKICAgIEV2ZW50VHlwZVNwZWMgZXZlbnRUeXBlc1syXTsKICAgIEV2ZW50SGFuZGxlclVQUCBoYW5kbGVyVVBQOwogICAgLyogRXZlbnRIYW5kbGVyUmVmIGhhbmRsZXJSZWY7ICovCgogICAgZXZlbnRUeXBlc1swXS5ldmVudENsYXNzID0ga0V2ZW50Q2xhc3NGb250OwogICAgZXZlbnRUeXBlc1swXS5ldmVudEtpbmQgID0ga0V2ZW50Rm9udFNlbGVjdGlvbjsKICAgIGV2ZW50VHlwZXNbMV0uZXZlbnRDbGFzcyA9IGtFdmVudENsYXNzRm9udDsKICAgIGV2ZW50VHlwZXNbMV0uZXZlbnRLaW5kICA9IGtFdmVudEZvbnRQYW5lbENsb3NlZDsKCiAgICBoYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKEZvbnRQYW5lbEhhbmRsZXIpOwoKICAgIEluc3RhbGxBcHBsaWNhdGlvbkV2ZW50SGFuZGxlcihoYW5kbGVyVVBQLCAvKm51bVR5cGVzPSovMiwgZXZlbnRUeXBlcywKCSAgICAvKnVzZXJEYXRhPSovTlVMTCwgLypoYW5kbGVyUmVmPSovTlVMTCk7Cn0KCgovKgogKiBGaWxsIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBvdXROYW1lIHdpdGggdGhlIG5hbWUgYW5kIHNpemUKICogb2YgdGhlIGZvbnQgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBGb250IFBhbmVsLgogKi8KI2RlZmluZSBGT05UX1NUWUxFX0JVRkZFUl9TSVpFIDMyCiAgICBzdGF0aWMgdm9pZApHZXRGb250UGFuZWxTZWxlY3Rpb24oY2hhcl91KiBvdXROYW1lKQp7CiAgICBTdHIyNTUJICAgIGJ1ZjsKICAgIEJ5dGVDb3VudAkgICAgZm9udE5hbWVMZW4gPSAwOwogICAgQVRTVUZvbnRJRAkgICAgZmlkOwogICAgY2hhcl91CSAgICBzdHlsZVN0cmluZ1tGT05UX1NUWUxFX0JVRkZFUl9TSVpFXTsKCiAgICBpZiAoIW91dE5hbWUpCglyZXR1cm47CgogICAgaWYgKEZNR2V0Rm9udEZhbWlseU5hbWUoZ0ZvbnRQYW5lbEluZm8uZmFtaWx5LCBidWYpID09IG5vRXJyKQogICAgewoJLyogQ2Fub25pY2FsaXplIGxvY2FsaXplZCBmb250IG5hbWVzICovCglpZiAoRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZShnRm9udFBhbmVsSW5mby5mYW1pbHksCgkJICAgIGdGb250UGFuZWxJbmZvLnN0eWxlLCAmZmlkLCBOVUxMKSAhPSBub0VycikKCSAgICByZXR1cm47CgoJLyogUmVxdWVzdCBmb250IG5hbWUgd2l0aCBNYWMgZW5jb2RpbmcgKG90aGVyd2lzZSB3ZSBjb3VsZAoJICogZ2V0IGFuIHVud2FudGVkIHV0Zi0xNiBuYW1lKSAqLwoJaWYgKEFUU1VGaW5kRm9udE5hbWUoZmlkLCBrRm9udEZ1bGxOYW1lLCBrRm9udE1hY2ludG9zaFBsYXRmb3JtLAoJCSAgICBrRm9udE5vU2NyaXB0Q29kZSwga0ZvbnROb0xhbmd1YWdlQ29kZSwKCQkgICAgMjU1LCBvdXROYW1lLCAmZm9udE5hbWVMZW4sIE5VTEwpICE9IG5vRXJyKQoJICAgIHJldHVybjsKCgkvKiBPbmx5IGVuY29kZSBmb250IHNpemUsIGJlY2F1c2Ugc3R5bGUgKGJvbGQsIGl0YWxpYywgZXRjKSBpcwoJICogYWxyZWFkeSBwYXJ0IG9mIHRoZSBmb250IGZ1bGwgbmFtZSAqLwoJdmltX3NucHJpbnRmKHN0eWxlU3RyaW5nLCBGT05UX1NUWUxFX0JVRkZFUl9TSVpFLCAiOmglZCIsCgkJZ0ZvbnRQYW5lbEluZm8uc2l6ZS8qLAoJCSgoZ0ZvbnRQYW5lbEluZm8uc3R5bGUgJiBib2xkKSE9MCA/ICI6YiIgOiAiIiksCgkJKChnRm9udFBhbmVsSW5mby5zdHlsZSAmIGl0YWxpYykhPTAgPyAiOmkiIDogIiIpLAoJCSgoZ0ZvbnRQYW5lbEluZm8uc3R5bGUgJiB1bmRlcmxpbmUpIT0wID8gIjp1IiA6ICIiKSovKTsKCglpZiAoKGZvbnROYW1lTGVuICsgU1RSTEVOKHN0eWxlU3RyaW5nKSkgPCAyNTUpCgkgICAgU1RSQ1BZKG91dE5hbWUgKyBmb250TmFtZUxlbiwgc3R5bGVTdHJpbmcpOwogICAgfQogICAgZWxzZQogICAgewoJKm91dE5hbWUgPSBOVUxMOwogICAgfQp9CiNlbmRpZgoKCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBVbmZpbGVkIHlldAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgovKgogKiAgZ3VpX21hY19nZXRfbWVudV9pdGVtX2luZGV4CiAqCiAqICBSZXR1cm5zIHRoZSBpbmRleCBpbnNpZGUgdGhlIG1lbnUgd2hlcgogKi8KICAgIHNob3J0IC8qIFNob3VsZGUgd2UgcmV0dXJuIE1lbnVJdGVtSW5kZXg/ICovCmd1aV9tYWNfZ2V0X21lbnVfaXRlbV9pbmRleChwTWVudSkKICAgIHZpbW1lbnVfVCAqcE1lbnU7CnsKICAgIHNob3J0CWluZGV4OwogICAgc2hvcnQJaXRlbUluZGV4ID0gLTE7CiAgICB2aW1tZW51X1QJKnBCcm90aGVyOwoKICAgIC8qIE9ubHkgbWVudSB3aXRob3V0IHBhcmVudCBhcmUgdGhlOgogICAgICogLW1lbnUgaW4gdGhlIG1lbnViYXIKICAgICAqIC1wb3B1cCBtZW51CiAgICAgKiAtdG9vbGJhciAoZ3Vlc3MpCiAgICAgKgogICAgICogV2hpY2ggYXJlIG5vdCBpdGVtcyBhbnl3YXkuCiAgICAgKi8KICAgIGlmIChwTWVudS0+cGFyZW50KQogICAgewoJLyogU3RhcnQgZnJvbSB0aGUgT2xkZXN0IEJyb3RoZXIgKi8KCXBCcm90aGVyID0gcE1lbnUtPnBhcmVudC0+Y2hpbGRyZW47CglpbmRleCA9IDE7Cgl3aGlsZSAoKHBCcm90aGVyKSAmJiAoaXRlbUluZGV4ID09IC0xKSkKCXsKCSAgICBpZiAocEJyb3RoZXIgPT0gcE1lbnUpCgkJaXRlbUluZGV4ID0gaW5kZXg7CgkgICAgaW5kZXgrKzsKCSAgICBwQnJvdGhlciA9IHBCcm90aGVyLT5uZXh0OwoJfQojaWZkZWYgVVNFX0hFTFBNRU5VCgkvKiBBZGp1c3QgaW5kZXggaW4gaGVscCBtZW51IChmb3IgcHJlZGVmaW5lZCBvbmVzKSAqLwoJaWYgKGl0ZW1JbmRleCAhPSAtMSkKCSAgICBpZiAocE1lbnUtPnBhcmVudC0+c3VibWVudV9pZCA9PSBrSE1IZWxwTWVudUlEKQoJCWl0ZW1JbmRleCArPSBndWkuTWFjT1NIZWxwSXRlbXM7CiNlbmRpZgogICAgfQogICAgcmV0dXJuIGl0ZW1JbmRleDsKfQoKICAgIHN0YXRpYyB2aW1tZW51X1QgKgpndWlfbWFjX2dldF92aW1fbWVudShtZW51SUQsIGl0ZW1JbmRleCwgcE1lbnUpCiAgICBzaG9ydAltZW51SUQ7CiAgICBzaG9ydAlpdGVtSW5kZXg7CiAgICB2aW1tZW51X1QJKnBNZW51Owp7CiAgICBzaG9ydAlpbmRleDsKICAgIHZpbW1lbnVfVAkqcENoaWxkTWVudTsKICAgIHZpbW1lbnVfVAkqcEVsZGVyID0gcE1lbnUtPnBhcmVudDsKCgogICAgLyogT25seSBtZW51IHdpdGhvdXQgcGFyZW50IGFyZSB0aGU6CiAgICAgKiAtbWVudSBpbiB0aGUgbWVudWJhcgogICAgICogLXBvcHVwIG1lbnUKICAgICAqIC10b29sYmFyIChndWVzcykKICAgICAqCiAgICAgKiBXaGljaCBhcmUgbm90IGl0ZW1zIGFueXdheS4KICAgICAqLwoKICAgIGlmICgocEVsZGVyKSAmJiAocEVsZGVyLT5zdWJtZW51X2lkID09IG1lbnVJRCkpCiAgICB7CiNpZmRlZiBVU0VfSEVMUE1FTlUKCWlmIChtZW51SUQgPT0ga0hNSGVscE1lbnVJRCkKCSAgICBpdGVtSW5kZXggLT0gZ3VpLk1hY09TSGVscEl0ZW1zOwojZW5kaWYKCglmb3IgKGluZGV4ID0gMTsgKGluZGV4ICE9IGl0ZW1JbmRleCkgJiYgKHBNZW51ICE9IE5VTEwpOyBpbmRleCsrKQoJICAgIHBNZW51ID0gcE1lbnUtPm5leHQ7CiAgICB9CiAgICBlbHNlCiAgICB7Cglmb3IgKDsgcE1lbnUgIT0gTlVMTDsgcE1lbnUgPSBwTWVudS0+bmV4dCkKCXsKCSAgICBpZiAocE1lbnUtPmNoaWxkcmVuICE9IE5VTEwpCgkgICAgewoJCXBDaGlsZE1lbnUgPSBndWlfbWFjX2dldF92aW1fbWVudQoJCQkgICAobWVudUlELCBpdGVtSW5kZXgsIHBNZW51LT5jaGlsZHJlbik7CgkJaWYgKHBDaGlsZE1lbnUpCgkJewoJCSAgICBwTWVudSA9IHBDaGlsZE1lbnU7CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gcE1lbnU7Cn0KCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBNYWNPUyBGZWVkYmFjayBwcm9jZWR1cmVzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KICAgIHBhc2NhbAogICAgdm9pZApndWlfbWFjX2RyYWdfdGh1bWIoQ29udHJvbEhhbmRsZSB0aGVDb250cm9sLCBzaG9ydCBwYXJ0Q29kZSkKewogICAgc2Nyb2xsYmFyX1QJCSpzYjsKICAgIGludAkJCXZhbHVlLCBkcmFnZ2luZzsKICAgIENvbnRyb2xIYW5kbGUJdGhlQ29udHJvbFRvVXNlOwogICAgaW50CQkJZG9udF9zY3JvbGxfc2F2ZSA9IGRvbnRfc2Nyb2xsOwoKICAgIHRoZUNvbnRyb2xUb1VzZSA9IGRyYWdnZWRfc2I7CgogICAgc2IgPSBndWlfZmluZF9zY3JvbGxiYXIoKGxvbmcpIEdldENvbnRyb2xSZWZlcmVuY2UodGhlQ29udHJvbFRvVXNlKSk7CgogICAgaWYgKHNiID09IE5VTEwpCglyZXR1cm47CgogICAgLyogTmVlZCB0byBmaW5kIHZhbHVlIGJ5IGRpZmYgYmV0d2VlbiBPbGQgUG9zcyBOZXcgUG9zICovCiAgICB2YWx1ZSA9IEdldENvbnRyb2wzMkJpdFZhbHVlKHRoZUNvbnRyb2xUb1VzZSk7CiAgICBkcmFnZ2luZyA9IChwYXJ0Q29kZSAhPSAwKTsKCiAgICAvKiBXaGVuICJhbGxvd19zY3JvbGxiYXIiIGlzIEZBTFNFIHN0aWxsIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG5ldwogICAgICogcG9zaXRpb24sIGJ1dCBkb24ndCBhY3R1YWxseSBzY3JvbGwgYnkgc2V0dGluZyAiZG9udF9zY3JvbGwiLiAqLwogICAgZG9udF9zY3JvbGwgPSAhYWxsb3dfc2Nyb2xsYmFyOwogICAgZ3VpX2RyYWdfc2Nyb2xsYmFyKHNiLCB2YWx1ZSwgZHJhZ2dpbmcpOwogICAgZG9udF9zY3JvbGwgPSBkb250X3Njcm9sbF9zYXZlOwp9CgogICAgcGFzY2FsCiAgICB2b2lkCmd1aV9tYWNfc2Nyb2xsX2FjdGlvbihDb250cm9sSGFuZGxlIHRoZUNvbnRyb2wsIHNob3J0IHBhcnRDb2RlKQp7CiAgICAvKiBUT0RPOiBoYXZlIGxpdmUgc3VwcG9ydCAqLwogICAgc2Nyb2xsYmFyX1QgKnNiLCAqc2JfaW5mbzsKICAgIGxvbmcJZGF0YTsKICAgIGxvbmcJdmFsdWU7CiAgICBpbnQJCXBhZ2U7CiAgICBpbnQJCWRyYWdnaW5nID0gRkFMU0U7CiAgICBpbnQJCWRvbnRfc2Nyb2xsX3NhdmUgPSBkb250X3Njcm9sbDsKCiAgICBzYiA9IGd1aV9maW5kX3Njcm9sbGJhcigobG9uZylHZXRDb250cm9sUmVmZXJlbmNlKHRoZUNvbnRyb2wpKTsKCiAgICBpZiAoc2IgPT0gTlVMTCkKCXJldHVybjsKCiAgICBpZiAoc2ItPndwICE9IE5VTEwpCQkvKiBMZWZ0IG9yIHJpZ2h0IHNjcm9sbGJhciAqLwogICAgewoJLyoKCSAqIENhcmVmdWw6IG5lZWQgdG8gZ2V0IHNjcm9sbGJhciBpbmZvIG91dCBvZiBmaXJzdCAobGVmdCkgc2Nyb2xsYmFyCgkgKiBmb3Igd2luZG93LCBidXQga2VlcCByZWFsIHNjcm9sbGJhciB0b28gYmVjYXVzZSB3ZSBtdXN0IHBhc3MgaXQgdG8KCSAqIGd1aV9kcmFnX3Njcm9sbGJhcigpLgoJICovCglzYl9pbmZvID0gJnNiLT53cC0+d19zY3JvbGxiYXJzWzBdOwoKCWlmIChzYl9pbmZvLT5zaXplID4gNSkKCSAgICBwYWdlID0gc2JfaW5mby0+c2l6ZSAtIDI7CS8qIHVzZSB0d28gbGluZXMgb2YgY29udGV4dCAqLwoJZWxzZQoJICAgIHBhZ2UgPSBzYl9pbmZvLT5zaXplOwogICAgfQogICAgZWxzZQkJCS8qIEJvdHRvbSBzY3JvbGxiYXIgKi8KICAgIHsKCXNiX2luZm8gPSBzYjsKCXBhZ2UgPSBXX1dJRFRIKGN1cndpbikgLSA1OwogICAgfQoKICAgIHN3aXRjaCAocGFydENvZGUpCiAgICB7CgljYXNlICBrQ29udHJvbFVwQnV0dG9uUGFydDogICBkYXRhID0gLTE7ICAgIGJyZWFrOwoJY2FzZSAga0NvbnRyb2xEb3duQnV0dG9uUGFydDogZGF0YSA9IDE7ICAgICBicmVhazsKCWNhc2UgIGtDb250cm9sUGFnZURvd25QYXJ0OiAgIGRhdGEgPSBwYWdlOyAgYnJlYWs7CgljYXNlICBrQ29udHJvbFBhZ2VVcFBhcnQ6ICAgICBkYXRhID0gLXBhZ2U7IGJyZWFrOwoJCSAgICBkZWZhdWx0OiBkYXRhID0gMDsgYnJlYWs7CiAgICB9CgogICAgdmFsdWUgPSBzYl9pbmZvLT52YWx1ZSArIGRhdGE7Ci8qICBpZiAodmFsdWUgPiBzYl9pbmZvLT5tYXgpCgl2YWx1ZSA9IHNiX2luZm8tPm1heDsKICAgIGVsc2UgaWYgKHZhbHVlIDwgMCkKCXZhbHVlID0gMDsqLwoKICAgIC8qIFdoZW4gImFsbG93X3Njcm9sbGJhciIgaXMgRkFMU0Ugc3RpbGwgbmVlZCB0byByZW1lbWJlciB0aGUgbmV3CiAgICAgKiBwb3NpdGlvbiwgYnV0IGRvbid0IGFjdHVhbGx5IHNjcm9sbCBieSBzZXR0aW5nICJkb250X3Njcm9sbCIuICovCiAgICBkb250X3Njcm9sbCA9ICFhbGxvd19zY3JvbGxiYXI7CiAgICBndWlfZHJhZ19zY3JvbGxiYXIoc2IsIHZhbHVlLCBkcmFnZ2luZyk7CiAgICBkb250X3Njcm9sbCA9IGRvbnRfc2Nyb2xsX3NhdmU7CgogICAgb3V0X2ZsdXNoKCk7CiAgICBndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoc2IsIHZhbHVlLCBzYl9pbmZvLT5zaXplLCBzYl9pbmZvLT5tYXgpOwoKLyogIGlmIChzYl9pbmZvLT53cCAhPSBOVUxMKQogICAgewoJd2luX1QJKndwOwoJaW50CXNiX251bTsKCglzYl9udW0gPSAwOwoJZm9yICh3cCA9IGZpcnN0d2luOyB3cCAhPSBzYi0+d3AgJiYgd3AgIT0gTlVMTDsgd3AgPSBXX05FWFQod3ApKQoJc2JfbnVtKys7CgoJaWYgKHdwICE9IE5VTEwpCgl7CgkgICAgY3VycmVudF9zY3JvbGxiYXIgPSBzYl9udW07CgkgICAgc2Nyb2xsYmFyX3ZhbHVlID0gdmFsdWU7CgkgICAgZ3VpX2RvX3Njcm9sbCgpOwoJICAgIGd1aV9tY2hfc2V0X3Njcm9sbGJhcl90aHVtYihzYiwgdmFsdWUsIHNiX2luZm8tPnNpemUsIHNiX2luZm8tPm1heCk7Cgl9CiAgICB9Ki8KfQoKLyoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIE1hY09TIENsaWNrIEhhbmRsaW5nIHByb2NlZHVyZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKCi8qCiAqIEhhbmRsZSBhIGNsaWNrIGluc2lkZSB0aGUgd2luZG93LCBpdCBtYXkgaGFwcGVucyBpbiB0aGUKICogc2Nyb2xsYmFyIG9yIHRoZSBjb250ZW50cy4KICoKICogVE9ETzogQWRkIHN1cHBvcnQgZm9yIHBvdGVudGlhbCBUT09MQkFSCiAqLwogICAgdm9pZApndWlfbWFjX2RvSW5Db250ZW50Q2xpY2sodGhlRXZlbnQsIHdoaWNoV2luZG93KQogICAgRXZlbnRSZWNvcmQgKnRoZUV2ZW50OwogICAgV2luZG93UHRyCSB3aGljaFdpbmRvdzsKewogICAgUG9pbnQJCXRoZVBvaW50OwogICAgaW50X3UJCXZpbU1vZGlmaWVyczsKICAgIHNob3J0CQl0aGVQb3J0aW9uOwogICAgQ29udHJvbEhhbmRsZQl0aGVDb250cm9sOwogICAgaW50CQkJdmltTW91c2VCdXR0b247CiAgICBzaG9ydAkJZGJsQ2xpY2s7CgogICAgdGhlUG9pbnQgPSB0aGVFdmVudC0+d2hlcmU7CiAgICBHbG9iYWxUb0xvY2FsKCZ0aGVQb2ludCk7CiAgICBTZWxlY3RXaW5kb3cod2hpY2hXaW5kb3cpOwoKICAgIHRoZVBvcnRpb24gPSBGaW5kQ29udHJvbCh0aGVQb2ludCwgd2hpY2hXaW5kb3csICZ0aGVDb250cm9sKTsKCiAgICBpZiAodGhlQ29udHJvbCAhPSBOVUwpCiAgICB7CgkvKiBXZSBoaXQgYSBzY29sbGJhciAqLwoKCWlmICh0aGVQb3J0aW9uICE9IGtDb250cm9sSW5kaWNhdG9yUGFydCkKCXsKCSAgICBkcmFnZ2VkX3NiID0gdGhlQ29udHJvbDsKCSAgICBUcmFja0NvbnRyb2wodGhlQ29udHJvbCwgdGhlUG9pbnQsIGdTY3JvbGxBY3Rpb24pOwoJICAgIGRyYWdnZWRfc2IgPSBOVUxMOwoJfQoJZWxzZQoJewoJICAgIGRyYWdnZWRfc2IgPSB0aGVDb250cm9sOwojaWYgMQoJICAgIFRyYWNrQ29udHJvbCh0aGVDb250cm9sLCB0aGVQb2ludCwgZ1Njcm9sbERyYWcpOwojZWxzZQoJICAgIFRyYWNrQ29udHJvbCh0aGVDb250cm9sLCB0aGVQb2ludCwgTlVMTCk7CiNlbmRpZgoJICAgIC8qIHBhc3MgMCBhcyB0aGUgcGFydCB0byB0ZWxsIGd1aV9tYWNfZHJhZ190aHVtYiwgdGhhdCB0aGUgbW91c2UKCSAgICAgKiBidXR0b24gaGFzIGJlZW4gcmVsZWFzZWQgKi8KCSAgICBndWlfbWFjX2RyYWdfdGh1bWIodGhlQ29udHJvbCwgMCk7IC8qIFNob3VsZCBpdCBiZSB0aGVQb3J0aW9uID8gKERhbnkpICovCgkgICAgZHJhZ2dlZF9zYiA9IE5VTEw7Cgl9CiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBXZSBhcmUgaW5zaWRlIHRoZSBjb250ZW50cyAqLwoKCS8qIENvbnZlcnQgdGhlIENUUkwsIE9QVElPTiwgU0hJRlQgYW5kIENNRCBrZXkgKi8KCXZpbU1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzKHRoZUV2ZW50LT5tb2RpZmllcnMpOwoKCS8qIERlZmF1bHRzIHRvIE1PVVNFX0xFRlQgYXMgdGhlcmUncyBvbmx5IG9uZSBtb3VzZSBidXR0b24gKi8KCXZpbU1vdXNlQnV0dG9uID0gTU9VU0VfTEVGVDsKCiNpZmRlZiBVU0VfQ1RSTENMSUNLTUVOVQoJLyogQ29udmVydCB0aGUgQ1RSTF9NT1VTRV9MRUZUIHRvIE1PVVNFX1JJR0hUICovCgljbGlja0lzUG9wdXAgPSBGQUxTRTsKCglpZiAoKGd1aS5NYWNPU0hhdmVDbnR4TWVudSkgJiYgKG1vdXNlX21vZGVsX3BvcHVwKCkpKQoJICAgIGlmIChJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKHRoZUV2ZW50KSkKCSAgICB7CgkJdmltTW91c2VCdXR0b24gPSBNT1VTRV9SSUdIVDsKCQl2aW1Nb2RpZmllcnMgJj0gfk1PVVNFX0NUUkw7CgkJY2xpY2tJc1BvcHVwID0gVFJVRTsKCSAgICB9CiNlbmRpZgoKCS8qIElzIGl0IGEgZG91YmxlIGNsaWNrID8gKi8KCWRibENsaWNrID0gKCh0aGVFdmVudC0+d2hlbiAtIGxhc3RNb3VzZVRpY2spIDwgR2V0RGJsVGltZSgpKTsKCgkvKiBTZW5kIHRoZSBtb3VzZSBjbGljaiB0byBWaW0gKi8KCWd1aV9zZW5kX21vdXNlX2V2ZW50KHZpbU1vdXNlQnV0dG9uLCB0aGVQb2ludC5oLAoJCQkJCSAgdGhlUG9pbnQudiwgZGJsQ2xpY2ssIHZpbU1vZGlmaWVycyk7CgoJLyogQ3JlYXRlIHRoZSByZWN0YW5nbGUgYXJvdW5kIHRoZSBjdXJzb3IgdG8gZGV0ZWN0CgkgKiB0aGUgbW91c2UgZHJhZ2dpbmcKCSAqLwojaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKI2lmIDAKCS8qIFRPRE86IERvIHdlIG5lZWQgdG8gdGhpcyBldmVuIGZvciB0aGUgY29udGV4dHVhbCBtZW51PwoJICogSXQgbWF5IGJlIHJlcXVpcmUgZm9yIHBvcHVwX3NldHBvcywgYnV0IGZvciBwb3B1cD8KCSAqLwoJaWYgKHZpbU1vdXNlQnV0dG9uID09IE1PVVNFX0xFRlQpCiNlbmRpZgojZW5kaWYKCXsKCSAgICBTZXRSZWN0KCZkcmFnUmVjdCwgRklMTF9YKFhfMl9DT0wodGhlUG9pbnQuaCkpLAoJCQkJRklMTF9ZKFlfMl9ST1codGhlUG9pbnQudikpLAoJCQkJRklMTF9YKFhfMl9DT0wodGhlUG9pbnQuaCkrMSksCgkJCQlGSUxMX1koWV8yX1JPVyh0aGVQb2ludC52KSsxKSk7CgoJICAgIGRyYWdSZWN0RW5ibCA9IFRSVUU7CgkgICAgZHJhZ1JlY3RDb250cm9sID0ga0NyZWF0ZVJlY3Q7Cgl9CiAgICB9Cn0KCi8qCiAqIEhhbmRsZSB0aGUgY2xpY2sgaW4gdGhlIHRpdGxlYmFyICh0byBtb3ZlIHRoZSB3aW5kb3cpCiAqLwogICAgdm9pZApndWlfbWFjX2RvSW5EcmFnQ2xpY2sod2hlcmUsIHdoaWNoV2luZG93KQogICAgUG9pbnQJd2hlcmU7CiAgICBXaW5kb3dQdHIJd2hpY2hXaW5kb3c7CnsKICAgIFJlY3QJbW92aW5nTGltaXRzOwogICAgUmVjdAkqbW92aW5nTGltaXRzUHRyID0gJm1vdmluZ0xpbWl0czsKCiAgICAvKiBUT0RPOiBtYXkgdHJ5IHRvIHByZXZlbnQgbW92ZSBvdXRzaWRlIHNjcmVlbj8gKi8KI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBtb3ZpbmdMaW1pdHNQdHIgPSBHZXRSZWdpb25Cb3VuZHMoR2V0R3JheVJnbigpLCAmbW92aW5nTGltaXRzKTsKI2Vsc2UKICAgIG1vdmluZ0xpbWl0c1B0ciA9ICYoKkdldEdyYXlSZ24oKSktPnJnbkJCb3g7CiNlbmRpZgogICAgRHJhZ1dpbmRvdyh3aGljaFdpbmRvdywgd2hlcmUsIG1vdmluZ0xpbWl0c1B0cik7Cn0KCi8qCiAqIEhhbmRsZSB0aGUgY2xpY2sgaW4gdGhlIGdyb3cgYm94CiAqLwogICAgdm9pZApndWlfbWFjX2RvSW5Hcm93Q2xpY2sod2hlcmUsIHdoaWNoV2luZG93KQogICAgUG9pbnQJd2hlcmU7CiAgICBXaW5kb3dQdHIJd2hpY2hXaW5kb3c7CnsKCiAgICBsb25nCSAgICBuZXdTaXplOwogICAgdW5zaWduZWQgc2hvcnQgIG5ld1dpZHRoOwogICAgdW5zaWduZWQgc2hvcnQgIG5ld0hlaWdodDsKICAgIFJlY3QJICAgIHJlc2l6ZUxpbWl0czsKICAgIFJlY3QJICAgICpyZXNpemVMaW1pdHNQdHIgPSAmcmVzaXplTGltaXRzOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIFJlY3QJICAgIE5ld0NvbnRlbnRSZWN0OwoKICAgIHJlc2l6ZUxpbWl0c1B0ciA9IEdldFJlZ2lvbkJvdW5kcyhHZXRHcmF5UmduKCksICZyZXNpemVMaW1pdHMpOwojZWxzZQogICAgcmVzaXplTGltaXRzID0gcWQuc2NyZWVuQml0cy5ib3VuZHM7CiNlbmRpZgoKICAgIC8qIFNldCB0aGUgbWluaW11biBzaXplICovCiAgICAvKiBUT0RPOiBTaG91bGQgdGhpcyBjb21lIGZyb20gVmltPyAqLwogICAgcmVzaXplTGltaXRzLnRvcCA9IDEwMDsKICAgIHJlc2l6ZUxpbWl0cy5sZWZ0ID0gMTAwOwoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBuZXdTaXplID0gUmVzaXplV2luZG93KHdoaWNoV2luZG93LCB3aGVyZSwgJnJlc2l6ZUxpbWl0cywgJk5ld0NvbnRlbnRSZWN0KTsKICAgIG5ld1dpZHRoICA9IE5ld0NvbnRlbnRSZWN0LnJpZ2h0IC0gTmV3Q29udGVudFJlY3QubGVmdDsKICAgIG5ld0hlaWdodCA9IE5ld0NvbnRlbnRSZWN0LmJvdHRvbSAtIE5ld0NvbnRlbnRSZWN0LnRvcDsKICAgIGd1aV9yZXNpemVfc2hlbGwobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CiAgICBndWlfc2V0X3NoZWxsc2l6ZShUUlVFLCBGQUxTRSk7CiNlbHNlCiAgICBuZXdTaXplID0gR3Jvd1dpbmRvdyh3aGljaFdpbmRvdywgd2hlcmUsICZyZXNpemVMaW1pdHMpOwogICAgaWYgKG5ld1NpemUgIT0gMCkKICAgIHsKCW5ld1dpZHRoICA9IG5ld1NpemUgJiAweDAwMDBGRkZGOwoJbmV3SGVpZ2h0ID0gKG5ld1NpemUgPj4gMTYpICYgMHgwMDAwRkZGRjsKCglndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CgoJZ3VpX3Jlc2l6ZV9zaGVsbChuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKCgkvKgoJICogV2UgbmVlZCB0byBjYWxsIGd1aV9zZXRfc2hlbGxzaXplIGFzIHRoZSBzaXplCgkgKiB1c2VkIGJ5IFZpbSBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBzaXplIHNlbGVjdGVkCgkgKiBieSB0aGUgdXNlci4gVGhpcyBjYXVzZSBzb21lIG92ZXJoZWFkCgkgKiBUT0RPOiBhZGQgYSBjaGVjayBpbnNpZGUgZ3VpX3Jlc2l6ZV9zaGVsbD8KCSAqLwoJZ3VpX3NldF9zaGVsbHNpemUoVFJVRSwgRkFMU0UpOwoKCS8qCgkgKiBPcmlnaW4gb2YgdGhlIGNvZGUgYmVsb3cgaXMgdW5rbm93bi4KCSAqIEZ1bmN0aW9uYWxpdHkgaXMgdW5rbm93bi4KCSAqIFRpbWUgb2YgY29tbWVudGVkIG91dCBpcyB1bmtub3duLgoJICovCi8qCVNldFBvcnQod3ApOwoJSW52YWxSZWN0KCZ3cC0+cG9ydFJlY3QpOwoJaWYgKGlzVXNlcldpbmRvdyh3cCkpIHsKCSAgICBEcmF3aW5nV2luZG93UGVlawlhV2luZG93ID0gKERyYXdpbmdXaW5kb3dQZWVrKXdwOwoKCSAgICBpZiAoYVdpbmRvdy0+dG9vbFJvdXRpbmVzLnRvb2xXaW5kb3dSZXNpemVkUHJvYykKCQlDYWxsVG9vbFdpbmRvd1Jlc2l6ZWRQcm9jKGFXaW5kb3ctPnRvb2xSb3V0aW5lcy50b29sV2luZG93UmVzaXplZFByb2MsIHdwKTsKCX0qLwogICAgfTsKI2VuZGlmCgp9CgovKgogKiBIYW5kbGUgdGhlIGNsaWNrIGluIHRoZSB6b29tIGJveAogKi8KI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBzdGF0aWMgdm9pZApndWlfbWFjX2RvSW5ab29tQ2xpY2sodGhlRXZlbnQsIHdoaWNoV2luZG93KQogICAgRXZlbnRSZWNvcmQJKnRoZUV2ZW50OwogICAgV2luZG93UHRyCXdoaWNoV2luZG93Owp7CiAgICBSZWN0CXI7CiAgICBQb2ludAlwOwogICAgc2hvcnQJdGhlUGFydDsKCiAgICAvKiBpZGVhbCB3aWR0aCBpcyBjdXJyZW50ICovCiAgICBwLmggPSBDb2x1bW5zICogZ3VpLmNoYXJfd2lkdGggKyAyICogZ3VpLmJvcmRlcl9vZmZzZXQ7CiAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKCXAuaCArPSBndWkuc2Nyb2xsYmFyX3dpZHRoOwogICAgaWYgKGd1aS53aGljaF9zY3JvbGxiYXJzW1NCQVJfUklHSFRdKQoJcC5oICs9IGd1aS5zY3JvbGxiYXJfd2lkdGg7CiAgICAvKiBpZGVhbCBoZWlnaHQgaXMgYXMgaGVpZ2ggYXMgd2UgY2FuIGdldCAqLwogICAgcC52ID0gMTUgKiAxMDI0OwoKICAgIHRoZVBhcnQgPSBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSh3aGljaFdpbmRvdywgJnAsICZyKQoJCQkJCQkgICAgICAgPyBpblpvb21JbiA6IGluWm9vbU91dDsKCiAgICBpZiAoIVRyYWNrQm94KHdoaWNoV2luZG93LCB0aGVFdmVudC0+d2hlcmUsIHRoZVBhcnQpKQoJcmV0dXJuOwoKICAgIC8qIHVzZSByZXR1cm5lZCB3aWR0aCAqLwogICAgcC5oID0gci5yaWdodCAtIHIubGVmdDsKICAgIC8qIGFkanVzdCByZXR1cm5lZCBoZWlnaHQgKi8KICAgIHAudiA9IHIuYm90dG9tIC0gci50b3AgLSAyICogZ3VpLmJvcmRlcl9vZmZzZXQ7CiAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9CT1RUT01dKQoJcC52IC09IGd1aS5zY3JvbGxiYXJfaGVpZ2h0OwogICAgcC52IC09IHAudiAlIGd1aS5jaGFyX2hlaWdodDsKICAgIHAudiArPSAyICogZ3VpLmJvcmRlcl93aWR0aDsKICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0JPVFRPTV0pOwoJcC52ICs9IGd1aS5zY3JvbGxiYXJfaGVpZ2h0OwoKICAgIFpvb21XaW5kb3dJZGVhbCh3aGljaFdpbmRvdywgdGhlUGFydCwgJnApOwoKICAgIEdldFdpbmRvd0JvdW5kcyh3aGljaFdpbmRvdywga1dpbmRvd0NvbnRlbnRSZ24sICZyKTsKICAgIGd1aV9yZXNpemVfc2hlbGwoci5yaWdodCAtIHIubGVmdCwgci5ib3R0b20gLSByLnRvcCk7CiAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CiAgICBndWlfc2V0X3NoZWxsc2l6ZShUUlVFLCBGQUxTRSk7Cn0KI2VuZGlmIC8qIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICovCgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogTWFjT1MgRXZlbnQgSGFuZGxpbmcgcHJvY2VkdXJlCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCi8qCiAqIEhhbmRsZSB0aGUgVXBkYXRlIEV2ZW50CiAqLwoKICAgIHZvaWQKZ3VpX21hY19kb1VwZGF0ZUV2ZW50KGV2ZW50KQogICAgRXZlbnRSZWNvcmQJKmV2ZW50Owp7CiAgICBXaW5kb3dQdHIJd2hpY2hXaW5kb3c7CiAgICBHcmFmUHRyCXNhdmVQb3J0OwogICAgUmduSGFuZGxlCXVwZGF0ZVJnbjsKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBSZWN0CXVwZGF0ZVJlY3Q7CiNlbmRpZgogICAgUmVjdAkqdXBkYXRlUmVjdFB0cjsKICAgIFJlY3QJcmM7CiAgICBSZWN0CWdyb3dSZWN0OwogICAgUmduSGFuZGxlCXNhdmVSZ247CgoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICB1cGRhdGVSZ24gPSBOZXdSZ24oKTsKICAgIGlmICh1cGRhdGVSZ24gPT0gTlVMTCkKCXJldHVybjsKI2VuZGlmCgogICAgLyogVGhpcyBjb3VsZCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIgYXMgd2UKICAgICAqIGRvbid0IHJlcXVpcmUgYW55dGhpbmcgZWxzZSBvdXQgb2YgdGhlIGV2ZW50CiAgICAgKi8KICAgIHdoaWNoV2luZG93ID0gKFdpbmRvd1B0cikgZXZlbnQtPm1lc3NhZ2U7CgogICAgLyogU2F2ZSBDdXJyZW50IFBvcnQgKi8KICAgIEdldFBvcnQoJnNhdmVQb3J0KTsKCiAgICAvKiBTZWxlY3QgdGhlIFdpbmRvdydzIFBvcnQgKi8KI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBTZXRQb3J0V2luZG93UG9ydCh3aGljaFdpbmRvdyk7CiNlbHNlCiAgICBTZXRQb3J0KHdoaWNoV2luZG93KTsKI2VuZGlmCgogICAgLyogTGV0J3MgdXBkYXRlIHRoZSB3aW5kb3cgKi8KICAgICAgQmVnaW5VcGRhdGUod2hpY2hXaW5kb3cpOwoJLyogUmVkcmF3IHRoZSBiaWdnZXN0IHJlY3RhbmdsZSBjb3ZlcmluZyB0aGUgYXJlYQoJICogdG8gYmUgdXBkYXRlZC4KCSAqLwojaWZkZWYgVVNFX0NBUkJPTklaRUQKCUdldFBvcnRWaXNpYmxlUmVnaW9uKEdldFdpbmRvd1BvcnQod2hpY2hXaW5kb3cpLCB1cGRhdGVSZ24pOwojIGlmIDAKCS8qIFdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgdG8gdXNlIHRoZSBmb2xsd2luZyBidXQgZG9lc24ndAoJICogc2VlbSB0byB3b3JrIHVuZGVyIE1hY09TIFggKERhbnkpCgkgKi8KCUdldFdpbmRvd1JlZ2lvbih3aGljaFdpbmRvdywga1dpbmRvd1VwZGF0ZVJnbiwgdXBkYXRlUmduKTsKIyBlbmRpZgojZWxzZQoJdXBkYXRlUmduID0gd2hpY2hXaW5kb3ctPnZpc1JnbjsKI2VuZGlmCgkvKiBVc2UgdGhlIEhMb2NrIHVzZWxlc3MgaW4gQ2FyYm9uPyBJcyBpdCBoYXJtZnVsPyovCglITG9jaygoSGFuZGxlKSB1cGRhdGVSZ24pOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKCSAgdXBkYXRlUmVjdFB0ciA9IEdldFJlZ2lvbkJvdW5kcyh1cGRhdGVSZ24sICZ1cGRhdGVSZWN0KTsKIyBpZiAwCgkgIC8qIENvZGUgZnJvbSBvcmlnaW5hbCBDYXJib24gUG9ydCAodXNpbmcgR2V0V2luZG93UmVnaW9uLgoJICAgKiBJIGJlbGlldmUgdGhlIFVwZGF0ZVJnbiBpcyBhbHJlYWR5IGluIGxvY2FsIChEYW55KQoJICAgKi8KCSAgR2xvYmFsVG9Mb2NhbCgmdG9wTGVmdCh1cGRhdGVSZWN0KSk7IC8qIHByZUNhcmJvbj8gKi8KCSAgR2xvYmFsVG9Mb2NhbCgmYm90UmlnaHQodXBkYXRlUmVjdCkpOwojIGVuZGlmCiNlbHNlCgkgIHVwZGF0ZVJlY3RQdHIgPSAmKCp1cGRhdGVSZ24pLT5yZ25CQm94OwojZW5kaWYKCSAgLyogVXBkYXRlIHRoZSBjb250ZW50IChpLmUuIHRoZSB0ZXh0KSAqLwoJICBndWlfcmVkcmF3KHVwZGF0ZVJlY3RQdHItPmxlZnQsIHVwZGF0ZVJlY3RQdHItPnRvcCwKCQkgICAgICB1cGRhdGVSZWN0UHRyLT5yaWdodCAtIHVwZGF0ZVJlY3RQdHItPmxlZnQsCgkJICAgICAgdXBkYXRlUmVjdFB0ci0+Ym90dG9tICAgLSB1cGRhdGVSZWN0UHRyLT50b3ApOwoJICAvKiBDbGVhciB0aGUgYm9yZGVyIGFyZWFzIGlmIG5lZWRlZCAqLwoJICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CgkgIGlmICh1cGRhdGVSZWN0UHRyLT5sZWZ0IDwgRklMTF9YKDApKQoJICB7CgkgICAgU2V0UmVjdCgmcmMsIDAsIDAsIEZJTExfWCgwKSwgRklMTF9ZKFJvd3MpKTsKCSAgICBFcmFzZVJlY3QoJnJjKTsKCSAgfQoJICBpZiAodXBkYXRlUmVjdFB0ci0+dG9wIDwgRklMTF9ZKDApKQoJICB7CgkgICAgU2V0UmVjdCgmcmMsIDAsIDAsIEZJTExfWChDb2x1bW5zKSwgRklMTF9ZKDApKTsKCSAgICBFcmFzZVJlY3QoJnJjKTsKCSAgfQoJICBpZiAodXBkYXRlUmVjdFB0ci0+cmlnaHQgPiBGSUxMX1goQ29sdW1ucykpCgkgIHsKCSAgICBTZXRSZWN0KCZyYywgRklMTF9YKENvbHVtbnMpLCAwLAoJCQkgICBGSUxMX1goQ29sdW1ucykgKyBndWkuYm9yZGVyX29mZnNldCwgRklMTF9ZKFJvd3MpKTsKCSAgICBFcmFzZVJlY3QoJnJjKTsKCSAgfQoJICBpZiAodXBkYXRlUmVjdFB0ci0+Ym90dG9tID4gRklMTF9ZKFJvd3MpKQoJICB7CgkgICAgU2V0UmVjdCgmcmMsIDAsIEZJTExfWShSb3dzKSwgRklMTF9YKENvbHVtbnMpICsgZ3VpLmJvcmRlcl9vZmZzZXQsCgkJCQkJICAgIEZJTExfWShSb3dzKSArIGd1aS5ib3JkZXJfb2Zmc2V0KTsKCSAgICBFcmFzZVJlY3QoJnJjKTsKCSAgfQoJSFVubG9jaygoSGFuZGxlKSB1cGRhdGVSZ24pOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKCURpc3Bvc2VSZ24odXBkYXRlUmduKTsKI2VuZGlmCgoJLyogVXBkYXRlIHNjcm9sbGJhcnMgKi8KCURyYXdDb250cm9scyh3aGljaFdpbmRvdyk7CgoJLyogVXBkYXRlIHRoZSBHcm93Qm94ICovCgkvKiBUYWtlbiBmcm9tIEZBUSAzMy0yNyAqLwoJc2F2ZVJnbiA9IE5ld1JnbigpOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKCUdldFdpbmRvd0JvdW5kcyh3aGljaFdpbmRvdywga1dpbmRvd0dyb3dSZ24sICZncm93UmVjdCk7CiNlbHNlCglncm93UmVjdCA9IHdoaWNoV2luZG93LT5wb3J0UmVjdDsKCWdyb3dSZWN0LnRvcCAgPSBncm93UmVjdC5ib3R0b20gLSAxNTsKCWdyb3dSZWN0LmxlZnQgPSBncm93UmVjdC5yaWdodCAgLSAxNTsKI2VuZGlmCglHZXRDbGlwKHNhdmVSZ24pOwoJQ2xpcFJlY3QoJmdyb3dSZWN0KTsKCURyYXdHcm93SWNvbih3aGljaFdpbmRvdyk7CglTZXRDbGlwKHNhdmVSZ24pOwoJRGlzcG9zZVJnbihzYXZlUmduKTsKICAgICAgRW5kVXBkYXRlKHdoaWNoV2luZG93KTsKCiAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIFBvcnQgKi8KICAgIFNldFBvcnQoc2F2ZVBvcnQpOwp9CgovKgogKiBIYW5kbGUgdGhlIGFjdGl2YXRlL2RlYWN0aXZhdGUgZXZlbnQKICogKGFwcGx5IHRvIGEgd2luZG93KQogKi8KICAgIHZvaWQKZ3VpX21hY19kb0FjdGl2YXRlRXZlbnQoZXZlbnQpCiAgICBFdmVudFJlY29yZAkqZXZlbnQ7CnsKICAgIFdpbmRvd1B0cgl3aGljaFdpbmRvdzsKCiAgICB3aGljaFdpbmRvdyA9IChXaW5kb3dQdHIpIGV2ZW50LT5tZXNzYWdlOwogICAgaWYgKChldmVudC0+bW9kaWZpZXJzKSAmIGFjdGl2ZUZsYWcpCgkvKiBBY3RpdmF0ZSAqLwoJZ3VpX2ZvY3VzX2NoYW5nZShUUlVFKTsKICAgIGVsc2UKICAgIHsKCS8qIERlYWN0aXZhdGUgKi8KCWd1aV9mb2N1c19jaGFuZ2UoRkFMU0UpOwovKglET04nVCBLTk9XIHdoYXQgdGhlIGNvZGUgYmVsb3cgd2FzIGRvaW5nCglmb3VuZCBpbiB0aGUgZGVhY3RpdmF0ZSBjbGF1c2UsIGJ1dCB0aGUKCWNsYXVzZSB3cml0dGluZyBUUlVFIGludG8gaW5fZm9jdXMgKEJVRykKICovCgojaWYgMAkvKiBSZW1vdmVkIGJ5IERhbnkgYXMgcGVyIGFib3ZlIEp1bmUgMjAwMSAqLwoJYV9ib29sID0gZmFsc2U7CglTZXRQcmVzZXJ2ZUdseXBoKGFfYm9vbCk7CglTZXRPdXRsaW5lUHJlZmVycmVkKGFfYm9vbCk7CiNlbmRpZgogICAgfQp9CgoKLyoKICogSGFuZGxlIHRoZSBzdXNwZW5kL3Jlc3VtZSBldmVudAogKiAoYXBwbHkgdG8gdGhlIGFwcGxpY2F0aW9uKQogKi8KICAgIHZvaWQKZ3VpX21hY19kb1N1c3BlbmRFdmVudChldmVudCkKICAgIEV2ZW50UmVjb3JkCSpldmVudDsKewogICAgLyogVGhlIGZyb250bW9zdCBhcHBsaWNhdGlvbiBqdXN0IGNoYW5nZWQgKi8KCiAgICAvKiBOT1RFOiB0aGUgc3VzcGVuZCBtYXkgaGFwcGVuIGJlZm9yZSB0aGUgZGVhY3RpdmF0ZQogICAgICogICAgICAgc2VlbiBvbiBNYWNPUyBYCiAgICAgKi8KCiAgICAvKiBNYXkgbm90IG5lZWQgdG8gY2hhbmdlIGZvY3VzIGFzIHRoZSB3aW5kb3cgd2lsbAogICAgICogZ2V0IGFuIGFjdGl2YXRlL2Rlc2FjdGl2YXRlIGV2ZW50CiAgICAgKi8KICAgIGlmIChldmVudC0+bWVzc2FnZSAmIDEpCgkvKiBSZXN1bWUgKi8KCWd1aV9mb2N1c19jaGFuZ2UoVFJVRSk7CiAgICBlbHNlCgkvKiBTdXNwZW5kICovCglndWlfZm9jdXNfY2hhbmdlKEZBTFNFKTsKfQoKLyoKICogSGFuZGxlIHRoZSBrZXkKICovCiNpZmRlZiBVU0VfQ0FSQk9OS0VZSEFORExFUgojIGRlZmluZSBJTkxJTkVfS0VZX0JVRkZFUl9TSVpFIDgwCiAgICBzdGF0aWMgcGFzY2FsIE9TU3RhdHVzCmd1aV9tYWNfZG9LZXlFdmVudENhcmJvbihFdmVudEhhbmRsZXJDYWxsUmVmIG5leHRIYW5kbGVyLCBFdmVudFJlZiB0aGVFdmVudCwKCXZvaWQgKmRhdGEpCnsKICAgIC8qIE11bHRpYnl0ZS1mcmllbmRseSBrZXkgZXZlbnQgaGFuZGxlciAqLwogICAgT1NTdGF0dXMJZSA9IC0xOwogICAgVUludDMyCWFjdHVhbFNpemU7CiAgICBVbmlDaGFyCSp0ZXh0OwogICAgY2hhcl91CXJlc3VsdFtJTkxJTkVfS0VZX0JVRkZFUl9TSVpFXTsKICAgIHNob3J0CWxlbiA9IDA7CiAgICBVSW50MzIJa2V5X3N5bTsKICAgIGNoYXIJY2hhcmNvZGU7CiAgICBpbnQJCWtleV9jaGFyOwogICAgVUludDMyCW1vZGlmaWVyczsKICAgIHNpemVfdAllbmNMZW47CiAgICBjaGFyX3UJKnRvID0gTlVMTDsKICAgIEJvb2xlYW4JaXNTcGVjaWFsID0gRkFMU0U7CiAgICBpbnQJCWk7CgogICAgLyogTWFzayB0aGUgbW91c2UgKGFzIHBlciB1c2VyIHNldHRpbmcpICovCiAgICBpZiAocF9taCkKCU9ic2N1cmVDdXJzb3IoKTsKCiAgICBkbwogICAgewoJaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LCBrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRUZXh0LAoJCSAgICB0eXBlVW5pY29kZVRleHQsIE5VTEwsIDAsICZhY3R1YWxTaXplLCBOVUxMKSkKCSAgICBicmVhazsKCgl0ZXh0ID0gKFVuaUNoYXIgKilhbGxvYyhhY3R1YWxTaXplKTsKCglpZiAodGV4dCkKCXsKCSAgICBkbwoJICAgIHsKCQlpZiAobm9FcnIgIT0gR2V0RXZlbnRQYXJhbWV0ZXIodGhlRXZlbnQsCgkJCSAgICBrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRUZXh0LAoJCQkgICAgdHlwZVVuaWNvZGVUZXh0LCBOVUxMLCBhY3R1YWxTaXplLCBOVUxMLCB0ZXh0KSkKCQkgICAgYnJlYWs7CgkJRXZlbnRSZWYga2V5RXZlbnQ7CgkJaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKHRoZUV2ZW50LAoJCQkgICAga0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kS2V5Ym9hcmRFdmVudCwKCQkJICAgIHR5cGVFdmVudFJlZiwgTlVMTCwgc2l6ZW9mKEV2ZW50UmVmKSwgTlVMTCwgJmtleUV2ZW50KSkKCQkgICAgYnJlYWs7CgkJaWYgKG5vRXJyICE9IEdldEV2ZW50UGFyYW1ldGVyKGtleUV2ZW50LAoJCQkgICAga0V2ZW50UGFyYW1LZXlNb2RpZmllcnMsCgkJCSAgICB0eXBlVUludDMyLCBOVUxMLCBzaXplb2YoVUludDMyKSwgTlVMTCwgJm1vZGlmaWVycykpCgkJICAgIGJyZWFrOwoJCWlmIChub0VyciAhPSBHZXRFdmVudFBhcmFtZXRlcihrZXlFdmVudCwKCQkJICAgIGtFdmVudFBhcmFtS2V5Q29kZSwKCQkJICAgIHR5cGVVSW50MzIsIE5VTEwsIHNpemVvZihVSW50MzIpLCBOVUxMLCAma2V5X3N5bSkpCgkJICAgIGJyZWFrOwoJCWlmIChub0VyciAhPSBHZXRFdmVudFBhcmFtZXRlcihrZXlFdmVudCwKCQkJICAgIGtFdmVudFBhcmFtS2V5TWFjQ2hhckNvZGVzLAoJCQkgICAgdHlwZUNoYXIsIE5VTEwsIHNpemVvZihjaGFyKSwgTlVMTCwgJmNoYXJjb2RlKSkKCQkgICAgYnJlYWs7CgoJCWtleV9jaGFyID0gY2hhcmNvZGU7CgoJCWlmIChtb2RpZmllcnMgJiBjb250cm9sS2V5KQoJCXsKCQkgICAgaWYgKChtb2RpZmllcnMgJiB+KGNvbnRyb2xLZXl8c2hpZnRLZXkpKSA9PSAwCgkJCSAgICAmJiAoa2V5X2NoYXIgPT0gJzInIHx8IGtleV9jaGFyID09ICc2JykpCgkJICAgIHsKCQkJLyogQ1RSTC1eIGFuZCBDVFJMLUAgZG9uJ3Qgd29yayBpbiB0aGUgbm9ybWFsIHdheS4gKi8KCQkJaWYgKGtleV9jaGFyID09ICcyJykKCQkJICAgIGtleV9jaGFyID0gQ3RybF9BVDsKCQkJZWxzZQoJCQkgICAga2V5X2NoYXIgPSBDdHJsX0hBVDsKCgkJCXRleHRbMF0gPSAoVW5pQ2hhcilrZXlfY2hhcjsKCQkJbW9kaWZpZXJzID0gMDsKCQkgICAgfQoJCX0KCgkJaWYgKG1vZGlmaWVycyAmIGNtZEtleSkKI2lmbmRlZiBVU0VfQ01EX0tFWQoJCSAgICBicmVhazsgIC8qIExldCBzeXN0ZW0gaGFuZGxlIENtZCsuLi4gKi8KI2Vsc2UKCQl7CgkJICAgIC8qIEludGVyY2VwdCBDTUQtLiAqLwoJCSAgICBpZiAoa2V5X2NoYXIgPT0gJy4nKQoJCQlnb3RfaW50ID0gVFJVRTsKCgkJICAgIC8qIENvbnZlcnQgdGhlIG1vZGlmaWVycyAqLwoJCSAgICBtb2RpZmllcnMgPSBFdmVudE1vZGlmaWVyczJWaW1Nb2RpZmllcnMobW9kaWZpZXJzKTsKCgkJICAgIC8qIEZvbGxvd2luZyBjb2RlIHRvIHNpbXBsaWZ5IGFuZCBjb25zb2xpZGF0ZSBtb2RpZmllcnMKCQkgICAgICogdGFrZW4gbGliZXJhbGx5IGZyb20gZ3VpX3c0OC5jICovCgoJCSAgICBrZXlfY2hhciA9IHNpbXBsaWZ5X2tleShrZXlfY2hhciwgKGludCAqKSZtb2RpZmllcnMpOwoKCQkgICAgLyogcmVtb3ZlIFNISUZUIGZvciBrZXlzIHRoYXQgYXJlIGFscmVhZHkgc2hpZnRlZCwgZS5nLiwKCQkgICAgICogJygnIGFuZCAnKicgKi8KCQkgICAgaWYgKGtleV9jaGFyIDwgMHgxMDAgJiYKCQkJICAgICFpc2FscGhhKGtleV9jaGFyKSAmJiBpc3ByaW50KGtleV9jaGFyKSkKCQkJbW9kaWZpZXJzICY9IH5NT0RfTUFTS19TSElGVDsKCgkJICAgIC8qIEludGVycHJldCBNRVRBLCBpbmNsdWRlIFNISUZULCBldGMuICovCgkJICAgIGtleV9jaGFyID0gZXh0cmFjdF9tb2RpZmllcnMoa2V5X2NoYXIsIChpbnQgKikmbW9kaWZpZXJzKTsKCQkgICAgaWYgKGtleV9jaGFyID09IENTSSkKCQkJa2V5X2NoYXIgPSBLX0NTSTsKCgkJICAgIGlmIChtb2RpZmllcnMpCgkJICAgIHsKCQkJcmVzdWx0W2xlbisrXSA9IENTSTsKCQkJcmVzdWx0W2xlbisrXSA9IEtTX01PRElGSUVSOwoJCQlyZXN1bHRbbGVuKytdID0gbW9kaWZpZXJzOwoJCSAgICB9CgoJCSAgICBpc1NwZWNpYWwgPSBUUlVFOwoJCX0KI2VuZGlmCgkJZWxzZQoJCXsKCQkgICAgLyogRmluZCB0aGUgc3BlY2lhbCBrZXkgKGVnLiwgZm9yIGN1cnNvciBrZXlzKSAqLwoJCSAgICBpZiAoIShhY3R1YWxTaXplID4gc2l6ZW9mKFVuaUNoYXIpKSAmJgoJCQkgICAgKCh0ZXh0WzBdIDwgMHgyMCkgfHwgKHRleHRbMF0gPT0gMHg3ZikpKQoJCSAgICB7CgkJCWZvciAoaSA9IDA7IHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltICE9IChLZXlTeW0pMDsgKytpKQoJCQkgICAgaWYgKHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltID09IGtleV9zeW0pCgkJCSAgICB7CgkJCQlrZXlfY2hhciA9IFRPX1NQRUNJQUwoc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMCwKCQkJCQlzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxKTsKCQkJCWtleV9jaGFyID0gc2ltcGxpZnlfa2V5KGtleV9jaGFyLAoJCQkJCShpbnQgKikmbW9kaWZpZXJzKTsKCQkJCWlzU3BlY2lhbCA9IFRSVUU7CgkJCQlicmVhazsKCQkJICAgIH0KCQkgICAgfQoJCX0KCgkJaWYgKGlzU3BlY2lhbCAmJiBJU19TUEVDSUFMKGtleV9jaGFyKSkKCQl7CgkJICAgIHJlc3VsdFtsZW4rK10gPSBDU0k7CgkJICAgIHJlc3VsdFtsZW4rK10gPSBLX1NFQ09ORChrZXlfY2hhcik7CgkJICAgIHJlc3VsdFtsZW4rK10gPSBLX1RISVJEKGtleV9jaGFyKTsKCQl9CgkJZWxzZQoJCXsKCQkgICAgZW5jTGVuID0gYWN0dWFsU2l6ZTsKCQkgICAgdG8gPSBtYWNfdXRmMTZfdG9fZW5jKHRleHQsIGFjdHVhbFNpemUsICZlbmNMZW4pOwoJCX0KCgkJaWYgKHRvKQoJCXsKCQkgICAgLyogVGhpcyBpcyBiYXNpY2FsbHkgYWRkX3RvX2lucHV0X2J1Zl9jc2koKSAqLwoJCSAgICBmb3IgKGkgPSAwOyBpIDwgZW5jTGVuICYmIGxlbiA8IChJTkxJTkVfS0VZX0JVRkZFUl9TSVpFLTEpOyArK2kpCgkJICAgIHsKCQkJcmVzdWx0W2xlbisrXSA9IHRvW2ldOwoJCQlpZiAodG9baV0gPT0gQ1NJKQoJCQl7CgkJCSAgICByZXN1bHRbbGVuKytdID0gS1NfRVhUUkE7CgkJCSAgICByZXN1bHRbbGVuKytdID0gKGludClLRV9DU0k7CgkJCX0KCQkgICAgfQoJCSAgICB2aW1fZnJlZSh0byk7CgkJfQoKCQlhZGRfdG9faW5wdXRfYnVmKHJlc3VsdCwgbGVuKTsKCQllID0gbm9FcnI7CgkgICAgfQoJICAgIHdoaWxlICgwKTsKCgkgICAgdmltX2ZyZWUodGV4dCk7CgkgICAgaWYgKGUgPT0gbm9FcnIpCgkgICAgewoJCS8qIEZha2UgZXZlbnQgdG8gd2FrZSB1cCBXTkUgKHJlcXVpcmVkIHRvIGdldAoJCSAqIGtleSByZXBlYXQgd29ya2luZyAqLwoJCVBvc3RFdmVudChrZXlVcCwgMCk7CgkJcmV0dXJuIG5vRXJyOwoJICAgIH0KCX0KICAgIH0KICAgIHdoaWxlICgwKTsKCiAgICByZXR1cm4gQ2FsbE5leHRFdmVudEhhbmRsZXIobmV4dEhhbmRsZXIsIHRoZUV2ZW50KTsKfQojZWxzZQogICAgdm9pZApndWlfbWFjX2RvS2V5RXZlbnQoRXZlbnRSZWNvcmQgKnRoZUV2ZW50KQp7CiAgICAvKiBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgQ09NTUFORCBLRVkgKi8KICAgIGxvbmcJCW1lbnU7CiAgICB1bnNpZ25lZCBjaGFyCXN0cmluZ1syMF07CiAgICBzaG9ydAkJbnVtLCBpOwogICAgc2hvcnQJCWxlbiA9IDA7CiAgICBLZXlTeW0JCWtleV9zeW07CiAgICBpbnQJCQlrZXlfY2hhcjsKICAgIGludAkJCW1vZGlmaWVyczsKICAgIGludAkJCXNpbXBsaWZ5ID0gRkFMU0U7CgogICAgLyogTWFzayB0aGUgbW91c2UgKGFzIHBlciB1c2VyIHNldHRpbmcpICovCiAgICBpZiAocF9taCkKCU9ic2N1cmVDdXJzb3IoKTsKCiAgICAvKiBHZXQgdGhlIGtleSBjb2RlIGFuZCBpdCdzIEFTQ0lJIHJlcHJlc2VudGF0aW9uICovCiAgICBrZXlfc3ltID0gKCh0aGVFdmVudC0+bWVzc2FnZSAmIGtleUNvZGVNYXNrKSA+PiA4KTsKICAgIGtleV9jaGFyID0gdGhlRXZlbnQtPm1lc3NhZ2UgJiBjaGFyQ29kZU1hc2s7CiAgICBudW0gPSAxOwoKICAgIC8qIEludGVyY2VwdCBDVFJMLUMgKi8KICAgIGlmICh0aGVFdmVudC0+bW9kaWZpZXJzICYgY29udHJvbEtleSkKICAgIHsKCWlmIChrZXlfY2hhciA9PSBDdHJsX0MgJiYgY3RybF9jX2ludGVycnVwdHMpCgkgICAgZ290X2ludCA9IFRSVUU7CgllbHNlIGlmICgodGhlRXZlbnQtPm1vZGlmaWVycyAmIH4oY29udHJvbEtleXxzaGlmdEtleSkpID09IDAKCQkmJiAoa2V5X2NoYXIgPT0gJzInIHx8IGtleV9jaGFyID09ICc2JykpCgl7CgkgICAgLyogQ1RSTC1eIGFuZCBDVFJMLUAgZG9uJ3Qgd29yayBpbiB0aGUgbm9ybWFsIHdheS4gKi8KCSAgICBpZiAoa2V5X2NoYXIgPT0gJzInKQoJCWtleV9jaGFyID0gQ3RybF9BVDsKCSAgICBlbHNlCgkJa2V5X2NoYXIgPSBDdHJsX0hBVDsKCSAgICB0aGVFdmVudC0+bW9kaWZpZXJzID0gMDsKCX0KICAgIH0KCiAgICAvKiBJbnRlcmNlcHQgQ01ELS4gKi8KICAgIGlmICh0aGVFdmVudC0+bW9kaWZpZXJzICYgY21kS2V5KQoJaWYgKGtleV9jaGFyID09ICcuJykKCSAgICBnb3RfaW50ID0gVFJVRTsKCiAgICAvKiBIYW5kbGUgY29tbWFuZCBrZXkgYXMgcGVyIG1lbnUgKi8KICAgIC8qIFRPRE86IHNob3VsZCBvdmVycmlkZSBiZSBhbGxvd2VkPyBSZXF1aXJlIFlBTyBvciBjb3VsZCB1c2UgJ3dpbmFsdGtleScgKi8KICAgIGlmICh0aGVFdmVudC0+bW9kaWZpZXJzICYgY21kS2V5KQoJLyogT25seSBhY2NlcHQgQ01EIGFsb25lIG9yIHdpdGggQ0FQTE9DS1MgYW5kIHRoZSBtb3VzZSBidXR0b24uCgkgKiBXaHkgdGhlIG1vdXNlIGJ1dHRvbj8gKi8KCWlmICgodGhlRXZlbnQtPm1vZGlmaWVycyAmICh+KGNtZEtleSB8IGJ0blN0YXRlIHwgYWxwaGFMb2NrKSkpID09IDApCgl7CgkgICAgbWVudSA9IE1lbnVLZXkoa2V5X2NoYXIpOwoJICAgIGlmIChIaVdvcmQobWVudSkpCgkgICAgewoJCWd1aV9tYWNfaGFuZGxlX21lbnUobWVudSk7CgkJcmV0dXJuOwoJICAgIH0KCX0KCiAgICAvKiBDb252ZXJ0IHRoZSBtb2RpZmllcnMgKi8KICAgIG1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vZGlmaWVycyh0aGVFdmVudC0+bW9kaWZpZXJzKTsKCgogICAgLyogSGFuZGxlIHNwZWNpYWwga2V5cy4gKi8KI2lmIDAKICAgIC8qIFdoeSBoYXMgdGhpcyBiZWVuIHJlbW92ZWQ/ICovCiAgICBpZgkoISh0aGVFdmVudC0+bW9kaWZpZXJzICYgKGNtZEtleSB8IGNvbnRyb2xLZXkgfCByaWdodENvbnRyb2xLZXkpKSkKI2VuZGlmCiAgICB7CgkvKiBGaW5kIHRoZSBzcGVjaWFsIGtleSAoZm9yIG5vbi1wcmludGFibGUga2V5dF9jaGFyKSAqLwoJaWYgICgoa2V5X2NoYXIgPCAweDIwKSB8fCAoa2V5X2NoYXIgPT0gMHg3ZikpCgkgICAgZm9yIChpID0gMDsgc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gIT0gKEtleVN5bSkwOyBpKyspCgkJaWYgKHNwZWNpYWxfa2V5c1tpXS5rZXlfc3ltID09IGtleV9zeW0pCgkJewojIGlmIDAKCQkgICAgLyogV2UgY3VycmVudGx5IGRvbid0IGhhdmUgbm90IHNvIHNwZWNpYWwga2V5ICovCgkJICAgIGlmIChzcGVjaWFsX2tleXNbaV0udmltX2NvZGUxID09IE5VTCkKCQkJa2V5X2NoYXIgPSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwOwoJCSAgICBlbHNlCiMgZW5kaWYKCQkJa2V5X2NoYXIgPSBUT19TUEVDSUFMKHNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTAsCgkJCQkJCXNwZWNpYWxfa2V5c1tpXS52aW1fY29kZTEpOwoJCSAgICBzaW1wbGlmeSA9IFRSVUU7CgkJICAgIGJyZWFrOwoJCX0KICAgIH0KCiAgICAvKiBGb3Igc29tZSBrZXlzIHRoZSBtb2RpZmllciBpcyBpbmNsdWRlZCBpbiB0aGUgY2hhciBpdHNlbGYuICovCiAgICBpZiAoc2ltcGxpZnkgfHwga2V5X2NoYXIgPT0gVEFCIHx8IGtleV9jaGFyID09ICcgJykKCWtleV9jaGFyID0gc2ltcGxpZnlfa2V5KGtleV9jaGFyLCAmbW9kaWZpZXJzKTsKCiAgICAvKiBBZGQgdGhlIG1vZGlmaWVyIHRvIHRoZSBpbnB1dCBidSBpZiBuZWVkZWQgKi8KICAgIC8qIERvIG5vdCB3YW50IFNISUZULUEgb3IgQ1RSTC1BIHdpdGggbW9kaWZpZXIgKi8KICAgIGlmICghSVNfU1BFQ0lBTChrZXlfY2hhcikKCSAgICAmJiBrZXlfc3ltICE9IHZrX1NwYWNlCgkgICAgJiYga2V5X3N5bSAhPSB2a19UYWIKCSAgICAmJiBrZXlfc3ltICE9IHZrX1JldHVybgoJICAgICYmIGtleV9zeW0gIT0gdmtfRW50ZXIKCSAgICAmJiBrZXlfc3ltICE9IHZrX0VzYykKICAgIHsKI2lmIDEKICAgIC8qIENsZWFyIG1vZGlmaWVycyB3aGVuIG9ubHkgb25lIG1vZGlmaWVyIGlzIHNldCAqLwoJaWYgKChtb2RpZmllcnMgPT0gTU9EX01BU0tfU0hJRlQpCgkJfHwgKG1vZGlmaWVycyA9PSBNT0RfTUFTS19DVFJMKQoJCXx8IChtb2RpZmllcnMgPT0gTU9EX01BU0tfQUxUKSkKCSAgICBtb2RpZmllcnMgPSAwOwojZWxzZQoJaWYgKG1vZGlmaWVycyAmIE1PRF9NQVNLX0NUUkwpCgkgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzICYgfk1PRF9NQVNLX0NUUkw7CglpZiAobW9kaWZpZXJzICYgTU9EX01BU0tfQUxUKQoJICAgIG1vZGlmaWVycyA9IG1vZGlmaWVycyAmIH5NT0RfTUFTS19BTFQ7CglpZiAobW9kaWZpZXJzICYgTU9EX01BU0tfU0hJRlQpCgkgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzICYgfk1PRF9NQVNLX1NISUZUOwojZW5kaWYKICAgIH0KCWlmIChtb2RpZmllcnMpCgl7CgkgICAgc3RyaW5nW2xlbisrXSA9IENTSTsKCSAgICBzdHJpbmdbbGVuKytdID0gS1NfTU9ESUZJRVI7CgkgICAgc3RyaW5nW2xlbisrXSA9IG1vZGlmaWVyczsKCX0KCglpZiAoSVNfU1BFQ0lBTChrZXlfY2hhcikpCgl7CgkgICAgc3RyaW5nW2xlbisrXSA9IENTSTsKCSAgICBzdHJpbmdbbGVuKytdID0gS19TRUNPTkQoa2V5X2NoYXIpOwoJICAgIHN0cmluZ1tsZW4rK10gPSBLX1RISVJEKGtleV9jaGFyKTsKCX0KCWVsc2UKCXsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICAvKiBDb252ZXJ0IGNoYXJhY3RlcnMgd2hlbiBuZWVkZWQgKGUuZy4sIGZyb20gTWFjUm9tYW4gdG8gbGF0aW4xKS4KCSAgICAgKiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgdGhlIE5VTCBieXRlLiAqLwoJICAgIGlmIChpbnB1dF9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FICYmIGtleV9jaGFyID4gMCkKCSAgICB7CgkJY2hhcl91CWZyb21bMl0sICp0bzsKCQlpbnQJbDsKCgkJZnJvbVswXSA9IGtleV9jaGFyOwoJCWZyb21bMV0gPSBOVUw7CgkJbCA9IDE7CgkJdG8gPSBzdHJpbmdfY29udmVydCgmaW5wdXRfY29udiwgZnJvbSwgJmwpOwoJCWlmICh0byAhPSBOVUxMKQoJCXsKCQkgICAgZm9yIChpID0gMDsgaSA8IGwgJiYgbGVuIDwgMTk7IGkrKykKCQkgICAgewoJCQlpZiAodG9baV0gPT0gQ1NJKQoJCQl7CgkJCSAgICBzdHJpbmdbbGVuKytdID0gS1NfRVhUUkE7CgkJCSAgICBzdHJpbmdbbGVuKytdID0gS0VfQ1NJOwoJCQl9CgkJCWVsc2UKCQkJICAgIHN0cmluZ1tsZW4rK10gPSB0b1tpXTsKCQkgICAgfQoJCSAgICB2aW1fZnJlZSh0byk7CgkJfQoJCWVsc2UKCQkgICAgc3RyaW5nW2xlbisrXSA9IGtleV9jaGFyOwoJICAgIH0KCSAgICBlbHNlCiNlbmRpZgoJCXN0cmluZ1tsZW4rK10gPSBrZXlfY2hhcjsKCX0KCglpZiAobGVuID09IDEgJiYgc3RyaW5nWzBdID09IENTSSkKCXsKCSAgICAvKiBUdXJuIENTSSBpbnRvIEtfQ1NJLiAqLwoJICAgIHN0cmluZ1sgbGVuKysgXSA9IEtTX0VYVFJBOwoJICAgIHN0cmluZ1sgbGVuKysgXSA9IEtFX0NTSTsKCX0KCiAgICBhZGRfdG9faW5wdXRfYnVmKHN0cmluZywgbGVuKTsKfQojZW5kaWYKCi8qCiAqIEhhbmRsZSBNb3VzZUNsaWNrCiAqLwogICAgdm9pZApndWlfbWFjX2RvTW91c2VEb3duRXZlbnQodGhlRXZlbnQpCiAgICBFdmVudFJlY29yZCAqdGhlRXZlbnQ7CnsKICAgIHNob3J0CQl0aGVQYXJ0OwogICAgV2luZG93UHRyCQl3aGljaFdpbmRvdzsKCiAgICB0aGVQYXJ0ID0gRmluZFdpbmRvdyh0aGVFdmVudC0+d2hlcmUsICZ3aGljaFdpbmRvdyk7CgogICAgc3dpdGNoICh0aGVQYXJ0KQogICAgewoJY2FzZSAoaW5EZXNrKToKCSAgICAvKiBUT0RPOiB3aGF0IHRvIGRvPyAqLwoJICAgIGJyZWFrOwoKCWNhc2UgKGluTWVudUJhcik6CgkgICAgZ3VpX21hY19oYW5kbGVfbWVudShNZW51U2VsZWN0KHRoZUV2ZW50LT53aGVyZSkpOwoJICAgIGJyZWFrOwoKCWNhc2UgKGluQ29udGVudCk6CgkgICAgZ3VpX21hY19kb0luQ29udGVudENsaWNrKHRoZUV2ZW50LCB3aGljaFdpbmRvdyk7CgkgICAgYnJlYWs7CgoJY2FzZSAoaW5EcmFnKToKCSAgICBndWlfbWFjX2RvSW5EcmFnQ2xpY2sodGhlRXZlbnQtPndoZXJlLCB3aGljaFdpbmRvdyk7CgkgICAgYnJlYWs7CgoJY2FzZSAoaW5Hcm93KToKCSAgICBndWlfbWFjX2RvSW5Hcm93Q2xpY2sodGhlRXZlbnQtPndoZXJlLCB3aGljaFdpbmRvdyk7CgkgICAgYnJlYWs7CgoJY2FzZSAoaW5Hb0F3YXkpOgoJICAgIGlmIChUcmFja0dvQXdheSh3aGljaFdpbmRvdywgdGhlRXZlbnQtPndoZXJlKSkKCQlndWlfc2hlbGxfY2xvc2VkKCk7CgkgICAgYnJlYWs7CgoJY2FzZSAoaW5ab29tSW4pOgoJY2FzZSAoaW5ab29tT3V0KToKI2lmZGVmIFVTRV9DQVJCT05JWkVECgkgICAgZ3VpX21hY19kb0luWm9vbUNsaWNrKHRoZUV2ZW50LCB3aGljaFdpbmRvdyk7CiNlbmRpZgoJICAgIGJyZWFrOwogICAgfQp9CgovKgogKiBIYW5kbGUgTW91c2VNb3ZlZAogKiBbdGhpcyBldmVudCBpcyBhIG1vdmluZyBpbiBhbmQgb3V0IG9mIGEgcmVnaW9uXQogKi8KICAgIHZvaWQKZ3VpX21hY19kb01vdXNlTW92ZWRFdmVudChldmVudCkKICAgIEV2ZW50UmVjb3JkICpldmVudDsKewogICAgUG9pbnQgICB0aGVQb2ludDsKICAgIGludF91ICAgdmltTW9kaWZpZXJzOwoKICAgIHRoZVBvaW50ID0gZXZlbnQtPndoZXJlOwogICAgR2xvYmFsVG9Mb2NhbCgmdGhlUG9pbnQpOwogICAgdmltTW9kaWZpZXJzID0gRXZlbnRNb2RpZmllcnMyVmltTW91c2VNb2RpZmllcnMoZXZlbnQtPm1vZGlmaWVycyk7CgogICAgaWYgKCFCdXR0b24oKSkKCWd1aV9tb3VzZV9tb3ZlZCh0aGVQb2ludC5oLCB0aGVQb2ludC52KTsKICAgIGVsc2UKI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCglpZiAoIWNsaWNrSXNQb3B1cCkKI2VuZGlmCgkgICAgZ3VpX3NlbmRfbW91c2VfZXZlbnQoTU9VU0VfRFJBRywgdGhlUG9pbnQuaCwKCQkJCQkgICAgIHRoZVBvaW50LnYsIEZBTFNFLCB2aW1Nb2RpZmllcnMpOwoKICAgIC8qIFJlc2V0IHRoZSByZWdpb24gZnJvbSB3aGljaCB3ZSBtb3ZlIGluIGFuZCBvdXQgKi8KICAgIFNldFJlY3QoJmRyYWdSZWN0LCBGSUxMX1goWF8yX0NPTCh0aGVQb2ludC5oKSksCgkJCUZJTExfWShZXzJfUk9XKHRoZVBvaW50LnYpKSwKCQkJRklMTF9YKFhfMl9DT0wodGhlUG9pbnQuaCkrMSksCgkJCUZJTExfWShZXzJfUk9XKHRoZVBvaW50LnYpKzEpKTsKCiAgICBpZiAoZHJhZ1JlY3RFbmJsKQoJZHJhZ1JlY3RDb250cm9sID0ga0NyZWF0ZVJlY3Q7Cgp9CgovKgogKiBIYW5kbGUgdGhlIG1vdXNlIHJlbGVhc2UKICovCiAgICB2b2lkCmd1aV9tYWNfZG9Nb3VzZVVwRXZlbnQodGhlRXZlbnQpCiAgICBFdmVudFJlY29yZCAqdGhlRXZlbnQ7CnsKICAgIFBvaW50ICAgdGhlUG9pbnQ7CiAgICBpbnRfdSAgIHZpbU1vZGlmaWVyczsKCiAgICAvKiBUT0RPOiBQcm9wZXJseSBjb252ZXJ0IHRoZSBDb250ZXh0dWFsIG1lbnUgbW91c2UtdXAgKi8KICAgIC8qICAgICAgIFBvdGVudGlhbCBzb3VyY2Ugb2YgdGhlIGRvdWJsZSBtZW51ICovCiAgICBsYXN0TW91c2VUaWNrID0gdGhlRXZlbnQtPndoZW47CiAgICBkcmFnUmVjdEVuYmwgPSBGQUxTRTsKICAgIGRyYWdSZWN0Q29udHJvbCA9IGtDcmVhdGVFbXB0eTsKICAgIHRoZVBvaW50ID0gdGhlRXZlbnQtPndoZXJlOwogICAgR2xvYmFsVG9Mb2NhbCgmdGhlUG9pbnQpOwoKICAgIHZpbU1vZGlmaWVycyA9IEV2ZW50TW9kaWZpZXJzMlZpbU1vdXNlTW9kaWZpZXJzKHRoZUV2ZW50LT5tb2RpZmllcnMpOwojaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKICAgIGlmIChjbGlja0lzUG9wdXApCiAgICB7Cgl2aW1Nb2RpZmllcnMgJj0gfk1PVVNFX0NUUkw7CgljbGlja0lzUG9wdXAgPSBGQUxTRTsKICAgIH0KI2VuZGlmCiAgICBndWlfc2VuZF9tb3VzZV9ldmVudChNT1VTRV9SRUxFQVNFLCB0aGVQb2ludC5oLCB0aGVQb2ludC52LCBGQUxTRSwgdmltTW9kaWZpZXJzKTsKfQoKI2lmZGVmIFVTRV9NT1VTRVdIRUVMCiAgICBzdGF0aWMgcGFzY2FsIE9TU3RhdHVzCmd1aV9tYWNfbW91c2Vfd2hlZWwoRXZlbnRIYW5kbGVyQ2FsbFJlZiBuZXh0SGFuZGxlciwgRXZlbnRSZWYgdGhlRXZlbnQsCgkJCQkJCQkJICAgdm9pZCAqZGF0YSkKewogICAgRXZlbnRSZWYJYm9ndXNFdmVudDsKICAgIFBvaW50CXBvaW50OwogICAgUmVjdAlib3VuZHM7CiAgICBVSW50MzIJbW9kOwogICAgU0ludDMyCWRlbHRhOwogICAgaW50X3UJdmltX21vZDsKCiAgICBpZiAobm9FcnIgIT0gR2V0RXZlbnRQYXJhbWV0ZXIodGhlRXZlbnQsIGtFdmVudFBhcmFtTW91c2VXaGVlbERlbHRhLAoJCQkgICAgICB0eXBlU0ludDMyLCBOVUxMLCBzaXplb2YoU0ludDMyKSwgTlVMTCwgJmRlbHRhKSkKCWdvdG8gYmFpbDsKICAgIGlmIChub0VyciAhPSBHZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwga0V2ZW50UGFyYW1Nb3VzZUxvY2F0aW9uLAoJCQkgICAgICB0eXBlUURQb2ludCwgTlVMTCwgc2l6ZW9mKFBvaW50KSwgTlVMTCwgJnBvaW50KSkKCWdvdG8gYmFpbDsKICAgIGlmIChub0VyciAhPSBHZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwga0V2ZW50UGFyYW1LZXlNb2RpZmllcnMsCgkJCQl0eXBlVUludDMyLCBOVUxMLCBzaXplb2YoVUludDMyKSwgTlVMTCwgJm1vZCkpCglnb3RvIGJhaWw7CgogICAgdmltX21vZCA9IDA7CiAgICBpZiAobW9kICYgc2hpZnRLZXkpCgl2aW1fbW9kIHw9IE1PVVNFX1NISUZUOwogICAgaWYgKG1vZCAmIGNvbnRyb2xLZXkpCgl2aW1fbW9kIHw9IE1PVVNFX0NUUkw7CiAgICBpZiAobW9kICYgb3B0aW9uS2V5KQoJdmltX21vZCB8PSBNT1VTRV9BTFQ7CgogICAgLyogcG9zdCBhIGJvZ3VzIGV2ZW50IHRvIHdha2UgdXAgV2FpdE5leHRFdmVudCAqLwogICAgaWYgKG5vRXJyICE9IENyZWF0ZUV2ZW50KE5VTEwsIGtFdmVudENsYXNzTW91c2UsIGtFdmVudE1vdXNlTW92ZWQsIDAsCgkJCQkJICAgIGtFdmVudEF0dHJpYnV0ZU5vbmUsICZib2d1c0V2ZW50KSkKCWdvdG8gYmFpbDsKICAgIGlmIChub0VyciAhPSBQb3N0RXZlbnRUb1F1ZXVlKEdldE1haW5FdmVudFF1ZXVlKCksIGJvZ3VzRXZlbnQsCgkJCQkJCQkgICBrRXZlbnRQcmlvcml0eUxvdykpCglnb3RvIGJhaWw7CgogICAgUmVsZWFzZUV2ZW50KGJvZ3VzRXZlbnQpOwoKICAgIGlmIChub0VyciA9PSBHZXRXaW5kb3dCb3VuZHMoZ3VpLlZpbVdpbmRvdywga1dpbmRvd0NvbnRlbnRSZ24sICZib3VuZHMpKQogICAgewoJcG9pbnQuaCAtPSBib3VuZHMubGVmdDsKCXBvaW50LnYgLT0gYm91bmRzLnRvcDsKICAgIH0KCiAgICBndWlfc2VuZF9tb3VzZV9ldmVudCgoZGVsdGEgPiAwKSA/IE1PVVNFXzQgOiBNT1VTRV81LAoJCQkJCSAgICBwb2ludC5oLCBwb2ludC52LCBGQUxTRSwgdmltX21vZCk7CgogICAgcmV0dXJuIG5vRXJyOwoKICBiYWlsOgogICAgLyoKICAgICAqIHdoZW4gd2UgZmFpbCBnaXZlIGFueSBhZGRpdGlvbmFsIGNhbGxiYWNrIGhhbmRsZXIgYSBjaGFuY2UgdG8gcGVyZm9ybQogICAgICogaXQncyBhY3Rpb25zCiAgICAgKi8KICAgIHJldHVybiBDYWxsTmV4dEV2ZW50SGFuZGxlcihuZXh0SGFuZGxlciwgdGhlRXZlbnQpOwp9CiNlbmRpZiAvKiBkZWZpbmVkKFVTRV9NT1VTRVdIRUVMKSAqLwoKI2lmIDAKCi8qCiAqIFRoaXMgd291bGQgYmUgdGhlIG5vcm1hbCB3YXkgb2YgaW52b2tpbmcgdGhlIGNvbnRleHR1YWwgbWVudQogKiBidXQgdGhlIFZpbSBBUEkgZG9lc24ndCBzZWVtIHRvIGEgc3VwcG9ydCBhIHJlcXVlc3QgdG8gZ2V0CiAqIHRoZSBtZW51IHRoYXQgd2Ugc2hvdWxkIGRpc3BsYXkKICovCiAgICB2b2lkCmd1aV9tYWNfaGFuZGxlX2NvbnRleHR1YWxfbWVudShldmVudCkKICAgIEV2ZW50UmVjb3JkICpldmVudDsKewovKgogKiAgQ2xvbmUgUG9wVXAgdG8gdXNlIG1lbnUKICogIENyZWF0ZSBhIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24KICogIENhbGwgdGhlIHByb2NlZHVyZQogKi8KCi8vICBDYWxsIHRvIEhhbmRsZSBQb3B1cAogICAgT1NTdGF0dXMgc3RhdHVzID0gQ29udGV4dHVhbE1lbnVTZWxlY3QoQ250eE1lbnUsIGV2ZW50LT53aGVyZSwgZmFsc2UsIGtDTUhlbHBJdGVtTm9IZWxwLCAiIiwgTlVMTCwgJkNudHhUeXBlLCAmQ250eE1lbnVJRCwgJkNudHhNZW51SXRlbSk7CgogICAgaWYgKHN0YXR1cyAhPSBub0VycikKCXJldHVybjsKCiAgICBpZiAoQ250eFR5cGUgPT0ga0NNTWVudUl0ZW1TZWxlY3RlZCkKICAgIHsKCS8qIEhhbmRsZSB0aGUgbWVudSBDbnR4TWVudUlELCBDbnR4TWVudUl0ZW0gKi8KCS8qIFRoZSBzdWJtZW51IGNhbiBiZSBoYW5kbGUgZGlyZWN0bHkgYnkgZ3VpX21hY19oYW5kbGVfbWVudSAqLwoJLyogQnV0IHdoYXQgYWJvdXQgdGhlIGN1cnJlbnQgbWVudSwgaXMgdGhlIG1lbnkgY2hhbmdlZCBieSBDb250ZXh0dWFsTWVudVNlbGVjdCAqLwoJZ3VpX21hY19oYW5kbGVfbWVudSgoQ250eE1lbnVJRCA8PCAxNikgKyBDbnR4TWVudUl0ZW0pOwogICAgfQogICAgZWxzZSBpZiAoQ250eE1lbnVJRCA9PSBrQ01TaG93SGVscFNlbGVjdGVkKQogICAgewoJLyogU2hvdWxkIGNvbWUgdXAgd2l0aCB0aGUgaGVscCAqLwogICAgfQoKfQojZW5kaWYKCi8qCiAqIEhhbmRsZSBtZW51YmFyIHNlbGVjdGlvbgogKi8KICAgIHZvaWQKZ3VpX21hY19oYW5kbGVfbWVudShtZW51Q2hvaWNlKQogICAgbG9uZyBtZW51Q2hvaWNlOwp7CiAgICBzaG9ydAltZW51ID0gSGlXb3JkKG1lbnVDaG9pY2UpOwogICAgc2hvcnQJaXRlbSA9IExvV29yZChtZW51Q2hvaWNlKTsKICAgIHZpbW1lbnVfVAkqdGhlVmltTWVudSA9IHJvb3RfbWVudTsKI2lmbmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgTWVudUhhbmRsZQlhcHBsZU1lbnU7CiAgICBTdHIyNTUJaXRlbU5hbWU7CiNlbmRpZgoKICAgIGlmIChtZW51ID09IDI1NikgIC8qIFRPRE86IHVzZSBjb25zdGFudCBvciBndWkueHl6ICovCiAgICB7CglpZiAoaXRlbSA9PSAxKQoJICAgIGd1aV9tY2hfYmVlcCgpOyAvKiBUT0RPOiBQb3B1cCBkaWFsb2cgb3IgZG8gOmludHJvICovCgllbHNlCgl7CiNpZm5kZWYgVVNFX0NBUkJPTklaRUQKCSAgICAvKiBEZXNrIEFjY2Vzc29yeSBkb2Vzbid0IGV4aXN0IGluIENhcmJvbiAqLwoJICAgIGFwcGxlTWVudSA9IEdldE1lbnVIYW5kbGUobWVudSk7CgkgICAgR2V0TWVudUl0ZW1UZXh0KGFwcGxlTWVudSwgaXRlbSwgaXRlbU5hbWUpOwoJICAgICh2b2lkKSBPcGVuRGVza0FjYyhpdGVtTmFtZSk7CiNlbmRpZgoJfQogICAgfQogICAgZWxzZSBpZiAoaXRlbSAhPSAwKQogICAgewoJdGhlVmltTWVudSA9IGd1aV9tYWNfZ2V0X3ZpbV9tZW51KG1lbnUsIGl0ZW0sIHJvb3RfbWVudSk7CgoJaWYgKHRoZVZpbU1lbnUpCgkgICAgZ3VpX21lbnVfY2IodGhlVmltTWVudSk7CiAgICB9CiAgICBIaWxpdGVNZW51KDApOwp9CgovKgogKiBEaXNwYXRjaCB0aGUgZXZlbnQgdG8gcHJvcGVyIGhhbmRsZXIKICovCgogICAgdm9pZApndWlfbWFjX2hhbmRsZV9ldmVudChldmVudCkKICAgIEV2ZW50UmVjb3JkICpldmVudDsKewogICAgT1NFcnIJZXJyb3I7CgogICAgLyogSGFuZGxlIGNvbnRleHR1YWwgbWVudSByaWdodCBub3cgKGlmIG5lZWRlZCkgKi8KI2lmZGVmIFVTRV9DVFJMQ0xJQ0tNRU5VCiAgICBpZiAoZ3VpLk1hY09TSGF2ZUNudHhNZW51KQoJaWYgKElzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2soZXZlbnQpKQoJewojIGlmIDAKCSAgICBndWlfbWFjX2hhbmRsZV9jb250ZXh0dWFsX21lbnUoZXZlbnQpOwojIGVsc2UKCSAgICBndWlfbWFjX2RvTW91c2VEb3duRXZlbnQoZXZlbnQpOwojIGVuZGlmCgkgICAgcmV0dXJuOwoJfQojZW5kaWYKCiAgICAvKiBIYW5kbGUgbm9ybWFsIGV2ZW50ICovCiAgICBzd2l0Y2ggKGV2ZW50LT53aGF0KQogICAgewojaWZuZGVmIFVTRV9DQVJCT05LRVlIQU5ETEVSCgljYXNlIChrZXlEb3duKToKCWNhc2UgKGF1dG9LZXkpOgoJICAgIGd1aV9tYWNfZG9LZXlFdmVudChldmVudCk7CgkgICAgYnJlYWs7CiNlbmRpZgoJY2FzZSAoa2V5VXApOgoJICAgIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgd2hlbiB0aGUga2V5IGdldCByZWxlYXNlICovCgkgICAgYnJlYWs7CgoJY2FzZSAobW91c2VEb3duKToKCSAgICBndWlfbWFjX2RvTW91c2VEb3duRXZlbnQoZXZlbnQpOwoJICAgIGJyZWFrOwoKCWNhc2UgKG1vdXNlVXApOgoJICAgIGd1aV9tYWNfZG9Nb3VzZVVwRXZlbnQoZXZlbnQpOwoJICAgIGJyZWFrOwoKCWNhc2UgKHVwZGF0ZUV2dCk6CgkgICAgZ3VpX21hY19kb1VwZGF0ZUV2ZW50KGV2ZW50KTsKCSAgICBicmVhazsKCgljYXNlIChkaXNrRXZ0KToKCSAgICAvKiBXZSBkb24ndCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGRpc2sgaW5zZXJ0aW9uICovCgkgICAgYnJlYWs7CgoJY2FzZSAoYWN0aXZhdGVFdnQpOgoJICAgIGd1aV9tYWNfZG9BY3RpdmF0ZUV2ZW50KGV2ZW50KTsKCSAgICBicmVhazsKCgljYXNlIChvc0V2dCk6CgkgICAgc3dpdGNoICgoZXZlbnQtPm1lc3NhZ2UgPj4gMjQpICYgMHhGRikKCSAgICB7CgkJY2FzZSAoMHhGQSk6IC8qIG1vdXNlTW92ZWRNZXNzYWdlICovCgkJICAgIGd1aV9tYWNfZG9Nb3VzZU1vdmVkRXZlbnQoZXZlbnQpOwoJCSAgICBicmVhazsKCQljYXNlICgweDAxKTogLyogc3VzcGVuZFJlc3VtZU1lc3NhZ2UgKi8KCQkgICAgZ3VpX21hY19kb1N1c3BlbmRFdmVudChldmVudCk7CgkJICAgIGJyZWFrOwoJICAgIH0KCSAgICBicmVhazsKCiNpZmRlZiBVU0VfQUVWRU5UCgljYXNlIChrSGlnaExldmVsRXZlbnQpOgoJICAgIC8qIFNvbWVvbmUncyB0YWxraW5nIHRvIHVzLCB0aHJvdWdoIEFwcGxlRXZlbnRzICovCgkgICAgZXJyb3IgPSBBRVByb2Nlc3NBcHBsZUV2ZW50KGV2ZW50KTsgLyogVE9ETzogRXJyb3IgSGFuZGxpbmcgKi8KCSAgICBicmVhazsKI2VuZGlmCiAgICB9Cn0KCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBVbmtub3duIFN0dWZmCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCgogICAgR3VpRm9udApndWlfbWFjX2ZpbmRfZm9udChmb250X25hbWUpCiAgICBjaGFyX3UgKmZvbnRfbmFtZTsKewogICAgY2hhcl91CWM7CiAgICBjaGFyX3UJKnA7CiAgICBjaGFyX3UJcEZvbnROYW1lWzI1Nl07CiAgICBTdHIyNTUJc3lzdGVtRm9udG5hbWU7CiAgICBzaG9ydAlmb250X2lkOwogICAgc2hvcnQJc2l6ZT05OwogICAgR3VpRm9udAlmb250OwojaWYgMAogICAgY2hhcl91ICAgICAgKmZvbnROYW1lUHRyOwojZW5kaWYKCiAgICBmb3IgKHAgPSBmb250X25hbWU7ICgoKnAgIT0gMCkgJiYgKCpwICE9ICc6JykpOyBwKyspCgk7CgogICAgYyA9ICpwOwogICAgKnAgPSAwOwoKI2lmIDEKICAgIFNUUkNQWSgmcEZvbnROYW1lWzFdLCBmb250X25hbWUpOwogICAgcEZvbnROYW1lWzBdID0gU1RSTEVOKGZvbnRfbmFtZSk7CiAgICAqcCA9IGM7CgogICAgLyogR2V0IHRoZSBmb250IG5hbWUsIG1pbnVzIHRoZSBzdHlsZSBzdWZmaXggKDpoLCBldGMpICovCiNpZiBkZWZpbmVkKE1BQ09TX1gpICYmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpCiAgICBjaGFyX3UgZm9udE5hbWVbMjU2XTsKICAgIGNoYXJfdSAqc3R5bGVTdGFydCA9IHZpbV9zdHJjaHIoZm9udF9uYW1lLCAnOicpOwogICAgc2l6ZV90IGZvbnROYW1lTGVuID0gc3R5bGVTdGFydCA/IHN0eWxlU3RhcnQgLSBmb250X25hbWUgOiBTVFJMRU4oZm9udE5hbWUpOwogICAgdmltX3N0cm5jcHkoZm9udE5hbWUsIGZvbnRfbmFtZSwgZm9udE5hbWVMZW4pOwoKICAgIEFUU1VGb250SUQgZm9udFJlZjsKICAgIEZNRm9udFN0eWxlIGZvbnRTdHlsZTsKICAgIGZvbnRfaWQgPSAwOwoKICAgIGlmIChBVFNVRmluZEZvbnRGcm9tTmFtZSgmcEZvbnROYW1lWzFdLCBwRm9udE5hbWVbMF0sIGtGb250RnVsbE5hbWUsCgkJa0ZvbnRNYWNpbnRvc2hQbGF0Zm9ybSwga0ZvbnROb1NjcmlwdENvZGUsIGtGb250Tm9MYW5ndWFnZUNvZGUsCgkJJmZvbnRSZWYpID09IG5vRXJyKQogICAgewoJaWYgKEZNR2V0Rm9udEZhbWlseUluc3RhbmNlRnJvbUZvbnQoZm9udFJlZiwgJmZvbnRfaWQsICZmb250U3R5bGUpICE9IG5vRXJyKQoJICAgIGZvbnRfaWQgPSAwOwogICAgfQojZWxzZQogICAgR2V0Rk51bShwRm9udE5hbWUsICZmb250X2lkKTsKI2VuZGlmCgogICAgaWYgKGZvbnRfaWQgPT0gMCkKICAgIHsKCS8qCgkgKiBUcnkgYWdhaW4sIHRoaXMgdGltZSByZXBsYWNpbmcgdW5kZXJzY29yZXMgaW4gdGhlIGZvbnQgbmFtZQoJICogd2l0aCBzcGFjZXMgKDpzZXQgZ3VpZm9udCBhbGxvd3MgdGhlIHR3byB0byBiZSB1c2VkCgkgKiBpbnRlcmNoYW5nZWFibHk7IHRoZSBGb250IE1hbmFnZXIgZG9lc24ndCkuCgkgKi8KCWludCBpLCBjaGFuZ2VkID0gRkFMU0U7CgoJZm9yIChpID0gcEZvbnROYW1lWzBdOyBpID4gMDsgLS1pKQoJewoJICAgIGlmIChwRm9udE5hbWVbaV0gPT0gJ18nKQoJICAgIHsKCQlwRm9udE5hbWVbaV0gPSAnICc7CgkJY2hhbmdlZCA9IFRSVUU7CgkgICAgfQoJfQoJaWYgKGNoYW5nZWQpCiNpZiBkZWZpbmVkKE1BQ09TX1gpICYmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpCgkgICAgaWYgKEFUU1VGaW5kRm9udEZyb21OYW1lKCZwRm9udE5hbWVbMV0sIHBGb250TmFtZVswXSwKCQkJa0ZvbnRGdWxsTmFtZSwga0ZvbnROb1BsYXRmb3JtQ29kZSwga0ZvbnROb1NjcmlwdENvZGUsCgkJCWtGb250Tm9MYW5ndWFnZUNvZGUsICZmb250UmVmKSA9PSBub0VycikKCSAgICB7CgkJaWYgKEZNR2V0Rm9udEZhbWlseUluc3RhbmNlRnJvbUZvbnQoZm9udFJlZiwgJmZvbnRfaWQsICZmb250U3R5bGUpICE9IG5vRXJyKQoJCSAgICBmb250X2lkID0gMDsKCSAgICB9CiNlbHNlCgkgICAgR2V0Rk51bShwRm9udE5hbWUsICZmb250X2lkKTsKI2VuZGlmCiAgICB9CgojZWxzZQogICAgLyogbmFtZSA9IEMyUGFzY2FsX3NhdmUobWVudS0+ZG5hbWUpOyAqLwogICAgZm9udE5hbWVQdHIgPSBDMlBhc2NhbF9zYXZlX2FuZF9yZW1vdmVfYmFja3NsYXNoKGZvbnRfbmFtZSk7CgogICAgR2V0Rk51bShmb250TmFtZVB0ciwgJmZvbnRfaWQpOwojZW5kaWYKCgogICAgaWYgKGZvbnRfaWQgPT0gMCkKICAgIHsKCS8qIE91cHMsIHRoZSBzeXN0ZW0gZm9udCB3YXMgaXQgdGhlIG9uZSB0aGUgdXNlciB3YW50ICovCgojaWYgZGVmaW5lZChNQUNPU19YKSAmJiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKQoJaWYgKEZNR2V0Rm9udEZhbWlseU5hbWUoc3lzdGVtRm9udCwgc3lzdGVtRm9udG5hbWUpICE9IG5vRXJyKQoJICAgIHJldHVybiBOT0ZPTlQ7CiNlbHNlCglHZXRGb250TmFtZSgwLCBzeXN0ZW1Gb250bmFtZSk7CiNlbmRpZgoJaWYgKCFFcXVhbFN0cmluZyhwRm9udE5hbWUsIHN5c3RlbUZvbnRuYW1lLCBmYWxzZSwgZmFsc2UpKQoJICAgIHJldHVybiBOT0ZPTlQ7CiAgICB9CiAgICBpZiAoKnAgPT0gJzonKQogICAgewoJcCsrOwoJLyogU2V0IHRoZSB2YWx1ZXMgZm91bmQgYWZ0ZXIgJzonICovCgl3aGlsZSAoKnApCgl7CgkgICAgc3dpdGNoICgqcCsrKQoJICAgIHsKCQljYXNlICdoJzoKCQkgICAgc2l6ZSA9IHBvaW50c190b19waXhlbHMocCwgJnAsIFRSVUUpOwoJCSAgICBicmVhazsKCQkgICAgLyoKCQkgICAgICogVE9ETzogTWF5YmUgYWNjZXB0IHdpZHRoIGFuZCBzdHlsZXMKCQkgICAgICovCgkgICAgfQoJICAgIHdoaWxlICgqcCA9PSAnOicpCgkJcCsrOwoJfQogICAgfQoKICAgIGlmIChzaXplIDwgMSkKCXNpemUgPSAxOyAgIC8qIEF2b2lkIGhhdmluZyBhIHNpemUgb2YgMCB3aXRoIHN5c3RlbSBmb250ICovCgogICAgZm9udCA9IChzaXplIDw8IDE2KSArICgobG9uZykgZm9udF9pZCAmIDB4RkZGRik7CgogICAgcmV0dXJuIGZvbnQ7Cn0KCi8qCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBHVUlfTUNIIGZ1bmN0aW9ubmFsaXR5CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCi8qCiAqIFBhcnNlIHRoZSBHVUkgcmVsYXRlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiAgQW55IGFyZ3VtZW50cyB1c2VkIGFyZQogKiBkZWxldGVkIGZyb20gYXJndiwgYW5kICphcmdjIGlzIGRlY3JlbWVudGVkIGFjY29yZGluZ2x5LiAgVGhpcyBpcyBjYWxsZWQKICogd2hlbiB2aW0gaXMgc3RhcnRlZCwgd2hldGhlciBvciBub3QgdGhlIEdVSSBoYXMgYmVlbiBzdGFydGVkLgogKi8KICAgIHZvaWQKZ3VpX21jaF9wcmVwYXJlKGFyZ2MsIGFyZ3YpCiAgICBpbnQJCSphcmdjOwogICAgY2hhcgkqKmFyZ3Y7CnsKICAgIC8qIFRPRE86IE1vdmUgbW9zdCBvZiB0aGlzIHN0dWZmIHRvd2FyZCBndWlfbWNoX2luaXQgKi8KI2lmZGVmIFVTRV9FWEVfTkFNRQogICAgRlNTcGVjCWFwcGxEaXI7CiMgaWZuZGVmIFVTRV9GSU5EX0JVTkRMRV9QQVRICiAgICBzaG9ydAlhcHBsVlJlZk51bTsKICAgIGxvbmcJYXBwbERpcklEOwogICAgU3RyMjU1CXZvbE5hbWU7CiMgZWxzZQogICAgUHJvY2Vzc1NlcmlhbE51bWJlciBwc247CiAgICBGU1JlZglhcHBsRlNSZWY7CiMgZW5kaWYKI2VuZGlmCgojaWZuZGVmIFVTRV9DQVJCT05JWkVECiAgICBNYXhBcHBsWm9uZSgpOwkgICAgLyogV2hhdCBjb3VsZCByZXBsYWNlIHRob3MgKi8KICAgIC8qIEluIENhcmJvbiwgYWxsIHNoYXJlZCBsaWJyYXJ5IGFyZSBhdXRvbWF0aWNhbGx5IGxvYWQgaW4KICAgICAqIHRoZXJlJ3Mgbm8gbmVlZCB0byBpbml0IHRoZW0KICAgICAqLwogICAgSW5pdEdyYWYoJnFkLnRoZVBvcnQpOwogICAgSW5pdEZvbnRzKCk7CiAgICBJbml0V2luZG93cygpOwogICAgSW5pdE1lbnVzKCk7CiAgICBURUluaXQoKTsKICAgIEluaXREaWFsb2dzKG5pbCk7CiNlbHNlCiAgICAvKiBXaHkgZGlkIEkgcHV0IHRoYXQgaW4/IChEYW55KSAqLwogICAgTW9yZU1hc3RlclBvaW50ZXJzICgweDQwICogMyk7IC8qIHdlIGxvdmUgaGFuZGxlcyAqLwojZW5kaWYKCiNpZiAwCiAgICBJbml0Q3Vyc29yKCk7CgojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCgpOwojZW5kaWYKCiNpZmRlZiBVU0VfQUVWRU5UCiAgICAodm9pZCkgSW5zdGFsbEFFSGFuZGxlcnMoKTsKI2VuZGlmCgojaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKICAgIGlmIChHZXN0YWx0KGdlc3RhbHRDb250ZXh0dWFsTWVudUF0dHIsICZnZXN0YWx0X3JjKSA9PSBub0VycikKCWd1aS5NYWNPU0hhdmVDbnR4TWVudSA9IEJpdFRzdCgmZ2VzdGFsdF9yYywgMzEtZ2VzdGFsdENvbnRleHR1YWxNZW51VHJhcEF2YWlsYWJsZSk7CiAgICBlbHNlCglndWkuTWFjT1NIYXZlQ250eE1lbnUgPSBmYWxzZTsKCiAgICBpZiAoZ3VpLk1hY09TSGF2ZUNudHhNZW51KQoJZ3VpLk1hY09TSGF2ZUNudHhNZW51ID0gKEluaXRDb250ZXh0dWFsTWVudXMoKT09bm9FcnIpOwojZW5kaWYKCiNpZmRlZiBVU0VfU0lPVVgKICAgIFNJT1VYU2V0dGluZ3Muc3RhbmRhbG9uZSA9IGZhbHNlOwogICAgU0lPVVhTZXR0aW5ncy5pbml0aWFsaXplVEIgPSBmYWxzZTsKICAgIFNJT1VYU2V0dGluZ3Muc2V0dXBtZW51cyA9IGZhbHNlOwogICAgU0lPVVhTZXR0aW5ncy5hc2t0b3NhdmVvbmNsb3NlID0gZmFsc2U7CiAgICBTSU9VWFNldHRpbmdzLnNob3dzdGF0dXNsaW5lID0gdHJ1ZTsKICAgIFNJT1VYU2V0dGluZ3MudG9wcGl4ZWwgPSAzMDA7CiAgICBTSU9VWFNldHRpbmdzLmxlZnRwaXhlbCA9IDEwOwogICAgSW5zdGFsbENvbnNvbGUoMSk7IC8qIGZpbGVubyhzdGRvdXQpID0gMSwgb24gcGFnZSA0MzAgb2YgTVNMIEMgKi8KICAgIHByaW50ZigiRGVidWdnaW5nIGNvbnNvbGUgZW5hYmxlZFxuIik7CiAgICAvKglTSU9VWFNldFRpdGxlKChjaGFyX3UgKikgIlZpbSBTdGRvdXQiKTsgKi8KI2VuZGlmCgogICAgcG9tbWUgPSBOZXdNZW51KDI1NiwgIlxwXDAyNCIpOyAvKiAweDE0PSA9IEFwcGxlIE1lbnUgKi8KCiAgICBBcHBlbmRNZW51KHBvbW1lLCAiXHBBYm91dCBWSU0iKTsKI2lmbmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgQXBwZW5kTWVudShwb21tZSwgIlxwLSIpOwogICAgQXBwZW5kUmVzTWVudShwb21tZSwgJ0RSVlInKTsKI2VuZGlmCgogICAgSW5zZXJ0TWVudShwb21tZSwgMCk7CgogICAgRHJhd01lbnVCYXIoKTsKCgojaWZuZGVmIFVTRV9PRkZTRVRFRF9XSU5ET1cKICAgIFNldFJlY3QoJndpbmRSZWN0LCAxMCwgNDgsIDEwKzgwKjcgKyAxNiwgNDgrMjQqMTEpOwojZWxzZQogICAgU2V0UmVjdCgmd2luZFJlY3QsIDMwMCwgNDAsIDMwMCs4MCo3ICsgMTYsIDQwKzI0KjExKTsKI2VuZGlmCgoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBDcmVhdGVOZXdXaW5kb3coa0RvY3VtZW50V2luZG93Q2xhc3MsCgkJa1dpbmRvd1Jlc2l6YWJsZUF0dHJpYnV0ZSB8IGtXaW5kb3dDb2xsYXBzZUJveEF0dHJpYnV0ZSwKCQkmd2luZFJlY3QsICZndWkuVmltV2luZG93KTsKICAgIFNldFBvcnRXaW5kb3dQb3J0KGd1aS5WaW1XaW5kb3cpOwojZWxzZQogICAgZ3VpLlZpbVdpbmRvdyA9IE5ld0NXaW5kb3cobmlsLCAmd2luZFJlY3QsICJccGdWaW0gb24gTWFjaW50b3NoIiwgdHJ1ZSwgZG9jdW1lbnRQcm9jLAoJCQkoV2luZG93UHRyKSAtMUwsIGZhbHNlLCAwKTsKICAgIFNldFBvcnQoZ3VpLlZpbVdpbmRvdyk7CiNlbmRpZgoKICAgIGd1aS5jaGFyX3dpZHRoID0gNzsKICAgIGd1aS5jaGFyX2hlaWdodCA9IDExOwogICAgZ3VpLmNoYXJfYXNjZW50ID0gNjsKICAgIGd1aS5udW1fcm93cyA9IDI0OwogICAgZ3VpLm51bV9jb2xzID0gODA7CiAgICBndWkuaW5fZm9jdXMgPSBUUlVFOyAvKiBGb3IgdGhlIG1vbWVudCAtPiBzeW4uIG9mIGZyb250IGFwcGxpY2F0aW9uICovCgojaWYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCiAgICBnU2Nyb2xsQWN0aW9uID0gTmV3Q29udHJvbEFjdGlvblVQUChndWlfbWFjX3Njcm9sbF9hY3Rpb24pOwogICAgZ1Njcm9sbERyYWcgICA9IE5ld0NvbnRyb2xBY3Rpb25VUFAoZ3VpX21hY19kcmFnX3RodW1iKTsKI2Vsc2UKICAgIGdTY3JvbGxBY3Rpb24gPSBOZXdDb250cm9sQWN0aW9uUHJvYyhndWlfbWFjX3Njcm9sbF9hY3Rpb24pOwogICAgZ1Njcm9sbERyYWcgICA9IE5ld0NvbnRyb2xBY3Rpb25Qcm9jKGd1aV9tYWNfZHJhZ190aHVtYik7CiNlbmRpZgoKICAgIC8qIEdldHRpbmcgYSBoYW5kbGUgdG8gdGhlIEhlbHAgbWVudSAqLwojaWZkZWYgVVNFX0hFTFBNRU5VCiMgaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIEhNR2V0SGVscE1lbnUoJmd1aS5NYWNPU0hlbHBNZW51LCBOVUxMKTsKIyBlbHNlCiAgICAodm9pZCkgSE1HZXRIZWxwTWVudUhhbmRsZSgmZ3VpLk1hY09TSGVscE1lbnUpOwojIGVuZGlmCgogICAgaWYgKGd1aS5NYWNPU0hlbHBNZW51ICE9IG5pbCkKCWd1aS5NYWNPU0hlbHBJdGVtcyA9IENvdW50TWVudUl0ZW1zKGd1aS5NYWNPU0hlbHBNZW51KTsKICAgIGVsc2UKCWd1aS5NYWNPU0hlbHBJdGVtcyA9IDA7CiNlbmRpZgoKICAgIGRyYWdSZWN0RW5ibCA9IEZBTFNFOwogICAgZHJhZ1JnbiA9IE5VTEw7CiAgICBkcmFnUmVjdENvbnRyb2wgPSBrQ3JlYXRlRW1wdHk7CiAgICBjdXJzb3JSZ24gPSBOZXdSZ24oKTsKI2VuZGlmCiNpZmRlZiBVU0VfRVhFX05BTUUKIyBpZm5kZWYgVVNFX0ZJTkRfQlVORExFX1BBVEgKICAgIEhHZXRWb2wodm9sTmFtZSwgJmFwcGxWUmVmTnVtLCAmYXBwbERpcklEKTsKICAgIC8qIFROMjAxNTogbWVudGlvbiBhIHBvc3NpYmxlIGJhZCBWUmVmTnVtICovCiAgICBGU01ha2VGU1NwZWMoYXBwbFZSZWZOdW0sIGFwcGxEaXJJRCwgIlxwIiwgJmFwcGxEaXIpOwojIGVsc2UKICAgIC8qIE9TRXJyIEdldEFwcGxpY2F0aW9uQnVuZGxlRlNTcGVjKEZTU3BlY1B0ciB0aGVGU1NwZWNQdHIpCiAgICAgKiBvZiBUTjIwMTUKICAgICAqIFRoaXMgdGVjaG5pYyByZW1vdmUgdGhlIC4uL0NvbnRlbnRzL01hY09TL2V0YyBwYXJ0CiAgICAgKi8KICAgICh2b2lkKUdldEN1cnJlbnRQcm9jZXNzKCZwc24pOwogICAgLyogaWYgKGVyciAhPSBub0VycikgcmV0dXJuIGVycjsgKi8KCiAgICAodm9pZClHZXRQcm9jZXNzQnVuZGxlTG9jYXRpb24oJnBzbiwgJmFwcGxGU1JlZik7CiAgICAvKiBpZiAoZXJyICE9IG5vRXJyKSByZXR1cm4gZXJyOyAqLwoKICAgICh2b2lkKUZTR2V0Q2F0YWxvZ0luZm8oJmFwcGxGU1JlZiwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsICZhcHBsRGlyLCBOVUxMKTsKCiAgICAvKiBUaGlzIHRlY2huaWMgcmV0dXJuIE5JTCB3aGVuIHdlIGRpc2FsbG93X2d1aSAqLwojIGVuZGlmCiAgICBleGVfbmFtZSA9IEZ1bGxQYXRoRnJvbUZTU3BlY19zYXZlKGFwcGxEaXIpOwojZW5kaWYKCiNpZmRlZiBVU0VfVklNX0NSRUFUT1JfSUQKICAgIF9mY3JlYXRvciA9ICdWSU0hJzsKICAgIF9mdHlwZSA9ICdURVhUJzsKI2VuZGlmCn0KCiNpZm5kZWYgQUxXQVlTX1VTRV9HVUkKLyoKICogQ2hlY2sgaWYgdGhlIEdVSSBjYW4gYmUgc3RhcnRlZC4gIENhbGxlZCBiZWZvcmUgZ3ZpbXJjIGlzIHNvdXJjZWQuCiAqIFJldHVybiBPSyBvciBGQUlMLgogKi8KICAgIGludApndWlfbWNoX2luaXRfY2hlY2sodm9pZCkKewogICAgLyogVE9ETzogRm9yIE1hY09TIFggZmluZCBhIHdheSB0byByZXR1cm4gRkFJTCwgaWYgdGhlIHVzZXIgbG9nZ2VkIGluCiAgICAgKiB1c2luZyB0aGUgPmNvbnNvbGUKICAgICAqLwogICAgaWYgKGRpc2FsbG93X2d1aSkgLyogc2VlIG1haW4uYyBmb3IgcmVhc29uIHRvIGRpc2FsbG93ICovCglyZXR1cm4gRkFJTDsKICAgIHJldHVybiBPSzsKfQojZW5kaWYKCiAgICBzdGF0aWMgT1NFcnIKcmVjZWl2ZUhhbmRsZXIoV2luZG93UmVmIHRoZVdpbmRvdywgdm9pZCogaGFuZGxlclJlZkNvbiwgRHJhZ1JlZiB0aGVEcmFnKQp7CiAgICBpbnQJCXgsIHk7CiAgICBpbnRfdQltb2RpZmllcnM7CiAgICBjaGFyX3UJKipmbmFtZXMgPSBOVUxMOwogICAgaW50CQljb3VudDsKICAgIGludAkJaSwgajsKCiAgICAvKiBHZXQgZHJvcCBwb3NpdGlvbiwgbW9kaWZpZXJzIGFuZCBjb3VudCBvZiBpdGVtcyAqLwogICAgewoJUG9pbnQJcG9pbnQ7CglTSW50MTYJbW91c2VVcE1vZGlmaWVyczsKCVVJbnQxNgljb3VudEl0ZW07CgoJR2V0RHJhZ01vdXNlKHRoZURyYWcsICZwb2ludCwgTlVMTCk7CglHbG9iYWxUb0xvY2FsKCZwb2ludCk7Cgl4ID0gcG9pbnQuaDsKCXkgPSBwb2ludC52OwoJR2V0RHJhZ01vZGlmaWVycyh0aGVEcmFnLCBOVUxMLCBOVUxMLCAmbW91c2VVcE1vZGlmaWVycyk7Cgltb2RpZmllcnMgPSBFdmVudE1vZGlmaWVyczJWaW1Nb3VzZU1vZGlmaWVycyhtb3VzZVVwTW9kaWZpZXJzKTsKCUNvdW50RHJhZ0l0ZW1zKHRoZURyYWcsICZjb3VudEl0ZW0pOwoJY291bnQgPSBjb3VudEl0ZW07CiAgICB9CgogICAgZm5hbWVzID0gKGNoYXJfdSAqKilhbGxvYyhjb3VudCAqIHNpemVvZihjaGFyX3UgKikpOwogICAgaWYgKGZuYW1lcyA9PSBOVUxMKQoJcmV0dXJuIGRyYWdOb3RBY2NlcHRlZEVycjsKCiAgICAvKiBHZXQgZmlsZSBuYW1lcyBkcm9wcGVkICovCiAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGNvdW50OyArK2kpCiAgICB7CglEcmFnSXRlbVJlZglpdGVtOwoJT1NFcnIJCWVycjsKCVNpemUJCXNpemU7CglGbGF2b3JUeXBlCXR5cGUgPSBmbGF2b3JUeXBlSEZTOwoJSEZTRmxhdm9yCWhmc0ZsYXZvcjsKCglmbmFtZXNbaV0gPSBOVUxMOwoJR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIodGhlRHJhZywgaSArIDEsICZpdGVtKTsKCWVyciA9IEdldEZsYXZvckRhdGFTaXplKHRoZURyYWcsIGl0ZW0sIHR5cGUsICZzaXplKTsKCWlmIChlcnIgIT0gbm9FcnIgfHwgc2l6ZSA+IHNpemVvZihoZnNGbGF2b3IpKQoJICAgIGNvbnRpbnVlOwoJZXJyID0gR2V0Rmxhdm9yRGF0YSh0aGVEcmFnLCBpdGVtLCB0eXBlLCAmaGZzRmxhdm9yLCAmc2l6ZSwgMCk7CglpZiAoZXJyICE9IG5vRXJyKQoJICAgIGNvbnRpbnVlOwoJZm5hbWVzW2orK10gPSBGdWxsUGF0aEZyb21GU1NwZWNfc2F2ZShoZnNGbGF2b3IuZmlsZVNwZWMpOwogICAgfQogICAgY291bnQgPSBqOwoKICAgIGd1aV9oYW5kbGVfZHJvcCh4LCB5LCBtb2RpZmllcnMsIGZuYW1lcywgY291bnQpOwoKICAgIC8qIEZha2UgbW91c2UgZXZlbnQgdG8gd2FrZSBmcm9tIHN0YWxsICovCiAgICBQb3N0RXZlbnQobW91c2VVcCwgMCk7CgogICAgcmV0dXJuIG5vRXJyOwp9CgovKgogKiBJbml0aWFsaXNlIHRoZSBHVUkuICBDcmVhdGUgYWxsIHRoZSB3aW5kb3dzLCBzZXQgdXAgYWxsIHRoZSBjYWxsLWJhY2tzCiAqIGV0Yy4KICovCiAgICBpbnQKZ3VpX21jaF9pbml0KCkKewogICAgLyogVE9ETzogTW92ZSBtb3N0IG9mIHRoaXMgc3R1ZmYgdG93YXJkIGd1aV9tY2hfaW5pdCAqLwogICAgUmVjdAl3aW5kUmVjdDsKICAgIE1lbnVIYW5kbGUJcG9tbWU7CiNpZmRlZiBVU0VfQ1RSTENMSUNLTUVOVQogICAgbG9uZwlnZXN0YWx0X3JjOwojZW5kaWYKI2lmZGVmIFVTRV9NT1VTRVdIRUVMCiAgICBFdmVudFR5cGVTcGVjICAgZXZlbnRUeXBlU3BlYzsKICAgIEV2ZW50SGFuZGxlclJlZiBtb3VzZVdoZWVsSGFuZGxlclJlZjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0FSQk9OS0VZSEFORExFUgogICAgRXZlbnRIYW5kbGVyUmVmIGtleUV2ZW50SGFuZGxlclJlZjsKI2VuZGlmCgojaWZkZWYgTUFDT1NfWAogICAgaWYgKEdlc3RhbHQoZ2VzdGFsdFN5c3RlbVZlcnNpb24sICZnTWFjU3lzdGVtVmVyc2lvbikgIT0gbm9FcnIpCglnTWFjU3lzdGVtVmVyc2lvbiA9IDB4MTAwMDsgLyogRGVmYXVsdCB0byBtaW5pbXVtIHNlbnNpYmxlIHZhbHVlICovCiNlbmRpZgoKI2lmIDEKICAgIEluaXRDdXJzb3IoKTsKCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7CiNlbmRpZgoKI2lmZGVmIFVTRV9BRVZFTlQKICAgICh2b2lkKSBJbnN0YWxsQUVIYW5kbGVycygpOwojZW5kaWYKCiNpZmRlZiBVU0VfQ1RSTENMSUNLTUVOVQogICAgaWYgKEdlc3RhbHQoZ2VzdGFsdENvbnRleHR1YWxNZW51QXR0ciwgJmdlc3RhbHRfcmMpID09IG5vRXJyKQoJZ3VpLk1hY09TSGF2ZUNudHhNZW51ID0gQml0VHN0KCZnZXN0YWx0X3JjLCAzMS1nZXN0YWx0Q29udGV4dHVhbE1lbnVUcmFwQXZhaWxhYmxlKTsKICAgIGVsc2UKCWd1aS5NYWNPU0hhdmVDbnR4TWVudSA9IGZhbHNlOwoKICAgIGlmIChndWkuTWFjT1NIYXZlQ250eE1lbnUpCglndWkuTWFjT1NIYXZlQ250eE1lbnUgPSAoSW5pdENvbnRleHR1YWxNZW51cygpPT1ub0Vycik7CiNlbmRpZgoKI2lmZGVmIFVTRV9TSU9VWAogICAgU0lPVVhTZXR0aW5ncy5zdGFuZGFsb25lID0gZmFsc2U7CiAgICBTSU9VWFNldHRpbmdzLmluaXRpYWxpemVUQiA9IGZhbHNlOwogICAgU0lPVVhTZXR0aW5ncy5zZXR1cG1lbnVzID0gZmFsc2U7CiAgICBTSU9VWFNldHRpbmdzLmFza3Rvc2F2ZW9uY2xvc2UgPSBmYWxzZTsKICAgIFNJT1VYU2V0dGluZ3Muc2hvd3N0YXR1c2xpbmUgPSB0cnVlOwogICAgU0lPVVhTZXR0aW5ncy50b3BwaXhlbCA9IDMwMDsKICAgIFNJT1VYU2V0dGluZ3MubGVmdHBpeGVsID0gMTA7CiAgICBJbnN0YWxsQ29uc29sZSgxKTsgLyogZmlsZW5vKHN0ZG91dCkgPSAxLCBvbiBwYWdlIDQzMCBvZiBNU0wgQyAqLwogICAgcHJpbnRmKCJEZWJ1Z2dpbmcgY29uc29sZSBlbmFibGVkXG4iKTsKICAgIC8qCVNJT1VYU2V0VGl0bGUoKGNoYXJfdSAqKSAiVmltIFN0ZG91dCIpOyAqLwojZW5kaWYKCiAgICBwb21tZSA9IE5ld01lbnUoMjU2LCAiXHBcMDI0Iik7IC8qIDB4MTQ9ID0gQXBwbGUgTWVudSAqLwoKICAgIEFwcGVuZE1lbnUocG9tbWUsICJccEFib3V0IFZJTSIpOwojaWZuZGVmIFVTRV9DQVJCT05JWkVECiAgICBBcHBlbmRNZW51KHBvbW1lLCAiXHAtIik7CiAgICBBcHBlbmRSZXNNZW51KHBvbW1lLCAnRFJWUicpOwojZW5kaWYKCiAgICBJbnNlcnRNZW51KHBvbW1lLCAwKTsKCiAgICBEcmF3TWVudUJhcigpOwoKCiNpZm5kZWYgVVNFX09GRlNFVEVEX1dJTkRPVwogICAgU2V0UmVjdCgmd2luZFJlY3QsIDEwLCA0OCwgMTArODAqNyArIDE2LCA0OCsyNCoxMSk7CiNlbHNlCiAgICBTZXRSZWN0KCZ3aW5kUmVjdCwgMzAwLCA0MCwgMzAwKzgwKjcgKyAxNiwgNDArMjQqMTEpOwojZW5kaWYKCiAgICBndWkuVmltV2luZG93ID0gTmV3Q1dpbmRvdyhuaWwsICZ3aW5kUmVjdCwgIlxwZ1ZpbSBvbiBNYWNpbnRvc2giLCB0cnVlLAojaWZkZWYgVVNFX0NBUkJPTklaRUQKCQkJem9vbURvY1Byb2MsCiNlbHNlCgkJCWRvY3VtZW50UHJvYywKI2VuZGlmCgkJCShXaW5kb3dQdHIpLTFMLCB0cnVlLCAwKTsKICAgIEluc3RhbGxSZWNlaXZlSGFuZGxlcigoRHJhZ1JlY2VpdmVIYW5kbGVyVVBQKXJlY2VpdmVIYW5kbGVyLAoJICAgIGd1aS5WaW1XaW5kb3csIE5VTEwpOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIFNldFBvcnRXaW5kb3dQb3J0KGd1aS5WaW1XaW5kb3cpOwojZWxzZQogICAgU2V0UG9ydChndWkuVmltV2luZG93KTsKI2VuZGlmCgogICAgZ3VpLmNoYXJfd2lkdGggPSA3OwogICAgZ3VpLmNoYXJfaGVpZ2h0ID0gMTE7CiAgICBndWkuY2hhcl9hc2NlbnQgPSA2OwogICAgZ3VpLm51bV9yb3dzID0gMjQ7CiAgICBndWkubnVtX2NvbHMgPSA4MDsKICAgIGd1aS5pbl9mb2N1cyA9IFRSVUU7IC8qIEZvciB0aGUgbW9tZW50IC0+IHN5bi4gb2YgZnJvbnQgYXBwbGljYXRpb24gKi8KCiNpZiBUQVJHRVRfQVBJX01BQ19DQVJCT04KICAgIGdTY3JvbGxBY3Rpb24gPSBOZXdDb250cm9sQWN0aW9uVVBQKGd1aV9tYWNfc2Nyb2xsX2FjdGlvbik7CiAgICBnU2Nyb2xsRHJhZyAgID0gTmV3Q29udHJvbEFjdGlvblVQUChndWlfbWFjX2RyYWdfdGh1bWIpOwojZWxzZQogICAgZ1Njcm9sbEFjdGlvbiA9IE5ld0NvbnRyb2xBY3Rpb25Qcm9jKGd1aV9tYWNfc2Nyb2xsX2FjdGlvbik7CiAgICBnU2Nyb2xsRHJhZyAgID0gTmV3Q29udHJvbEFjdGlvblByb2MoZ3VpX21hY19kcmFnX3RodW1iKTsKI2VuZGlmCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChNQUNPU19YKQogICAgLyogSW5zdGFsbCBDYXJib24gZXZlbnQgY2FsbGJhY2tzLiAqLwogICAgKHZvaWQpSW5zdGFsbEZvbnRQYW5lbEhhbmRsZXIoKTsKI2VuZGlmCgogICAgLyogR2V0dGluZyBhIGhhbmRsZSB0byB0aGUgSGVscCBtZW51ICovCiNpZmRlZiBVU0VfSEVMUE1FTlUKIyBpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgSE1HZXRIZWxwTWVudSgmZ3VpLk1hY09TSGVscE1lbnUsIE5VTEwpOwojIGVsc2UKICAgICh2b2lkKSBITUdldEhlbHBNZW51SGFuZGxlKCZndWkuTWFjT1NIZWxwTWVudSk7CiMgZW5kaWYKCiAgICBpZiAoZ3VpLk1hY09TSGVscE1lbnUgIT0gbmlsKQoJZ3VpLk1hY09TSGVscEl0ZW1zID0gQ291bnRNZW51SXRlbXMoZ3VpLk1hY09TSGVscE1lbnUpOwogICAgZWxzZQoJZ3VpLk1hY09TSGVscEl0ZW1zID0gMDsKI2VuZGlmCgogICAgZHJhZ1JlY3RFbmJsID0gRkFMU0U7CiAgICBkcmFnUmduID0gTlVMTDsKICAgIGRyYWdSZWN0Q29udHJvbCA9IGtDcmVhdGVFbXB0eTsKICAgIGN1cnNvclJnbiA9IE5ld1JnbigpOwojZW5kaWYKICAgIC8qIERpc3BsYXkgYW55IHBlbmRpbmcgZXJyb3IgbWVzc2FnZXMgKi8KICAgIGRpc3BsYXlfZXJyb3JzKCk7CgogICAgLyogR2V0IGJhY2tncm91bmQvZm9yZWdyb3VuZCBjb2xvcnMgZnJvbSBzeXN0ZW0gKi8KICAgIC8qIFRPRE86IGRvIHRoZSBhcHByb3JpYXRlIGNhbGwgdG8gZ2V0IHJlYWwgZGVmYXVsdHMgKi8KICAgIGd1aS5ub3JtX3BpeGVsID0gMHgwMDAwMDAwMDsKICAgIGd1aS5iYWNrX3BpeGVsID0gMHgwMEZGRkZGRjsKCiAgICAvKiBHZXQgdGhlIGNvbG9ycyBmcm9tIHRoZSAiTm9ybWFsIiBncm91cCAoc2V0IGluIHN5bnRheC5jIG9yIGluIGEgdmltcmMKICAgICAqIGZpbGUpLiAqLwogICAgc2V0X25vcm1hbF9jb2xvcnMoKTsKCiAgICAvKgogICAgICogQ2hlY2sgdGhhdCBub25lIG9mIHRoZSBjb2xvcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgogICAgICogVGhlbiBzdG9yZSB0aGUgY3VycmVudCB2YWx1ZXMgYXMgdGhlIGRlZmF1bHRzLgogICAgICovCiAgICBndWlfY2hlY2tfY29sb3JzKCk7CiAgICBndWkuZGVmX25vcm1fcGl4ZWwgPSBndWkubm9ybV9waXhlbDsKICAgIGd1aS5kZWZfYmFja19waXhlbCA9IGd1aS5iYWNrX3BpeGVsOwoKICAgIC8qIEdldCB0aGUgY29sb3JzIGZvciB0aGUgaGlnaGxpZ2h0IGdyb3VwcyAoZ3VpX2NoZWNrX2NvbG9ycygpIG1pZ2h0IGhhdmUKICAgICAqIGNoYW5nZWQgdGhlbSkgKi8KICAgIGhpZ2hsaWdodF9ndWlfc3RhcnRlZCgpOwoKICAgIC8qCiAgICAgKiBTZXR0aW5nIHRoZSBndWkgY29uc3RhbnRzCiAgICAgKi8KI2lmZGVmIEZFQVRfTUVOVQogICAgZ3VpLm1lbnVfaGVpZ2h0ID0gMDsKI2VuZGlmCiAgICBndWkuc2Nyb2xsYmFyX2hlaWdodCA9IGd1aS5zY3JvbGxiYXJfd2lkdGggPSAxNTsgLyogY2hlYXQgMSBvdmVybGFwICovCiAgICBndWkuYm9yZGVyX29mZnNldCA9IGd1aS5ib3JkZXJfd2lkdGggPSAyOwoKI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoTUFDT1NfWCkKICAgIC8qIElmIFF1YXJ0ei1zdHlsZSB0ZXh0IGFudGlhbGlhc2luZyBpcyBhdmFpbGFibGUgKHNlZQogICAgICAgZ3VpX21jaF9kcmF3X3N0cmluZygpIGJlbG93KSwgZW5hYmxlIGl0IGZvciBhbGwgZm9udCBzaXplcy4gKi8KICAgIHZpbV9zZXRlbnYoKGNoYXJfdSAqKSJRRFRFWFRfTUlOU0laRSIsIChjaGFyX3UgKikiMSIpOwojZW5kaWYKCiNpZmRlZiBVU0VfTU9VU0VXSEVFTAogICAgZXZlbnRUeXBlU3BlYy5ldmVudENsYXNzID0ga0V2ZW50Q2xhc3NNb3VzZTsKICAgIGV2ZW50VHlwZVNwZWMuZXZlbnRLaW5kID0ga0V2ZW50TW91c2VXaGVlbE1vdmVkOwogICAgbW91c2VXaGVlbEhhbmRsZXJVUFAgPSBOZXdFdmVudEhhbmRsZXJVUFAoZ3VpX21hY19tb3VzZV93aGVlbCk7CiAgICBpZiAobm9FcnIgIT0gSW5zdGFsbEFwcGxpY2F0aW9uRXZlbnRIYW5kbGVyKG1vdXNlV2hlZWxIYW5kbGVyVVBQLCAxLAoJCQkJICZldmVudFR5cGVTcGVjLCBOVUxMLCAmbW91c2VXaGVlbEhhbmRsZXJSZWYpKQogICAgewoJbW91c2VXaGVlbEhhbmRsZXJSZWYgPSBOVUxMOwoJRGlzcG9zZUV2ZW50SGFuZGxlclVQUChtb3VzZVdoZWVsSGFuZGxlclVQUCk7Cgltb3VzZVdoZWVsSGFuZGxlclVQUCA9IE5VTEw7CiAgICB9CiNlbmRpZgoKI2lmZGVmIFVTRV9DQVJCT05LRVlIQU5ETEVSCiAgICBldmVudFR5cGVTcGVjLmV2ZW50Q2xhc3MgPSBrRXZlbnRDbGFzc1RleHRJbnB1dDsKICAgIGV2ZW50VHlwZVNwZWMuZXZlbnRLaW5kID0ga0V2ZW50VW5pY29kZUZvcktleUV2ZW50OwogICAga2V5RXZlbnRIYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKGd1aV9tYWNfZG9LZXlFdmVudENhcmJvbik7CiAgICBpZiAobm9FcnIgIT0gSW5zdGFsbEFwcGxpY2F0aW9uRXZlbnRIYW5kbGVyKGtleUV2ZW50SGFuZGxlclVQUCwgMSwKCQkmZXZlbnRUeXBlU3BlYywgTlVMTCwgJmtleUV2ZW50SGFuZGxlclJlZikpCiAgICB7CglrZXlFdmVudEhhbmRsZXJSZWYgPSBOVUxMOwoJRGlzcG9zZUV2ZW50SGFuZGxlclVQUChrZXlFdmVudEhhbmRsZXJVUFApOwoJa2V5RXZlbnRIYW5kbGVyVVBQID0gTlVMTDsKICAgIH0KI2VuZGlmCgovKgojaWZkZWYgRkVBVF9NQllURQogICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImVuY29kaW5nIiwgMEwsIChjaGFyX3UgKikidXRmLTgiLCAwKTsKI2VuZGlmCiovCgogICAgLyogVE9ETzogTG9hZCBiaXRtYXAgaWYgdXNpbmcgVE9PTEJBUiAqLwogICAgcmV0dXJuIE9LOwp9CgovKgogKiBDYWxsZWQgd2hlbiB0aGUgZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kIGNvbG9yIGhhcyBiZWVuIGNoYW5nZWQuCiAqLwogICAgdm9pZApndWlfbWNoX25ld19jb2xvcnMoKQp7CiAgICAvKiBUT0RPOgogICAgICogVGhpcyBwcm9jIGlzIGNhbGxlZCB3aGVuIE5vcm1hbCBpcyBzZXQgdG8gYSB2YWx1ZQogICAgICogc28gd2hhdCBtc3V0IGJlIGRvbmU/IEkgZG9uJ3Qga25vdwogICAgICovCn0KCi8qCiAqIE9wZW4gdGhlIEdVSSB3aW5kb3cgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGd1aV9tY2hfaW5pdCgpLgogKi8KICAgIGludApndWlfbWNoX29wZW4oKQp7CiAgICBTaG93V2luZG93KGd1aS5WaW1XaW5kb3cpOwoKICAgIGlmIChndWlfd2luX3ggIT0gLTEgJiYgZ3VpX3dpbl95ICE9IC0xKQoJZ3VpX21jaF9zZXRfd2lucG9zKGd1aV93aW5feCwgZ3VpX3dpbl95KTsKCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgLyoKICAgICAqIE1ha2UgdGhlIEdVSSB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIChpbiBjYXNlIGl0IHdhcyBsYXVuY2hlZAogICAgICogZnJvbSB0aGUgVGVybWluYWwgb3IgdmlhIDpndWkpLgogICAgICovCiAgICB7CglQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKCWlmIChHZXRDdXJyZW50UHJvY2VzcygmcHNuKSA9PSBub0VycikKCSAgICBTZXRGcm9udFByb2Nlc3MoJnBzbik7CiAgICB9CiNlbmRpZgoKICAgIHJldHVybiBPSzsKfQoKICAgIHZvaWQKZ3VpX21jaF9leGl0KGludCByYykKewogICAgLyogVE9ETzogZmluZCBvdXQgYWxsIHdoYXQgaXMgbWlzc2luZyBoZXJlPyAqLwogICAgRGlzcG9zZVJnbihjdXJzb3JSZ24pOwoKI2lmZGVmIFVTRV9DQVJCT05LRVlIQU5ETEVSCiAgICBpZiAoa2V5RXZlbnRIYW5kbGVyVVBQKQoJRGlzcG9zZUV2ZW50SGFuZGxlclVQUChrZXlFdmVudEhhbmRsZXJVUFApOwojZW5kaWYKCiNpZmRlZiBVU0VfTU9VU0VXSEVFTAogICAgaWYgKG1vdXNlV2hlZWxIYW5kbGVyVVBQICE9IE5VTEwpCglEaXNwb3NlRXZlbnRIYW5kbGVyVVBQKG1vdXNlV2hlZWxIYW5kbGVyVVBQKTsKI2VuZGlmCgojaWZkZWYgVVNFX0FUU1VJX0RSQVdJTkcKICAgIGlmIChnRm9udFN0eWxlKQoJQVRTVURpc3Bvc2VTdHlsZShnRm9udFN0eWxlKTsKI2VuZGlmCgogICAgLyogRXhpdCB0byBzaGVsbD8gKi8KICAgIGV4aXQocmMpOwp9CgovKgogKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHdpbmRvdy4KICovCiAgICBpbnQKZ3VpX21jaF9nZXRfd2lucG9zKGludCAqeCwgaW50ICp5KQp7CiAgICAvKiBUT0RPICovCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgUmVjdAlib3VuZHM7CiAgICBPU1N0YXR1cwlzdGF0dXM7CgogICAgLyogQ2FyYm9uID49IDEuMC4yLCBNYWNPUyA+PSA4LjUgKi8KICAgIHN0YXR1cyA9IEdldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93U3RydWN0dXJlUmduLCAmYm91bmRzKTsKCiAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQoJcmV0dXJuIEZBSUw7CiAgICAqeCA9IGJvdW5kcy5sZWZ0OwogICAgKnkgPSBib3VuZHMudG9wOwogICAgcmV0dXJuIE9LOwojZW5kaWYKICAgIHJldHVybiBGQUlMOwp9CgovKgogKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHdpbmRvdyB0byB0aGUgZ2l2ZW4KICogY29vcmRpbmF0ZXMuCiAqLwogICAgdm9pZApndWlfbWNoX3NldF93aW5wb3MoaW50IHgsIGludCB5KQp7CiAgICAvKiBUT0RPOiAgU2hvdWxkIG1ha2Ugc3VyZSB0aGUgd2luZG93IGlzIG1vdmUgd2l0aGluIHJhbmdlCiAgICAgKgkgICAgICBlLmcuOiB5ID4gfjE2IFtNZW51IGJhcl0sIHggPiAwLCB4IDwgc2NyZWVuIHdpZHRoCiAgICAgKi8KICAgIE1vdmVXaW5kb3coZ3VpLlZpbVdpbmRvdywgeCwgeSwgVFJVRSk7Cn0KCiAgICB2b2lkCmd1aV9tY2hfc2V0X3NoZWxsc2l6ZSgKICAgIGludAkJd2lkdGgsCiAgICBpbnQJCWhlaWdodCwKICAgIGludAkJbWluX3dpZHRoLAogICAgaW50CQltaW5faGVpZ2h0LAogICAgaW50CQliYXNlX3dpZHRoLAogICAgaW50CQliYXNlX2hlaWdodCkKewojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIENHcmFmUHRyCVZpbVBvcnQ7CiAgICBSZWN0CVZpbUJvdW5kOwojZW5kaWYKCiAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKICAgIHsKI2lmZGVmIFVTRV9DQVJCT05JWkVECglWaW1Qb3J0ID0gR2V0V2luZG93UG9ydChndWkuVmltV2luZG93KTsKCUdldFBvcnRCb3VuZHMoVmltUG9ydCwgJlZpbUJvdW5kKTsKCVZpbUJvdW5kLmxlZnQgPSAtZ3VpLnNjcm9sbGJhcl93aWR0aDsgLyogKyAxOyovCglTZXRQb3J0Qm91bmRzKFZpbVBvcnQsICZWaW1Cb3VuZCk7CiAgICAvKglHZXRXaW5kb3dCb3VuZHMoZ3VpLlZpbVdpbmRvdywga1dpbmRvd0dsb2JhbFBvcnRSZ24sICZ3aW5Qb3J0UmVjdCk7ID8/Ki8KI2Vsc2UKCWd1aS5WaW1XaW5kb3ctPnBvcnRSZWN0LmxlZnQgPSAtZ3VpLnNjcm9sbGJhcl93aWR0aDsgLyogKyAxOyovCiAgICAvKglTZXRXaW5kb3dCb3VuZHMoZ3VpLlZpbVdpbmRvdywga1dpbmRvd0dsb2JhbFBvcnRSZ24sICZ3aW5Qb3J0UmVjdCk7ID8/Ki8KI2VuZGlmCiAgICB9CiAgICBlbHNlCiAgICB7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAoJVmltUG9ydCA9IEdldFdpbmRvd1BvcnQoZ3VpLlZpbVdpbmRvdyk7CglHZXRQb3J0Qm91bmRzKFZpbVBvcnQsICZWaW1Cb3VuZCk7CglWaW1Cb3VuZC5sZWZ0ID0gMDsKCVNldFBvcnRCb3VuZHMoVmltUG9ydCwgJlZpbUJvdW5kKTsKI2Vsc2UKCWd1aS5WaW1XaW5kb3ctPnBvcnRSZWN0LmxlZnQgPSAwOwojZW5kaWY7CiAgICB9CgogICAgU2l6ZVdpbmRvdyhndWkuVmltV2luZG93LCB3aWR0aCwgaGVpZ2h0LCBUUlVFKTsKCiAgICBndWlfcmVzaXplX3NoZWxsKHdpZHRoLCBoZWlnaHQpOwp9CgovKgogKiBHZXQgdGhlIHNjcmVlbiBkaW1lbnNpb25zLgogKiBBbGxvdyAxMCBwaXhlbHMgZm9yIGhvcml6b250YWwgYm9yZGVycywgNDAgZm9yIHZlcnRpY2FsIGJvcmRlcnMuCiAqIElzIHRoZXJlIG5vIHdheSB0byBmaW5kIG91dCBob3cgd2lkZSB0aGUgYm9yZGVycyByZWFsbHkgYXJlPwogKiBUT0RPOiBBZGQgbGl2ZSB1ZGF0ZSBvZiB0aG9zZSB2YWx1ZSBvbiBzdXNwZW5kL3Jlc3VtZS4KICovCiAgICB2b2lkCmd1aV9tY2hfZ2V0X3NjcmVlbl9kaW1lbnNpb25zKHNjcmVlbl93LCBzY3JlZW5faCkKICAgIGludAkJKnNjcmVlbl93OwogICAgaW50CQkqc2NyZWVuX2g7CnsKICAgIEdESGFuZGxlCWRvbWluYW50RGV2aWNlID0gR2V0TWFpbkRldmljZSgpOwogICAgUmVjdAlzY3JlZW5SZWN0ID0gKCoqZG9taW5hbnREZXZpY2UpLmdkUmVjdDsKCiAgICAqc2NyZWVuX3cgPSBzY3JlZW5SZWN0LnJpZ2h0IC0gMTA7CiAgICAqc2NyZWVuX2ggPSBzY3JlZW5SZWN0LmJvdHRvbSAtIDQwOwp9CgoKI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoTUFDT1NfWCkKLyoKICogT3BlbiB0aGUgRm9udCBQYW5lbCBhbmQgd2FpdCBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZm9udCBhbmQKICogY2xvc2UgdGhlIHBhbmVsLiAgVGhlbiBmaWxsIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBmb250X25hbWUgd2l0aAogKiB0aGUgbmFtZSBhbmQgc2l6ZSBvZiB0aGUgc2VsZWN0ZWQgZm9udCBhbmQgcmV0dXJuIHRoZSBmb250J3MgaGFuZGxlLAogKiBvciBOT0ZPTlQgaW4gY2FzZSBvZiBhbiBlcnJvci4KICovCiAgICBzdGF0aWMgR3VpRm9udApndWlfbWFjX3NlbGVjdF9mb250KGNoYXJfdSAqZm9udF9uYW1lKQp7CiAgICBHdWlGb250CQkgICAgc2VsZWN0ZWRfZm9udCA9IE5PRk9OVDsKICAgIE9TU3RhdHVzCQkgICAgc3RhdHVzOwogICAgRm9udFNlbGVjdGlvblFEU3R5bGUgICAgY3Vycl9mb250OwoKICAgIC8qIEluaXRpYWxpemUgdGhlIEZvbnQgUGFuZWwgd2l0aCB0aGUgY3VycmVudCBmb250LiAqLwogICAgY3Vycl9mb250Lmluc3RhbmNlLmZvbnRGYW1pbHkgPSBndWkubm9ybV9mb250ICYgMHhGRkZGOwogICAgY3Vycl9mb250LnNpemUgPSAoZ3VpLm5vcm1fZm9udCA+PiAxNik7CiAgICAvKiBUT0RPOiBzZXQgZm9udFN0eWxlIG9uY2Ugc3R5bGVzIGFyZSBzdXBwb3J0ZWQgaW4gZ3VpX21hY19maW5kX2ZvbnQoKSAqLwogICAgY3Vycl9mb250Lmluc3RhbmNlLmZvbnRTdHlsZSA9IDA7CiAgICBjdXJyX2ZvbnQuaGFzQ29sb3IgPSBmYWxzZTsKICAgIGN1cnJfZm9udC52ZXJzaW9uID0gMDsgLyogdmVyc2lvbiBudW1iZXIgb2YgdGhlIHN0eWxlIHN0cnVjdHVyZSAqLwogICAgc3RhdHVzID0gU2V0Rm9udEluZm9Gb3JTZWxlY3Rpb24oa0ZvbnRTZWxlY3Rpb25RRFR5cGUsCgkgICAgLypudW1TdHlsZXM9Ki8xLCAmY3Vycl9mb250LCAvKmV2ZW50VGFyZ2V0PSovTlVMTCk7CgogICAgZ0ZvbnRQYW5lbEluZm8uZmFtaWx5ID0gY3Vycl9mb250Lmluc3RhbmNlLmZvbnRGYW1pbHk7CiAgICBnRm9udFBhbmVsSW5mby5zdHlsZSA9IGN1cnJfZm9udC5pbnN0YW5jZS5mb250U3R5bGU7CiAgICBnRm9udFBhbmVsSW5mby5zaXplID0gY3Vycl9mb250LnNpemU7CgogICAgLyogUG9wIHVwIHRoZSBGb250IFBhbmVsLiAqLwogICAgc3RhdHVzID0gRlBTaG93SGlkZUZvbnRQYW5lbCgpOwogICAgaWYgKHN0YXR1cyA9PSBub0VycikKICAgIHsKCS8qCgkgKiBUaGUgRm9udCBQYW5lbCBpcyBtb2RlbGVzcy4gIFdlIHJlYWxseSBuZWVkIGl0IHRvIGJlIG1vZGFsLAoJICogc28gd2Ugc3BpbiBpbiBhbiBldmVudCBsb29wIHVudGlsIHRoZSBwYW5lbCBpcyBjbG9zZWQuCgkgKi8KCWdGb250UGFuZWxJbmZvLmlzUGFuZWxWaXNpYmxlID0gdHJ1ZTsKCXdoaWxlIChnRm9udFBhbmVsSW5mby5pc1BhbmVsVmlzaWJsZSkKCXsKCSAgICBFdmVudFJlY29yZCBlOwoJICAgIFdhaXROZXh0RXZlbnQoZXZlcnlFdmVudCwgJmUsIC8qc2xlZXA9Ki8yMCwgLyptb3VzZVJnbj0qL05VTEwpOwoJfQoKCUdldEZvbnRQYW5lbFNlbGVjdGlvbihmb250X25hbWUpOwoJc2VsZWN0ZWRfZm9udCA9IGd1aV9tYWNfZmluZF9mb250KGZvbnRfbmFtZSk7CiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWRfZm9udDsKfQojZW5kaWYKCgovKgogKiBJbml0aWFsaXNlIHZpbSB0byB1c2UgdGhlIGZvbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4JUmV0dXJuIEZBSUwgaWYgdGhlIGZvbnQKICogY291bGQgbm90IGJlIGxvYWRlZCwgT0sgb3RoZXJ3aXNlLgogKi8KICAgIGludApndWlfbWNoX2luaXRfZm9udChmb250X25hbWUsIGZvbnRzZXQpCiAgICBjaGFyX3UJKmZvbnRfbmFtZTsKICAgIGludAkJZm9udHNldDsJICAgIC8qIG5vdCB1c2VkICovCnsKICAgIC8qIFRPRE86IEFkZCBzdXBwb3J0IGZvciBib2xkIGl0YWxpYyB1bmRlcmxpbmUgcHJvcG9ydGlvbmFsIGV0Yy4uLiAqLwogICAgU3RyMjU1CXN1Z2dlc3RlZEZvbnQgPSAiXHBNb25hY28iOwogICAgaW50CQlzdWdnZXN0ZWRTaXplID0gMTA7CiAgICBGb250SW5mbwlmb250X2luZm87CiAgICBzaG9ydAlmb250X2lkOwogICAgR3VpRm9udAlmb250OwogICAgY2hhcl91CXVzZWRfZm9udF9uYW1lWzUxMl07CgojaWZkZWYgVVNFX0FUU1VJX0RSQVdJTkcKICAgIGlmIChnRm9udFN0eWxlID09IE5VTEwpCiAgICB7CglpZiAoQVRTVUNyZWF0ZVN0eWxlKCZnRm9udFN0eWxlKSAhPSBub0VycikKCSAgICBnRm9udFN0eWxlID0gTlVMTDsKICAgIH0KI2VuZGlmCgogICAgaWYgKGZvbnRfbmFtZSA9PSBOVUxMKQogICAgewoJLyogRmlyc3QgdHJ5IHRvIGdldCB0aGUgc3VnZ2VzdGVkIGZvbnQgKi8KCUdldEZOdW0oc3VnZ2VzdGVkRm9udCwgJmZvbnRfaWQpOwoKCWlmIChmb250X2lkID09IDApCgl7CgkgICAgLyogVGhlbiBwaWNrdXAgdGhlIHN0YW5kYXJkIGFwcGxpY2F0aW9uIGZvbnQgKi8KCSAgICBmb250X2lkID0gR2V0QXBwRm9udCgpOwoJICAgIFNUUkNQWSh1c2VkX2ZvbnRfbmFtZSwgImRlZmF1bHQiKTsKCX0KCWVsc2UKCSAgICBTVFJDUFkodXNlZF9mb250X25hbWUsICJNb25hY28iKTsKCWZvbnQgPSAoc3VnZ2VzdGVkU2l6ZSA8PCAxNikgKyAoKGxvbmcpIGZvbnRfaWQgJiAweEZGRkYpOwogICAgfQojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChNQUNPU19YKQogICAgZWxzZSBpZiAoU1RSQ01QKGZvbnRfbmFtZSwgIioiKSA9PSAwKQogICAgewoJY2hhcl91ICpuZXdfcF9ndWlmb250OwoKCWZvbnQgPSBndWlfbWFjX3NlbGVjdF9mb250KHVzZWRfZm9udF9uYW1lKTsKCWlmIChmb250ID09IE5PRk9OVCkKCSAgICByZXR1cm4gRkFJTDsKCgkvKiBTZXQgZ3VpZm9udCB0byB0aGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgZm9udC4gKi8KCW5ld19wX2d1aWZvbnQgPSBhbGxvYyhTVFJMRU4odXNlZF9mb250X25hbWUpICsgMSk7CglpZiAobmV3X3BfZ3VpZm9udCAhPSBOVUxMKQoJewoJICAgIFNUUkNQWShuZXdfcF9ndWlmb250LCB1c2VkX2ZvbnRfbmFtZSk7CgkgICAgdmltX2ZyZWUocF9ndWlmb250KTsKCSAgICBwX2d1aWZvbnQgPSBuZXdfcF9ndWlmb250OwoJICAgIC8qIFJlcGxhY2Ugc3BhY2VzIGluIHRoZSBmb250IG5hbWUgd2l0aCB1bmRlcnNjb3Jlcy4gKi8KCSAgICBmb3IgKCA7ICpuZXdfcF9ndWlmb250OyArK25ld19wX2d1aWZvbnQpCgkgICAgewoJCWlmICgqbmV3X3BfZ3VpZm9udCA9PSAnICcpCgkJICAgICpuZXdfcF9ndWlmb250ID0gJ18nOwoJICAgIH0KCX0KICAgIH0KI2VuZGlmCiAgICBlbHNlCiAgICB7Cglmb250ID0gZ3VpX21hY19maW5kX2ZvbnQoZm9udF9uYW1lKTsKCVNUUk5DUFkodXNlZF9mb250X25hbWUsIGZvbnRfbmFtZSwgc2l6ZW9mKHVzZWRfZm9udF9uYW1lKSk7Cgl1c2VkX2ZvbnRfbmFtZVtzaXplb2YodXNlZF9mb250X25hbWUpIC0gMV0gPSBOVUw7CgoJaWYgKGZvbnQgPT0gTk9GT05UKQoJICAgIHJldHVybiBGQUlMOwogICAgfQoKICAgIGd1aS5ub3JtX2ZvbnQgPSBmb250OwoKICAgIGhsX3NldF9mb250X25hbWUodXNlZF9mb250X25hbWUpOwoKICAgIFRleHRTaXplKGZvbnQgPj4gMTYpOwogICAgVGV4dEZvbnQoZm9udCAmIDB4RkZGRik7CgogICAgR2V0Rm9udEluZm8oJmZvbnRfaW5mbyk7CgogICAgZ3VpLmNoYXJfYXNjZW50ID0gZm9udF9pbmZvLmFzY2VudDsKICAgIGd1aS5jaGFyX3dpZHRoICA9IENoYXJXaWR0aCgnXycpOwogICAgZ3VpLmNoYXJfaGVpZ2h0ID0gZm9udF9pbmZvLmFzY2VudCArIGZvbnRfaW5mby5kZXNjZW50ICsgcF9saW5lc3BhY2U7CgojaWZkZWYgVVNFX0FUU1VJX0RSQVdJTkcKICAgIEFUU1VGb250SUQJCQlmb250SUQ7CiAgICBGaXhlZAkJCWZvbnRTaXplOwogICAgQVRTU3R5bGVSZW5kZXJpbmdPcHRpb25zCWZvbnRPcHRpb25zOwoKICAgIGlmIChnRm9udFN0eWxlKQogICAgewoJZm9udElEID0gZm9udCAmIDB4RkZGRjsKCWZvbnRTaXplID0gTG9uZzJGaXgoZm9udCA+PiAxNik7CgoJLyogTm8gYW50aWFsaWFzaW5nIGJ5IGRlZmF1bHQgKGRvIG5vdCBhdHRlbXB0IHRvIHRvdWNoIGFudGlhbGlzaW5nCgkgKiBvcHRpb25zIG9uIHByZS1KYWd1YXIpICovCglmb250T3B0aW9ucyA9CiNpZmRlZiBNQUNPU19YCgkgICAgKGdNYWNTeXN0ZW1WZXJzaW9uID49IDB4MTAyMCkgPwoJICAgIGtBVFNTdHlsZU5vQW50aUFsaWFzaW5nIDoKI2VuZGlmCgkgICAga0FUU1N0eWxlTm9PcHRpb25zOwoKCUFUU1VBdHRyaWJ1dGVUYWcgYXR0cmliVGFnc1tdID0KCXsKCSAgICBrQVRTVUZvbnRUYWcsIGtBVFNVU2l6ZVRhZywga0FUU1VTdHlsZVJlbmRlcmluZ09wdGlvbnNUYWcsCgkgICAga0FUU1VNYXhBVFNVSVRhZ1ZhbHVlKzEKCX07CglCeXRlQ291bnQgYXR0cmliU2l6ZXNbXSA9Cgl7CgkgICAgc2l6ZW9mKEFUU1VGb250SUQpLCBzaXplb2YoRml4ZWQpLAoJICAgIHNpemVvZihBVFNTdHlsZVJlbmRlcmluZ09wdGlvbnMpLCBzaXplb2YgZm9udAoJfTsKCUFUU1VBdHRyaWJ1dGVWYWx1ZVB0ciBhdHRyaWJWYWx1ZXNbXSA9Cgl7CgkgICAgJmZvbnRJRCwgJmZvbnRTaXplLCAmZm9udE9wdGlvbnMsICZmb250Cgl9OwoKCS8qIENvbnZlcnQgZm9udCBpZCB0byBBVFNVRm9udElEICovCglpZiAoRk1HZXRGb250RnJvbUZvbnRGYW1pbHlJbnN0YW5jZShmb250SUQsIDAsICZmb250SUQsIE5VTEwpID09IG5vRXJyKQoJewoJICAgIGlmIChBVFNVU2V0QXR0cmlidXRlcyhnRm9udFN0eWxlLAoJCQkoc2l6ZW9mIGF0dHJpYlRhZ3MpL3NpemVvZihBVFNVQXR0cmlidXRlVGFnKSwKCQkJYXR0cmliVGFncywgYXR0cmliU2l6ZXMsIGF0dHJpYlZhbHVlcykgIT0gbm9FcnIpCgkgICAgewoJCUFUU1VEaXNwb3NlU3R5bGUoZ0ZvbnRTdHlsZSk7CgkJZ0ZvbnRTdHlsZSA9IE5VTEw7CgkgICAgfQoJfQogICAgfQojZW5kaWYKCiAgICByZXR1cm4gT0s7Cgp9CgogICAgaW50Cmd1aV9tY2hfYWRqdXN0X2NoYXJzaXplKCkKewogICAgRm9udEluZm8gICAgZm9udF9pbmZvOwoKICAgIEdldEZvbnRJbmZvKCZmb250X2luZm8pOwogICAgZ3VpLmNoYXJfaGVpZ2h0ID0gZm9udF9pbmZvLmFzY2VudCArIGZvbnRfaW5mby5kZXNjZW50ICsgcF9saW5lc3BhY2U7CiAgICBndWkuY2hhcl9hc2NlbnQgPSBmb250X2luZm8uYXNjZW50ICsgcF9saW5lc3BhY2UgLyAyOwogICAgcmV0dXJuIE9LOwp9CgovKgogKiBHZXQgYSBmb250IHN0cnVjdHVyZSBmb3IgaGlnaGxpZ2h0aW5nLgogKi8KICAgIEd1aUZvbnQKZ3VpX21jaF9nZXRfZm9udChuYW1lLCBnaXZlRXJyb3JJZk1pc3NpbmcpCiAgICBjaGFyX3UJKm5hbWU7CiAgICBpbnQJCWdpdmVFcnJvcklmTWlzc2luZzsKewogICAgR3VpRm9udCBmb250OwoKICAgIGZvbnQgPSBndWlfbWFjX2ZpbmRfZm9udChuYW1lKTsKCiAgICBpZiAoZm9udCA9PSBOT0ZPTlQpCiAgICB7CglpZiAoZ2l2ZUVycm9ySWZNaXNzaW5nKQoJICAgIEVNU0cyKF8oZV9mb250KSwgbmFtZSk7CglyZXR1cm4gTk9GT05UOwogICAgfQogICAgLyoKICAgICAqIFRPRE8gOiBBY2NlcHQgb25seSBtb25vc3BhY2UKICAgICAqLwoKICAgIHJldHVybiBmb250Owp9CgojaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFJldHVybiB0aGUgbmFtZSBvZiBmb250ICJmb250IiBpbiBhbGxvY2F0ZWQgbWVtb3J5LgogKiBEb24ndCBrbm93IGhvdyB0byBnZXQgdGhlIGFjdHVhbCBuYW1lLCB0aHVzIHVzZSB0aGUgcHJvdmlkZWQgbmFtZS4KICovCiAgICBjaGFyX3UgKgpndWlfbWNoX2dldF9mb250bmFtZShmb250LCBuYW1lKQogICAgR3VpRm9udCBmb250OwogICAgY2hhcl91ICAqbmFtZTsKewogICAgaWYgKG5hbWUgPT0gTlVMTCkKCXJldHVybiBOVUxMOwogICAgcmV0dXJuIHZpbV9zdHJzYXZlKG5hbWUpOwp9CiNlbmRpZgoKLyoKICogU2V0IHRoZSBjdXJyZW50IHRleHQgZm9udC4KICovCiAgICB2b2lkCmd1aV9tY2hfc2V0X2ZvbnQoZm9udCkKICAgIEd1aUZvbnQJZm9udDsKewojaWZkZWYgVVNFX0FUU1VJX0RSQVdJTkcKICAgIEd1aUZvbnQJCQljdXJyRm9udDsKICAgIEJ5dGVDb3VudAkJCWFjdHVhbEZvbnRCeXRlQ291bnQ7CiAgICBBVFNVRm9udElECQkJZm9udElEOwogICAgRml4ZWQJCQlmb250U2l6ZTsKICAgIEFUU1N0eWxlUmVuZGVyaW5nT3B0aW9ucwlmb250T3B0aW9uczsKCiAgICBpZiAoZ0ZvbnRTdHlsZSkKICAgIHsKCS8qIEF2b2lkIHNldHRpbmcgc2FtZSBmb250IGFnYWluICovCglpZiAoQVRTVUdldEF0dHJpYnV0ZShnRm9udFN0eWxlLCBrQVRTVU1heEFUU1VJVGFnVmFsdWUrMSwgc2l6ZW9mIGZvbnQsCgkJICAgICZjdXJyRm9udCwgJmFjdHVhbEZvbnRCeXRlQ291bnQpID09IG5vRXJyICYmCgkJYWN0dWFsRm9udEJ5dGVDb3VudCA9PSAoc2l6ZW9mIGZvbnQpKQoJewoJICAgIGlmIChjdXJyRm9udCA9PSBmb250KQoJCXJldHVybjsKCX0KCglmb250SUQgPSBmb250ICYgMHhGRkZGOwoJZm9udFNpemUgPSBMb25nMkZpeChmb250ID4+IDE2KTsKCS8qIFJlc3BlY3QgcF9hbnRpYWxpYXMgc2V0dGluZyBvbmx5IGZvciB3aWRlIGZvbnQuCgkgKiBUaGUgcmVhc29uIGZvciBkb2luZyB0aGlzIGF0IHRoZSBtb21lbnQgaXMgYSBiaXQgY29tcGxpY2F0ZWQsCgkgKiBidXQgaXQncyBtYWlubHkgYmVjYXVzZSBhKSBsYXRpbiAobm9uLXdpZGUpIGFsaWFzZWQgZm9udHMKCSAqIGxvb2sgYmFkIGluIE9TIFggMTAuMy54IGFuZCBiZWxvdyAoZHVlIHRvIGEgYnVnIGluIEFUUyksIGFuZAoJICogYikgd2lkZSBtdWx0aWJ5dGUgaW5wdXQgZG9lcyBub3Qgc3VmZmVyIGZyb20gdGhhdCBwcm9ibGVtLiAqLwoJZm9udE9wdGlvbnMgPQojaWZkZWYgTUFDT1NfWAoJICAgIChwX2FudGlhbGlhcyAmJiAoZm9udCA9PSBndWkud2lkZV9mb250KSkgPwoJICAgIGtBVFNTdHlsZU5vT3B0aW9ucyA6IGtBVFNTdHlsZU5vQW50aUFsaWFzaW5nOwojZWxzZQoJICAgIGtBVFNTdHlsZU5vT3B0aW9uczsKI2VuZGlmCgoJQVRTVUF0dHJpYnV0ZVRhZyBhdHRyaWJUYWdzW10gPQoJewoJICAgIGtBVFNVRm9udFRhZywga0FUU1VTaXplVGFnLCBrQVRTVVN0eWxlUmVuZGVyaW5nT3B0aW9uc1RhZywKCSAgICBrQVRTVU1heEFUU1VJVGFnVmFsdWUrMQoJfTsKCUJ5dGVDb3VudCBhdHRyaWJTaXplc1tdID0KCXsKCSAgICBzaXplb2YoQVRTVUZvbnRJRCksIHNpemVvZihGaXhlZCksCgkgICAgc2l6ZW9mKEFUU1N0eWxlUmVuZGVyaW5nT3B0aW9ucyksIHNpemVvZiBmb250Cgl9OwoJQVRTVUF0dHJpYnV0ZVZhbHVlUHRyIGF0dHJpYlZhbHVlc1tdID0KCXsKCSAgICAmZm9udElELCAmZm9udFNpemUsICZmb250T3B0aW9ucywgJmZvbnQKCX07CgoJaWYgKEZNR2V0Rm9udEZyb21Gb250RmFtaWx5SW5zdGFuY2UoZm9udElELCAwLCAmZm9udElELCBOVUxMKSA9PSBub0VycikKCXsKCSAgICBpZiAoQVRTVVNldEF0dHJpYnV0ZXMoZ0ZvbnRTdHlsZSwKCQkJKHNpemVvZiBhdHRyaWJUYWdzKS9zaXplb2YoQVRTVUF0dHJpYnV0ZVRhZyksCgkJCWF0dHJpYlRhZ3MsIGF0dHJpYlNpemVzLCBhdHRyaWJWYWx1ZXMpICE9IG5vRXJyKQoJICAgIHsKI2lmbmRlZiBOREVCVUcKCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IHNldCBmb250IHN0eWxlXG4iKTsKI2VuZGlmCgkJQVRTVURpc3Bvc2VTdHlsZShnRm9udFN0eWxlKTsKCQlnRm9udFN0eWxlID0gTlVMTDsKCSAgICB9Cgl9CgogICAgfQoKICAgIGlmICghZ0lzRm9udEZhbGxiYWNrU2V0KQogICAgewoJLyogU2V0dXAgYXV0b21hdGljIGZvbnQgc3Vic3RpdHV0aW9uLiBUaGUgdXNlcidzIGd1aWZvbnR3aWRlCgkgKiBpcyB0cmllZCBmaXJzdCwgdGhlbiB0aGUgc3lzdGVtIHRyaWVzIG90aGVyIGZvbnRzLiAqLwovKgoJQVRTVUF0dHJpYnV0ZVRhZyBmYWxsYmFja1RhZ3NbXSA9IHsga0FUU1VMaW5lRm9udEZhbGxiYWNrc1RhZyB9OwoJQnl0ZUNvdW50IGZhbGxiYWNrU2l6ZXNbXSA9IHsgc2l6ZW9mKEFUU1VGb250RmFsbGJhY2tzKSB9OwoJQVRTVUNyZWF0ZUZvbnRGYWxsYmFja3MoJmdGb250RmFsbGJhY2tzKTsKCUFUU1VTZXRPYmpGb250RmFsbGJhY2tzKGdGb250RmFsbGJhY2tzLCApOwoqLwoJaWYgKGd1aS53aWRlX2ZvbnQpCgl7CgkgICAgQVRTVUZvbnRJRCBmYWxsYmFja0ZvbnRzOwoJICAgIGdJc0ZvbnRGYWxsYmFja1NldCA9IFRSVUU7CgoJICAgIGlmIChGTUdldEZvbnRGcm9tRm9udEZhbWlseUluc3RhbmNlKAoJCQkoZ3VpLndpZGVfZm9udCAmIDB4RkZGRiksCgkJCTAsCgkJCSZmYWxsYmFja0ZvbnRzLAoJCQlOVUxMKSA9PSBub0VycikKCSAgICB7CgkJQVRTVVNldEZvbnRGYWxsYmFja3MoKHNpemVvZiBmYWxsYmFja0ZvbnRzKS9zaXplb2YoQVRTVUZvbnRJRCksICZmYWxsYmFja0ZvbnRzLCBrQVRTVVNlcXVlbnRpYWxGYWxsYmFja3NQcmVmZXJyZWQpOwoJICAgIH0KLyoKCUFUU1VBdHRyaWJ1dGVWYWx1ZVB0ciBmYWxsYmFja1ZhbHVlc1tdID0geyB9OwoqLwoJfQogICAgfQojZW5kaWYKICAgIFRleHRTaXplKGZvbnQgPj4gMTYpOwogICAgVGV4dEZvbnQoZm9udCAmIDB4RkZGRik7Cn0KCiNpZiAwIC8qIG5vdCB1c2VkICovCi8qCiAqIFJldHVybiBUUlVFIGlmIHRoZSB0d28gZm9udHMgZ2l2ZW4gYXJlIGVxdWl2YWxlbnQuCiAqLwogICAgaW50Cmd1aV9tY2hfc2FtZV9mb250KGYxLCBmMikKICAgIEd1aUZvbnQJZjE7CiAgICBHdWlGb250CWYyOwp7CiAgICByZXR1cm4gZjEgPT0gZjI7Cn0KI2VuZGlmCgovKgogKiBJZiBhIGZvbnQgaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQsIGZyZWUgaXRzIHN0cnVjdHVyZS4KICovCiAgICB2b2lkCmd1aV9tY2hfZnJlZV9mb250KGZvbnQpCiAgICBHdWlGb250CWZvbnQ7CnsKICAgIC8qCiAgICAgKiBGcmVlIGZvbnQgd2hlbiAiZm9udCIgaXMgbm90IDAuCiAgICAgKiBOb3RoaW5nIHRvIGRvIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBzaW5jZQogICAgICogbm90aGluZyBpcyBhbGxvY2F0ZWQgZm9yIGVhY2ggZm9udCB1c2VkLgogICAgICovCn0KCiAgICBzdGF0aWMgaW50CmhleF9kaWdpdChjKQogICAgaW50CQljOwp7CiAgICBpZiAoaXNkaWdpdChjKSkKCXJldHVybiBjIC0gJzAnOwogICAgYyA9IFRPTE9XRVJfQVNDKGMpOwogICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQoJcmV0dXJuIGMgLSAnYScgKyAxMDsKICAgIHJldHVybiAtMTAwMDsKfQoKLyoKICogUmV0dXJuIHRoZSBQaXhlbCB2YWx1ZSAoY29sb3IpIGZvciB0aGUgZ2l2ZW4gY29sb3IgbmFtZS4gIFRoaXMgcm91dGluZSB3YXMKICogcHJldHR5IG11Y2ggdGFrZW4gZnJvbSBleGFtcGxlIGNvZGUgaW4gdGhlIFNpbGljb24gR3JhcGhpY3MgT1NGL01vdGlmCiAqIFByb2dyYW1tZXIncyBHdWlkZS4KICogUmV0dXJuIElOVkFMQ09MT1Igd2hlbiBmYWlsZWQuCiAqLwogICAgZ3VpY29sb3JfVApndWlfbWNoX2dldF9jb2xvcihuYW1lKQogICAgY2hhcl91ICpuYW1lOwp7CiAgICAvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyBuYW1lZCBjb2xvciBvZiBNYWNPUyA4CiAgICAgKi8KICAgIFJHQkNvbG9yCU1hY0NvbG9yOwovLyAgICBndWljb2xvcl9UCWNvbG9yID0gMDsKCiAgICB0eXBlZGVmIHN0cnVjdCBndWljb2xvcl90VGFibGUKICAgIHsKCWNoYXIJICAgICpuYW1lOwoJZ3VpY29sb3JfVCAgY29sb3I7CiAgICB9IGd1aWNvbG9yX3RUYWJsZTsKCiAgICAvKgogICAgICogVGhlIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiBlYWNoIGxpbmUgaXMgdGhlIHNvdXJjZQogICAgICogKE1hYywgV2luZG93LCBVbml4KSBhbmQgdGhlIG51bWJlciBpcyB0aGUgdW5peCByZ2IudHh0IHZhbHVlCiAgICAgKi8KICAgIHN0YXRpYyBndWljb2xvcl90VGFibGUgdGFibGVbXSA9CiAgICB7Cgl7IkJsYWNrIiwJUkdCKDB4MDAsIDB4MDAsIDB4MDApfSwKCXsiZGFya2dyYXkiLAlSR0IoMHg4MCwgMHg4MCwgMHg4MCl9LCAvKlcqLwoJeyJkYXJrZ3JleSIsCVJHQigweDgwLCAweDgwLCAweDgwKX0sIC8qVyovCgl7IkdyYXkiLAlSR0IoMHhDMCwgMHhDMCwgMHhDMCl9LCAvKlcqLwoJeyJHcmV5IiwJUkdCKDB4QzAsIDB4QzAsIDB4QzApfSwgLypXKi8KCXsibGlnaHRncmF5IiwJUkdCKDB4RTAsIDB4RTAsIDB4RTApfSwgLypXKi8KCXsibGlnaHRncmV5IiwJUkdCKDB4RTAsIDB4RTAsIDB4RTApfSwgLypXKi8KCXsid2hpdGUiLAlSR0IoMHhGRiwgMHhGRiwgMHhGRil9LAoJeyJkYXJrcmVkIiwJUkdCKDB4ODAsIDB4MDAsIDB4MDApfSwgLypXKi8KCXsicmVkIiwJCVJHQigweERELCAweDA4LCAweDA2KX0sIC8qTSovCgl7ImxpZ2h0cmVkIiwJUkdCKDB4RkYsIDB4QTAsIDB4QTApfSwgLypXKi8KCXsiRGFya0JsdWUiLAlSR0IoMHgwMCwgMHgwMCwgMHg4MCl9LCAvKlcqLwoJeyJCbHVlIiwJUkdCKDB4MDAsIDB4MDAsIDB4RDQpfSwgLypNKi8KCXsibGlnaHRibHVlIiwJUkdCKDB4QTAsIDB4QTAsIDB4RkYpfSwgLypXKi8KCXsiRGFya0dyZWVuIiwJUkdCKDB4MDAsIDB4ODAsIDB4MDApfSwgLypXKi8KCXsiR3JlZW4iLAlSR0IoMHgwMCwgMHg2NCwgMHgxMSl9LCAvKk0qLwoJeyJsaWdodGdyZWVuIiwJUkdCKDB4QTAsIDB4RkYsIDB4QTApfSwgLypXKi8KCXsiRGFya0N5YW4iLAlSR0IoMHgwMCwgMHg4MCwgMHg4MCl9LCAvKlcgPzB4MzA3RDdFICovCgl7ImN5YW4iLAlSR0IoMHgwMiwgMHhBQiwgMHhFQSl9LCAvKk0qLwoJeyJsaWdodGN5YW4iLAlSR0IoMHhBMCwgMHhGRiwgMHhGRil9LCAvKlcqLwoJeyJkYXJrbWFnZW50YSIsCVJHQigweDgwLCAweDAwLCAweDgwKX0sIC8qVyovCgl7Im1hZ2VudGEiLAlSR0IoMHhGMiwgMHgwOCwgMHg4NCl9LCAvKk0qLwoJeyJsaWdodG1hZ2VudGEiLFJHQigweEYwLCAweEEwLCAweEYwKX0sIC8qVyovCgl7ImJyb3duIiwJUkdCKDB4ODAsIDB4NDAsIDB4NDApfSwgLypXKi8KCXsieWVsbG93IiwJUkdCKDB4RkMsIDB4RjMsIDB4MDUpfSwgLypNKi8KCXsibGlnaHR5ZWxsb3ciLAlSR0IoMHhGRiwgMHhGRiwgMHhBMCl9LCAvKk0qLwoJeyJkYXJreWVsbG93IiwJUkdCKDB4QkIsIDB4QkIsIDB4MDApfSwgLypVKi8KCXsiU2VhR3JlZW4iLAlSR0IoMHgyRSwgMHg4QiwgMHg1Nyl9LCAvKlcgMHg0RTg5NzUgKi8KCXsib3JhbmdlIiwJUkdCKDB4RkMsIDB4ODAsIDB4MDApfSwgLypXIDB4Rjg3QTE3ICovCgl7IlB1cnBsZSIsCVJHQigweEEwLCAweDIwLCAweEYwKX0sIC8qVyAweDhlMzVlNSAqLwoJeyJTbGF0ZUJsdWUiLAlSR0IoMHg2QSwgMHg1QSwgMHhDRCl9LCAvKlcgMHg3MzdDQTEgKi8KCXsiVmlvbGV0IiwJUkdCKDB4OEQsIDB4MzgsIDB4QzkpfSwgLypVKi8KICAgIH07CgogICAgaW50CQlyLCBnLCBiOwogICAgaW50CQlpOwoKICAgIGlmIChuYW1lWzBdID09ICcjJyAmJiBzdHJsZW4oKGNoYXIgKikgbmFtZSkgPT0gNykKICAgIHsKCS8qIE5hbWUgaXMgaW4gIiNycmdnYmIiIGZvcm1hdCAqLwoJciA9IGhleF9kaWdpdChuYW1lWzFdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbMl0pOwoJZyA9IGhleF9kaWdpdChuYW1lWzNdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbNF0pOwoJYiA9IGhleF9kaWdpdChuYW1lWzVdKSAqIDE2ICsgaGV4X2RpZ2l0KG5hbWVbNl0pOwoJaWYgKHIgPCAwIHx8IGcgPCAwIHx8IGIgPCAwKQoJICAgIHJldHVybiBJTlZBTENPTE9SOwoJcmV0dXJuIFJHQihyLCBnLCBiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWlmIChTVFJJQ01QKG5hbWUsICJoaWxpdGUiKSA9PSAwKQoJewoJICAgIExNR2V0SGlsaXRlUkdCKCZNYWNDb2xvcik7CgkgICAgcmV0dXJuIChSR0IoTWFjQ29sb3IucmVkID4+IDgsIE1hY0NvbG9yLmdyZWVuID4+IDgsIE1hY0NvbG9yLmJsdWUgPj4gOCkpOwoJfQoJLyogQ2hlY2sgaWYgdGhlIG5hbWUgaXMgb25lIG9mIHRoZSBjb2xvcnMgd2Uga25vdyAqLwoJZm9yIChpID0gMDsgaSA8IHNpemVvZih0YWJsZSkgLyBzaXplb2YodGFibGVbMF0pOyBpKyspCgkgICAgaWYgKFNUUklDTVAobmFtZSwgdGFibGVbaV0ubmFtZSkgPT0gMCkKCQlyZXR1cm4gdGFibGVbaV0uY29sb3I7CiAgICB9CgoKICAgIC8qCiAgICAgKiBMYXN0IGF0dGVtcHQuIExvb2sgaW4gdGhlIGZpbGUgIiRWSU0vcmdiLnR4dCIuCiAgICAgKi8KICAgIHsKI2RlZmluZSBMSU5FX0xFTiAxMDAKCUZJTEUJKmZkOwoJY2hhcglsaW5lW0xJTkVfTEVOXTsKCWNoYXJfdQkqZm5hbWU7CgojaWZkZWYgQ09MT05fQVNfUEFUSFNFUAoJZm5hbWUgPSBleHBhbmRfZW52X3NhdmUoKGNoYXJfdSAqKSIkVklNUlVOVElNRTpyZ2IudHh0Iik7CiNlbHNlCglmbmFtZSA9IGV4cGFuZF9lbnZfc2F2ZSgoY2hhcl91ICopIiRWSU1SVU5USU1FL3JnYi50eHQiKTsKI2VuZGlmCglpZiAoZm5hbWUgPT0gTlVMTCkKCSAgICByZXR1cm4gSU5WQUxDT0xPUjsKCglmZCA9IGZvcGVuKChjaGFyICopZm5hbWUsICJydCIpOwoJdmltX2ZyZWUoZm5hbWUpOwoJaWYgKGZkID09IE5VTEwpCgkgICAgcmV0dXJuIElOVkFMQ09MT1I7CgoJd2hpbGUgKCFmZW9mKGZkKSkKCXsKCSAgICBpbnQJCWxlbjsKCSAgICBpbnQJCXBvczsKCSAgICBjaGFyCSpjb2xvcjsKCgkgICAgZmdldHMobGluZSwgTElORV9MRU4sIGZkKTsKCSAgICBsZW4gPSBzdHJsZW4obGluZSk7CgoJICAgIGlmIChsZW4gPD0gMSB8fCBsaW5lW2xlbi0xXSAhPSAnXG4nKQoJCWNvbnRpbnVlOwoKCSAgICBsaW5lW2xlbi0xXSA9ICdcMCc7CgoJICAgIGkgPSBzc2NhbmYobGluZSwgIiVkICVkICVkICVuIiwgJnIsICZnLCAmYiwgJnBvcyk7CgkgICAgaWYgKGkgIT0gMykKCQljb250aW51ZTsKCgkgICAgY29sb3IgPSBsaW5lICsgcG9zOwoKCSAgICBpZiAoU1RSSUNNUChjb2xvciwgbmFtZSkgPT0gMCkKCSAgICB7CgkJZmNsb3NlKGZkKTsKCQlyZXR1cm4gKGd1aWNvbG9yX1QpIFJHQihyLCBnLCBiKTsKCSAgICB9Cgl9CglmY2xvc2UoZmQpOwogICAgfQoKICAgIHJldHVybiBJTlZBTENPTE9SOwp9CgovKgogKiBTZXQgdGhlIGN1cnJlbnQgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLgogKi8KICAgIHZvaWQKZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpCiAgICBndWljb2xvcl9UCWNvbG9yOwp7CiAgICBSR0JDb2xvciBUaGVDb2xvcjsKCiAgICBUaGVDb2xvci5yZWQgPSBSZWQoY29sb3IpICogMHgwMTAxOwogICAgVGhlQ29sb3IuZ3JlZW4gPSBHcmVlbihjb2xvcikgKiAweDAxMDE7CiAgICBUaGVDb2xvci5ibHVlID0gQmx1ZShjb2xvcikgKiAweDAxMDE7CgogICAgUkdCRm9yZUNvbG9yKCZUaGVDb2xvcik7Cn0KCi8qCiAqIFNldCB0aGUgY3VycmVudCB0ZXh0IGJhY2tncm91bmQgY29sb3IuCiAqLwogICAgdm9pZApndWlfbWNoX3NldF9iZ19jb2xvcihjb2xvcikKICAgIGd1aWNvbG9yX1QJY29sb3I7CnsKICAgIFJHQkNvbG9yIFRoZUNvbG9yOwoKICAgIFRoZUNvbG9yLnJlZCA9IFJlZChjb2xvcikgKiAweDAxMDE7CiAgICBUaGVDb2xvci5ncmVlbiA9IEdyZWVuKGNvbG9yKSAqIDB4MDEwMTsKICAgIFRoZUNvbG9yLmJsdWUgPSBCbHVlKGNvbG9yKSAqIDB4MDEwMTsKCiAgICBSR0JCYWNrQ29sb3IoJlRoZUNvbG9yKTsKfQoKLyoKICogU2V0IHRoZSBjdXJyZW50IHRleHQgc3BlYWlsIGNvbG9yLiBUT0RPCiAqLwogICAgdm9pZApndWlfbWNoX3NldF9zcF9jb2xvcihjb2xvcikKICAgIGd1aWNvbG9yX1QJY29sb3I7CnsKfQoKICAgIHZvaWQKZ3VpX21jaF9kcmF3X3N0cmluZyhyb3csIGNvbCwgcywgbGVuLCBmbGFncykKICAgIGludAkJcm93OwogICAgaW50CQljb2w7CiAgICBjaGFyX3UJKnM7CiAgICBpbnQJCWxlbjsKICAgIGludAkJZmxhZ3M7CnsKI2lmZGVmIEZFQVRfTUJZVEUKI2lmZGVmIFVTRV9BVFNVSV9EUkFXSU5HCiAgICAvKiBBVFNVSSByZXF1aXJlcyB1dGYtMTYgc3RyaW5ncyAqLwogICAgVW5pQ2hhckNvdW50IHV0ZjE2X2xlbjsKICAgIFVuaUNoYXIgKnRvZnJlZSA9IG1hY19lbmNfdG9fdXRmMTYocywgbGVuLCAoc2l6ZV90ICopJnV0ZjE2X2xlbik7CiAgICB1dGYxNl9sZW4gLz0gc2l6ZW9mKFVuaUNoYXIpOwojZWxzZQogICAgY2hhcl91CSp0b2ZyZWUgPSBOVUxMOwoKICAgIGlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKICAgIHsKCXRvZnJlZSA9IHN0cmluZ19jb252ZXJ0KCZvdXRwdXRfY29udiwgcywgJmxlbik7CglpZiAodG9mcmVlICE9IE5VTEwpCgkgICAgcyA9IHRvZnJlZTsKICAgIH0KI2VuZGlmCiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVF9HVUkpICYmIGRlZmluZWQoTUFDT1NfWCkKICAgIC8qIEFUU1VJIGF1dG9tYXRpY2FsbHkgYW50aWFsaWFzZXMgdGV4dCAqLwojaWZuZGVmIFVTRV9BVFNVSV9EUkFXSU5HCiAgICAvKgogICAgICogT24gT1MgWCwgdHJ5IHVzaW5nIFF1YXJ0ei1zdHlsZSB0ZXh0IGFudGlhbGlhc2luZy4KICAgICAqLwogICAgaWYgKGdNYWNTeXN0ZW1WZXJzaW9uID49IDB4MTAyMCkKICAgIHsKCS8qIFF1YXJ0eiBhbnRpYWxpYXNpbmcgaXMgYXZhaWxhYmxlIG9ubHkgaW4gT1MgMTAuMiBhbmQgbGF0ZXIuICovCglVSW50MzIgcWRfZmxhZ3MgPSAocF9hbnRpYWxpYXMgPwoJCQkgICAgIGtRRFVzZUNHVGV4dFJlbmRlcmluZyB8IGtRRFVzZUNHVGV4dE1ldHJpY3MgOiAwKTsKCVFEU3dhcFRleHRGbGFncyhxZF9mbGFncyk7CiAgICB9CiNlbmRpZgoKICAgIC8qCiAgICAgKiBXaGVuIGFudGlhbGlhc2luZyB3ZSdyZSB1c2luZyBzcmNPciBtb2RlLCB3ZSBoYXZlIHRvIGNsZWFyIHRoZSBibG9jawogICAgICogYmVmb3JlIGRyYXdpbmcgdGhlIHRleHQuCiAgICAgKiBBbHNvIG5lZWRlZCB3aGVuICdsaW5lc3BhY2UnIGlzIG5vbi16ZXJvIHRvIHJlbW92ZSB0aGUgY3Vyc29yIGFuZAogICAgICogdW5kZXJsaW5pbmcuCiAgICAgKiBCdXQgbm90IHdoZW4gZHJhd2luZyB0cmFuc3BhcmVudGx5LgogICAgICogVGhlIGZvbGxvd2luZyBpcyBsaWtlIGNhbGxpbmcgZ3VpX21jaF9jbGVhcl9ibG9jayhyb3csIGNvbCwgcm93LCBjb2wgKwogICAgICogbGVuIC0gMSksIGJ1dCB3aXRob3V0IHNldHRpbmcgdGhlIGJnIGNvbG9yIHRvIGd1aS5iYWNrX3BpeGVsLgogICAgICovCiNpZmRlZiBVU0VfQVRTVUlfRFJBV0lORwogICAgaWYgKChmbGFncyAmIERSQVdfVFJBTlNQKSA9PSAwKQojZWxzZQogICAgaWYgKCgoZ01hY1N5c3RlbVZlcnNpb24gPj0gMHgxMDIwICYmIHBfYW50aWFsaWFzKSB8fCBwX2xpbmVzcGFjZSAhPSAwKQoJICAgICYmICEoZmxhZ3MgJiBEUkFXX1RSQU5TUCkpCiNlbmRpZgogICAgewoJUmVjdCByYzsKCglyYy5sZWZ0ID0gRklMTF9YKGNvbCk7CglyYy50b3AgPSBGSUxMX1kocm93KTsKI2lmZGVmIEZFQVRfTUJZVEUKCS8qIE11bHRpYnl0ZSBjb21wdXRhdGlvbiB0YWtlbiBmcm9tIGd1aV93MzIuYyAqLwoJaWYgKGhhc19tYnl0ZSkKCXsKCSAgICBpbnQgY2VsbF9sZW4gPSAwOwoJICAgIGludCBuOwoKCSAgICAvKiBDb21wdXRlIHRoZSBsZW5ndGggaW4gZGlzcGxheSBjZWxscy4gKi8KCSAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuICs9IE1CX0JZVEUyTEVOKHNbbl0pKQoJCWNlbGxfbGVuICs9ICgqbWJfcHRyMmNlbGxzKShzICsgbik7CgkgICAgcmMucmlnaHQgPSBGSUxMX1goY29sICsgY2VsbF9sZW4pOwoJfQoJZWxzZQojZW5kaWYKCXJjLnJpZ2h0ID0gRklMTF9YKGNvbCArIGxlbikgKyAoY29sICsgbGVuID09IENvbHVtbnMpOwoJcmMuYm90dG9tID0gRklMTF9ZKHJvdyArIDEpOwoJRXJhc2VSZWN0KCZyYyk7CiAgICB9CgojaWZuZGVmIFVTRV9BVFNVSV9EUkFXSU5HCiAgICBpZiAoZ01hY1N5c3RlbVZlcnNpb24gPj0gMHgxMDIwICYmIHBfYW50aWFsaWFzKQogICAgewoJU3R5bGVQYXJhbWV0ZXIgZmFjZTsKCglmYWNlID0gbm9ybWFsOwoJaWYgKGZsYWdzICYgRFJBV19CT0xEKQoJICAgIGZhY2UgfD0gYm9sZDsKCWlmIChmbGFncyAmIERSQVdfVU5ERVJMKQoJICAgIGZhY2UgfD0gdW5kZXJsaW5lOwoJVGV4dEZhY2UoZmFjZSk7CgoJLyogUXVhcnR6IGFudGlhbGlhc2luZyB3b3JrcyBvbmx5IGluIHNyY09yIHRyYW5zZmVyIG1vZGUuICovCglUZXh0TW9kZShzcmNPcik7CgoJTW92ZVRvKFRFWFRfWChjb2wpLCBURVhUX1kocm93KSk7CglEcmF3VGV4dCgoY2hhciopcywgMCwgbGVuKTsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiNlbmRpZgogICAgewoJLyogVXNlIG9sZC1zdHlsZSwgbm9uLWFudGlhbGlhc2VkIFF1aWNrRHJhdyB0ZXh0IHJlbmRlcmluZy4gKi8KCVRleHRNb2RlKHNyY0NvcHkpOwoJVGV4dEZhY2Uobm9ybWFsKTsKCiAgICAvKiAgU2VsZWN0Rm9udChoZGMsIGd1aS5jdXJyRm9udCk7ICovCgoJaWYgKGZsYWdzICYgRFJBV19UUkFOU1ApCgl7CgkgICAgVGV4dE1vZGUoc3JjT3IpOwoJfQoKCU1vdmVUbyhURVhUX1goY29sKSwgVEVYVF9ZKHJvdykpOwojaWZkZWYgVVNFX0FUU1VJX0RSQVdJTkcKCUFUU1VUZXh0TGF5b3V0IHRleHRMYXlvdXQ7CgoJaWYgKEFUU1VDcmVhdGVUZXh0TGF5b3V0V2l0aFRleHRQdHIodG9mcmVlLAoJCSAgICBrQVRTVUZyb21UZXh0QmVnaW5uaW5nLCBrQVRTVVRvVGV4dEVuZCwKCQkgICAgdXRmMTZfbGVuLAoJCSAgICAoZ0ZvbnRTdHlsZSA/IDEgOiAwKSwgJnV0ZjE2X2xlbiwKCQkgICAgKGdGb250U3R5bGUgPyAmZ0ZvbnRTdHlsZSA6IE5VTEwpLAoJCSAgICAmdGV4dExheW91dCkgPT0gbm9FcnIpCgl7CgkgICAgQVRTVVNldFRyYW5zaWVudEZvbnRNYXRjaGluZyh0ZXh0TGF5b3V0LCBUUlVFKTsKCgkgICAgQVRTVURyYXdUZXh0KHRleHRMYXlvdXQsCgkJICAgIGtBVFNVRnJvbVRleHRCZWdpbm5pbmcsIGtBVFNVVG9UZXh0RW5kLAoJCSAgICBrQVRTVVVzZUdyYWZQb3J0UGVuTG9jLCBrQVRTVVVzZUdyYWZQb3J0UGVuTG9jKTsKCgkgICAgQVRTVURpc3Bvc2VUZXh0TGF5b3V0KHRleHRMYXlvdXQpOwoJfQojZWxzZQoJRHJhd1RleHQoKGNoYXIgKilzLCAwLCBsZW4pOwoKCglpZiAoZmxhZ3MgJiBEUkFXX0JPTEQpCgl7CgkgICAgVGV4dE1vZGUoc3JjT3IpOwoJICAgIE1vdmVUbyhURVhUX1goY29sKSArIDEsIFRFWFRfWShyb3cpKTsKCSAgICBEcmF3VGV4dCgoY2hhciAqKXMsIDAsIGxlbik7Cgl9CgoJaWYgKGZsYWdzICYgRFJBV19VTkRFUkwpCgl7CgkgICAgTW92ZVRvKEZJTExfWChjb2wpLCBGSUxMX1kocm93ICsgMSkgLSAxKTsKCSAgICBMaW5lVG8oRklMTF9YKGNvbCArIGxlbikgLSAxLCBGSUxMX1kocm93ICsgMSkgLSAxKTsKCX0KI2VuZGlmCiAgICB9CgojaWZkZWYgRkVBVF9NQllURQogICAgdmltX2ZyZWUodG9mcmVlKTsKI2VuZGlmCn0KCi8qCiAqIFJldHVybiBPSyBpZiB0aGUga2V5IHdpdGggdGhlIHRlcm1jYXAgbmFtZSAibmFtZSIgaXMgc3VwcG9ydGVkLgogKi8KICAgIGludApndWlfbWNoX2hhc2tleShuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgaW50IGk7CgogICAgZm9yIChpID0gMDsgc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gIT0gKEtleVN5bSkwOyBpKyspCglpZiAobmFtZVswXSA9PSBzcGVjaWFsX2tleXNbaV0udmltX2NvZGUwICYmCgkJCQkJIG5hbWVbMV0gPT0gc3BlY2lhbF9rZXlzW2ldLnZpbV9jb2RlMSkKCSAgICByZXR1cm4gT0s7CiAgICByZXR1cm4gRkFJTDsKfQoKICAgIHZvaWQKZ3VpX21jaF9iZWVwKCkKewogICAgU3lzQmVlcCgxKTsgLyogU2hvdWxkIHRoaXMgYmUgMD8gKD8/Pz8pICovCn0KCiAgICB2b2lkCmd1aV9tY2hfZmxhc2gobXNlYykKICAgIGludAkgICAgbXNlYzsKewogICAgLyogRG8gYSB2aXN1YWwgYmVlcCBieSByZXZlcnNpbmcgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzICovCiAgICBSZWN0ICAgIHJjOwoKICAgIC8qCiAgICAgKiBOb3RlOiBJbnZlcnRSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCiAgICAgKi8KICAgIHJjLmxlZnQgPSAwOwogICAgcmMudG9wID0gMDsKICAgIHJjLnJpZ2h0ID0gZ3VpLm51bV9jb2xzICogZ3VpLmNoYXJfd2lkdGg7CiAgICByYy5ib3R0b20gPSBndWkubnVtX3Jvd3MgKiBndWkuY2hhcl9oZWlnaHQ7CiAgICBJbnZlcnRSZWN0KCZyYyk7CgogICAgdWlfZGVsYXkoKGxvbmcpbXNlYywgVFJVRSk7CQkvKiB3YWl0IGZvciBzb21lIG1zZWMgKi8KCiAgICBJbnZlcnRSZWN0KCZyYyk7Cn0KCi8qCiAqIEludmVydCBhIHJlY3RhbmdsZSBmcm9tIHJvdyByLCBjb2x1bW4gYywgZm9yIG5yIHJvd3MgYW5kIG5jIGNvbHVtbnMuCiAqLwogICAgdm9pZApndWlfbWNoX2ludmVydF9yZWN0YW5nbGUociwgYywgbnIsIG5jKQogICAgaW50CQlyOwogICAgaW50CQljOwogICAgaW50CQlucjsKICAgIGludAkJbmM7CnsKICAgIFJlY3QJcmM7CgogICAgLyoKICAgICAqIE5vdGU6IEludmVydFJlY3QoKSBleGNsdWRlcyByaWdodCBhbmQgYm90dG9tIG9mIHJlY3RhbmdsZS4KICAgICAqLwogICAgcmMubGVmdCA9IEZJTExfWChjKTsKICAgIHJjLnRvcCA9IEZJTExfWShyKTsKICAgIHJjLnJpZ2h0ID0gcmMubGVmdCArIG5jICogZ3VpLmNoYXJfd2lkdGg7CiAgICByYy5ib3R0b20gPSByYy50b3AgKyBuciAqIGd1aS5jaGFyX2hlaWdodDsKICAgIEludmVydFJlY3QoJnJjKTsKCn0KCi8qCiAqIEljb25pZnkgdGhlIEdVSSB3aW5kb3cuCiAqLwogICAgdm9pZApndWlfbWNoX2ljb25pZnkoKQp7CiAgICAvKiBUT0RPOiBmaW5kIG91dCB3aGF0IGNvdWxkIHJlcGxhY2UgaWNvbmlmeQogICAgICoJICAgICAtd2luZG93IHNoYWRlPwogICAgICoJICAgICAtaGlkZSBhcHBsaWNhdGlvbj8KICAgICAqLwp9CgojaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIEJyaW5nIHRoZSBWaW0gd2luZG93IHRvIHRoZSBmb3JlZ3JvdW5kLgogKi8KICAgIHZvaWQKZ3VpX21jaF9zZXRfZm9yZWdyb3VuZCgpCnsKICAgIC8qIFRPRE8gKi8KfQojZW5kaWYKCi8qCiAqIERyYXcgYSBjdXJzb3Igd2l0aG91dCBmb2N1cy4KICovCiAgICB2b2lkCmd1aV9tY2hfZHJhd19ob2xsb3dfY3Vyc29yKGNvbG9yKQogICAgZ3VpY29sb3JfVAljb2xvcjsKewogICAgUmVjdCByYzsKCiAgICAvKgogICAgICogTm90ZTogRnJhbWVSZWN0KCkgZXhjbHVkZXMgcmlnaHQgYW5kIGJvdHRvbSBvZiByZWN0YW5nbGUuCiAgICAgKi8KICAgIHJjLmxlZnQgPSBGSUxMX1goZ3VpLmNvbCk7CiAgICByYy50b3AgPSBGSUxMX1koZ3VpLnJvdyk7CiAgICByYy5yaWdodCA9IHJjLmxlZnQgKyBndWkuY2hhcl93aWR0aDsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGlmIChtYl9sZWZ0aGFsdmUoZ3VpLnJvdywgZ3VpLmNvbCkpCglyYy5yaWdodCArPSBndWkuY2hhcl93aWR0aDsKI2VuZGlmCiAgICByYy5ib3R0b20gPSByYy50b3AgKyBndWkuY2hhcl9oZWlnaHQ7CgogICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOwoKICAgIEZyYW1lUmVjdCgmcmMpOwp9CgovKgogKiBEcmF3IHBhcnQgb2YgYSBjdXJzb3IsIG9ubHkgdyBwaXhlbHMgd2lkZSwgYW5kIGggcGl4ZWxzIGhpZ2guCiAqLwogICAgdm9pZApndWlfbWNoX2RyYXdfcGFydF9jdXJzb3IodywgaCwgY29sb3IpCiAgICBpbnQJCXc7CiAgICBpbnQJCWg7CiAgICBndWljb2xvcl9UCWNvbG9yOwp7CiAgICBSZWN0IHJjOwoKI2lmZGVmIEZFQVRfUklHSFRMRUZUCiAgICAvKiB2ZXJ0aWNhbCBsaW5lIHNob3VsZCBiZSBvbiB0aGUgcmlnaHQgb2YgY3VycmVudCBwb2ludCAqLwogICAgaWYgKENVUlNPUl9CQVJfUklHSFQpCglyYy5sZWZ0ID0gRklMTF9YKGd1aS5jb2wgKyAxKSAtIHc7CiAgICBlbHNlCiNlbmRpZgoJcmMubGVmdCA9IEZJTExfWChndWkuY29sKTsKICAgIHJjLnRvcCA9IEZJTExfWShndWkucm93KSArIGd1aS5jaGFyX2hlaWdodCAtIGg7CiAgICByYy5yaWdodCA9IHJjLmxlZnQgKyB3OwogICAgcmMuYm90dG9tID0gcmMudG9wICsgaDsKCiAgICBndWlfbWNoX3NldF9mZ19jb2xvcihjb2xvcik7CgogICAgRnJhbWVSZWN0KCZyYyk7Ci8vICAgIFBhaW50UmVjdCgmcmMpOwp9CgoKCi8qCiAqIENhdGNoIHVwIHdpdGggYW55IHF1ZXVlZCBYIGV2ZW50cy4gIFRoaXMgbWF5IHB1dCBrZXlib2FyZCBpbnB1dCBpbnRvIHRoZQogKiBpbnB1dCBidWZmZXIsIGNhbGwgcmVzaXplIGNhbGwtYmFja3MsIHRyaWdnZXIgdGltZXJzIGV0Yy4gIElmIHRoZXJlIGlzCiAqIG5vdGhpbmcgaW4gdGhlIFggZXZlbnQgcXVldWUgKCYgbm8gdGltZXJzIHBlbmRpbmcpLCB0aGVuIHdlIHJldHVybgogKiBpbW1lZGlhdGVseS4KICovCiAgICB2b2lkCmd1aV9tY2hfdXBkYXRlKCkKewogICAgLyogVE9ETzogZmluZCB3aGF0IHRvIGRvCiAgICAgKgkgICAgIG1heWJlIGNhbGwgZ3VpX21jaF93YWl0X2Zvcl9jaGFycyAoMCkKICAgICAqCSAgICAgbW9yZSBsaWtlIGxvb2sgYXQgRXZlbnRRdWV1ZSB0aGVuCiAgICAgKgkgICAgIGNhbGwgaGVhcnQgb2YgZ3VpX21jaF93YWl0X2Zvcl9jaGFyczsKICAgICAqCiAgICAgKglpZiAoZXZlbnR0aGVyKQogICAgICoJICAgIGd1aV9tYWNfaGFuZGxlX2V2ZW50KCZldmVudCk7CiAgICAgKi8KICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OwoKICAgIGlmIChFdmVudEF2YWlsKGV2ZXJ5RXZlbnQsICZ0aGVFdmVudCkpCglpZiAodGhlRXZlbnQud2hhdCAhPSBudWxsRXZlbnQpCgkgICAgZ3VpX21jaF93YWl0X2Zvcl9jaGFycygwKTsKfQoKLyoKICogU2ltcGxlIHdyYXBwZXIgdG8gbmVnbGVjdCBtb3JlIGVhc2lseSB0aGUgdGltZQogKiBzcGVudCBpbnNpZGUgV2FpdE5leHRFdmVudCB3aGlsZSBwcm9maWxpbmcuCiAqLwoKI2lmIGRlZmluZWQoX19NV0VSS1NfXykgIC8qIG9ubHkgaW4gQ29kZXdhcnJpb3IgKi8KIyBwcmFnbWEgcHJvZmlsZSByZXNldAojZW5kaWYKICAgIHBhc2NhbAogICAgQm9vbGVhbgpXYWl0TmV4dEV2ZW50V3JwKEV2ZW50TWFzayBldmVudE1hc2ssIEV2ZW50UmVjb3JkICp0aGVFdmVudCwgVUludDMyIHNsZWVwLCBSZ25IYW5kbGUgbW91c2VSZ24pCnsKICAgIGlmICgoKGxvbmcpIHNsZWVwKSA8IC0xKQoJc2xlZXAgPSAzMjc2NzsKICAgIHJldHVybiBXYWl0TmV4dEV2ZW50KGV2ZW50TWFzaywgdGhlRXZlbnQsIHNsZWVwLCBtb3VzZVJnbik7Cn0KCi8qCiAqIEdVSSBpbnB1dCByb3V0aW5lIGNhbGxlZCBieSBndWlfd2FpdF9mb3JfY2hhcnMoKS4gIFdhaXRzIGZvciBhIGNoYXJhY3RlcgogKiBmcm9tIHRoZSBrZXlib2FyZC4KICogIHd0aW1lID09IC0xCSAgICBXYWl0IGZvcmV2ZXIuCiAqICB3dGltZSA9PSAwCSAgICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCiAqICB3dGltZSA+IDAJICAgIFdhaXQgd3RpbWUgbWlsbGlzZWNvbmRzIGZvciBhIGNoYXJhY3Rlci4KICogUmV0dXJucyBPSyBpZiBhIGNoYXJhY3RlciB3YXMgZm91bmQgdG8gYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZSwKICogb3IgRkFJTCBvdGhlcndpc2UuCiAqLwojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBwcm9maWxlIHJlc2V0CiNlbmRpZgogICAgaW50Cmd1aV9tY2hfd2FpdF9mb3JfY2hhcnMod3RpbWUpCiAgICBpbnQJICAgIHd0aW1lOwp7CiAgICBFdmVudE1hc2sJbWFzayAgPSAoZXZlcnlFdmVudCk7CiAgICBFdmVudFJlY29yZCBldmVudDsKICAgIGxvbmcJZW50cnlUaWNrOwogICAgbG9uZwljdXJyZW50VGljazsKICAgIGxvbmcJc2xlZXBweVRpY2s7CgogICAgLyogSWYgd2UgYXJlIHByb3ZpZGluZyBsaWZlIGZlZWRiYWNrIHdpdGggdGhlIHNjcm9sbGJhciwKICAgICAqIHdlIGRvbid0IHdhbnQgdG8gdHJ5IHRvIHdhaXQgZm9yIGFuIGV2ZW50LCBvciBlbHNlCiAgICAgKiB0aGVyZSB3b24ndCBiZSBhbnkgbGlmZSBmZWVkYmFjay4KICAgICAqLwogICAgaWYgKGRyYWdnZWRfc2IgIT0gTlVMTCkKCXJldHVybiBGQUlMOwoJLyogVE9ETzogQ2hlY2sgaWYgRkFJTCBpcyB0aGUgcHJvcGVyIHJldHVybiBjb2RlICovCgogICAgZW50cnlUaWNrID0gVGlja0NvdW50KCk7CgogICAgYWxsb3dfc2Nyb2xsYmFyID0gVFJVRTsKCiAgICBkbwogICAgewovKglpZiAoZHJhZ1JlY3RDb250cm9sID09IGtDcmVhdGVFbXB0eSkKCXsKCSAgICBkcmFnUmduID0gTlVMTDsKCSAgICBkcmFnUmVjdENvbnRyb2wgPSBrTm90aGluZzsKCX0KCWVsc2UqLyBpZiAoZHJhZ1JlY3RDb250cm9sID09IGtDcmVhdGVSZWN0KQoJewoJICAgIGRyYWdSZ24gPSBjdXJzb3JSZ247CgkgICAgUmVjdFJnbihkcmFnUmduLCAmZHJhZ1JlY3QpOwoJICAgIGRyYWdSZWN0Q29udHJvbCA9IGtOb3RoaW5nOwoJfQoJLyoKCSAqIERvbid0IHVzZSBndWlfbWNoX3VwZGF0ZSgpIGJlY2F1c2UgdGhlbiB3ZSB3aWxsIHNwaW4tbG9jayB1bnRpbCBhCgkgKiBjaGFyIGFycml2ZXMsIGluc3RlYWQgd2UgdXNlIFdhaXROZXh0RXZlbnRXcnAoKSB0byBoYW5nIHVudGlsIGFuCgkgKiBldmVudCBhcnJpdmVzLiAgTm8gbmVlZCB0byBjaGVjayBmb3IgaW5wdXRfYnVmX2Z1bGwgYmVjYXVzZSB3ZSBhcmUKCSAqIHJldHVybmluZyBhcyBzb29uIGFzIGl0IGNvbnRhaW5zIGEgc2luZ2xlIGNoYXIuCgkgKi8KCS8qIFRPRE86IHJlZHVjZSB3dGltZSBhY2NvcmRpbmx5Pz8/ICAqLwoJaWYgKHd0aW1lID4gLTEpCgkgICAgc2xlZXBweVRpY2sgPSA2MCp3dGltZS8xMDAwOwoJZWxzZQoJICAgIHNsZWVwcHlUaWNrID0gMzI3Njc7CglpZiAoV2FpdE5leHRFdmVudFdycChtYXNrLCAmZXZlbnQsIHNsZWVwcHlUaWNrLCBkcmFnUmduKSkKCXsKI2lmZGVmIFVTRV9TSU9VWAoJICAgIGlmICghU0lPVVhIYW5kbGVPbmVFdmVudCgmZXZlbnQpKQojZW5kaWYKCQlndWlfbWFjX2hhbmRsZV9ldmVudCgmZXZlbnQpOwoJICAgIGlmIChpbnB1dF9hdmFpbGFibGUoKSkKCSAgICB7CgkJYWxsb3dfc2Nyb2xsYmFyID0gRkFMU0U7CgkJcmV0dXJuIE9LOwoJICAgIH0KCX0KCWN1cnJlbnRUaWNrID0gVGlja0NvdW50KCk7CiAgICB9CiAgICB3aGlsZSAoKHd0aW1lID09IC0xKSB8fCAoKGN1cnJlbnRUaWNrIC0gZW50cnlUaWNrKSA8IDYwKnd0aW1lLzEwMDApKTsKCiAgICBhbGxvd19zY3JvbGxiYXIgPSBGQUxTRTsKICAgIHJldHVybiBGQUlMOwp9CgojaWYgZGVmaW5lZChfX01XRVJLU19fKSAgLyogb25seSBpbiBDb2Rld2FycmlvciAqLwojIHByYWdtYSBwcm9maWxlIHJlc2V0CiNlbmRpZgoKLyoKICogT3V0cHV0IHJvdXRpbmVzLgogKi8KCi8qIEZsdXNoIGFueSBvdXRwdXQgdG8gdGhlIHNjcmVlbiAqLwogICAgdm9pZApndWlfbWNoX2ZsdXNoKCkKewogICAgLyogVE9ETzogSXMgYW55dGhpbmcgbmVlZGVkIGhlcmU/ICovCn0KCi8qCiAqIENsZWFyIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHRoZSBzY3JlZW4gZnJvbSB0ZXh0IHBvcyAocm93MSwgY29sMSkgdG8KICogKHJvdzIsIGNvbDIpIGluY2x1c2l2ZS4KICovCiAgICB2b2lkCmd1aV9tY2hfY2xlYXJfYmxvY2socm93MSwgY29sMSwgcm93MiwgY29sMikKICAgIGludAkJcm93MTsKICAgIGludAkJY29sMTsKICAgIGludAkJcm93MjsKICAgIGludAkJY29sMjsKewogICAgUmVjdCByYzsKCiAgICAvKgogICAgICogQ2xlYXIgb25lIGV4dHJhIHBpeGVsIGF0IHRoZSBmYXIgcmlnaHQsIGZvciB3aGVuIGJvbGQgY2hhcmFjdGVycyBoYXZlCiAgICAgKiBzcGlsbGVkIG92ZXIgdG8gdGhlIG5leHQgY29sdW1uLgogICAgICovCiAgICByYy5sZWZ0ID0gRklMTF9YKGNvbDEpOwogICAgcmMudG9wID0gRklMTF9ZKHJvdzEpOwogICAgcmMucmlnaHQgPSBGSUxMX1goY29sMiArIDEpICsgKGNvbDIgPT0gQ29sdW1ucyAtIDEpOwogICAgcmMuYm90dG9tID0gRklMTF9ZKHJvdzIgKyAxKTsKCiAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CiAgICBFcmFzZVJlY3QoJnJjKTsKfQoKLyoKICogQ2xlYXIgdGhlIHdob2xlIHRleHQgd2luZG93LgogKi8KICAgIHZvaWQKZ3VpX21jaF9jbGVhcl9hbGwoKQp7CiAgICBSZWN0CXJjOwoKICAgIHJjLmxlZnQgPSAwOwogICAgcmMudG9wID0gMDsKICAgIHJjLnJpZ2h0ID0gQ29sdW1ucyAqIGd1aS5jaGFyX3dpZHRoICsgMiAqIGd1aS5ib3JkZXJfd2lkdGg7CiAgICByYy5ib3R0b20gPSBSb3dzICogZ3VpLmNoYXJfaGVpZ2h0ICsgMiAqIGd1aS5ib3JkZXJfd2lkdGg7CgogICAgZ3VpX21jaF9zZXRfYmdfY29sb3IoZ3VpLmJhY2tfcGl4ZWwpOwogICAgRXJhc2VSZWN0KCZyYyk7Ci8qICBndWlfbWNoX3NldF9mZ19jb2xvcihndWkubm9ybV9waXhlbCk7CiAgICBGcmFtZVJlY3QoJnJjKTsKKi8KfQoKLyoKICogRGVsZXRlIHRoZSBnaXZlbiBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUgZ2l2ZW4gcm93LCBzY3JvbGxpbmcgdXAgYW55CiAqIHRleHQgZnVydGhlciBkb3duIHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KICovCiAgICB2b2lkCmd1aV9tY2hfZGVsZXRlX2xpbmVzKHJvdywgbnVtX2xpbmVzKQogICAgaW50CQlyb3c7CiAgICBpbnQJCW51bV9saW5lczsKewogICAgUmVjdAlyYzsKCiAgICAvKiBjaGFuZ2VkIHdpdGhvdXQgY2hlY2tpbmchICovCiAgICByYy5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOwogICAgcmMucmlnaHQgPSBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgKyAxKTsKICAgIHJjLnRvcCA9IEZJTExfWShyb3cpOwogICAgcmMuYm90dG9tID0gRklMTF9ZKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCArIDEpOwoKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKICAgIFNjcm9sbFJlY3QoJnJjLCAwLCAtbnVtX2xpbmVzICogZ3VpLmNoYXJfaGVpZ2h0LCAoUmduSGFuZGxlKSBuaWwpOwoKICAgIGd1aV9jbGVhcl9ibG9jayhndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBudW1fbGluZXMgKyAxLAoJCQkJCQkgICAgICAgZ3VpLnNjcm9sbF9yZWdpb25fbGVmdCwKCWd1aS5zY3JvbGxfcmVnaW9uX2JvdCwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOwp9CgovKgogKiBJbnNlcnQgdGhlIGdpdmVuIG51bWJlciBvZiBsaW5lcyBiZWZvcmUgdGhlIGdpdmVuIHJvdywgc2Nyb2xsaW5nIGRvd24gYW55CiAqIGZvbGxvd2luZyB0ZXh0IHdpdGhpbiB0aGUgc2Nyb2xsIHJlZ2lvbi4KICovCiAgICB2b2lkCmd1aV9tY2hfaW5zZXJ0X2xpbmVzKHJvdywgbnVtX2xpbmVzKQogICAgaW50CQlyb3c7CiAgICBpbnQJCW51bV9saW5lczsKewogICAgUmVjdCByYzsKCiAgICByYy5sZWZ0ID0gRklMTF9YKGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQpOwogICAgcmMucmlnaHQgPSBGSUxMX1goZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQgKyAxKTsKICAgIHJjLnRvcCA9IEZJTExfWShyb3cpOwogICAgcmMuYm90dG9tID0gRklMTF9ZKGd1aS5zY3JvbGxfcmVnaW9uX2JvdCArIDEpOwoKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKCiAgICBTY3JvbGxSZWN0KCZyYywgMCwgZ3VpLmNoYXJfaGVpZ2h0ICogbnVtX2xpbmVzLCAoUmduSGFuZGxlKSBuaWwpOwoKICAgIC8qIFVwZGF0ZSBndWkuY3Vyc29yX3JvdyBpZiB0aGUgY3Vyc29yIHNjcm9sbGVkIG9yIGNvcGllZCBvdmVyICovCiAgICBpZiAoZ3VpLmN1cnNvcl9yb3cgPj0gZ3VpLnJvdwoJICAgICYmIGd1aS5jdXJzb3JfY29sID49IGd1aS5zY3JvbGxfcmVnaW9uX2xlZnQKCSAgICAmJiBndWkuY3Vyc29yX2NvbCA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9yaWdodCkKICAgIHsKCWlmIChndWkuY3Vyc29yX3JvdyA8PSBndWkuc2Nyb2xsX3JlZ2lvbl9ib3QgLSBudW1fbGluZXMpCgkgICAgZ3VpLmN1cnNvcl9yb3cgKz0gbnVtX2xpbmVzOwoJZWxzZSBpZiAoZ3VpLmN1cnNvcl9yb3cgPD0gZ3VpLnNjcm9sbF9yZWdpb25fYm90KQoJICAgIGd1aS5jdXJzb3JfaXNfdmFsaWQgPSBGQUxTRTsKICAgIH0KCiAgICBndWlfY2xlYXJfYmxvY2socm93LCBndWkuc2Nyb2xsX3JlZ2lvbl9sZWZ0LAoJCQkJcm93ICsgbnVtX2xpbmVzIC0gMSwgZ3VpLnNjcm9sbF9yZWdpb25fcmlnaHQpOwp9CgogICAgLyoKICAgICAqIFRPRE86IGFkZCBhIHZpbSBmb3JtYXQgdG8gdGhlIGNsaXBib2FyZCB3aGljaCByZW1lbWJlcgogICAgICoJICAgICBMSU5FV0lTRSwgQ0hBUldJU0UsIEJMT0NLV0lTRQogICAgICovCgogICAgdm9pZApjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihjYmQpCiAgICBWaW1DbGlwYm9hcmQgKmNiZDsKewoKICAgIEhhbmRsZQl0ZXh0T2ZDbGlwOwogICAgaW50CQlmbGF2b3IgPSAwOwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIFNpemUJc2NyYXBTaXplOwogICAgU2NyYXBGbGF2b3JGbGFncwlzY3JhcEZsYWdzOwogICAgU2NyYXBSZWYgICAgc2NyYXAgPSBuaWw7CiAgICBPU1N0YXR1cwllcnJvcjsKI2Vsc2UKICAgIGxvbmcJc2NyYXBPZmZzZXQ7CiAgICBsb25nCXNjcmFwU2l6ZTsKI2VuZGlmCiAgICBpbnQJCXR5cGU7CiAgICBjaGFyCSpzZWFyY2hDUjsKICAgIGNoYXJfdQkqdGVtcGNsaXA7CgoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBlcnJvciA9IEdldEN1cnJlbnRTY3JhcCgmc2NyYXApOwogICAgaWYgKGVycm9yICE9IG5vRXJyKQoJcmV0dXJuOwoKICAgIGVycm9yID0gR2V0U2NyYXBGbGF2b3JGbGFncyhzY3JhcCwgVklNU0NSQVBGTEFWT1IsICZzY3JhcEZsYWdzKTsKICAgIGlmIChlcnJvciA9PSBub0VycikKICAgIHsKCWVycm9yID0gR2V0U2NyYXBGbGF2b3JTaXplKHNjcmFwLCBWSU1TQ1JBUEZMQVZPUiwgJnNjcmFwU2l6ZSk7CglpZiAoZXJyb3IgPT0gbm9FcnIgJiYgc2NyYXBTaXplID4gMSkKCSAgICBmbGF2b3IgPSAxOwogICAgfQoKICAgIGlmIChmbGF2b3IgPT0gMCkKICAgIHsKCWVycm9yID0gR2V0U2NyYXBGbGF2b3JGbGFncyhzY3JhcCwga1NjcmFwRmxhdm9yVHlwZVVuaWNvZGUsICZzY3JhcEZsYWdzKTsKCWlmIChlcnJvciAhPSBub0VycikKCSAgICByZXR1cm47CgoJZXJyb3IgPSBHZXRTY3JhcEZsYXZvclNpemUoc2NyYXAsIGtTY3JhcEZsYXZvclR5cGVVbmljb2RlLCAmc2NyYXBTaXplKTsKCWlmIChlcnJvciAhPSBub0VycikKCSAgICByZXR1cm47CiAgICB9CgogICAgUmVzZXJ2ZU1lbShzY3JhcFNpemUpOwojZWxzZQogICAgLyogQ2FsbCB0byBMb2FkU2NyYXAgc2VlbSB0byBhdm9pZCBwcm9ibGVtIHdpdGggY3Jhc2ggb24gZmlyc3QgcGFzdGUgKi8KICAgIHNjcmFwU2l6ZSA9IExvYWRTY3JhcCgpOwogICAgc2NyYXBTaXplID0gR2V0U2NyYXAobmlsLCAnVEVYVCcsICZzY3JhcE9mZnNldCk7CgogICAgaWYgKHNjcmFwU2l6ZSA+IDApCiNlbmRpZgogICAgewojaWZkZWYgVVNFX0NBUkJPTklaRUQKCS8qIEluIENBUkJPTiB3ZSBkb24ndCBuZWVkIGEgSGFuZGxlLCBhIHBvaW50ZXIgaXMgZ29vZCAqLwoJdGV4dE9mQ2xpcCA9IE5ld0hhbmRsZShzY3JhcFNpemUpOwoJLyogdGVtcGNsaXAgPSBsYWxsb2Moc2NyYXBTaXplKzEsIFRSVUUpOyAqLwojZWxzZQoJdGV4dE9mQ2xpcCA9IE5ld0hhbmRsZSgwKTsKI2VuZGlmCglITG9jayh0ZXh0T2ZDbGlwKTsKI2lmZGVmIFVTRV9DQVJCT05JWkVECgllcnJvciA9IEdldFNjcmFwRmxhdm9yRGF0YShzY3JhcCwKCQlmbGF2b3IgPyBWSU1TQ1JBUEZMQVZPUiA6IGtTY3JhcEZsYXZvclR5cGVVbmljb2RlLAoJCSZzY3JhcFNpemUsICp0ZXh0T2ZDbGlwKTsKI2Vsc2UKCXNjcmFwU2l6ZSA9IEdldFNjcmFwKHRleHRPZkNsaXAsICdURVhUJywgJnNjcmFwT2Zmc2V0KTsKI2VuZGlmCglzY3JhcFNpemUgLT0gZmxhdm9yOwoKCWlmIChmbGF2b3IpCgkgICAgdHlwZSA9ICoqdGV4dE9mQ2xpcDsKCWVsc2UKCSAgICB0eXBlID0gKHN0cmNocigqdGV4dE9mQ2xpcCwgJ1xyJykgIT0gTlVMTCkgPyBNTElORSA6IE1DSEFSOwoKCXRlbXBjbGlwID0gbGFsbG9jKHNjcmFwU2l6ZSArIDEsIFRSVUUpOwojaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKQoJbWNoX21lbW1vdmUodGVtcGNsaXAsICp0ZXh0T2ZDbGlwICsgZmxhdm9yLCBzY3JhcFNpemUpOwojZWxzZQoJU1RSTkNQWSh0ZW1wY2xpcCwgKnRleHRPZkNsaXAgKyBmbGF2b3IsIHNjcmFwU2l6ZSk7CiNlbmRpZgoJdGVtcGNsaXBbc2NyYXBTaXplXSA9IDA7CgoJc2VhcmNoQ1IgPSAoY2hhciAqKXRlbXBjbGlwOwoJd2hpbGUgKHNlYXJjaENSICE9IE5VTEwpCgl7CgkgICAgc2VhcmNoQ1IgPSBzdHJjaHIoc2VhcmNoQ1IsICdccicpOwoKCSAgICBpZiAoc2VhcmNoQ1IgIT0gTlVMTCkKCQlzZWFyY2hDUlswXSA9ICdcbic7CgoJfQoKI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkKCS8qIENvbnZlcnQgZnJvbSB1dGYtMTYgKGNsaXBib2FyZCkgKi8KCXNpemVfdCBlbmNMZW4gPSAwOwoJY2hhcl91ICp0byA9IG1hY191dGYxNl90b19lbmMoKFVuaUNoYXIgKil0ZW1wY2xpcCwgc2NyYXBTaXplLCAmZW5jTGVuKTsKCWlmICh0bykKCXsKCSAgICBzY3JhcFNpemUgPSBlbmNMZW47CgkgICAgdmltX2ZyZWUodGVtcGNsaXApOwoJICAgIHRlbXBjbGlwID0gdG87Cgl9CiNlbmRpZgoJY2xpcF95YW5rX3NlbGVjdGlvbih0eXBlLCB0ZW1wY2xpcCwgc2NyYXBTaXplLCBjYmQpOwoKCXZpbV9mcmVlKHRlbXBjbGlwKTsKCUhVbmxvY2sodGV4dE9mQ2xpcCk7CgoJRGlzcG9zZUhhbmRsZSh0ZXh0T2ZDbGlwKTsKICAgIH0KfQoKICAgIHZvaWQKY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oY2JkKQogICAgVmltQ2xpcGJvYXJkICpjYmQ7CnsKICAgIC8qCiAgICAgKiBUT0RPOiBSZWFsbHkgbm90aGluZyB0byBkbz8KICAgICAqLwp9CgogICAgaW50CmNsaXBfbWNoX293bl9zZWxlY3Rpb24oY2JkKQogICAgVmltQ2xpcGJvYXJkICpjYmQ7CnsKICAgIHJldHVybiBPSzsKfQoKLyoKICogU2VuZCB0aGUgY3VycmVudCBzZWxlY3Rpb24gdG8gdGhlIGNsaXBib2FyZC4KICovCiAgICB2b2lkCmNsaXBfbWNoX3NldF9zZWxlY3Rpb24oY2JkKQogICAgVmltQ2xpcGJvYXJkICpjYmQ7CnsKICAgIEhhbmRsZQl0ZXh0T2ZDbGlwOwogICAgbG9uZwlzY3JhcFNpemU7CiAgICBpbnQJCXR5cGU7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgU2NyYXBSZWYgICAgc2NyYXA7CiNlbmRpZgoKICAgIGNoYXJfdQkqc3RyID0gTlVMTDsKCiAgICBpZiAoIWNiZC0+b3duZWQpCglyZXR1cm47CgogICAgY2xpcF9nZXRfc2VsZWN0aW9uKGNiZCk7CgogICAgLyoKICAgICAqIE9uY2Ugd2Ugc2V0IHRoZSBjbGlwYm9hcmQsIGxvc2Ugb3duZXJzaGlwLiAgSWYgYW5vdGhlciBhcHBsaWNhdGlvbiBzZXRzCiAgICAgKiB0aGUgY2xpcGJvYXJkLCB3ZSBkb24ndCB3YW50IHRvIHRoaW5rIHRoYXQgd2Ugc3RpbGwgb3duIGl0LgogICAgICoKICAgICAqLwoKICAgIGNiZC0+b3duZWQgPSBGQUxTRTsKCiAgICB0eXBlID0gY2xpcF9jb252ZXJ0X3NlbGVjdGlvbigmc3RyLCAobG9uZ191ICopICZzY3JhcFNpemUsIGNiZCk7CgojaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKQogICAgc2l6ZV90IHV0ZjE2X2xlbiA9IDA7CiAgICBVbmlDaGFyICp0byA9IG1hY19lbmNfdG9fdXRmMTYoc3RyLCBzY3JhcFNpemUsICZ1dGYxNl9sZW4pOwogICAgaWYgKHRvKQogICAgewoJc2NyYXBTaXplID0gdXRmMTZfbGVuOwoJdmltX2ZyZWUoc3RyKTsKCXN0ciA9IChjaGFyX3UgKil0bzsKICAgIH0KI2VuZGlmCgogICAgaWYgKHR5cGUgPj0gMCkKICAgIHsKI2lmZGVmIFVTRV9DQVJCT05JWkVECglDbGVhckN1cnJlbnRTY3JhcCgpOwojZWxzZQoJWmVyb1NjcmFwKCk7CiNlbmRpZgoKI2lmZGVmIFVTRV9DQVJCT05JWkVECgl0ZXh0T2ZDbGlwID0gTmV3SGFuZGxlKHNjcmFwU2l6ZSArIDEpOwojZWxzZQoJdGV4dE9mQ2xpcCA9IE5ld0hhbmRsZShzY3JhcFNpemUpOwojZW5kaWYKCUhMb2NrKHRleHRPZkNsaXApOwoKI2lmZGVmIFVTRV9DQVJCT05JWkVECgkqKnRleHRPZkNsaXAgPSB0eXBlOwoJbWNoX21lbW1vdmUoKnRleHRPZkNsaXAgKyAxLCBzdHIsIHNjcmFwU2l6ZSk7CglHZXRDdXJyZW50U2NyYXAoJnNjcmFwKTsKCVB1dFNjcmFwRmxhdm9yKHNjcmFwLCBrU2NyYXBGbGF2b3JUeXBlVW5pY29kZSwga1NjcmFwRmxhdm9yTWFza05vbmUsCgkJc2NyYXBTaXplLCAqdGV4dE9mQ2xpcCArIDEpOwoJUHV0U2NyYXBGbGF2b3Ioc2NyYXAsIFZJTVNDUkFQRkxBVk9SLCBrU2NyYXBGbGF2b3JNYXNrTm9uZSwKCQlzY3JhcFNpemUgKyAxLCAqdGV4dE9mQ2xpcCk7CiNlbHNlCglTVFJOQ1BZKCp0ZXh0T2ZDbGlwLCBzdHIsIHNjcmFwU2l6ZSk7CglQdXRTY3JhcChzY3JhcFNpemUsICdURVhUJywgKnRleHRPZkNsaXApOwojZW5kaWYKCUhVbmxvY2sodGV4dE9mQ2xpcCk7CglEaXNwb3NlSGFuZGxlKHRleHRPZkNsaXApOwogICAgfQoKICAgIHZpbV9mcmVlKHN0cik7Cn0KCiAgICB2b2lkCmd1aV9tY2hfc2V0X3RleHRfYXJlYV9wb3MoeCwgeSwgdywgaCkKICAgIGludAkJeDsKICAgIGludAkJeTsKICAgIGludAkJdzsKICAgIGludAkJaDsKewogICAgUmVjdAlWaW1Cb3VuZDsKCi8qICBIaWRlV2luZG93KGd1aS5WaW1XaW5kb3cpOyAqLwojaWZkZWYgVVNFX0NBUkJPTklaRUQKICAgIEdldFdpbmRvd0JvdW5kcyhndWkuVmltV2luZG93LCBrV2luZG93R2xvYmFsUG9ydFJnbiwgJlZpbUJvdW5kKTsKI2Vsc2UKICAgIFZpbUJvdW5kID0gZ3VpLlZpbVdpbmRvdy0+cG9ydFJlY3Q7CiNlbmRpZgoKICAgIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQogICAgewoJVmltQm91bmQubGVmdCA9IC1ndWkuc2Nyb2xsYmFyX3dpZHRoICsgMTsKICAgIH0KICAgIGVsc2UKICAgIHsKCVZpbUJvdW5kLmxlZnQgPSAwOwogICAgfQoKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBTZXRXaW5kb3dCb3VuZHMoZ3VpLlZpbVdpbmRvdywga1dpbmRvd0dsb2JhbFBvcnRSZ24sICZWaW1Cb3VuZCk7CiNlbmRpZgoKICAgIFNob3dXaW5kb3coZ3VpLlZpbVdpbmRvdyk7Cn0KCi8qCiAqIE1lbnUgc3R1ZmYuCiAqLwoKICAgIHZvaWQKZ3VpX21jaF9lbmFibGVfbWVudShmbGFnKQogICAgaW50CQlmbGFnOwp7CiAgICAvKgogICAgICogTWVudSBpcyBhbHdheXMgYWN0aXZlIGluIGl0c2VsZgogICAgICogKG1heWJlIHdlIHNob3VsZCBvbmx5IGRpc2FibGUgYSB2aW0gbWVudQogICAgICoJYW5kIGtlZXAgc3RhbmRhcmQgbWVudSkKICAgICAqCiAgICAgKi8KfQoKICAgIHZvaWQKZ3VpX21jaF9zZXRfbWVudV9wb3MoeCwgeSwgdywgaCkKICAgIGludAkJeDsKICAgIGludAkJeTsKICAgIGludAkJdzsKICAgIGludAkJaDsKewogICAgLyoKICAgICAqIFRoZSBtZW51IGlzIGFsd2F5cyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4KICAgICAqIE1heWJlIGEgZnV0dXIgdmVyc2lvbiB3aWxsIHBlcm1pdCBhIG1lbnUgaW4gdGhlIHdpbmRvdwogICAgICoKICAgICAqLwp9CgovKgogKiBBZGQgYSBzdWIgbWVudSB0byB0aGUgbWVudSBiYXIuCiAqLwogICAgdm9pZApndWlfbWNoX2FkZF9tZW51KG1lbnUsIGlkeCkKICAgIHZpbW1lbnVfVAkqbWVudTsKICAgIGludAkJaWR4Owp7CiAgICAvKgogICAgICogVE9ETzogVHJ5IHRvIHVzZSBvbmx5IG1lbnVfaWQgaW5zdGVhZCBvZiBib3RoIG1lbnVfaWQgYW5kIG1lbnVfaGFuZGxlLgogICAgICogVE9ETzogdXNlIG1lbnUtPm1uZW1vbmljIGFuZCBtZW51LT5hY3RleHQKICAgICAqIFRPRE86IFRyeSB0byByZXVzZSBtZW51IGlkCiAgICAgKiAgICAgICBDYXJib24gSGVscCBzdWdnZXN0IHRvIHVzZSBvbmx5IGlkIGJldHdlZW4gMSBhbmQgMjM1CiAgICAgKi8KICAgIHN0YXRpYyBsb25nCSBuZXh0X2F2YWlsX2lkID0gMTI4OwogICAgbG9uZwkgbWVudV9hZnRlcl9tZSA9IDA7IC8qIERlZmF1bHQgdG8gdGhlIGVuZCAqLwojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgQ0ZTdHJpbmdSZWYgbmFtZTsKI2Vsc2UKICAgIGNoYXJfdQkqbmFtZTsKI2VuZGlmCiAgICBzaG9ydAkgaW5kZXg7CiAgICB2aW1tZW51X1QJKnBhcmVudCA9IG1lbnUtPnBhcmVudDsKICAgIHZpbW1lbnVfVAkqYnJvdGhlciA9IG1lbnUtPm5leHQ7CgogICAgLyogQ2Fubm90IGFkZCBhIG1lbnUgaWYgLi4uICovCiAgICBpZiAoKHBhcmVudCAhPSBOVUxMICYmIHBhcmVudC0+c3VibWVudV9pZCA9PSAwKSkKCXJldHVybjsKCiAgICAvKiBtZW51IElEIGdyZWF0ZXIgdGhhbiAxMDI0IGFyZSByZXNlcnZlZCBmb3IgPz8/ICovCiAgICBpZiAobmV4dF9hdmFpbF9pZCA9PSAxMDI0KQoJcmV0dXJuOwoKICAgIC8qIE15IGJyb3RoZXIgY291bGQgYmUgdGhlIFBvcFVwLCBmaW5kIG15IHJlYWwgYnJvdGhlciAqLwogICAgd2hpbGUgKChicm90aGVyICE9IE5VTEwpICYmICghbWVudV9pc19tZW51YmFyKGJyb3RoZXItPm5hbWUpKSkKCWJyb3RoZXIgPSBicm90aGVyLT5uZXh0OwoKICAgIC8qICBGaW5kIHdoZXJlIHRvIGluc2VydCB0aGUgbWVudSAoZm9yIE1lbnVCYXIpICovCiAgICBpZiAoKHBhcmVudCA9PSBOVUxMKSAmJiAoYnJvdGhlciAhPSBOVUxMKSkKCW1lbnVfYWZ0ZXJfbWUgPSBicm90aGVyLT5zdWJtZW51X2lkOwoKICAgIC8qIElmIHRoZSBtZW51IGlzIG5vdCBwYXJ0IG9mIHRoZSBtZW51YmFyIChhbmQgaXRzIHN1Ym1lbnVzKSwgYWRkIGl0ICdub3doZXJlJyAqLwogICAgaWYgKCFtZW51X2lzX21lbnViYXIobWVudS0+bmFtZSkpCgltZW51X2FmdGVyX21lID0gaGllck1lbnU7CgogICAgLyogQ29udmVydCB0aGUgbmFtZSAqLwojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgbmFtZSA9IG1lbnVfdGl0bGVfcmVtb3ZpbmdfbW5lbW9uaWMobWVudSk7CiNlbHNlCiAgICBuYW1lID0gQzJQYXNjYWxfc2F2ZShtZW51LT5kbmFtZSk7CiNlbmRpZgogICAgaWYgKG5hbWUgPT0gTlVMTCkKCXJldHVybjsKCiAgICAvKiBDcmVhdGUgdGhlIG1lbnUgdW5sZXNzIGl0J3MgdGhlIGhlbHAgbWVudSAqLwojaWZkZWYgVVNFX0hFTFBNRU5VCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICBpZiAobWVudS0+cHJpb3JpdHkgPT0gOTk5OSkKI2Vsc2UKICAgIGlmIChTVFJOQ01QKG5hbWUsICJcNEhlbHAiLCA1KSA9PSAwKQojZW5kaWYKICAgIHsKCW1lbnUtPnN1Ym1lbnVfaWQgPSBrSE1IZWxwTWVudUlEOwoJbWVudS0+c3VibWVudV9oYW5kbGUgPSBndWkuTWFjT1NIZWxwTWVudTsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiAgICB7CgkvKiBDYXJib24gc3VnZ2VzdCB1c2Ugb2YKCSAqIE9TU3RhdHVzIENyZWF0ZU5ld01lbnUoTWVudUlELCBNZW51QXR0cmlidXRlcywgTWVudVJlZiAqKTsKCSAqIE9TU3RhdHVzIFNldE1lbnVUaXRsZShNZW51UmVmLCBDb25zdFN0cjI1NVBhcmFtIHRpdGxlKTsKCSAqLwoJbWVudS0+c3VibWVudV9pZCA9IG5leHRfYXZhaWxfaWQ7CiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCglpZiAoQ3JlYXRlTmV3TWVudShtZW51LT5zdWJtZW51X2lkLCAwLCAoTWVudVJlZiAqKSZtZW51LT5zdWJtZW51X2hhbmRsZSkgPT0gbm9FcnIpCgkgICAgU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKChNZW51UmVmKW1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBuYW1lKTsKI2Vsc2UKCW1lbnUtPnN1Ym1lbnVfaGFuZGxlID0gTmV3TWVudShtZW51LT5zdWJtZW51X2lkLCBuYW1lKTsKI2VuZGlmCgluZXh0X2F2YWlsX2lkKys7CiAgICB9CgogICAgaWYgKHBhcmVudCA9PSBOVUxMKQogICAgewoJLyogQWRkaW5nIGEgbWVudSB0byB0aGUgbWVudWJhciwgb3IgaW4gdGhlIG5vIG1hbnMgbGFuZCAoZm9yIFBvcFVwKSAqLwoKCS8qIFRPRE86IFZlcmlmeSBpZiB3ZSBjb3VsZCBvbmx5IEluc2VydCBNZW51IGlmIHJlYWxseSBwYXJ0IG9mIHRoZQoJICogbWVudWJhciBUaGUgSW5zZXJ0ZWQgbWVudSBhcmUgc2Nhbm5lZCBvciB0aGUgQ29tbWFuZC1rZXkgY29tYm9zCgkgKi8KCgkvKiBJbnNlcnQgdGhlIG1lbnUgdW5sZXNzIGl0J3MgdGhlIEhlbHAgbWVudSAqLwojaWZkZWYgVVNFX0hFTFBNRU5VCglpZiAobWVudS0+c3VibWVudV9pZCAhPSBrSE1IZWxwTWVudUlEKQojZW5kaWYKCSAgICBJbnNlcnRNZW51KG1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBtZW51X2FmdGVyX21lKTsgLyogaW5zZXJ0IGJlZm9yZSAqLwojaWYgMQoJLyogVmltIHNob3VsZCBub3JtYWxseSB1cGRhdGUgaXQuIFRPRE86IHZlcmlmeSAqLwoJRHJhd01lbnVCYXIoKTsKI2VuZGlmCiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBBZGRpbmcgYXMgYSBzdWJtZW51ICovCgoJaW5kZXggPSBndWlfbWFjX2dldF9tZW51X2l0ZW1faW5kZXgobWVudSk7CgoJLyogQ2FsbCBJbnNlcnRNZW51SXRlbSBmb2xsb3dlZCBieSBTZXRNZW51SXRlbVRleHQKCSAqIHRvIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVyIHJlY29nbml0aW9uIGJ5IEluc2VydE1lbnVJdGVtCgkgKi8KCUluc2VydE1lbnVJdGVtKHBhcmVudC0+c3VibWVudV9oYW5kbGUsICJccCAiLCBpZHgpOyAvKiBhZnRlckl0ZW0gKi8KI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKCVNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgbmFtZSk7CiNlbHNlCglTZXRNZW51SXRlbVRleHQocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIG5hbWUpOwojZW5kaWYKCVNldEl0ZW1DbWQocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIDB4MUIpOwoJU2V0SXRlbU1hcmsocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIG1lbnUtPnN1Ym1lbnVfaWQpOwoJSW5zZXJ0TWVudShtZW51LT5zdWJtZW51X2hhbmRsZSwgaGllck1lbnUpOwogICAgfQoKI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKICAgIENGUmVsZWFzZShuYW1lKTsKI2Vsc2UKICAgIHZpbV9mcmVlKG5hbWUpOwojZW5kaWYKCiNpZiAwCiAgICAvKiBEb25lIGJ5IFZpbSBsYXRlciBvbiAqLwogICAgRHJhd01lbnVCYXIoKTsKI2VuZGlmCn0KCi8qCiAqIEFkZCBhIG1lbnUgaXRlbSB0byBhIG1lbnUKICovCiAgICB2b2lkCmd1aV9tY2hfYWRkX21lbnVfaXRlbShtZW51LCBpZHgpCiAgICB2aW1tZW51X1QJKm1lbnU7CiAgICBpbnQJCWlkeDsKewojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgQ0ZTdHJpbmdSZWYgbmFtZTsKI2Vsc2UKICAgIGNoYXJfdQkqbmFtZTsKI2VuZGlmCiAgICB2aW1tZW51X1QJKnBhcmVudCA9IG1lbnUtPnBhcmVudDsKICAgIGludAkJbWVudV9pbnNlcnRlZDsKCiAgICAvKiBDYW5ub3QgYWRkIGl0ZW0sIGlmIHRoZSBtZW51IGhhdmUgbm90IGJlZW4gY3JlYXRlZCAqLwogICAgaWYgKHBhcmVudC0+c3VibWVudV9pZCA9PSAwKQoJcmV0dXJuOwoKICAgIC8qIENvdWxkIGNhbGwgU2V0TWVudVJlZkNvbiBbQ0FSQk9OXSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgTWVudSwKICAgICAgIGZvciBvbGRlciBPUyBjYWxsIEdldE1lbnVJdGVtRGF0YSAobWVudSwgaXRlbSwgaXNDb21tYW5kSUQ/LCBkYXRhKSAqLwoKICAgIC8qIENvbnZlcnQgdGhlIG5hbWUgKi8KI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKICAgIG5hbWUgPSBtZW51X3RpdGxlX3JlbW92aW5nX21uZW1vbmljKG1lbnUpOwojZWxzZQogICAgbmFtZSA9IEMyUGFzY2FsX3NhdmUobWVudS0+ZG5hbWUpOwojZW5kaWYKCiAgICAvKiBXaGVyZSBhcmUganVzdCBhIG1lbnUgaXRlbSwgc28gbm8gaGFuZGxlLCBubyBpZCAqLwogICAgbWVudS0+c3VibWVudV9pZCA9IDA7CiAgICBtZW51LT5zdWJtZW51X2hhbmRsZSA9IE5VTEw7CgojaWZkZWYgVVNFX0hFTFBNRU5VCiAgICAvKiBUaGUgaW5kZXggaW4gdGhlIGhlbHAgbWVudSBhcmUgb2Zmc2V0ZWQgKi8KICAgIGlmIChwYXJlbnQtPnN1Ym1lbnVfaWQgPT0ga0hNSGVscE1lbnVJRCkKCWlkeCArPSBndWkuTWFjT1NIZWxwSXRlbXM7CiNlbmRpZgoKICAgIG1lbnVfaW5zZXJ0ZWQgPSAwOwogICAgaWYgKG1lbnUtPmFjdGV4dCkKICAgIHsKCS8qIElmIHRoZSBhY2NlbGVyYXRvciB0ZXh0IGZvciB0aGUgbWVudSBpdGVtIGxvb2tzIGxpa2UgaXQgZGVzY3JpYmVzCgkgKiBhIGNvbW1hbmQga2V5IChlLmcuLCAiPEQtUy10PiIgb3IgIjxDLTc+IiksIGRpc3BsYXkgaXQgYXMgdGhlCgkgKiBpdGVtJ3MgY29tbWFuZCBlcXVpdmFsZW50LgoJICovCglpbnQJICAgIGtleSA9IDA7CglpbnQJICAgIG1vZGlmaWVycyA9IDA7CgljaGFyX3UJICAgICpwX2FjdGV4dDsKCglwX2FjdGV4dCA9IG1lbnUtPmFjdGV4dDsKCWtleSA9IGZpbmRfc3BlY2lhbF9rZXkoJnBfYWN0ZXh0LCAmbW9kaWZpZXJzLCAvKmtleWNvZGU9Ki8wKTsKCWlmICgqcF9hY3RleHQgIT0gMCkKCSAgICBrZXkgPSAwOyAvKiBlcnJvcjogdHJhaWxpbmcgdGV4dCAqLwoJLyogZmluZF9zcGVjaWFsX2tleSgpIHJldHVybnMgYSBrZXljb2RlIHdpdGggYXMgbWFueSBvZiB0aGUKCSAqIHNwZWNpZmllZCBtb2RpZmllcnMgYXMgYXBwcm9wcmlhdGUgYWxyZWFkeSBhcHBsaWVkIChlLmcuLCBmb3IKCSAqICI8RC1DLXg+IiBpdCByZXR1cm5zIEN0cmwtWCBhcyB0aGUga2V5Y29kZSBhbmQgTU9EX01BU0tfQ01ECgkgKiBhcyB0aGUgb25seSBtb2RpZmllcikuICBTaW5jZSB3ZSB3YW50IHRvIGRpc3BsYXkgYWxsIG9mIHRoZQoJICogbW9kaWZpZXJzLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGtleWNvZGUgYmFjayB0byBhIHByaW50YWJsZQoJICogY2hhcmFjdGVyIHBsdXMgbW9kaWZpZXJzLgoJICogVE9ETzogV3JpdGUgYW4gYWx0ZXJuYXRpdmUgZmluZF9zcGVjaWFsX2tleSgpIHRoYXQgZG9lc24ndAoJICogYXBwbHkgbW9kaWZpZXJzLgoJICovCglpZiAoa2V5ID4gMCAmJiBrZXkgPCAzMikKCXsKCSAgICAvKiBDb252ZXJ0IGEgY29udHJvbCBrZXkgdG8gYW4gdXBwZXJjYXNlIGxldHRlci4gIE5vdGUgdGhhdAoJICAgICAqIGJ5IHRoaXMgcG9pbnQgaXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoCgkgICAgICogYmV0d2VlbiwgZS5nLiwgQ3RybC1TIGFuZCBDdHJsLVNoaWZ0LVMuCgkgICAgICovCgkgICAgbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CgkgICAga2V5ICs9ICdAJzsKCX0KCS8qIElmIHRoZSBrZXljb2RlIGlzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIHNldCB0aGUgU2hpZnQgbW9kaWZpZXIuCgkgKiBJZiBpdCBpcyBhIGxvd2VyY2FzZSBsZXR0ZXIsIGRvbid0IHNldCB0aGUgbW9kaWZpZXIsIGJ1dCBjb252ZXJ0CgkgKiB0aGUgbGV0dGVyIHRvIHVwcGVyY2FzZSBmb3IgZGlzcGxheSBpbiB0aGUgbWVudS4KCSAqLwoJZWxzZSBpZiAoa2V5ID49ICdBJyAmJiBrZXkgPD0gJ1onKQoJICAgIG1vZGlmaWVycyB8PSBNT0RfTUFTS19TSElGVDsKCWVsc2UgaWYgKGtleSA+PSAnYScgJiYga2V5IDw9ICd6JykKCSAgICBrZXkgKz0gJ0EnIC0gJ2EnOwoJLyogTm90ZToga2V5Y29kZXMgYmVsb3cgMHgyMiBhcmUgcmVzZXJ2ZWQgYnkgQXBwbGUuICovCglpZiAoa2V5ID49IDB4MjIgJiYgdmltX2lzcHJpbnRjX3N0cmljdChrZXkpKQoJewoJICAgIGludAkJdmFsaWQgPSAxOwoJICAgIGNoYXJfdSAgICAgIG1hY19tb2RzID0ga01lbnVOb01vZGlmaWVyczsKCSAgICAvKiBDb252ZXJ0IFZpbSBtb2RpZmllciBjb2RlcyB0byBNZW51IE1hbmFnZXIgZXF1aXZhbGVudHMuICovCgkgICAgaWYgKG1vZGlmaWVycyAmIE1PRF9NQVNLX1NISUZUKQoJCW1hY19tb2RzIHw9IGtNZW51U2hpZnRNb2RpZmllcjsKCSAgICBpZiAobW9kaWZpZXJzICYgTU9EX01BU0tfQ1RSTCkKCQltYWNfbW9kcyB8PSBrTWVudUNvbnRyb2xNb2RpZmllcjsKCSAgICBpZiAoIShtb2RpZmllcnMgJiBNT0RfTUFTS19DTUQpKQoJCW1hY19tb2RzIHw9IGtNZW51Tm9Db21tYW5kTW9kaWZpZXI7CgkgICAgaWYgKG1vZGlmaWVycyAmIE1PRF9NQVNLX0FMVCB8fCBtb2RpZmllcnMgJiBNT0RfTUFTS19NVUxUSV9DTElDSykKCQl2YWxpZCA9IDA7IC8qIFRPRE86IHdpbGwgQWx0IHNvbWVkYXkgbWFwIHRvIE9wdGlvbj8gKi8KCSAgICBpZiAodmFsaWQpCgkgICAgewoJCWNoYXJfdQkgICAgaXRlbV90eHRbMTBdOwoJCS8qIEluc2VydCB0aGUgbWVudSBpdGVtIGFmdGVyIGlkeCwgd2l0aCBpdHMgY29tbWFuZCBrZXkuICovCgkJaXRlbV90eHRbMF0gPSAzOyBpdGVtX3R4dFsxXSA9ICcgJzsgaXRlbV90eHRbMl0gPSAnLyc7CgkJaXRlbV90eHRbM10gPSBrZXk7CgkJSW5zZXJ0TWVudUl0ZW0ocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaXRlbV90eHQsIGlkeCk7CgkJLyogU2V0IHRoZSBtb2RpZmllciBrZXlzLiAqLwoJCVNldE1lbnVJdGVtTW9kaWZpZXJzKHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCBtYWNfbW9kcyk7CgkJbWVudV9pbnNlcnRlZCA9IDE7CgkgICAgfQoJfQogICAgfQogICAgLyogQ2FsbCBJbnNlcnRNZW51SXRlbSBmb2xsb3dlZCBieSBTZXRNZW51SXRlbVRleHQKICAgICAqIHRvIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVyIHJlY29nbml0aW9uIGJ5IEluc2VydE1lbnVJdGVtCiAgICAgKi8KICAgIGlmICghbWVudV9pbnNlcnRlZCkKCUluc2VydE1lbnVJdGVtKHBhcmVudC0+c3VibWVudV9oYW5kbGUsICJccCAiLCBpZHgpOyAvKiBhZnRlckl0ZW0gKi8KICAgIC8qIFNldCB0aGUgbWVudSBpdGVtIG5hbWUuICovCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICBTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcocGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaWR4KzEsIG5hbWUpOwojZWxzZQogICAgU2V0TWVudUl0ZW1UZXh0KHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCBuYW1lKTsKI2VuZGlmCgojaWYgMAogICAgLyogQ2FsbGVkIGJ5IFZpbSAqLwogICAgRHJhd01lbnVCYXIoKTsKI2VuZGlmCgojaWYgZGVmaW5lZChVU0VfQ0FSQk9OSVpFRCkgJiYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgQ0ZSZWxlYXNlKG5hbWUpOwojZWxzZQogICAgLyogVE9ETzogQ2FuIG5hbWUgYmUgZnJlZWQ/ICovCiAgICB2aW1fZnJlZShuYW1lKTsKI2VuZGlmCn0KCiAgICB2b2lkCmd1aV9tY2hfdG9nZ2xlX3RlYXJvZmZzKGVuYWJsZSkKICAgIGludAkgICAgZW5hYmxlOwp7CiAgICAvKiBubyB0ZWFyb2ZmIG1lbnVzICovCn0KCi8qCiAqIERlc3Ryb3kgdGhlIG1hY2hpbmUgc3BlY2lmaWMgbWVudSB3aWRnZXQuCiAqLwogICAgdm9pZApndWlfbWNoX2Rlc3Ryb3lfbWVudShtZW51KQogICAgdmltbWVudV9UCSptZW51Owp7CiAgICBzaG9ydAlpbmRleCA9IGd1aV9tYWNfZ2V0X21lbnVfaXRlbV9pbmRleChtZW51KTsKCiAgICBpZiAoaW5kZXggPiAwKQogICAgewogICAgICBpZiAobWVudS0+cGFyZW50KQogICAgICB7CiNpZmRlZiBVU0VfSEVMUE1FTlUKCWlmIChtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlICE9IG5pbCkgLypndWkuTWFjT1NIZWxwTWVudSkqLwojZW5kaWYKCXsKCSAgICAvKiBGb3Igbm93IGp1c3QgZG9uJ3QgZGVsZXRlIGhlbHAgbWVudSBpdGVtcy4gKEh1aD8gRGFueSkgKi8KCSAgICBEZWxldGVNZW51SXRlbShtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CgoJICAgIC8qIERlbGV0ZSB0aGUgTWVudSBpZiBpdCB3YXMgYSBoaWVyYXJjaGljYWwgTWVudSAqLwoJICAgIGlmIChtZW51LT5zdWJtZW51X2lkICE9IDApCgkgICAgewoJCURlbGV0ZU1lbnUobWVudS0+c3VibWVudV9pZCk7CgkJRGlzcG9zZU1lbnUobWVudS0+c3VibWVudV9oYW5kbGUpOwoJICAgIH0KCX0KI2lmZGVmIFVTRV9IRUxQTUVOVQojIGlmZGVmIERFQlVHX01BQ19NRU5VCgllbHNlCgl7CgkgICAgcHJpbnRmKCJnbWRtIDFcbiIpOwoJfQojIGVuZGlmCiNlbmRpZgogICAgICB9CiNpZmRlZiBERUJVR19NQUNfTUVOVQogICAgICBlbHNlCiAgICAgIHsKCXByaW50ZigiZ21kbSAyXG4iKTsKICAgICAgfQojZW5kaWYKICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIERvIG5vdCBkZWxldGUgdGhlIEhlbHAgTWVudSAqLwojaWZkZWYgVVNFX0hFTFBNRU5VCglpZiAobWVudS0+c3VibWVudV9pZCAhPSBrSE1IZWxwTWVudUlEKQojZW5kaWYKCXsKCSAgICBEZWxldGVNZW51KG1lbnUtPnN1Ym1lbnVfaWQpOwoJICAgIERpc3Bvc2VNZW51KG1lbnUtPnN1Ym1lbnVfaGFuZGxlKTsKCX0KICAgIH0KICAgIC8qIFNob3VsZG4ndCB0aGlzIGJlIGFscmVhZHkgZG9uZSBieSBWaW0uIFRPRE86IENoZWNrICovCiAgICBEcmF3TWVudUJhcigpOwp9CgovKgogKiBNYWtlIGEgbWVudSBlaXRoZXIgZ3JleSBvciBub3QgZ3JleS4KICovCiAgICB2b2lkCmd1aV9tY2hfbWVudV9ncmV5KG1lbnUsIGdyZXkpCiAgICB2aW1tZW51X1QJKm1lbnU7CiAgICBpbnQJCWdyZXk7CnsKICAgIC8qIFRPRE86IENoZWNrIGlmIG1lbnUgcmVhbGx5IGV4aXN0cyAqLwogICAgc2hvcnQgaW5kZXggPSBndWlfbWFjX2dldF9tZW51X2l0ZW1faW5kZXgobWVudSk7Ci8qCiAgICBpbmRleCA9IG1lbnUtPmluZGV4OwoqLwogICAgaWYgKGdyZXkpCiAgICB7CglpZiAobWVudS0+Y2hpbGRyZW4pCgkgICAgRGlzYWJsZU1lbnVJdGVtKG1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CglpZiAobWVudS0+cGFyZW50KQoJICBpZiAobWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSkKCSAgICBEaXNhYmxlTWVudUl0ZW0obWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSwgaW5kZXgpOwogICAgfQogICAgZWxzZQogICAgewoJaWYgKG1lbnUtPmNoaWxkcmVuKQoJICAgIEVuYWJsZU1lbnVJdGVtKG1lbnUtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CglpZiAobWVudS0+cGFyZW50KQoJICBpZiAobWVudS0+cGFyZW50LT5zdWJtZW51X2hhbmRsZSkKCSAgICBFbmFibGVNZW51SXRlbShtZW51LT5wYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpbmRleCk7CiAgICB9Cn0KCi8qCiAqIE1ha2UgbWVudSBpdGVtIGhpZGRlbiBvciBub3QgaGlkZGVuCiAqLwogICAgdm9pZApndWlfbWNoX21lbnVfaGlkZGVuKG1lbnUsIGhpZGRlbikKICAgIHZpbW1lbnVfVAkqbWVudTsKICAgIGludAkJaGlkZGVuOwp7CiAgICAvKiBUaGVyZSdzIG5vIGhpZGRlbiBtb2RlIG9uIE1hY09TICovCiAgICBndWlfbWNoX21lbnVfZ3JleShtZW51LCBoaWRkZW4pOwp9CgoKLyoKICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgc2V0dGluZyBhbGwgdGhlIG1lbnVzIHRvIGdyZXkvaGlkZGVuIG9yIG5vdC4KICovCiAgICB2b2lkCmd1aV9tY2hfZHJhd19tZW51YmFyKCkKewogICAgRHJhd01lbnVCYXIoKTsKfQoKCi8qCiAqIFNjcm9sbGJhciBzdHVmZi4KICovCgogICAgdm9pZApndWlfbWNoX2VuYWJsZV9zY3JvbGxiYXIoc2IsIGZsYWcpCiAgICBzY3JvbGxiYXJfVAkqc2I7CiAgICBpbnQJCWZsYWc7CnsKICAgIGlmIChmbGFnKQoJU2hvd0NvbnRyb2woc2ItPmlkKTsKICAgIGVsc2UKCUhpZGVDb250cm9sKHNiLT5pZCk7CgojaWZkZWYgREVCVUdfTUFDX1NCCiAgICBwcmludGYoImVuYl9zYiAoJXgpICV4XG4iLHNiLT5pZCwgZmxhZyk7CiNlbmRpZgp9CgogICAgdm9pZApndWlfbWNoX3NldF9zY3JvbGxiYXJfdGh1bWIoc2IsIHZhbCwgc2l6ZSwgbWF4KQogICAgc2Nyb2xsYmFyX1QgKnNiOwogICAgbG9uZwl2YWw7CiAgICBsb25nCXNpemU7CiAgICBsb25nCW1heDsKewogICAgU2V0Q29udHJvbDMyQml0TWF4aW11bSAoc2ItPmlkLCBtYXgpOwogICAgU2V0Q29udHJvbDMyQml0TWluaW11bSAoc2ItPmlkLCAwKTsKICAgIFNldENvbnRyb2wzMkJpdFZhbHVlICAgKHNiLT5pZCwgdmFsKTsKI2lmZGVmIERFQlVHX01BQ19TQgogICAgcHJpbnRmKCJ0aHVtYl9zYiAoJXgpICV4LCAleCwleFxuIixzYi0+aWQsIHZhbCwgc2l6ZSwgbWF4KTsKI2VuZGlmCn0KCiAgICB2b2lkCmd1aV9tY2hfc2V0X3Njcm9sbGJhcl9wb3Moc2IsIHgsIHksIHcsIGgpCiAgICBzY3JvbGxiYXJfVCAqc2I7CiAgICBpbnQJCXg7CiAgICBpbnQJCXk7CiAgICBpbnQJCXc7CiAgICBpbnQJCWg7CnsKICAgIGd1aV9tY2hfc2V0X2JnX2NvbG9yKGd1aS5iYWNrX3BpeGVsKTsKLyogIGlmIChndWkud2hpY2hfc2Nyb2xsYmFyc1tTQkFSX0xFRlRdKQogICAgewoJTW92ZUNvbnRyb2woc2ItPmlkLCB4LTE2LCB5KTsKCVNpemVDb250cm9sKHNiLT5pZCwgdyArIDEsIGgpOwogICAgfQogICAgZWxzZQogICAgewoJTW92ZUNvbnRyb2woc2ItPmlkLCB4LCB5KTsKCVNpemVDb250cm9sKHNiLT5pZCwgdyArIDEsIGgpOwogICAgfSovCiAgICBpZiAoc2IgPT0gJmd1aS5ib3R0b21fc2JhcikKCWggKz0gMTsKICAgIGVsc2UKCXcgKz0gMTsKCiAgICBpZiAoZ3VpLndoaWNoX3Njcm9sbGJhcnNbU0JBUl9MRUZUXSkKCXggLT0gMTU7CgogICAgTW92ZUNvbnRyb2woc2ItPmlkLCB4LCB5KTsKICAgIFNpemVDb250cm9sKHNiLT5pZCwgdywgaCk7CiNpZmRlZiBERUJVR19NQUNfU0IKICAgIHByaW50Zigic2l6ZV9zYiAoJXgpICV4LCAleCwgJXgsICV4XG4iLHNiLT5pZCwgeCwgeSwgdywgaCk7CiNlbmRpZgp9CgogICAgdm9pZApndWlfbWNoX2NyZWF0ZV9zY3JvbGxiYXIoc2IsIG9yaWVudCkKICAgIHNjcm9sbGJhcl9UICpzYjsKICAgIGludAkJb3JpZW50OwkvKiBTQkFSX1ZFUlQgb3IgU0JBUl9IT1JJWiAqLwp7CiAgICBSZWN0IGJvdW5kczsKCiAgICBib3VuZHMudG9wID0gLTE2OwogICAgYm91bmRzLmJvdHRvbSA9IC0xMDsKICAgIGJvdW5kcy5yaWdodCA9IC0xMDsKICAgIGJvdW5kcy5sZWZ0ID0gLTE2OwoKICAgIHNiLT5pZCA9IE5ld0NvbnRyb2woZ3VpLlZpbVdpbmRvdywKCQkJICZib3VuZHMsCgkJCSAiXHBTY3JvbGxCYXIiLAoJCQkgVFJVRSwKCQkJIDAsIC8qIGN1cnJlbnQqLwoJCQkgMCwgLyogdG9wICovCgkJCSAwLCAvKiBib3R0b20gKi8KI2lmZGVmIFVTRV9DQVJCT05JWkVECgkJCSBrQ29udHJvbFNjcm9sbEJhckxpdmVQcm9jLAojZWxzZQoJCQkgc2Nyb2xsQmFyUHJvYywKI2VuZGlmCgkJCSAobG9uZykgc2ItPmlkZW50KTsKI2lmZGVmIERFQlVHX01BQ19TQgogICAgcHJpbnRmKCJjcmVhdGVfc2IgKCV4KSAleFxuIixzYi0+aWQsIG9yaWVudCk7CiNlbmRpZgp9CgogICAgdm9pZApndWlfbWNoX2Rlc3Ryb3lfc2Nyb2xsYmFyKHNiKQogICAgc2Nyb2xsYmFyX1QgKnNiOwp7CiAgICBndWlfbWNoX3NldF9iZ19jb2xvcihndWkuYmFja19waXhlbCk7CiAgICBEaXNwb3NlQ29udHJvbChzYi0+aWQpOwojaWZkZWYgREVCVUdfTUFDX1NCCiAgICBwcmludGYoImRlc3Rfc2IgKCV4KSBcbiIsc2ItPmlkKTsKI2VuZGlmCn0KCgovKgogKiBDdXJzb3IgYmxpbmsgZnVuY3Rpb25zLgogKgogKiBUaGlzIGlzIGEgc2ltcGxlIHN0YXRlIG1hY2hpbmU6CiAqIEJMSU5LX05PTkUJbm90IGJsaW5raW5nIGF0IGFsbAogKiBCTElOS19PRkYJYmxpbmtpbmcsIGN1cnNvciBpcyBub3Qgc2hvd24KICogQkxJTktfT04gYmxpbmtpbmcsIGN1cnNvciBpcyBzaG93bgogKi8KICAgIHZvaWQKZ3VpX21jaF9zZXRfYmxpbmtpbmcobG9uZyB3YWl0LCBsb25nIG9uLCBsb25nIG9mZikKewogICAgLyogVE9ETzogVE9ETzogVE9ETzogVE9ETzogKi8KLyogICAgYmxpbmtfd2FpdHRpbWUgPSB3YWl0OwogICAgYmxpbmtfb250aW1lID0gb247CiAgICBibGlua19vZmZ0aW1lID0gb2ZmOyovCn0KCi8qCiAqIFN0b3AgdGhlIGN1cnNvciBibGlua2luZy4gIFNob3cgdGhlIGN1cnNvciBpZiBpdCB3YXNuJ3Qgc2hvd24uCiAqLwogICAgdm9pZApndWlfbWNoX3N0b3BfYmxpbmsoKQp7CiAgICBndWlfdXBkYXRlX2N1cnNvcihUUlVFLCBGQUxTRSk7CiAgICAvKiBUT0RPOiBUT0RPOiBUT0RPOiBUT0RPOiAqLwovKiAgICBndWlfdzMyX3JtX2JsaW5rX3RpbWVyKCk7CiAgICBpZiAoYmxpbmtfc3RhdGUgPT0gQkxJTktfT0ZGKQogICAgZ3VpX3VwZGF0ZV9jdXJzb3IoVFJVRSwgRkFMU0UpOwogICAgYmxpbmtfc3RhdGUgPSBCTElOS19OT05FOyovCn0KCi8qCiAqIFN0YXJ0IHRoZSBjdXJzb3IgYmxpbmtpbmcuICBJZiBpdCB3YXMgYWxyZWFkeSBibGlua2luZywgdGhpcyByZXN0YXJ0cyB0aGUKICogd2FpdGluZyB0aW1lIGFuZCBzaG93cyB0aGUgY3Vyc29yLgogKi8KICAgIHZvaWQKZ3VpX21jaF9zdGFydF9ibGluaygpCnsKICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKICAgIC8qIFRPRE86IFRPRE86IFRPRE86IFRPRE86ICovCi8qICAgIGd1aV93MzJfcm1fYmxpbmtfdGltZXIoKTsgKi8KCiAgICAvKiBPbmx5IHN3aXRjaCBibGlua2luZyBvbiBpZiBub25lIG9mIHRoZSB0aW1lcyBpcyB6ZXJvICovCi8qICAgIGlmIChibGlua193YWl0dGltZSAmJiBibGlua19vbnRpbWUgJiYgYmxpbmtfb2ZmdGltZSkKICAgIHsKICAgIGJsaW5rX3RpbWVyID0gU2V0VGltZXIoTlVMTCwgMCwgKFVJTlQpYmxpbmtfd2FpdHRpbWUsCgkJCSAgICAoVElNRVJQUk9DKV9PbkJsaW5rVGltZXIpOwogICAgYmxpbmtfc3RhdGUgPSBCTElOS19PTjsKICAgIGd1aV91cGRhdGVfY3Vyc29yKFRSVUUsIEZBTFNFKTsKICAgIH0qLwp9CgovKgogKiBSZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiBhIHBpeGVsIGFzIGxvbmcuCiAqLwogICAgbG9uZ191Cmd1aV9tY2hfZ2V0X3JnYihndWljb2xvcl9UIHBpeGVsKQp7CiAgICByZXR1cm4gKFJlZChwaXhlbCkgPDwgMTYpICsgKEdyZWVuKHBpeGVsKSA8PCA4KSArIEJsdWUocGl4ZWwpOwp9CgoKCiNpZmRlZiBGRUFUX0JST1dTRQovKgogKiBQb3Agb3BlbiBhIGZpbGUgYnJvd3NlciBhbmQgcmV0dXJuIHRoZSBmaWxlIHNlbGVjdGVkLCBpbiBhbGxvY2F0ZWQgbWVtb3J5LAogKiBvciBOVUxMIGlmIENhbmNlbCBpcyBoaXQuCiAqICBzYXZpbmcgIC0gVFJVRSBpZiB0aGUgZmlsZSB3aWxsIGJlIHNhdmVkIHRvLCBGQUxTRSBpZiBpdCB3aWxsIGJlIG9wZW5lZC4KICogIHRpdGxlICAgLSBUaXRsZSBtZXNzYWdlIGZvciB0aGUgZmlsZSBicm93c2VyIGRpYWxvZy4KICogIGRmbHQgICAgLSBEZWZhdWx0IG5hbWUgb2YgZmlsZS4KICogIGV4dCAgICAgLSBEZWZhdWx0IGV4dGVuc2lvbiB0byBiZSBhZGRlZCB0byBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbnMuCiAqICBpbml0ZGlyIC0gZGlyZWN0b3J5IGluIHdoaWNoIHRvIG9wZW4gdGhlIGJyb3dzZXIgKE5VTEwgPSBjdXJyZW50IGRpcikKICogIGZpbHRlciAgLSBGaWx0ZXIgZm9yIG1hdGNoZWQgZmlsZXMgdG8gY2hvb3NlIGZyb20uCiAqICBIYXMgYSBmb3JtYXQgbGlrZSB0aGlzOgogKiAgIkMgRmlsZXMgKCouYylcMCouY1wwIgogKiAgIkFsbCBGaWxlc1wwKi4qXDBcMCIKICogIElmIHRoZXNlIHR3byBzdHJpbmdzIHdlcmUgY29uY2F0ZW5hdGVkLCB0aGVuIGEgY2hvaWNlIG9mIHR3byBmaWxlCiAqICBmaWx0ZXJzIHdpbGwgYmUgc2VsZWN0YWJsZSB0byB0aGUgdXNlci4gIFRoZW4gb25seSBtYXRjaGluZyBmaWxlcyB3aWxsCiAqICBiZSBzaG93biBpbiB0aGUgYnJvd3Nlci4gIElmIE5VTEwsIHRoZSBkZWZhdWx0IGFsbG93cyBhbGwgZmlsZXMuCiAqCiAqICAqTk9URSogLSB0aGUgZmlsdGVyIHN0cmluZyBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBUV08gbnVsbHMuCiAqLwogICAgY2hhcl91ICoKZ3VpX21jaF9icm93c2UoCiAgICBpbnQgc2F2aW5nLAogICAgY2hhcl91ICp0aXRsZSwKICAgIGNoYXJfdSAqZGZsdCwKICAgIGNoYXJfdSAqZXh0LAogICAgY2hhcl91ICppbml0ZGlyLAogICAgY2hhcl91ICpmaWx0ZXIpCnsKI2lmIGRlZmluZWQgKFVTRV9OQVZJR0FUSU9OX1NFUlZJQ0UpIHx8IGRlZmluZWQgKFVTRV9DQVJCT05JWkVEKQogICAgLyogVE9ETzogQWRkIEFtbW9uJ3Mgc2FmZXR5IGNoZWNsIChEYW55KSAqLwogICAgTmF2UmVwbHlSZWNvcmQJcmVwbHk7CiAgICBjaGFyX3UJCSpmbmFtZSA9IE5VTEw7CiAgICBjaGFyX3UJCSoqZm5hbWVzID0gTlVMTDsKICAgIGxvbmcJCW51bUZpbGVzOwogICAgTmF2RGlhbG9nT3B0aW9ucwluYXZPcHRpb25zOwogICAgT1NFcnIJCWVycm9yOwoKICAgIC8qIEdldCBOYXZpZ2F0aW9uIFNlcnZpY2UgRGVmYXVsdHMgdmFsdWUgKi8KICAgIE5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zKCZuYXZPcHRpb25zKTsKCgogICAgLyogVE9ETzogSWYgd2UgZ2V0IGEgOmJyb3dzZSBhcmdzLCBzZXQgdGhlIE11bHRpcGxlIGJpdC4gKi8KICAgIG5hdk9wdGlvbnMuZGlhbG9nT3B0aW9uRmxhZ3MgPSAga05hdkFsbG93SW52aXNpYmxlRmlsZXMKCQkJCSB8ICBrTmF2RG9udEF1dG9UcmFuc2xhdGUKCQkJCSB8ICBrTmF2RG9udEFkZFRyYW5zbGF0ZUl0ZW1zCgkJCSAgICAvKgkgfCAga05hdkFsbG93TXVsdGlwbGVGaWxlcyAqLwoJCQkJIHwgIGtOYXZBbGxvd1N0YXRpb25lcnk7CgogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKHRpdGxlLCAgICZuYXZPcHRpb25zLm1lc3NhZ2UpOwogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKGRmbHQsICAgICZuYXZPcHRpb25zLnNhdmVkRmlsZU5hbWUpOwogICAgLyogQ291bGQgc2V0IGNsaWVudE5hbWU/CiAgICAgKgkJIHdpbmRvd1RpdGxlPyAodGhlcmUncyBubyB0aXRsZSBiYXI/KQogICAgICovCgogICAgaWYgKHNhdmluZykKICAgIHsKCS8qIENoYW5nZSBmaXJzdCBwYXJtIEFFRGVzYyAodHlwZUZTUykgKmRlZmF1bHRMb2NhdGlvbiB0byBtYXRjaCBkZmx0ICovCglOYXZQdXRGaWxlKE5VTEwsICZyZXBseSwgJm5hdk9wdGlvbnMsIE5VTEwsICdURVhUJywgJ1ZJTSEnLCBOVUxMKTsKCWlmICghcmVwbHkudmFsaWRSZWNvcmQpCgkgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBDaGFuZ2UgZmlyc3QgcGFybSBBRURlc2MgKHR5cGVGU1MpICpkZWZhdWx0TG9jYXRpb24gdG8gbWF0Y2ggZGZsdCAqLwoJTmF2R2V0RmlsZShOVUxMLCAmcmVwbHksICZuYXZPcHRpb25zLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKCWlmICghcmVwbHkudmFsaWRSZWNvcmQpCgkgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZm5hbWVzID0gbmV3X2ZuYW1lc19mcm9tX0FFRGVzYygmcmVwbHkuc2VsZWN0aW9uLCAmbnVtRmlsZXMsICZlcnJvcik7CgogICAgTmF2RGlzcG9zZVJlcGx5KCZyZXBseSk7CgogICAgaWYgKGZuYW1lcykKICAgIHsKCWZuYW1lID0gZm5hbWVzWzBdOwoJdmltX2ZyZWUoZm5hbWVzKTsKICAgIH0KCiAgICAvKiBUT0RPOiBTaG9ydGVuIHRoZSBmaWxlIG5hbWUgaWYgcG9zc2libGUgKi8KICAgIHJldHVybiBmbmFtZTsKI2Vsc2UKICAgIFNGVHlwZUxpc3QJCWZpbGVUeXBlczsKICAgIFN0YW5kYXJkRmlsZVJlcGx5CXJlcGx5OwogICAgU3RyMjU1CQlQcm9tcHQ7CiAgICBTdHIyNTUJCURlZmF1bHROYW1lOwogICAgU3RyMjU1CQlEaXJlY3Rvcnk7CgogICAgLyogVE9ETzogc3BsaXQgZGZsdCBpbiBwYXRoIGFuZCBmaWxlbmFtZSAqLwoKICAgICh2b2lkKSBDMlBhc2NhbFN0cmluZyh0aXRsZSwgICAmUHJvbXB0KTsKICAgICh2b2lkKSBDMlBhc2NhbFN0cmluZyhkZmx0LCAgICAmRGVmYXVsdE5hbWUpOwogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKGluaXRkaXIsICZEaXJlY3RvcnkpOwoKICAgIGlmIChzYXZpbmcpCiAgICB7CgkvKiBVc2UgYSBjdXN0b24gZmlsdGVyIGluc3RlYWQgb2YgbmlsIEZBUSA5LTQgKi8KCVN0YW5kYXJkUHV0RmlsZShQcm9tcHQsIERlZmF1bHROYW1lLCAgJnJlcGx5KTsKCWlmICghcmVwbHkuc2ZHb29kKQoJICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZWxzZQogICAgewoJU3RhbmRhcmRHZXRGaWxlKG5pbCwgLTEsIGZpbGVUeXBlcywgJnJlcGx5KTsKCWlmICghcmVwbHkuc2ZHb29kKQoJICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIFdvcmsgZmluZSBidXQgYXBwZW5kIGEgOiBmb3IgbmV3IGZpbGUgKi8KICAgIHJldHVybiAoRnVsbFBhdGhGcm9tRlNTcGVjX3NhdmUocmVwbHkuc2ZGaWxlKSk7CgogICAgLyogU2hvcnRlbiB0aGUgZmlsZSBuYW1lIGlmIHBvc3NpYmxlICovCi8qICAgIG1jaF9kaXJuYW1lKElPYnVmZiwgSU9TSVpFKTsKICAgIHAgPSBzaG9ydGVuX2ZuYW1lKGZpbGVCdWYsIElPYnVmZik7CiAgICBpZiAocCA9PSBOVUxMKQogICAgcCA9IGZpbGVCdWY7CiAgICByZXR1cm4gdmltX3N0cnNhdmUocCk7CiovCiNlbmRpZgp9CiNlbmRpZiAvKiBGRUFUX0JST1dTRSAqLwoKI2lmZGVmIEZFQVRfR1VJX0RJQUxPRwovKgogKiBTdHVmZiBmb3IgZGlhbG9ndWVzCiAqLwoKLyoKICogQ3JlYXRlIGEgZGlhbG9ndWUgZHluYW1pY2FsbHkgZnJvbSB0aGUgcGFyYW1ldGVyIHN0cmluZ3MuCiAqIHR5cGUgICAgICAgPSB0eXBlIG9mIGRpYWxvZ3VlIChxdWVzdGlvbiwgYWxlcnQsIGV0Yy4pCiAqIHRpdGxlICAgICAgPSBkaWFsb2d1ZSB0aXRsZS4gbWF5IGJlIE5VTEwgZm9yIGRlZmF1bHQgdGl0bGUuCiAqIG1lc3NhZ2UgICAgPSB0ZXh0IHRvIGRpc3BsYXkuIERpYWxvZ3VlIHNpemVzIHRvIGFjY29tbW9kYXRlIGl0LgogKiBidXR0b25zICAgID0gJ1xuJyBzZXBhcmF0ZWQgbGlzdCBvZiBidXR0b24gY2FwdGlvbnMsIGRlZmF1bHQgZmlyc3QuCiAqIGRmbHRidXR0b24gPSBudW1iZXIgb2YgZGVmYXVsdCBidXR0b24uCiAqCiAqIFRoaXMgcm91dGluZSByZXR1cm5zIDEgaWYgdGhlIGZpcnN0IGJ1dHRvbiBpcyBwcmVzc2VkLAogKgkgICAgMiBmb3IgdGhlIHNlY29uZCwgZXRjLgogKgogKgkgICAgMCBpbmRpY2F0ZXMgRXNjIHdhcyBwcmVzc2VkLgogKgkgICAgLTEgZm9yIHVuZXhwZWN0ZWQgZXJyb3IKICoKICogSWYgc3R1YmJpbmcgb3V0IHRoaXMgZm4sIHJldHVybiAxLgogKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIHNob3J0ICAgaWR4OwogICAgc2hvcnQgICB3aWR0aDsJLyogU2l6ZSBvZiB0aGUgdGV4dCBpbiBwaXhlbCAqLwogICAgUmVjdCAgICBib3g7Cn0gdmdtRGxnSXRtOyAvKiBWaW0gR3VpX01hYy5jIERpYWxvZyBJdGVtICovCgojZGVmaW5lIE1vdmVSZWN0VG8ocix4LHkpIE9mZnNldFJlY3Qocix4LXItPmxlZnQseS1yLT50b3ApCgogICAgc3RhdGljIHZvaWQKbWFjTW92ZURpYWxvZ0l0ZW0oCiAgICBEaWFsb2dSZWYJdGhlRGlhbG9nLAogICAgc2hvcnQJaXRlbU51bWJlciwKICAgIHNob3J0CVgsCiAgICBzaG9ydAlZLAogICAgUmVjdAkqaW5Cb3gpCnsKI2lmIDAgLyogVVNFX0NBUkJPTklaRUQgKi8KICAgIC8qIFVudGVzdGVkICovCiAgICBNb3ZlRGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIFgsIFkpOwogICAgaWYgKGluQm94ICE9IG5pbCkKCUdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpdGVtTnVtYmVyLCAmaXRlbVR5cGUsICZpdGVtSGFuZGxlLCBpbkJveCk7CiNlbHNlCiAgICBzaG9ydAlpdGVtVHlwZTsKICAgIEhhbmRsZQlpdGVtSGFuZGxlOwogICAgUmVjdAlsb2NhbEJveDsKICAgIFJlY3QJKml0ZW1Cb3ggPSAmbG9jYWxCb3g7CgogICAgaWYgKGluQm94ICE9IG5pbCkKCWl0ZW1Cb3ggPSBpbkJveDsKCiAgICBHZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaXRlbU51bWJlciwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgaXRlbUJveCk7CiAgICBPZmZzZXRSZWN0KGl0ZW1Cb3gsIC1pdGVtQm94LT5sZWZ0LCAtaXRlbUJveC0+dG9wKTsKICAgIE9mZnNldFJlY3QoaXRlbUJveCwgWCwgWSk7CiAgICAvKiBUbyBtb3ZlIGEgY29udHJvbCAobGlrZSBhIGJ1dHRvbikgd2UgbmVlZCB0byBjYWxsIGJvdGgKICAgICAqIE1vdmVDb250cm9sIGFuZCBTZXREaWFsb2dJdGVtLiBGQVEgNi0xOCAqLwogICAgaWYgKDEpIC8qKGl0ZW1UeXBlICYga0NvbnRyb2xEaWFsb2dJdGVtKSAqLwoJTW92ZUNvbnRyb2woKENvbnRyb2xSZWYpIGl0ZW1IYW5kbGUsIFgsIFkpOwogICAgU2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIGl0ZW1UeXBlLCBpdGVtSGFuZGxlLCBpdGVtQm94KTsKI2VuZGlmCn0KCiAgICBzdGF0aWMgdm9pZAptYWNTaXplRGlhbG9nSXRlbSgKICAgIERpYWxvZ1JlZgl0aGVEaWFsb2csCiAgICBzaG9ydAlpdGVtTnVtYmVyLAogICAgc2hvcnQJd2lkdGgsCiAgICBzaG9ydAloZWlnaHQpCnsKICAgIHNob3J0CWl0ZW1UeXBlOwogICAgSGFuZGxlCWl0ZW1IYW5kbGU7CiAgICBSZWN0CWl0ZW1Cb3g7CgogICAgR2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZpdGVtQm94KTsKCiAgICAvKiBXaGVuIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvIGRvIG5vdCBjaGFuZ2UgaXQgKi8KICAgIGlmICh3aWR0aCAgPT0gMCkKCXdpZHRoICA9IGl0ZW1Cb3gucmlnaHQgIC0gaXRlbUJveC5sZWZ0OwogICAgaWYgKGhlaWdodCA9PSAwKQoJaGVpZ2h0ID0gaXRlbUJveC5ib3R0b20gLSBpdGVtQm94LnRvcDsKCiNpZiAwIC8qIFVTRV9DQVJCT05JWkVEICovCiAgICBTaXplRGlhbG9nSXRlbSh0aGVEaWFsb2csIGl0ZW1OdW1iZXIsIHdpZHRoLCBoZWlnaHQpOyAvKiBVbnRlc3RlZCAqLwojZWxzZQogICAgLyogUmVzaXplIHRoZSBib3VuZGluZyBib3ggKi8KICAgIGl0ZW1Cb3gucmlnaHQgID0gaXRlbUJveC5sZWZ0ICsgd2lkdGg7CiAgICBpdGVtQm94LmJvdHRvbSA9IGl0ZW1Cb3gudG9wICArIGhlaWdodDsKCiAgICAvKiBUbyByZXNpemUgYSBjb250cm9sIChsaWtlIGEgYnV0dG9uKSB3ZSBuZWVkIHRvIGNhbGwgYm90aAogICAgICogU2l6ZUNvbnRyb2wgYW5kIFNldERpYWxvZ0l0ZW0uIChkZWR1Y3RlZCBmcm9tIEZBUSA2LTE4KSAqLwogICAgaWYgKGl0ZW1UeXBlICYga0NvbnRyb2xEaWFsb2dJdGVtKQoJU2l6ZUNvbnRyb2woKENvbnRyb2xSZWYpIGl0ZW1IYW5kbGUsIHdpZHRoLCBoZWlnaHQpOwoKICAgIC8qIENvbmZpZ3VyZSBiYWNrIHRoZSBpdGVtICovCiAgICBTZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaXRlbU51bWJlciwgaXRlbVR5cGUsIGl0ZW1IYW5kbGUsICZpdGVtQm94KTsKI2VuZGlmCn0KCiAgICBzdGF0aWMgdm9pZAptYWNTZXREaWFsb2dJdGVtVGV4dCgKICAgIERpYWxvZ1JlZgl0aGVEaWFsb2csCiAgICBzaG9ydAlpdGVtTnVtYmVyLAogICAgU3RyMjU1CWl0ZW1OYW1lKQp7CiAgICBzaG9ydAlpdGVtVHlwZTsKICAgIEhhbmRsZQlpdGVtSGFuZGxlOwogICAgUmVjdAlpdGVtQm94OwoKICAgIEdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpdGVtTnVtYmVyLCAmaXRlbVR5cGUsICZpdGVtSGFuZGxlLCAmaXRlbUJveCk7CgogICAgaWYgKGl0ZW1UeXBlICYga0NvbnRyb2xEaWFsb2dJdGVtKQoJU2V0Q29udHJvbFRpdGxlKChDb250cm9sUmVmKSBpdGVtSGFuZGxlLCBpdGVtTmFtZSk7CiAgICBlbHNlCglTZXREaWFsb2dJdGVtVGV4dChpdGVtSGFuZGxlLCBpdGVtTmFtZSk7Cn0KCiAgICBpbnQKZ3VpX21jaF9kaWFsb2coCiAgICBpbnQJCXR5cGUsCiAgICBjaGFyX3UJKnRpdGxlLAogICAgY2hhcl91CSptZXNzYWdlLAogICAgY2hhcl91CSpidXR0b25zLAogICAgaW50CQlkZmx0YnV0dG9uLAogICAgY2hhcl91CSp0ZXh0ZmllbGQpCnsKICAgIEhhbmRsZQlidXR0b25ESVRMOwogICAgSGFuZGxlCWljb25ESVRMOwogICAgSGFuZGxlCWlucHV0RElUTDsKICAgIEhhbmRsZQltZXNzYWdlRElUTDsKICAgIEhhbmRsZQlpdGVtSGFuZGxlOwogICAgSGFuZGxlCWljb25IYW5kbGU7CiAgICBEaWFsb2dQdHIJdGhlRGlhbG9nOwogICAgY2hhcl91CWxlbjsKICAgIGNoYXJfdQlQYXNjYWxUaXRsZVsyNTZdOwkvKiBwbGFjZSBob2xkZXIgZm9yIHRoZSB0aXRsZSAqLwogICAgY2hhcl91CW5hbWVbMjU2XTsKICAgIEdyYWZQdHIJb2xkUG9ydDsKICAgIHNob3J0CWl0ZW1IaXQ7CiAgICBjaGFyX3UJKmJ1dHRvbkNoYXI7CiAgICBSZWN0CWJveDsKICAgIHNob3J0CWJ1dHRvbjsKICAgIHNob3J0CWxhc3RCdXR0b247CiAgICBzaG9ydAlpdGVtVHlwZTsKICAgIHNob3J0CXVzZUljb247CiAgICBzaG9ydAl3aWR0aDsKICAgIHNob3J0CXRvdGFsQnV0dG9uV2lkdGggPSAwOyAgIC8qIHRoZSB3aWR0aCBvZiBhbGwgYnV0dG9uIHRvZ2V0aGVyIGluY3VkaW5nIHNwYWNpbmcgKi8KICAgIHNob3J0CXdpZGVzdEJ1dHRvbiA9IDA7CiAgICBzaG9ydAlkZmx0QnV0dG9uRWRnZSAgICAgPSAyMDsgIC8qIGd1dCBmZWVsaW5nICovCiAgICBzaG9ydAlkZmx0RWxlbWVudFNwYWNpbmcgPSAxMzsgIC8qIGZyb20gSU06Vi4yLTI5ICovCiAgICBzaG9ydCAgICAgICBkZmx0SWNvblNpZGVTcGFjZSAgPSAyMzsgIC8qIGZyb20gSU06Vi4yLTI5ICovCiAgICBzaG9ydAltYXhpbXVtV2lkdGggICAgICAgPSA0MDA7IC8qIGd1dCBmZWVsaW5nICovCiAgICBzaG9ydAltYXhCdXR0b25XaWR0aAkgICA9IDE3NTsgLyogZ3V0IGZlZWxpbmcgKi8KCiAgICBzaG9ydAl2ZXJ0aWNhbDsKICAgIHNob3J0CWRpYWxvZ0hlaWdodDsKICAgIHNob3J0CW1lc3NhZ2VMaW5lcyA9IDM7CiAgICBGb250SW5mbwl0ZXh0Rm9udEluZm87CgogICAgdmdtRGxnSXRtICAgaWNvbkl0bTsKICAgIHZnbURsZ0l0bSAgIG1lc3NhZ2VJdG07CiAgICB2Z21EbGdJdG0gICBpbnB1dEl0bTsKICAgIHZnbURsZ0l0bSAgIGJ1dHRvbkl0bTsKCiAgICBXaW5kb3dSZWYJdGhlV2luZG93OwoKICAgIC8qIENoZWNrICd2JyBmbGFnIGluICdndWlvcHRpb25zJzogdmVydGljYWwgYnV0dG9uIHBsYWNlbWVudC4gKi8KICAgIHZlcnRpY2FsID0gKHZpbV9zdHJjaHIocF9nbywgR09fVkVSVElDQUwpICE9IE5VTEwpOwoKICAgIC8qIENyZWF0ZSBhIG5ldyBEaWFsb2cgQm94IGZyb20gdGVtcGxhdGUuICovCiAgICB0aGVEaWFsb2cgPSBHZXROZXdEaWFsb2coMTI5LCBuaWwsIChXaW5kb3dSZWYpIC0xKTsKCiAgICAvKiBHZXQgdGhlIFdpbmRvd1JlZiAqLwogICAgdGhlV2luZG93ID0gR2V0RGlhbG9nV2luZG93KHRoZURpYWxvZyk7CgogICAgLyogSGlkZSB0aGUgd2luZG93LgogICAgICogMS4gdG8gYXZvaWQgc2VlaW5nIHNsb3cgZHJhd2luZwogICAgICogMi4gdG8gcHJldmVudCBhIHByb2JsZW0gc2VlbiB3aGlsZSBtb3ZpbmcgZGlhbG9nIGl0ZW0KICAgICAqICAgIHdpdGhpbiBhIHZpc2libGUgd2luZG93LiAobm9uLUNhcmJvbiBNYWNPUyA5KQogICAgICogQ291bGQgYmUgYXZvaWRlZCBieSBjaGFuZ2luZyB0aGUgcmVzb3VyY2UuCiAgICAgKi8KICAgIEhpZGVXaW5kb3codGhlV2luZG93KTsKCiAgICAvKiBDaGFuZ2UgdGhlIGdyYXBoaWNhbCBwb3J0IHRvIHRoZSBkaWFsb2csCiAgICAgKiBzbyB3ZSBjYW4gbWVhc3VyZSB0aGUgdGV4dCB3aXRoIHRoZSBwcm9wZXIgZm9udCAqLwogICAgR2V0UG9ydCgmb2xkUG9ydCk7CiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgU2V0UG9ydERpYWxvZ1BvcnQodGhlRGlhbG9nKTsKI2Vsc2UKICAgIFNldFBvcnQodGhlRGlhbG9nKTsKI2VuZGlmCgogICAgLyogR2V0IHRoZSBpbmZvIGFib3V0IHRoZSBkZWZhdWx0IHRleHQsCiAgICAgKiB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgaGVpZ2h0IG9mIHRoZSBtZXNzYWdlCiAgICAgKiBhbmQgb2YgdGhlICB0ZXh0IGZpZWxkICovCiAgICBHZXRGb250SW5mbygmdGV4dEZvbnRJbmZvKTsKCiAgICAvKglTZXQgdGhlIGRpYWxvZyB0aXRsZSAqLwogICAgaWYgKHRpdGxlICE9IE5VTEwpCiAgICB7Cgkodm9pZCkgQzJQYXNjYWxTdHJpbmcodGl0bGUsICZQYXNjYWxUaXRsZSk7CglTZXRXVGl0bGUodGhlV2luZG93LCBQYXNjYWxUaXRsZSk7CiAgICB9CgogICAgLyogQ3JlYXRlcyB0aGUgYnV0dG9ucyBhbmQgYWRkIHRoZW0gdG8gdGhlIERpYWxvZyBCb3guICovCiAgICBidXR0b25ESVRMID0gR2V0UmVzb3VyY2UoJ0RJVEwnLCAxMzApOwogICAgYnV0dG9uQ2hhciA9IGJ1dHRvbnM7CiAgICBidXR0b24gPSAwOwoKICAgIGZvciAoOypidXR0b25DaGFyICE9IDA7KQogICAgewoJLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBidXR0b24gKi8KCWJ1dHRvbisrOwoJbGVuID0gMDsKCWZvciAoOygoKmJ1dHRvbkNoYXIgIT0gRExHX0JVVFRPTl9TRVApICYmICgqYnV0dG9uQ2hhciAhPSAwKSAmJiAobGVuIDwgMjU1KSk7IGJ1dHRvbkNoYXIrKykKCXsKCSAgICBpZiAoKmJ1dHRvbkNoYXIgIT0gRExHX0hPVEtFWV9DSEFSKQoJCW5hbWVbKytsZW5dID0gKmJ1dHRvbkNoYXI7Cgl9CglpZiAoKmJ1dHRvbkNoYXIgIT0gMCkKCSAgYnV0dG9uQ2hhcisrOwoJbmFtZVswXSA9IGxlbjsKCgkvKiBBZGQgdGhlIGJ1dHRvbiAqLwoJQXBwZW5kRElUTCh0aGVEaWFsb2csIGJ1dHRvbkRJVEwsIG92ZXJsYXlESVRMKTsgLyogYXBwZW5kRElUTFJpZ2h0KTsgKi8KCgkvKiBDaGFuZ2UgdGhlIGJ1dHRvbidzIG5hbWUgKi8KCW1hY1NldERpYWxvZ0l0ZW1UZXh0KHRoZURpYWxvZywgYnV0dG9uLCBuYW1lKTsKCgkvKiBSZXNpemUgdGhlIGJ1dHRvbiB0byBmaXQgaXRzIG5hbWUgKi8KCXdpZHRoID0gU3RyaW5nV2lkdGgobmFtZSkgKyAyICogZGZsdEJ1dHRvbkVkZ2U7CgkvKiBMaW1pdGUgdGhlIHNpemUgb2YgYW55IGJ1dHRvbiB0byBhbiBhY2NlcHRhYmxlIHZhbHVlLiAqLwoJLyogVE9ETzogU2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBtZXNzYWdlIHdpZHRoICovCglpZiAod2lkdGggPiBtYXhCdXR0b25XaWR0aCkKCSAgICB3aWR0aCA9IG1heEJ1dHRvbldpZHRoOwoJbWFjU2l6ZURpYWxvZ0l0ZW0odGhlRGlhbG9nLCBidXR0b24sIHdpZHRoLCAwKTsKCgl0b3RhbEJ1dHRvbldpZHRoICs9IHdpZHRoOwoKCWlmICh3aWR0aCA+IHdpZGVzdEJ1dHRvbikKCSAgICB3aWRlc3RCdXR0b24gPSB3aWR0aDsKICAgIH0KICAgIFJlbGVhc2VSZXNvdXJjZShidXR0b25ESVRMKTsKICAgIGxhc3RCdXR0b24gPSBidXR0b247CgogICAgLyogQWRkIHRoZSBpY29uIHRvIHRoZSBEaWFsb2cgQm94LiAqLwogICAgaWNvbkl0bS5pZHggPSBsYXN0QnV0dG9uICsgMTsKICAgIGljb25ESVRMID0gR2V0UmVzb3VyY2UoJ0RJVEwnLCAxMzEpOwogICAgc3dpdGNoICh0eXBlKQogICAgewoJY2FzZSBWSU1fR0VORVJJQzogIHVzZUljb24gPSBrTm90ZUljb247CgljYXNlIFZJTV9FUlJPUjogICAgdXNlSWNvbiA9IGtTdG9wSWNvbjsKCWNhc2UgVklNX1dBUk5JTkc6ICB1c2VJY29uID0ga0NhdXRpb25JY29uOwoJY2FzZSBWSU1fSU5GTzogICAgIHVzZUljb24gPSBrTm90ZUljb247CgljYXNlIFZJTV9RVUVTVElPTjogdXNlSWNvbiA9IGtOb3RlSWNvbjsKCWRlZmF1bHQ6ICAgICAgdXNlSWNvbiA9IGtTdG9wSWNvbjsKICAgIH07CiAgICBBcHBlbmRESVRMKHRoZURpYWxvZywgaWNvbkRJVEwsIG92ZXJsYXlESVRMKTsKICAgIFJlbGVhc2VSZXNvdXJjZShpY29uRElUTCk7CiAgICBHZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaWNvbkl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwogICAgLyogVE9ETzogU2hvdWxkIHRoZSBpdGVtIGJlIGZyZWVkPyAqLwogICAgaWNvbkhhbmRsZSA9IEdldEljb24odXNlSWNvbik7CiAgICBTZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaWNvbkl0bS5pZHgsIGl0ZW1UeXBlLCBpY29uSGFuZGxlLCAmYm94KTsKCiAgICAvKiBBZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIERpYWxvZyBib3guICovCiAgICBtZXNzYWdlSXRtLmlkeCA9IGxhc3RCdXR0b24gKyAyOwogICAgbWVzc2FnZURJVEwgPSBHZXRSZXNvdXJjZSgnRElUTCcsIDEzMik7CiAgICBBcHBlbmRESVRMKHRoZURpYWxvZywgbWVzc2FnZURJVEwsIG92ZXJsYXlESVRMKTsKICAgIFJlbGVhc2VSZXNvdXJjZShtZXNzYWdlRElUTCk7CiAgICBHZXREaWFsb2dJdGVtKHRoZURpYWxvZywgbWVzc2FnZUl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKG1lc3NhZ2UsICZuYW1lKTsKICAgIFNldERpYWxvZ0l0ZW1UZXh0KGl0ZW1IYW5kbGUsIG5hbWUpOwogICAgbWVzc2FnZUl0bS53aWR0aCA9IFN0cmluZ1dpZHRoKG5hbWUpOwoKICAgIC8qIEFkZCB0aGUgaW5wdXQgYm94IGlmIG5lZWRlZCAqLwogICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQogICAgewoJLyogQ2hlYXQgZm9yIG5vdyByZXVzZSB0aGUgbWVzc2FnZSBhbmQgY29udmV0IHRvIHRleHQgZWRpdCAqLwoJaW5wdXRJdG0uaWR4ID0gbGFzdEJ1dHRvbiArIDM7CglpbnB1dERJVEwgPSBHZXRSZXNvdXJjZSgnRElUTCcsIDEzMik7CglBcHBlbmRESVRMKHRoZURpYWxvZywgaW5wdXRESVRMLCBvdmVybGF5RElUTCk7CglSZWxlYXNlUmVzb3VyY2UoaW5wdXRESVRMKTsKCUdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwovKgkgIFNldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsIGtFZGl0VGV4dERpYWxvZ0l0ZW0sIGl0ZW1IYW5kbGUsICZib3gpOyovCgkodm9pZCkgQzJQYXNjYWxTdHJpbmcodGV4dGZpZWxkLCAmbmFtZSk7CglTZXREaWFsb2dJdGVtVGV4dChpdGVtSGFuZGxlLCBuYW1lKTsKCWlucHV0SXRtLndpZHRoID0gU3RyaW5nV2lkdGgobmFtZSk7CiAgICB9CgogICAgLyogU2V0IHRoZSA8RU5URVI+IGFuZCA8RVNDPiBidXR0b24uICovCiAgICBTZXREaWFsb2dEZWZhdWx0SXRlbSh0aGVEaWFsb2csIGRmbHRidXR0b24pOwogICAgU2V0RGlhbG9nQ2FuY2VsSXRlbSh0aGVEaWFsb2csIDApOwoKICAgIC8qIFJlcG9zaXRpb24gZWxlbWVudCAqLwoKICAgIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gZm9yY2UgdmVydGljYWwgKi8KICAgIGlmICh0b3RhbEJ1dHRvbldpZHRoID4gbWF4aW11bVdpZHRoKQoJdmVydGljYWwgPSBUUlVFOwoKICAgIC8qIFBsYWNlIGljb24gKi8KICAgIG1hY01vdmVEaWFsb2dJdGVtKHRoZURpYWxvZywgaWNvbkl0bS5pZHgsIGRmbHRJY29uU2lkZVNwYWNlLCBkZmx0RWxlbWVudFNwYWNpbmcsICZib3gpOwogICAgaWNvbkl0bS5ib3gucmlnaHQgPSBib3gucmlnaHQ7CiAgICBpY29uSXRtLmJveC5ib3R0b20gPSBib3guYm90dG9tOwoKICAgIC8qIFBsYWNlIE1lc3NhZ2UgKi8KICAgIG1lc3NhZ2VJdG0uYm94LmxlZnQgPSBpY29uSXRtLmJveC5yaWdodCArIGRmbHRJY29uU2lkZVNwYWNlOwogICAgbWFjU2l6ZURpYWxvZ0l0ZW0odGhlRGlhbG9nLCBtZXNzYWdlSXRtLmlkeCwgMCwgIG1lc3NhZ2VMaW5lcyAqICh0ZXh0Rm9udEluZm8uYXNjZW50ICsgdGV4dEZvbnRJbmZvLmRlc2NlbnQpKTsKICAgIG1hY01vdmVEaWFsb2dJdGVtKHRoZURpYWxvZywgbWVzc2FnZUl0bS5pZHgsIG1lc3NhZ2VJdG0uYm94LmxlZnQsIGRmbHRFbGVtZW50U3BhY2luZywgJm1lc3NhZ2VJdG0uYm94KTsKCiAgICAvKiBQbGFjZSBJbnB1dCAqLwogICAgaWYgKHRleHRmaWVsZCAhPSBOVUxMKQogICAgewoJaW5wdXRJdG0uYm94LmxlZnQgPSBtZXNzYWdlSXRtLmJveC5sZWZ0OwoJaW5wdXRJdG0uYm94LnRvcCAgPSBtZXNzYWdlSXRtLmJveC5ib3R0b20gKyBkZmx0RWxlbWVudFNwYWNpbmc7CgltYWNTaXplRGlhbG9nSXRlbSh0aGVEaWFsb2csIGlucHV0SXRtLmlkeCwgMCwgdGV4dEZvbnRJbmZvLmFzY2VudCArIHRleHRGb250SW5mby5kZXNjZW50KTsKCW1hY01vdmVEaWFsb2dJdGVtKHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCBpbnB1dEl0bS5ib3gubGVmdCwgaW5wdXRJdG0uYm94LnRvcCwgJmlucHV0SXRtLmJveCk7CgkvKiBDb252ZXJ0IHRoZSBzdGF0aWMgdGV4dCBpbnRvIGEgdGV4dCBlZGl0LgoJICogRm9yIHNvbWUgcmVhc29uIHRoaXMgY2hhbmdlIG5lZWQgdG8gYmUgZG9uZSBsYXN0IChEYW55KSAqLwoJR2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGlucHV0SXRtLmlkeCwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJmlucHV0SXRtLmJveCk7CglTZXREaWFsb2dJdGVtKHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCBrRWRpdFRleHREaWFsb2dJdGVtLCBpdGVtSGFuZGxlLCAmaW5wdXRJdG0uYm94KTsKCVNlbGVjdERpYWxvZ0l0ZW1UZXh0KHRoZURpYWxvZywgaW5wdXRJdG0uaWR4LCAwLCAzMjc2Nyk7CiAgICB9CgogICAgLyogUGxhY2UgQnV0dG9uICovCiAgICBpZiAodGV4dGZpZWxkICE9IE5VTEwpCiAgICB7CglidXR0b25JdG0uYm94LmxlZnQgPSBpbnB1dEl0bS5ib3gubGVmdDsKCWJ1dHRvbkl0bS5ib3gudG9wICA9IGlucHV0SXRtLmJveC5ib3R0b20gKyBkZmx0RWxlbWVudFNwYWNpbmc7CiAgICB9CiAgICBlbHNlCiAgICB7CglidXR0b25JdG0uYm94LmxlZnQgPSBtZXNzYWdlSXRtLmJveC5sZWZ0OwoJYnV0dG9uSXRtLmJveC50b3AgID0gbWVzc2FnZUl0bS5ib3guYm90dG9tICsgZGZsdEVsZW1lbnRTcGFjaW5nOwogICAgfQoKICAgIGZvciAoYnV0dG9uPTE7IGJ1dHRvbiA8PSBsYXN0QnV0dG9uOyBidXR0b24rKykKICAgIHsKCgltYWNNb3ZlRGlhbG9nSXRlbSh0aGVEaWFsb2csIGJ1dHRvbiwgYnV0dG9uSXRtLmJveC5sZWZ0LCBidXR0b25JdG0uYm94LnRvcCwgJmJveCk7CgkvKiBXaXRoIHZlcnRpY2FsLCBpdCdzIGJldHRlciB0byBoYXZlIGFsbCBidXR0b24gdGhlIHNhbWUgbGVuZ2h0ICovCglpZiAodmVydGljYWwpCgl7CgkgICAgbWFjU2l6ZURpYWxvZ0l0ZW0odGhlRGlhbG9nLCBidXR0b24sIHdpZGVzdEJ1dHRvbiwgMCk7CgkgICAgR2V0RGlhbG9nSXRlbSh0aGVEaWFsb2csIGJ1dHRvbiwgJml0ZW1UeXBlLCAmaXRlbUhhbmRsZSwgJmJveCk7Cgl9CgkvKiBDYWxjdWxhdGUgcG9zaXRpb24gb2YgbmV4dCBidXR0b24gKi8KCWlmICh2ZXJ0aWNhbCkKCSAgICBidXR0b25JdG0uYm94LnRvcCAgPSBib3guYm90dG9tICsgZGZsdEVsZW1lbnRTcGFjaW5nOwoJZWxzZQoJICAgIGJ1dHRvbkl0bS5ib3gubGVmdCAgPSBib3gucmlnaHQgKyBkZmx0RWxlbWVudFNwYWNpbmc7CiAgICB9CgogICAgLyogUmVzaXplIHRoZSBkaWFsb2cgYm94ICovCiAgICBkaWFsb2dIZWlnaHQgPSBib3guYm90dG9tICsgZGZsdEVsZW1lbnRTcGFjaW5nOwogICAgU2l6ZVdpbmRvdyh0aGVXaW5kb3csIG1heGltdW1XaWR0aCwgZGlhbG9nSGVpZ2h0LCBUUlVFKTsKCiNpZmRlZiBVU0VfQ0FSQk9OSVpFRAogICAgLyogTWFnaWMgcmVzaXplICovCiAgICBBdXRvU2l6ZURpYWxvZyh0aGVEaWFsb2cpOwogICAgLyogTmVlZCBhIGhvcml6b250YWwgcmVzaXplIGFueXdheSBzbyBub3QgdGhhdCB1c2VmdWwgKi8KI2VuZGlmCgogICAgLyogRGlzcGxheSBpdCAqLwogICAgU2hvd1dpbmRvdyh0aGVXaW5kb3cpOwovKiAgQnJpbmdUb0Zyb250KHRoZVdpbmRvdyk7ICovCiAgICBTZWxlY3RXaW5kb3codGhlV2luZG93KTsKCi8qICBEcmF3RGlhbG9nKHRoZURpYWxvZyk7ICovCiNpZiAwCiAgICBHZXRQb3J0KCZvbGRQb3J0KTsKI2lmZGVmIFVTRV9DQVJCT05JWkVECiAgICBTZXRQb3J0RGlhbG9nUG9ydCh0aGVEaWFsb2cpOwojZWxzZQogICAgU2V0UG9ydCh0aGVEaWFsb2cpOwojZW5kaWYKI2VuZGlmCgogICAgLyogSGFuZyB1bnRpbCBvbmUgb2YgdGhlIGJ1dHRvbiBpcyBoaXQgKi8KICAgIGRvCiAgICB7CglNb2RhbERpYWxvZyhuaWwsICZpdGVtSGl0KTsKICAgIH0gd2hpbGUgKChpdGVtSGl0IDwgMSkgfHwgKGl0ZW1IaXQgPiBsYXN0QnV0dG9uKSk7CgogICAgLyogQ29weSBiYWNrIHRoZSB0ZXh0IGVudGVyZWQgYnkgdGhlIHVzZXIgaW50byB0aGUgcGFyYW0gKi8KICAgIGlmICh0ZXh0ZmllbGQgIT0gTlVMTCkKICAgIHsKCUdldERpYWxvZ0l0ZW0odGhlRGlhbG9nLCBpbnB1dEl0bS5pZHgsICZpdGVtVHlwZSwgJml0ZW1IYW5kbGUsICZib3gpOwoJR2V0RGlhbG9nSXRlbVRleHQoaXRlbUhhbmRsZSwgKGNoYXJfdSAqKSAmbmFtZSk7CiNpZiBJT1NJWkUgPCAyNTYKCS8qIFRydW5jYXRlIHRoZSBuYW1lIHRvIElPU0laRSBpZiBuZWVkZWQgKi8KCWlmIChuYW1lWzBdID4gSU9TSVpFKQoJICAgIG5hbWVbMF0gPSBJT1NJWkUgLSAxOwojZW5kaWYKCVNUUk5DUFkodGV4dGZpZWxkLCAmbmFtZVsxXSwgbmFtZVswXSk7Cgl0ZXh0ZmllbGRbbmFtZVswXV0gPSBOVUw7CiAgICB9CgogICAgLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgZ3JhcGhpY2FsIHBvcnQgKi8KICAgIFNldFBvcnQob2xkUG9ydCk7CgogICAgLyogR2V0IHJpZGUgb2YgdGggZWRpYWxvZyAoZnJlZSBtZW1vcnkpICovCiAgICBEaXNwb3NlRGlhbG9nKHRoZURpYWxvZyk7CgogICAgcmV0dXJuIGl0ZW1IaXQ7Ci8qCiAqIFVzZWZ1bGwgdGhpbmcgd2hpY2ggY291bGQgYmUgdXNlZAogKiBTZXREaWFsb2dUaW1lb3V0KCk6IEF1dG8gY2xpY2sgYSBidXR0b24gYWZ0ZXIgdGltZW91dAogKiBTZXREaWFsb2dUcmFja3NDdXJzb3IoKSA6IEdldCB0aGUgSS1iZWFtIGN1cnNvciBvdmVyIGlucHV0IGJveAogKiBNb3ZlRGlhbG9nSXRlbSgpOgkgICAgUHJvYmFibHkgYmV0dGVyIHRoYW4gU2V0RGlhbG9nSXRlbQogKiBTaXplRGlhbG9nSXRlbSgpOgkJKGJ1dCBpcyBpdCBDYXJib24gT25seT8pCiAqIEF1dG9TaXplRGlhbG9nKCk6CSAgICBNYWdpYyByZXNpemUgb2YgZGlhbG9nIGJhc2VkIG9uIHRleHQgbGVuZ2h0CiAqLwp9CiNlbmRpZiAvKiBGRUFUX0RJQUxPR19HVUkgKi8KCi8qCiAqIERpc3BsYXkgdGhlIHNhdmVkIGVycm9yIG1lc3NhZ2UocykuCiAqLwojaWZkZWYgVVNFX01DSF9FUlJNU0cKICAgIHZvaWQKZGlzcGxheV9lcnJvcnMoKQp7CiAgICBjaGFyCSpwOwogICAgY2hhcl91CXBFcnJvclsyNTZdOwoKICAgIGlmIChlcnJvcl9nYS5nYV9kYXRhICE9IE5VTEwpCiAgICB7CgkvKiBhdm9pZCBwdXR0aW5nIHVwIGEgbWVzc2FnZSBib3ggd2l0aCBibGFua3Mgb25seSAqLwoJZm9yIChwID0gKGNoYXIgKillcnJvcl9nYS5nYV9kYXRhOyAqcDsgKytwKQoJICAgIGlmICghaXNzcGFjZSgqcCkpCgkgICAgewoJCWlmIChTVFJMRU4ocCkgPiAyNTUpCgkJICAgIHBFcnJvclswXSA9IDI1NTsKCQllbHNlCgkJICAgIHBFcnJvclswXSA9IFNUUkxFTihwKTsKCgkJU1RSTkNQWSgmcEVycm9yWzFdLCBwLCBwRXJyb3JbMF0pOwoJCVBhcmFtVGV4dChwRXJyb3IsIG5pbCwgbmlsLCBuaWwpOwoJCUFsZXJ0KDEyOCwgbmlsKTsKCQlicmVhazsKCQkvKiBUT0RPOiBoYW5kbGVkIG1lc3NhZ2UgbG9uZ2VyIHRoYW4gMjU2IGNoYXJzCgkJICoJIHVzZSBhdXRvLXNpemVhYmxlIGFsZXJ0CgkJICoJIG9yIGRpYWxvZyB3aXRoIHNjcm9sbGJhcnMgKFRleHRFZGl0IHpvbmUpCgkJICovCgkgICAgfQoJZ2FfY2xlYXIoJmVycm9yX2dhKTsKICAgIH0KfQojZW5kaWYKCi8qCiAqIEdldCBjdXJyZW50IG1vdXNlIGNvb3JkaW5hdGVzIGluIHRleHQgd2luZG93LgogKi8KICAgIHZvaWQKZ3VpX21jaF9nZXRtb3VzZShpbnQgKngsIGludCAqeSkKewogICAgUG9pbnQgd2hlcmU7CgogICAgR2V0TW91c2UoJndoZXJlKTsKCiAgICAqeCA9IHdoZXJlLmg7CiAgICAqeSA9IHdoZXJlLnY7Cn0KCiAgICB2b2lkCmd1aV9tY2hfc2V0bW91c2UoeCwgeSkKICAgIGludAkJeDsKICAgIGludAkJeTsKewogICAgLyogVE9ETyAqLwojaWYgMAogICAgLyogRnJvbSBGQVEgMy0xMSAqLwoKICAgIEN1cnNvckRldmljZVB0ciBteU1vdXNlOwogICAgUG9pbnQJICAgIHdoZXJlOwoKICAgIGlmICggICBOR2V0VHJhcEFkZHJlc3MoX0N1cnNvckRldmljZURpc3BhdGNoLCBUb29sVHJhcCkKCSE9IE5HZXRUcmFwQWRkcmVzcyhfVW5pbXBsZW1lbnRlZCwgICBUb29sVHJhcCkpCiAgICB7CgkvKiBOZXcgd2F5ICovCgoJLyoKCSAqIEdldCBmaXJzdCBkZXZvaWNlIHdpdGggb25lIGJ1dHRvbi4KCSAqIFRoaXMgd2lsbCBwcm9iYWJseSBiZSB0aGUgc3RhbmRhZCBtb3VzZQoJICogc3RhcnRhdCBoZWFkIG9mIGN1cnNvciBkZXYgbGlzdAoJICoKCSAqLwoKCW15TW91c2UgPSBuaWw7CgoJZG8KCXsKCSAgICAvKiBHZXQgdGhlIG5leHQgY3Vyc29yIGRldmljZSAqLwoJICAgIEN1cnNvckRldmljZU5leHREZXZpY2UoJm15TW91c2UpOwoJfQoJd2hpbGUgKChteU1vdXNlICE9IG5pbCkgJiYgKG15TW91c2UtPmNudEJ1dHRvbnMgIT0gMSkpOwoKCUN1cnNvckRldmljZU1vdmVUbyhteU1vdXNlLCB4LCB5KTsKICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIE9sZCB3YXkgKi8KCXdoZXJlLmggPSB4OwoJd2hlcmUudiA9IHk7CgoJKihQb2ludCAqKVJhd01vdXNlID0gd2hlcmU7CgkqKFBvaW50ICopTVRlbXAgICAgPSB3aGVyZTsKCSooUHRyKSAgICBDcnNyTmV3ICA9IDB4RkZGRjsKICAgIH0KI2VuZGlmCn0KCiAgICB2b2lkCmd1aV9tY2hfc2hvd19wb3B1cG1lbnUobWVudSkKICAgIHZpbW1lbnVfVCAqbWVudTsKewojaWZkZWYgVVNFX0NUUkxDTElDS01FTlUKLyoKICogIENsb25lIFBvcFVwIHRvIHVzZSBtZW51CiAqICBDcmVhdGUgYSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCiAqICBDYWxsIHRoZSBwcm9jZWR1cmUKICovCgogICAgTWVudUhhbmRsZQlDbnR4TWVudTsKICAgIFBvaW50CXdoZXJlOwogICAgT1NTdGF0dXMJc3RhdHVzOwogICAgVUludDMyCUNudHhUeXBlOwogICAgU0ludDE2CUNudHhNZW51SUQ7CiAgICBVSW50MTYJQ250eE1lbnVJdGVtOwogICAgU3RyMjU1CUhlbHBOYW1lID0gIiI7CiAgICBHcmFmUHRyCXNhdmVQb3J0OwoKICAgIC8qIFNhdmUgQ3VycmVudCBQb3J0OiBPbiBNYWNPUyBYIHdlIHNlZW0gdG8gbG9zZSB0aGUgcG9ydCAqLwogICAgR2V0UG9ydCgmc2F2ZVBvcnQpOyAvKk9TWCovCgogICAgR2V0TW91c2UoJndoZXJlKTsKICAgIExvY2FsVG9HbG9iYWwoJndoZXJlKTsgLypPU1gqLwogICAgQ250eE1lbnUgPSBtZW51LT5zdWJtZW51X2hhbmRsZTsKCiAgICAvKiBUT0RPOiBHZXQgdGhlIHRleHQgc2VsZWN0aW9uIGZyb20gVmltICovCgogICAgLyogQ2FsbCB0byBIYW5kbGUgUG9wdXAgKi8KICAgIHN0YXR1cyA9IENvbnRleHR1YWxNZW51U2VsZWN0KENudHhNZW51LCB3aGVyZSwgZmFsc2UsIGtDTUhlbHBJdGVtTm9IZWxwLCBIZWxwTmFtZSwgTlVMTCwgJkNudHhUeXBlLCAmQ250eE1lbnVJRCwgJkNudHhNZW51SXRlbSk7CgogICAgaWYgKHN0YXR1cyA9PSBub0VycikKICAgIHsKCWlmIChDbnR4VHlwZSA9PSBrQ01NZW51SXRlbVNlbGVjdGVkKQoJewoJICAgIC8qIEhhbmRsZSB0aGUgbWVudSBDbnR4TWVudUlELCBDbnR4TWVudUl0ZW0gKi8KCSAgICAvKiBUaGUgc3VibWVudSBjYW4gYmUgaGFuZGxlIGRpcmVjdGx5IGJ5IGd1aV9tYWNfaGFuZGxlX21lbnUgKi8KCSAgICAvKiBCdXQgd2hhdCBhYm91dCB0aGUgY3VycmVudCBtZW51LCBpcyB0aGUgbWVudSBjaGFuZ2VkIGJ5IENvbnRleHR1YWxNZW51U2VsZWN0ICovCgkgICAgZ3VpX21hY19oYW5kbGVfbWVudSgoQ250eE1lbnVJRCA8PCAxNikgKyBDbnR4TWVudUl0ZW0pOwoJfQoJZWxzZSBpZiAoQ250eE1lbnVJRCA9PSBrQ01TaG93SGVscFNlbGVjdGVkKQoJewoJICAgIC8qIFNob3VsZCBjb21lIHVwIHdpdGggdGhlIGhlbHAgKi8KCX0KICAgIH0KCiAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIFBvcnQgKi8KICAgIFNldFBvcnQoc2F2ZVBvcnQpOyAvKk9TWCovCiNlbmRpZgp9CgojaWYgZGVmaW5lZChGRUFUX0NXX0VESVRPUikgfHwgZGVmaW5lZChQUk9UTykKLyogVE9ETzogSXMgaXQgbmVlZCBmb3IgTUFDT1NfWD8gKERhbnkpICovCiAgICB2b2lkCm1jaF9wb3N0X2J1ZmZlcl93cml0ZShidWZfVCAqYnVmKQp7CiMgaWZkZWYgVVNFX1NJT1VYCiAgICBwcmludGYoIldyaXRpbmcgQnVmLi4uXG4iKTsKIyBlbmRpZgogICAgR2V0RlNTcGVjRnJvbVBhdGgoYnVmLT5iX2ZmbmFtZSwgJmJ1Zi0+Yl9GU1NwZWMpOwogICAgU2VuZF9LQUhMX01PRF9BRShidWYpOwp9CiNlbmRpZgoKI2lmZGVmIEZFQVRfVElUTEUKLyoKICogU2V0IHRoZSB3aW5kb3cgdGl0bGUgYW5kIGljb24uCiAqIChUaGUgaWNvbiBpcyBub3QgdGFrZW4gY2FyZSBvZikuCiAqLwogICAgdm9pZApndWlfbWNoX3NldHRpdGxlKHRpdGxlLCBpY29uKQogICAgY2hhcl91ICp0aXRsZTsKICAgIGNoYXJfdSAqaWNvbjsKewogICAgLyogVE9ETzogR2V0IHZpbSB0byBtYWtlIHN1cmUgbWF4bGVuIChmcm9tIHBfdGl0bGVsZW4pIGlzIHNtYWxsZXIKICAgICAqICAgICAgIHRoYXQgMjU2LiBFdmVuIGJldHRlciBnZXQgaXQgdG8gZml0IG5pY2VseSBpbiB0aGUgdGl0bGViYXIuCiAgICAgKi8KI2lmIGRlZmluZWQoVVNFX0NBUkJPTklaRUQpICYmIGRlZmluZWQoRkVBVF9NQllURSkKICAgIENGU3RyaW5nUmVmIHdpbmRvd1RpdGxlOwogICAgc2l6ZV90CXdpbmRvd1RpdGxlTGVuOwojZWxzZQogICAgY2hhcl91ICAgKnBhc2NhbFRpdGxlOwojZW5kaWYKCiAgICBpZiAodGl0bGUgPT0gTlVMTCkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KCXJldHVybjsKCiNpZiBkZWZpbmVkKFVTRV9DQVJCT05JWkVEKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICB3aW5kb3dUaXRsZUxlbiA9IFNUUkxFTih0aXRsZSk7CiAgICB3aW5kb3dUaXRsZSAgPSBtYWNfZW5jX3RvX2Nmc3RyaW5nKHRpdGxlLCB3aW5kb3dUaXRsZUxlbik7CgogICAgaWYgKHdpbmRvd1RpdGxlKQogICAgewoJU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcoZ3VpLlZpbVdpbmRvdywgd2luZG93VGl0bGUpOwoJQ0ZSZWxlYXNlKHdpbmRvd1RpdGxlKTsKICAgIH0KI2Vsc2UKICAgIHBhc2NhbFRpdGxlID0gQzJQYXNjYWxfc2F2ZSh0aXRsZSk7CiAgICBpZiAocGFzY2FsVGl0bGUgIT0gTlVMTCkKICAgIHsKCVNldFdUaXRsZShndWkuVmltV2luZG93LCBwYXNjYWxUaXRsZSk7Cgl2aW1fZnJlZShwYXNjYWxUaXRsZSk7CiAgICB9CiNlbmRpZgp9CiNlbmRpZgoKLyoKICogVHJhbnNmZXJlZCBmcm9tIG9zX21hYy5jIGZvciBNYWNPUyBYIHVzaW5nIG9zX3VuaXguYyBwcmVwIHdvcmsKICovCgogICAgaW50CkMyUGFzY2FsU3RyaW5nKENTdHJpbmcsIFBhc2NhbFN0cmluZykKICAgIGNoYXJfdSAgKkNTdHJpbmc7CiAgICBTdHIyNTUgICpQYXNjYWxTdHJpbmc7CnsKICAgIGNoYXJfdSAqUGFzY2FsUHRyID0gKGNoYXJfdSAqKSBQYXNjYWxTdHJpbmc7CiAgICBpbnQgICAgbGVuOwogICAgaW50ICAgIGk7CgogICAgUGFzY2FsUHRyWzBdID0gMDsKICAgIGlmIChDU3RyaW5nID09IE5VTEwpCglyZXR1cm4gMDsKCiAgICBsZW4gPSBTVFJMRU4oQ1N0cmluZyk7CiAgICBpZiAobGVuID4gMjU1KQoJbGVuID0gMjU1OwoKICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKCVBhc2NhbFB0cltpKzFdID0gQ1N0cmluZ1tpXTsKCiAgICBQYXNjYWxQdHJbMF0gPSBsZW47CgogICAgcmV0dXJuIDA7Cn0KCiAgICBpbnQKR2V0RlNTcGVjRnJvbVBhdGgoZmlsZSwgZmlsZUZTU3BlYykKICAgIGNoYXJfdSAqZmlsZTsKICAgIEZTU3BlYyAqZmlsZUZTU3BlYzsKewogICAgLyogRnJvbSBGQVEgOC0xMiAqLwogICAgU3RyMjU1ICAgICAgZmlsZVBhc2NhbDsKICAgIENJbmZvUEJSZWMJbXlDUEI7CiAgICBPU0VycgllcnI7CgogICAgKHZvaWQpIEMyUGFzY2FsU3RyaW5nKGZpbGUsICZmaWxlUGFzY2FsKTsKCiAgICBteUNQQi5kaXJJbmZvLmlvTmFtZVB0ciAgID0gZmlsZVBhc2NhbDsKICAgIG15Q1BCLmRpckluZm8uaW9WUmVmTnVtICAgPSAwOwogICAgbXlDUEIuZGlySW5mby5pb0ZEaXJJbmRleCA9IDA7CiAgICBteUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAgID0gMDsKCiAgICBlcnI9IFBCR2V0Q2F0SW5mbygmbXlDUEIsIGZhbHNlKTsKCiAgICAvKiAgICB2UmVmTnVtLCBkaXJJRCwgbmFtZSAqLwogICAgRlNNYWtlRlNTcGVjKDAsIDAsIGZpbGVQYXNjYWwsIGZpbGVGU1NwZWMpOwoKICAgIC8qIFRPRE86IFVzZSBhbiBlcnJvciBjb2RlIG1lY2hhbmlzbSAqLwogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIENvbnZlcnQgYSBGU1NwZWMgdG8gYSBmdWlsbCBwYXRoCiAqLwoKY2hhcl91ICpGdWxsUGF0aEZyb21GU1NwZWNfc2F2ZShGU1NwZWMgZmlsZSkKewogICAgLyoKICAgICAqIFRPRE86IEFkZCBwcm90ZWN0aW9uIGZvciAyNTYgY2hhciBtYXguCiAgICAgKi8KCiAgICBDSW5mb1BCUmVjCXRoZUNQQjsKICAgIGNoYXJfdQlmbmFtZVsyNTZdOwogICAgY2hhcl91CSpmaWxlbmFtZVB0ciA9IGZuYW1lOwogICAgT1NFcnIJZXJyb3I7CiAgICBpbnQJCWZvbGRlciA9IDE7CiNpZmRlZiBVU0VfVU5JWEZJTEVOQU1FCiAgICBTSW50MTYJZGZsdFZvbF92UmVmTnVtOwogICAgU0ludDMyCWRmbHRWb2xfZGlySUQ7CiAgICBGU1JlZglyZWZGaWxlOwogICAgT1NTdGF0dXMJc3RhdHVzOwogICAgVUludDMyCXBhdGhTaXplID0gMjU2OwogICAgY2hhcl91CXBhdGhuYW1lWzI1Nl07CiAgICBjaGFyX3UJKnBhdGggPSBwYXRobmFtZTsKI2Vsc2UKICAgIFN0cjI1NQlkaXJlY3RvcnlOYW1lOwogICAgY2hhcl91CXRlbXBvcmFyeVsyNTVdOwogICAgY2hhcl91CSp0ZW1wb3JhcnlQdHIgPSB0ZW1wb3Jhcnk7CiNlbmRpZgoKI2lmZGVmIFVTRV9VTklYRklMRU5BTUUKICAgIC8qIEdldCB0aGUgZGVmYXVsdCB2b2x1bWUgKi8KICAgIC8qIFRPRE86IFJlbW92ZSBhcyB0aGlzIG9ubHkgd29yayBpZiBWaW0gaXMgb24gdGhlIEJvb3QgVm9sdW1lKi8KICAgIGVycm9yPUhHZXRWb2woTlVMTCwgJmRmbHRWb2xfdlJlZk51bSwgJmRmbHRWb2xfZGlySUQpOwoKICAgIGlmIChlcnJvcikKICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgoKICAgIC8qIFN0YXJ0IGZpbGxpbmcgZm5hbWUgd2l0aCBmaWxlLm5hbWUgICovCiAgICBTVFJOQ1BZKGZpbGVuYW1lUHRyLCAmZmlsZS5uYW1lWzFdLCBmaWxlLm5hbWVbMF0pOwogICAgZmlsZW5hbWVQdHJbZmlsZS5uYW1lWzBdXSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KCiAgICAvKiBHZXQgdGhlIGluZm8gYWJvdXQgdGhlIGZpbGUgc3BlY2lmaWVkIGluIEZTU3BlYyAqLwogICAgdGhlQ1BCLmRpckluZm8uaW9GRGlySW5kZXggPSAwOwogICAgdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBmaWxlLm5hbWU7CiAgICB0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0gICA9IGZpbGUudlJlZk51bTsKICAvKnRoZUNQQi5oRmlsZUluZm8uaW9EaXJJRCAgID0gMDsqLwogICAgdGhlQ1BCLmRpckluZm8uaW9EckRpcklEICAgPSBmaWxlLnBhcklEOwoKICAgIC8qIEFzIGlvRkRpckluZGV4ID0gMCwgZ2V0IHRoZSBpbmZvIG9mIGlvTmFtZVB0ciwKICAgICAgIHdoaWNoIGlzIHJlbGF0aXZlIHRvIGlvVnJlZk51bSwgaW9EaXJJRCAqLwogICAgZXJyb3IgPSBQQkdldENhdEluZm8oJnRoZUNQQiwgZmFsc2UpOwoKICAgIC8qIElmIHdlIGFyZSBjYWxsZWQgZm9yIGEgbmV3IGZpbGUgd2UgZXhwZWN0IGZuZkVyciAqLwogICAgaWYgKChlcnJvcikgJiYgKGVycm9yICE9IGZuZkVycikpCiAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qIENoZWNrIGlmIGl0J3MgYSBmaWxlIG9yIGZvbGRlciAgICAgICAqLwogICAgLyogZGVmYXVsdCB0byBmaWxlIGlmIGZpbGUgZG9uJ3QgZXhpc3QgICovCiAgICBpZiAoKCh0aGVDUEIuaEZpbGVJbmZvLmlvRmxBdHRyaWIgJiBpb0Rpck1hc2spID09IDApIHx8IChlcnJvcikpCiAgICAgIGZvbGRlciA9IDA7IC8qIEl0J3Mgbm90IGEgZm9sZGVyICovCiAgICBlbHNlCiAgICAgIGZvbGRlciA9IDE7CgojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQogICAgLyoKICAgICAqIFRoZSBmdW5jdGlvbiB1c2VkIGhlcmUgYXJlIGF2YWlsYWJsZSBpbiBDYXJib24sIGJ1dAogICAgICogZG8gbm90aGluZyB1bmUgTWFjT1MgOCBhbmQgOQogICAgICovCiAgICBpZiAoZXJyb3IgPT0gZm5mRXJyKQogICAgewoJLyogSWYgdGhlIGZpbGUgdG8gYmUgc2F2ZWQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgaXNuJ3QgcG9zc2libGUKCSAgIHRvIGNvbnZlcnQgaXRzIEZTU3BlYyBpbnRvIGFuIEZTUmVmLiAgQnV0IHdlIGNhbiBjb25zdHJ1Y3QgYW4KCSAgIEZTU3BlYyBmb3IgdGhlIGZpbGUncyBwYXJlbnQgZm9sZGVyIChzaW5jZSB3ZSBoYXZlIGl0cyB2b2x1bWUgYW5kCgkgICBkaXJlY3RvcnkgSURzKSwgYW5kIHNpbmNlIHRoYXQgZm9sZGVyIGRvZXMgZXhpc3QsIHdlIGNhbiBjb252ZXJ0CgkgICB0aGF0IEZTU3BlYyBpbnRvIGFuIEZTUmVmLCBjb252ZXJ0IHRoZSBGU1JlZiBpbiB0dXJuIGludG8gYSBwYXRoLAoJICAgYW5kLCBmaW5hbGx5LCBhcHBlbmQgdGhlIGZpbGVuYW1lLiAqLwoJRlNTcGVjIGRpclNwZWM7CglGU1JlZiBkaXJSZWY7CglTdHIyNTUgZW1wdHlGaWxlbmFtZSA9ICJccCI7CgllcnJvciA9IEZTTWFrZUZTU3BlYyh0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0sCgkgICAgdGhlQ1BCLmRpckluZm8uaW9EckRpcklELCBlbXB0eUZpbGVuYW1lLCAmZGlyU3BlYyk7CglpZiAoZXJyb3IpCgkgICAgcmV0dXJuIE5VTEw7CgoJZXJyb3IgPSBGU3BNYWtlRlNSZWYoJmRpclNwZWMsICZkaXJSZWYpOwoJaWYgKGVycm9yKQoJICAgIHJldHVybiBOVUxMOwoKCXN0YXR1cyA9IEZTUmVmTWFrZVBhdGgoJmRpclJlZiwgKFVJbnQ4KilwYXRoLCBwYXRoU2l6ZSk7CglpZiAoc3RhdHVzKQoJICAgIHJldHVybiBOVUxMOwoKCVNUUkNBVChwYXRoLCAiLyIpOwoJU1RSQ0FUKHBhdGgsIGZpbGVuYW1lUHRyKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCS8qIElmIHRoZSBmaWxlIHRvIGJlIHNhdmVkIGFscmVhZHkgZXhpc3RzLCB3ZSBjYW4gZ2V0IGl0cyBmdWxsIHBhdGgKCSAgIGJ5IGNvbnZlcnRpbmcgaXRzIEZTU3BlYyBpbnRvIGFuIEZTUmVmLiAqLwoJZXJyb3I9RlNwTWFrZUZTUmVmKCZmaWxlLCAmcmVmRmlsZSk7CglpZiAoZXJyb3IpCgkgICAgcmV0dXJuIE5VTEw7CgoJc3RhdHVzPUZTUmVmTWFrZVBhdGgoJnJlZkZpbGUsIChVSW50OCAqKSBwYXRoLCBwYXRoU2l6ZSk7CglpZiAoc3RhdHVzKQoJICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIEFkZCBhIHNsYXNoIGF0IHRoZSBlbmQgaWYgbmVlZGVkICovCiAgICBpZiAoZm9sZGVyKQoJU1RSQ0FUKHBhdGgsICIvIik7CgogICAgcmV0dXJuICh2aW1fc3Ryc2F2ZShwYXRoKSk7CiNlbHNlCiAgICAvKiBUT0RPOiBHZXQgcmlkIG9mIGFsbCBVU0VfVU5JWEZJTEVOQU1FIGJlbG93ICovCiAgICAvKiBTZXQgaW9OYW1lUHRyLCBpdCdzIHRoZSBzYW1lIGFyZWEgd2hpY2ggaXMgYWx3YXlzIHJldXNlZC4gKi8KICAgIHRoZUNQQi5kaXJJbmZvLmlvTmFtZVB0ciA9IGRpcmVjdG9yeU5hbWU7CgogICAgLyogVHJpY2sgZm9yIGZpcnN0IGVudHJ5LCBzZXQgaW9EclBhcklEIHRvIHRoZSBmaXJzdCB2YWx1ZQogICAgICogd2Ugd2FudCBmb3IgaW9EckRpcklEKi8KICAgIHRoZUNQQi5kaXJJbmZvLmlvRHJQYXJJRCA9IGZpbGUucGFySUQ7CiAgICB0aGVDUEIuZGlySW5mby5pb0RyRGlySUQgPSBmaWxlLnBhcklEOwoKICAgIGlmICgoVFJVRSkgJiYgKGZpbGUucGFySUQgIT0gZnNSdERpcklEIC8qZnNSdFBhcklEKi8pKQogICAgZG8KICAgIHsKCXRoZUNQQi5kaXJJbmZvLmlvRkRpckluZGV4ID0gLTE7CiAgICAgLyogdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBkaXJlY3RvcnlOYW1lOyBBbHJlYWR5IGRvbmUgYWJvdmUuICovCgl0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0gICA9IGZpbGUudlJlZk51bTsKICAgICAvKiB0aGVDUEIuZGlySW5mby5pb0RpcklEICAgICA9IGlycmV2ZWxhbnQgd2hlbiBpb0ZEaXJJbmRleCA9IC0xICovCgl0aGVDUEIuZGlySW5mby5pb0RyRGlySUQgICA9IHRoZUNQQi5kaXJJbmZvLmlvRHJQYXJJRDsKCgkvKiBBcyBpb0ZEaXJJbmRleCA9IC0xLCBnZXQgdGhlIGluZm8gb2YgaW9EckRpcklELCAqLwoJLyogICppb05hbWVQdHJbMCBUTyAzMV0gd2lsbCBiZSB1cGRhdGVkCQkgICAqLwoJZXJyb3IgPSBQQkdldENhdEluZm8oJnRoZUNQQixmYWxzZSk7CgoJaWYgKGVycm9yKQoJICByZXR1cm4gTlVMTDsKCgkvKiBQdXQgdGhlIG5ldyBkaXJlY3RvcnlOYW1lIGluIGZyb250IG9mIHRoZSBjdXJyZW50IGZuYW1lICovCglTVFJDUFkodGVtcG9yYXJ5UHRyLCBmaWxlbmFtZVB0cik7CglTVFJOQ1BZKGZpbGVuYW1lUHRyLCAmZGlyZWN0b3J5TmFtZVsxXSwgZGlyZWN0b3J5TmFtZVswXSk7CglmaWxlbmFtZVB0cltkaXJlY3RvcnlOYW1lWzBdXSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KCVNUUkNBVChmaWxlbmFtZVB0ciwgIjoiKTsKCVNUUkNBVChmaWxlbmFtZVB0ciwgdGVtcG9yYXJ5UHRyKTsKICAgIH0KI2lmIDEgLyogZGVmIFVTRV9VTklYRklMRU5BTUUgKi8KICAgIHdoaWxlICgodGhlQ1BCLmRpckluZm8uaW9EclBhcklEICE9IGZzUnREaXJJRCkgLyogJiYgKi8KCSAvKiAgKHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAhPSBmc1J0RGlySUQpKi8pOwojZWxzZQogICAgd2hpbGUgKHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAhPSBmc1J0RGlySUQpOwojZW5kaWYKCiAgICAvKiBHZXQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2b2x1bWUgb24gd2hpY2ggdGhlIGZpbGUgcmVzaWRlICovCiAgICB0aGVDUEIuZGlySW5mby5pb0ZEaXJJbmRleCA9IC0xOwogLyogdGhlQ1BCLmRpckluZm8uaW9OYW1lUHRyICAgPSBkaXJlY3RvcnlOYW1lOyBBbHJlYWR5IGRvbmUgYWJvdmUuICovCiAgICB0aGVDUEIuZGlySW5mby5pb1ZSZWZOdW0gICA9IGZpbGUudlJlZk51bTsKIC8qIHRoZUNQQi5kaXJJbmZvLmlvRGlySUQgICAgID0gaXJyZXZlbGFudCB3aGVuIGlvRkRpckluZGV4ID0gLTEgKi8KICAgIHRoZUNQQi5kaXJJbmZvLmlvRHJEaXJJRCAgID0gdGhlQ1BCLmRpckluZm8uaW9EclBhcklEOwoKICAgIC8qIEFzIGlvRkRpckluZGV4ID0gLTEsIGdldCB0aGUgaW5mbyBvZiBpb0RyRGlySUQsICovCiAgICAvKgkqaW9OYW1lUHRyWzAgVE8gMzFdIHdpbGwgYmUgdXBkYXRlZAkgICAgICAgKi8KICAgIGVycm9yID0gUEJHZXRDYXRJbmZvKCZ0aGVDUEIsZmFsc2UpOwoKICAgIGlmIChlcnJvcikKICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogRm9yIE1hY09TIENsYXNzaWMgYWx3YXlzIGFkZCB0aGUgdm9sdW1lIG5hbWUJICAgICAqLwogICAgLyogRm9yIE1hY09TIFggYWRkIHRoZSB2b2x1bWUgbmFtZSBwcmVjZWRlZCBieSAiVm9sdW1lcyIgKi8KICAgIC8qCXdoZW4gd2UgYXJlIG5vdCByZWZlcmluZyB0byB0aGUgYm9vdCB2b2x1bWUJICAgICAqLwojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQogICAgaWYgKGZpbGUudlJlZk51bSAhPSBkZmx0Vm9sX3ZSZWZOdW0pCiNlbmRpZgogICAgewoJLyogQWRkIHRoZSB2b2x1bWUgbmFtZSAqLwoJU1RSQ1BZKHRlbXBvcmFyeVB0ciwgZmlsZW5hbWVQdHIpOwoJU1RSTkNQWShmaWxlbmFtZVB0ciwgJmRpcmVjdG9yeU5hbWVbMV0sIGRpcmVjdG9yeU5hbWVbMF0pOwoJZmlsZW5hbWVQdHJbZGlyZWN0b3J5TmFtZVswXV0gPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCglTVFJDQVQoZmlsZW5hbWVQdHIsICI6Iik7CglTVFJDQVQoZmlsZW5hbWVQdHIsIHRlbXBvcmFyeVB0cik7CgojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQoJU1RSQ1BZKHRlbXBvcmFyeVB0ciwgZmlsZW5hbWVQdHIpOwoJZmlsZW5hbWVQdHJbMF0gPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCglTVFJDQVQoZmlsZW5hbWVQdHIsICJWb2x1bWVzOiIpOwoJU1RSQ0FUKGZpbGVuYW1lUHRyLCB0ZW1wb3JhcnlQdHIpOwojZW5kaWYKICAgIH0KCiAgICAvKiBBcHBlbmQgZmluYWwgcGF0aCBzZXBhcmF0b3IgaWYgaXQncyBhIGZvbGRlciAqLwogICAgaWYgKGZvbGRlcikKCVNUUkNBVChmbmFtZSwgIjoiKTsKCiAgICAvKiBBcyB3ZSB1c2UgVW5peCBGaWxlIE5hbWUgZm9yIE1hY09TIFggY29udmVydCBpdCAqLwojaWZkZWYgVVNFX1VOSVhGSUxFTkFNRQogICAgLyogTmVlZCB0byBpbnNlcnQgbGVhZGluZyAvICovCiAgICAvKiBUT0RPOiBnZXQgdGhlIGFib3ZlIGNvZGUgdG8gdXNlIGRpcmVjdGx5IHRoZSAvICovCiAgICBTVFJDUFkoJnRlbXBvcmFyeVB0clsxXSwgZmlsZW5hbWVQdHIpOwogICAgdGVtcG9yYXJ5UHRyWzBdID0gJy8nOwogICAgU1RSQ1BZKGZpbGVuYW1lUHRyLCB0ZW1wb3JhcnlQdHIpOwogICAgewogICAgY2hhcgkqcDsKICAgIGZvciAocCA9IGZuYW1lOyAqcDsgcCsrKQoJaWYgKCpwID09ICc6JykKCSAgICAqcCA9ICcvJzsKICAgIH0KI2VuZGlmCgogICAgcmV0dXJuICh2aW1fc3Ryc2F2ZShmbmFtZSkpOwojZW5kaWYKfQoKI2lmIGRlZmluZWQoVVNFX0lNX0NPTlRST0wpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIElucHV0IE1ldGhvZCBDb250cm9sIGZ1bmN0aW9ucy4KICovCgovKgogKiBOb3RpZnkgY3Vyc29yIHBvc2l0aW9uIHRvIElNLgogKi8KICAgIHZvaWQKaW1fc2V0X3Bvc2l0aW9uKGludCByb3csIGludCBjb2wpCnsKICAgIC8qIFRPRE86IEltcGxlbWVudCBtZSEgKi8KfQoKLyoKICogU2V0IElNIHN0YXR1cyBvbiAoImFjdGl2ZSIgaXMgVFJVRSkgb3Igb2ZmICgiYWN0aXZlIiBpcyBGQUxTRSkuCiAqLwogICAgdm9pZAppbV9zZXRfYWN0aXZlKGludCBhY3RpdmUpCnsKICAgIEtleVNjcmlwdChhY3RpdmUgPyBzbUtleVN5c1NjcmlwdCA6IHNtS2V5Um9tYW4pOwp9CgovKgogKiBHZXQgSU0gc3RhdHVzLiAgV2hlbiBJTSBpcyBvbiwgcmV0dXJuIG5vdCAwLiAgRWxzZSByZXR1cm4gMC4KICovCiAgICBpbnQKaW1fZ2V0X3N0YXR1cygpCnsKICAgIFNJbnQzMiBzY3JpcHQgPSBHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LZXlTY3JpcHQpOwogICAgcmV0dXJuIChzY3JpcHQgIT0gc21Sb21hbgoJICAgICYmIHNjcmlwdCA9PSBHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21TeXNTY3JpcHQpKSA/IDEgOiAwOwp9CiNlbmRpZiAvKiBkZWZpbmVkKFVTRV9JTV9DT05UUk9MKSB8fCBkZWZpbmVkKFBST1RPKSAqLwo=