LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY3htbC5jLHYgMS4zIDIwMDIvMDIvMTggMjI6Mjk6Mjgga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPGV4cGF0Lmg+CiNpbmNsdWRlICJmY2ludC5oIgoKRmNUZXN0ICoKRmNUZXN0Q3JlYXRlIChGY1F1YWwgcXVhbCwgY29uc3QgRmNDaGFyOCAqZmllbGQsIEZjT3AgY29tcGFyZSwgRmNFeHByICpleHByKQp7CiAgICBGY1Rlc3QJKnRlc3QgPSAoRmNUZXN0ICopIG1hbGxvYyAoc2l6ZW9mIChGY1Rlc3QpKTsKCiAgICBpZiAodGVzdCkKICAgIHsKCXRlc3QtPm5leHQgPSAwOwoJdGVzdC0+cXVhbCA9IHF1YWw7Cgl0ZXN0LT5maWVsZCA9IChjaGFyICopIEZjU3RyQ29weSAoZmllbGQpOwoJdGVzdC0+b3AgPSBjb21wYXJlOwoJdGVzdC0+ZXhwciA9IGV4cHI7CiAgICB9CiAgICByZXR1cm4gdGVzdDsKfQoKdm9pZApGY1Rlc3REZXN0cm95IChGY1Rlc3QgKnRlc3QpCnsKICAgIGlmICh0ZXN0LT5uZXh0KQoJRmNUZXN0RGVzdHJveSAodGVzdC0+bmV4dCk7CiAgICBGY0V4cHJEZXN0cm95ICh0ZXN0LT5leHByKTsKICAgIEZjU3RyRnJlZSAoKEZjQ2hhcjggKikgdGVzdC0+ZmllbGQpOwogICAgZnJlZSAodGVzdCk7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZUludGVnZXIgKGludCBpKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcEludGVnZXI7CgllLT51Lml2YWwgPSBpOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZURvdWJsZSAoZG91YmxlIGQpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wRG91YmxlOwoJZS0+dS5kdmFsID0gZDsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVTdHJpbmcgKGNvbnN0IEZjQ2hhcjggKnMpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wU3RyaW5nOwoJZS0+dS5zdmFsID0gRmNTdHJDb3B5IChzKTsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVNYXRyaXggKGNvbnN0IEZjTWF0cml4ICptKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcE1hdHJpeDsKCWUtPnUubXZhbCA9IEZjTWF0cml4Q29weSAobSk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlQm9vbCAoRmNCb29sIGIpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wQm9vbDsKCWUtPnUuYnZhbCA9IGI7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlTmlsICh2b2lkKQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcE5pbDsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVGaWVsZCAoY29uc3QgY2hhciAqZmllbGQpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wRmllbGQ7CgllLT51LmZpZWxkID0gKGNoYXIgKikgRmNTdHJDb3B5ICgoRmNDaGFyOCAqKSBmaWVsZCk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlQ29uc3QgKGNvbnN0IEZjQ2hhcjggKmNvbnN0YW50KQp7CiAgICBGY0V4cHIgKmUgPSAoRmNFeHByICopIG1hbGxvYyAoc2l6ZW9mIChGY0V4cHIpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm9wID0gRmNPcENvbnN0OwoJZS0+dS5jb25zdGFudCA9IEZjU3RyQ29weSAoY29uc3RhbnQpOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZU9wIChGY0V4cHIgKmxlZnQsIEZjT3Agb3AsIEZjRXhwciAqcmlnaHQpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBvcDsKCWUtPnUudHJlZS5sZWZ0ID0gbGVmdDsKCWUtPnUudHJlZS5yaWdodCA9IHJpZ2h0OwogICAgfQogICAgcmV0dXJuIGU7Cn0KCnZvaWQKRmNFeHByRGVzdHJveSAoRmNFeHByICplKQp7CiAgICBzd2l0Y2ggKGUtPm9wKSB7CiAgICBjYXNlIEZjT3BJbnRlZ2VyOgoJYnJlYWs7CiAgICBjYXNlIEZjT3BEb3VibGU6CglicmVhazsKICAgIGNhc2UgRmNPcFN0cmluZzoKCUZjU3RyRnJlZSAoZS0+dS5zdmFsKTsKCWJyZWFrOwogICAgY2FzZSBGY09wTWF0cml4OgoJRmNNYXRyaXhGcmVlIChlLT51Lm12YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BDaGFyU2V0OgoJRmNDaGFyU2V0RGVzdHJveSAoZS0+dS5jdmFsKTsKCWJyZWFrOwogICAgY2FzZSBGY09wQm9vbDoKCWJyZWFrOwogICAgY2FzZSBGY09wRmllbGQ6CglGY1N0ckZyZWUgKChGY0NoYXI4ICopIGUtPnUuZmllbGQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BDb25zdDoKCUZjU3RyRnJlZSAoZS0+dS5jb25zdGFudCk7CglicmVhazsKICAgIGNhc2UgRmNPcEFzc2lnbjoKICAgIGNhc2UgRmNPcEFzc2lnblJlcGxhY2U6CiAgICBjYXNlIEZjT3BQcmVwZW5kOgogICAgY2FzZSBGY09wUHJlcGVuZEZpcnN0OgogICAgY2FzZSBGY09wQXBwZW5kOgogICAgY2FzZSBGY09wQXBwZW5kTGFzdDoKCWJyZWFrOwogICAgY2FzZSBGY09wT3I6CiAgICBjYXNlIEZjT3BBbmQ6CiAgICBjYXNlIEZjT3BFcXVhbDoKICAgIGNhc2UgRmNPcENvbnRhaW5zOgogICAgY2FzZSBGY09wTm90RXF1YWw6CiAgICBjYXNlIEZjT3BMZXNzOgogICAgY2FzZSBGY09wTGVzc0VxdWFsOgogICAgY2FzZSBGY09wTW9yZToKICAgIGNhc2UgRmNPcE1vcmVFcXVhbDoKICAgIGNhc2UgRmNPcFBsdXM6CiAgICBjYXNlIEZjT3BNaW51czoKICAgIGNhc2UgRmNPcFRpbWVzOgogICAgY2FzZSBGY09wRGl2aWRlOgogICAgY2FzZSBGY09wUXVlc3Q6CiAgICBjYXNlIEZjT3BDb21tYToKCUZjRXhwckRlc3Ryb3kgKGUtPnUudHJlZS5yaWdodCk7CgkvKiBmYWxsIHRocm91Z2ggKi8KICAgIGNhc2UgRmNPcE5vdDoKCUZjRXhwckRlc3Ryb3kgKGUtPnUudHJlZS5sZWZ0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wTmlsOgogICAgY2FzZSBGY09wSW52YWxpZDoKCWJyZWFrOwogICAgfQogICAgZnJlZSAoZSk7Cn0KCkZjRWRpdCAqCkZjRWRpdENyZWF0ZSAoY29uc3QgY2hhciAqZmllbGQsIEZjT3Agb3AsIEZjRXhwciAqZXhwcikKewogICAgRmNFZGl0ICplID0gKEZjRWRpdCAqKSBtYWxsb2MgKHNpemVvZiAoRmNFZGl0KSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5uZXh0ID0gMDsKCWUtPmZpZWxkID0gZmllbGQ7ICAgLyogYWxyZWFkeSBzYXZlZCBpbiBncmFtbWFyICovCgllLT5vcCA9IG9wOwoJZS0+ZXhwciA9IGV4cHI7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKdm9pZApGY0VkaXREZXN0cm95IChGY0VkaXQgKmUpCnsKICAgIGlmIChlLT5uZXh0KQoJRmNFZGl0RGVzdHJveSAoZS0+bmV4dCk7CiAgICBGY1N0ckZyZWUgKChGY0NoYXI4ICopIGUtPmZpZWxkKTsKICAgIGlmIChlLT5leHByKQoJRmNFeHByRGVzdHJveSAoZS0+ZXhwcik7Cn0KCmNoYXIgKgpGY0NvbmZpZ1NhdmVGaWVsZCAoY29uc3QgY2hhciAqZmllbGQpCnsKICAgIHJldHVybiAoY2hhciAqKSBGY1N0ckNvcHkgKChGY0NoYXI4ICopIGZpZWxkKTsKfQoKdHlwZWRlZiBlbnVtIF9GY0VsZW1lbnQgewogICAgRmNFbGVtZW50Tm9uZSwKICAgIEZjRWxlbWVudEZvbnRjb25maWcsCiAgICBGY0VsZW1lbnREaXIsCiAgICBGY0VsZW1lbnRDYWNoZSwKICAgIEZjRWxlbWVudEluY2x1ZGUsCiAgICBGY0VsZW1lbnRDb25maWcsCiAgICBGY0VsZW1lbnRNYXRjaCwKICAgIEZjRWxlbWVudEFsaWFzLAoJCiAgICBGY0VsZW1lbnRCbGFuaywKCiAgICBGY0VsZW1lbnRQcmVmZXIsCiAgICBGY0VsZW1lbnRBY2NlcHQsCiAgICBGY0VsZW1lbnREZWZhdWx0LAogICAgRmNFbGVtZW50RmFtaWx5LAoKICAgIEZjRWxlbWVudFRlc3QsCiAgICBGY0VsZW1lbnRFZGl0LAogICAgRmNFbGVtZW50SW50LAogICAgRmNFbGVtZW50RG91YmxlLAogICAgRmNFbGVtZW50U3RyaW5nLAogICAgRmNFbGVtZW50TWF0cml4LAogICAgRmNFbGVtZW50Qm9vbCwKICAgIEZjRWxlbWVudENoYXJzZXQsCiAgICBGY0VsZW1lbnROYW1lLAogICAgRmNFbGVtZW50Q29uc3QsCiAgICBGY0VsZW1lbnRPciwKICAgIEZjRWxlbWVudEFuZCwKICAgIEZjRWxlbWVudEVxLAogICAgRmNFbGVtZW50Tm90RXEsCiAgICBGY0VsZW1lbnRMZXNzLAogICAgRmNFbGVtZW50TGVzc0VxLAogICAgRmNFbGVtZW50TW9yZSwKICAgIEZjRWxlbWVudE1vcmVFcSwKICAgIEZjRWxlbWVudFBsdXMsCiAgICBGY0VsZW1lbnRNaW51cywKICAgIEZjRWxlbWVudFRpbWVzLAogICAgRmNFbGVtZW50RGl2aWRlLAogICAgRmNFbGVtZW50Tm90LAogICAgRmNFbGVtZW50SWYsCiAgICBGY0VsZW1lbnRVbmtub3duCn0gRmNFbGVtZW50OwoKc3RhdGljIEZjRWxlbWVudApGY0VsZW1lbnRNYXAgKGNvbnN0IFhNTF9DaGFyICpuYW1lKQp7CiAgICBzdGF0aWMgc3RydWN0IHsKCWNoYXIJICAgICpuYW1lOwoJRmNFbGVtZW50ICAgZWxlbWVudDsKICAgIH0gZmNFbGVtZW50TWFwW10gPSB7Cgl7ICJmb250Y29uZmlnIiwJRmNFbGVtZW50Rm9udGNvbmZpZyB9LAoJeyAiZGlyIiwJRmNFbGVtZW50RGlyIH0sCgl7ICJjYWNoZSIsCUZjRWxlbWVudENhY2hlIH0sCgl7ICJpbmNsdWRlIiwJRmNFbGVtZW50SW5jbHVkZSB9LAoJeyAiY29uZmlnIiwJRmNFbGVtZW50Q29uZmlnIH0sCgl7ICJtYXRjaCIsCUZjRWxlbWVudE1hdGNoIH0sCgl7ICJhbGlhcyIsCUZjRWxlbWVudEFsaWFzIH0sCgkKCXsgImJsYW5rIiwJRmNFbGVtZW50QmxhbmsgfSwKCgl7ICJwcmVmZXIiLAlGY0VsZW1lbnRQcmVmZXIgfSwKCXsgImFjY2VwdCIsCUZjRWxlbWVudEFjY2VwdCB9LAoJeyAiZGVmYXVsdCIsCUZjRWxlbWVudERlZmF1bHQgfSwKCXsgImZhbWlseSIsCUZjRWxlbWVudEZhbWlseSB9LAoKCXsgInRlc3QiLAlGY0VsZW1lbnRUZXN0IH0sCgl7ICJlZGl0IiwJRmNFbGVtZW50RWRpdCB9LAoJeyAiaW50IiwJRmNFbGVtZW50SW50IH0sCgl7ICJkb3VibGUiLAlGY0VsZW1lbnREb3VibGUgfSwKCXsgInN0cmluZyIsCUZjRWxlbWVudFN0cmluZyB9LAoJeyAibWF0cml4IiwJRmNFbGVtZW50TWF0cml4IH0sCgl7ICJib29sIiwJRmNFbGVtZW50Qm9vbCB9LAoJeyAiY2hhcnNldCIsCUZjRWxlbWVudENoYXJzZXQgfSwKCXsgIm5hbWUiLAlGY0VsZW1lbnROYW1lIH0sCgl7ICJjb25zdCIsCUZjRWxlbWVudENvbnN0IH0sCgl7ICJvciIsCQlGY0VsZW1lbnRPciB9LAoJeyAiYW5kIiwJRmNFbGVtZW50QW5kIH0sCgl7ICJlcSIsCQlGY0VsZW1lbnRFcSB9LAoJeyAibm90X2VxIiwJRmNFbGVtZW50Tm90RXEgfSwKCXsgImxlc3MiLAlGY0VsZW1lbnRMZXNzIH0sCgl7ICJsZXNzX2VxIiwJRmNFbGVtZW50TGVzc0VxIH0sCgl7ICJtb3JlIiwJRmNFbGVtZW50TW9yZSB9LAoJeyAibW9yZV9lcSIsCUZjRWxlbWVudE1vcmVFcSB9LAoJeyAicGx1cyIsCUZjRWxlbWVudFBsdXMgfSwKCXsgIm1pbnVzIiwJRmNFbGVtZW50TWludXMgfSwKCXsgInRpbWVzIiwJRmNFbGVtZW50VGltZXMgfSwKCXsgImRpdmlkZSIsCUZjRWxlbWVudERpdmlkZSB9LAoJeyAibm90IiwJRmNFbGVtZW50Tm90IH0sCgl7ICJpZiIsCQlGY0VsZW1lbnRJZiB9LAoJCgl7IDAsCQkwIH0KICAgIH07CgogICAgaW50CSAgICBpOwogICAgZm9yIChpID0gMDsgZmNFbGVtZW50TWFwW2ldLm5hbWU7IGkrKykKCWlmICghc3RyY21wICgoY2hhciAqKSBuYW1lLCBmY0VsZW1lbnRNYXBbaV0ubmFtZSkpCgkgICAgcmV0dXJuIGZjRWxlbWVudE1hcFtpXS5lbGVtZW50OwogICAgcmV0dXJuIEZjRWxlbWVudFVua25vd247Cn0KCnR5cGVkZWYgc3RydWN0IF9GY1BTdGFjayB7CiAgICBzdHJ1Y3QgX0ZjUFN0YWNrICAgKnByZXY7CiAgICBGY0VsZW1lbnQJCWVsZW1lbnQ7CiAgICBGY0NoYXI4CQkqKmF0dHI7CiAgICBGY1N0ckJ1ZgkJc3RyOwp9IEZjUFN0YWNrOwogICAgCnR5cGVkZWYgZW51bSBfRmNWU3RhY2tUYWcgewogICAgRmNWU3RhY2tOb25lLAoKICAgIEZjVlN0YWNrU3RyaW5nLAogICAgRmNWU3RhY2tGYW1pbHksCiAgICBGY1ZTdGFja0ZpZWxkLAogICAgRmNWU3RhY2tDb25zdGFudCwKICAgIAogICAgRmNWU3RhY2tQcmVmZXIsCiAgICBGY1ZTdGFja0FjY2VwdCwKICAgIEZjVlN0YWNrRGVmYXVsdCwKICAgIAogICAgRmNWU3RhY2tJbnRlZ2VyLAogICAgRmNWU3RhY2tEb3VibGUsCiAgICBGY1ZTdGFja01hdHJpeCwKICAgIEZjVlN0YWNrQm9vbCwKICAgIAogICAgRmNWU3RhY2tUZXN0LAogICAgRmNWU3RhY2tFeHByLAogICAgRmNWU3RhY2tFZGl0Cn0gRmNWU3RhY2tUYWc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNWU3RhY2sgewogICAgc3RydWN0IF9GY1ZTdGFjawkqcHJldjsKICAgIEZjUFN0YWNrCQkqcHN0YWNrOwkvKiByZWxhdGVkIHBhcnNlIGVsZW1lbnQgKi8KICAgIEZjVlN0YWNrVGFnCQl0YWc7CiAgICB1bmlvbiB7CglGY0NoYXI4CQkqc3RyaW5nOwoKCWludAkJaW50ZWdlcjsKCWRvdWJsZQkJX2RvdWJsZTsKCUZjTWF0cml4CSptYXRyaXg7CglGY0Jvb2wJCWJvb2w7CgoJRmNUZXN0CQkqdGVzdDsKCUZjUXVhbAkJcXVhbDsKCUZjT3AJCW9wOwoJRmNFeHByCQkqZXhwcjsKCUZjRWRpdAkJKmVkaXQ7CiAgICB9IHU7Cn0gRmNWU3RhY2s7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDb25maWdQYXJzZSB7CiAgICBGY1BTdGFjawkgICAgKnBzdGFjazsKICAgIEZjVlN0YWNrCSAgICAqdnN0YWNrOwogICAgRmNCb29sCSAgICBlcnJvcjsKICAgIGNvbnN0IEZjQ2hhcjggICAqbmFtZTsKICAgIEZjQ29uZmlnCSAgICAqY29uZmlnOwogICAgWE1MX1BhcnNlcgkgICAgcGFyc2VyOwp9IEZjQ29uZmlnUGFyc2U7CgpzdGF0aWMgdm9pZApGY0NvbmZpZ0Vycm9yIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgY2hhciAqZm10LCAuLi4pCnsKICAgIHZhX2xpc3QJYXJnczsKCiAgICB2YV9zdGFydCAoYXJncywgZm10KTsKICAgIGlmIChwYXJzZSkKICAgIHsKCWlmIChwYXJzZS0+bmFtZSkKCSAgICBmcHJpbnRmIChzdGRlcnIsICJGb250Y29uZmlnIGVycm9yOiBcIiVzXCIsIGxpbmUgJWQ6ICIsCgkJICAgICBwYXJzZS0+bmFtZSwgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIChwYXJzZS0+cGFyc2VyKSk7CgllbHNlCgkgICAgZnByaW50ZiAoc3RkZXJyLCAiRm9udGNvbmZpZyBlcnJvcjogbGluZSAlZDogIiwKCQkgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAocGFyc2UtPnBhcnNlcikpOwoJcGFyc2UtPmVycm9yID0gRmNUcnVlOwogICAgfQogICAgZWxzZQoJZnByaW50ZiAoc3RkZXJyLCAiRm9udGNvbmZpZyBlcnJvcjogIik7CiAgICB2ZnByaW50ZiAoc3RkZXJyLCBmbXQsIGFyZ3MpOwogICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKICAgIHZhX2VuZCAoYXJncyk7Cn0KCnN0YXRpYyB2b2lkCkZjVlN0YWNrUHVzaCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrICp2c3RhY2spCnsKICAgIHZzdGFjay0+cHJldiA9IHBhcnNlLT52c3RhY2s7CiAgICB2c3RhY2stPnBzdGFjayA9IHBhcnNlLT5wc3RhY2sgPyBwYXJzZS0+cHN0YWNrLT5wcmV2IDogMDsKICAgIHBhcnNlLT52c3RhY2sgPSB2c3RhY2s7Cn0KCnN0YXRpYyBGY1ZTdGFjayAqCkZjVlN0YWNrQ3JlYXRlICh2b2lkKQp7CiAgICBGY1ZTdGFjayAgICAqbmV3OwoKICAgIG5ldyA9IG1hbGxvYyAoc2l6ZW9mIChGY1ZTdGFjaykpOwogICAgaWYgKCFuZXcpCglyZXR1cm4gMDsKICAgIG5ldy0+dGFnID0gRmNWU3RhY2tOb25lOwogICAgbmV3LT5wcmV2ID0gMDsKICAgIHJldHVybiBuZXc7Cn0KCnN0YXRpYyB2b2lkCkZjVlN0YWNrRGVzdHJveSAoRmNWU3RhY2sgKnZzdGFjaykKewogICAgRmNWU3RhY2sgICAgKnByZXY7CgogICAgZm9yICg7IHZzdGFjazsgdnN0YWNrID0gcHJldikKICAgIHsKCXByZXYgPSB2c3RhY2stPnByZXY7Cglzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CgljYXNlIEZjVlN0YWNrTm9uZToKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tTdHJpbmc6CgljYXNlIEZjVlN0YWNrRmFtaWx5OgoJY2FzZSBGY1ZTdGFja0ZpZWxkOgoJY2FzZSBGY1ZTdGFja0NvbnN0YW50OgoJICAgIEZjU3RyRnJlZSAodnN0YWNrLT51LnN0cmluZyk7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrSW50ZWdlcjoKCWNhc2UgRmNWU3RhY2tEb3VibGU6CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrTWF0cml4OgoJICAgIEZjTWF0cml4RnJlZSAodnN0YWNrLT51Lm1hdHJpeCk7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrQm9vbDoKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tUZXN0OgoJICAgIEZjVGVzdERlc3Ryb3kgKHZzdGFjay0+dS50ZXN0KTsKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tFeHByOgoJY2FzZSBGY1ZTdGFja1ByZWZlcjoKCWNhc2UgRmNWU3RhY2tBY2NlcHQ6CgljYXNlIEZjVlN0YWNrRGVmYXVsdDoKCSAgICBGY0V4cHJEZXN0cm95ICh2c3RhY2stPnUuZXhwcik7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrRWRpdDoKCSAgICBGY0VkaXREZXN0cm95ICh2c3RhY2stPnUuZWRpdCk7CgkgICAgYnJlYWs7Cgl9CglmcmVlICh2c3RhY2spOwogICAgfQp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaFN0cmluZyAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrVGFnIHRhZywgRmNDaGFyOCAqc3RyaW5nKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LnN0cmluZyA9IHN0cmluZzsKICAgIHZzdGFjay0+dGFnID0gdGFnOwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoSW50ZWdlciAoRmNDb25maWdQYXJzZSAqcGFyc2UsIGludCBpbnRlZ2VyKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmludGVnZXIgPSBpbnRlZ2VyOwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja0ludGVnZXI7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hEb3VibGUgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBkb3VibGUgX2RvdWJsZSkKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIHZzdGFjay0+dS5fZG91YmxlID0gX2RvdWJsZTsKICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tEb3VibGU7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hNYXRyaXggKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY01hdHJpeCAqbWF0cml4KQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgbWF0cml4ID0gRmNNYXRyaXhDb3B5IChtYXRyaXgpOwogICAgaWYgKCFtYXRyaXgpCiAgICB7CglGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHZzdGFjay0+dS5tYXRyaXggPSBtYXRyaXg7CiAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTWF0cml4OwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoQm9vbCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjQm9vbCBib29sKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmJvb2wgPSBib29sOwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja0Jvb2w7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hUZXN0IChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNUZXN0ICp0ZXN0KQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LnRlc3QgPSB0ZXN0OwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja1Rlc3Q7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hFeHByIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNWU3RhY2tUYWcgdGFnLCBGY0V4cHIgKmV4cHIpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2sgPSBGY1ZTdGFja0NyZWF0ZSAoKTsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB2c3RhY2stPnUuZXhwciA9IGV4cHI7CiAgICB2c3RhY2stPnRhZyA9IHRhZzsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaEVkaXQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY0VkaXQgKmVkaXQpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2sgPSBGY1ZTdGFja0NyZWF0ZSAoKTsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB2c3RhY2stPnUuZWRpdCA9IGVkaXQ7CiAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrRWRpdDsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNWU3RhY2sgKgpGY1ZTdGFja0ZldGNoIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgaW50IG9mZikKewogICAgRmNWU3RhY2sgICAgKnZzdGFjazsKCiAgICBmb3IgKHZzdGFjayA9IHBhcnNlLT52c3RhY2s7IHZzdGFjayAmJiBvZmYtLSA+IDA7IHZzdGFjayA9IHZzdGFjay0+cHJldik7CiAgICByZXR1cm4gdnN0YWNrOwp9CgpzdGF0aWMgdm9pZApGY1ZTdGFja0NsZWFyIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgd2hpbGUgKHBhcnNlLT52c3RhY2sgJiYgcGFyc2UtPnZzdGFjay0+cHN0YWNrID09IHBhcnNlLT5wc3RhY2spCiAgICB7CglGY1ZTdGFjayAgICAqdnN0YWNrID0gcGFyc2UtPnZzdGFjazsKCXBhcnNlLT52c3RhY2sgPSB2c3RhY2stPnByZXY7Cgl2c3RhY2stPnByZXYgPSAwOwoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgfQp9CgpzdGF0aWMgRmNWU3RhY2sgKgpGY1ZTdGFja1BvcCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjVlN0YWNrCSp2c3RhY2sgPSBwYXJzZS0+dnN0YWNrOwogICAgCiAgICBpZiAoIXZzdGFjayB8fCB2c3RhY2stPnBzdGFjayAhPSBwYXJzZS0+cHN0YWNrKQoJcmV0dXJuIDA7CiAgICBwYXJzZS0+dnN0YWNrID0gdnN0YWNrLT5wcmV2OwogICAgdnN0YWNrLT5wcmV2ID0gMDsKICAgIHJldHVybiB2c3RhY2s7Cn0KCnN0YXRpYyBpbnQKRmNWU3RhY2tFbGVtZW50cyAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGludAkJaCA9IDA7CiAgICBGY1ZTdGFjawkqdnN0YWNrID0gcGFyc2UtPnZzdGFjazsKICAgIHdoaWxlICh2c3RhY2sgJiYgdnN0YWNrLT5wc3RhY2sgPT0gcGFyc2UtPnBzdGFjaykKICAgIHsKCWgrKzsKCXZzdGFjayA9IHZzdGFjay0+cHJldjsKICAgIH0KICAgIHJldHVybiBoOwp9CgpzdGF0aWMgRmNDaGFyOCAqKgpGY0NvbmZpZ1NhdmVBdHRyIChjb25zdCBYTUxfQ2hhciAqKmF0dHIpCnsKICAgIGludAkJbjsKICAgIGludAkJc2xlbjsKICAgIGludAkJaTsKICAgIEZjQ2hhcjgJKipuZXc7CiAgICBGY0NoYXI4CSpzOwoKICAgIGlmICghYXR0cikKCXJldHVybiAwOwogICAgc2xlbiA9IDA7CiAgICBmb3IgKGkgPSAwOyBhdHRyW2ldOyBpKyspCglzbGVuICs9IHN0cmxlbiAoYXR0cltpXSkgKyAxOwogICAgbiA9IGk7CiAgICBuZXcgPSBtYWxsb2MgKChpICsgMSkgKiBzaXplb2YgKEZjQ2hhcjggKikgKyBzbGVuKTsKICAgIGlmICghbmV3KQoJcmV0dXJuIDA7CiAgICBzID0gKEZjQ2hhcjggKikgKG5ldyArIChpICsgMSkpOwogICAgZm9yIChpID0gMDsgYXR0cltpXTsgaSsrKQogICAgewoJbmV3W2ldID0gczsKCXN0cmNweSAoKGNoYXIgKikgcywgKGNoYXIgKikgYXR0cltpXSk7CglzICs9IHN0cmxlbiAoKGNoYXIgKikgcykgKyAxOwogICAgfQogICAgbmV3W2ldID0gMDsKICAgIHJldHVybiBuZXc7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNQU3RhY2tQdXNoIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNFbGVtZW50IGVsZW1lbnQsIGNvbnN0IFhNTF9DaGFyICoqYXR0cikKewogICAgRmNQU3RhY2sgICAqbmV3ID0gbWFsbG9jIChzaXplb2YgKEZjUFN0YWNrKSk7CgogICAgaWYgKCFuZXcpCglyZXR1cm4gRmNGYWxzZTsKICAgIG5ldy0+cHJldiA9IHBhcnNlLT5wc3RhY2s7CiAgICBuZXctPmVsZW1lbnQgPSBlbGVtZW50OwogICAgaWYgKGF0dHIpCiAgICB7CgluZXctPmF0dHIgPSBGY0NvbmZpZ1NhdmVBdHRyIChhdHRyKTsKCWlmICghbmV3LT5hdHRyKQoJICAgIEZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwogICAgfQogICAgZWxzZQoJbmV3LT5hdHRyID0gMDsKICAgIEZjU3RyQnVmSW5pdCAoJm5ldy0+c3RyLCAwLCAwKTsKICAgIHBhcnNlLT5wc3RhY2sgPSBuZXc7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjUFN0YWNrUG9wIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNQU3RhY2sgICAqb2xkOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spIAogICAgewoJRmNDb25maWdFcnJvciAocGFyc2UsICJtaXNtYXRjaGluZyBlbGVtZW50Iik7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIEZjVlN0YWNrQ2xlYXIgKHBhcnNlKTsKICAgIG9sZCA9IHBhcnNlLT5wc3RhY2s7CiAgICBwYXJzZS0+cHN0YWNrID0gb2xkLT5wcmV2OwogICAgRmNTdHJCdWZEZXN0cm95ICgmb2xkLT5zdHIpOwogICAgaWYgKG9sZC0+YXR0cikKCWZyZWUgKG9sZC0+YXR0cik7CiAgICBmcmVlIChvbGQpOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY0NvbmZpZ0luaXQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBjb25zdCBGY0NoYXI4ICpuYW1lLCBGY0NvbmZpZyAqY29uZmlnLCBYTUxfUGFyc2VyIHBhcnNlcikKewogICAgcGFyc2UtPnBzdGFjayA9IDA7CiAgICBwYXJzZS0+dnN0YWNrID0gMDsKICAgIHBhcnNlLT5lcnJvciA9IEZjRmFsc2U7CiAgICBwYXJzZS0+bmFtZSA9IG5hbWU7CiAgICBwYXJzZS0+Y29uZmlnID0gY29uZmlnOwogICAgcGFyc2UtPnBhcnNlciA9IHBhcnNlcjsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyB2b2lkCkZjQ29uZmlnQ2xlYW51cCAoRmNDb25maWdQYXJzZQkqcGFyc2UpCnsKICAgIHdoaWxlIChwYXJzZS0+cHN0YWNrKQoJRmNQU3RhY2tQb3AgKHBhcnNlKTsKfQoKc3RhdGljIGNvbnN0IEZjQ2hhcjggKgpGY0NvbmZpZ0dldEF0dHJpYnV0ZSAoRmNDb25maWdQYXJzZSAqcGFyc2UsIGNoYXIgKmF0dHIpCnsKICAgIEZjQ2hhcjggKiphdHRyczsKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybiAwOwoKICAgIGF0dHJzID0gcGFyc2UtPnBzdGFjay0+YXR0cjsKICAgIHdoaWxlICgqYXR0cnMpCiAgICB7CglpZiAoIXN0cmNtcCAoKGNoYXIgKikgKmF0dHJzLCBhdHRyKSkKCSAgICByZXR1cm4gYXR0cnNbMV07CglhdHRycyArPSAyOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCkZjU3RhcnRFbGVtZW50KHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqbmFtZSwgY29uc3QgWE1MX0NoYXIgKiphdHRyKQp7CiAgICBGY0NvbmZpZ1BhcnNlICAgKnBhcnNlID0gdXNlckRhdGE7CiAgICBGY0VsZW1lbnQJICAgIGVsZW1lbnQ7CiAgICAKICAgIGVsZW1lbnQgPSBGY0VsZW1lbnRNYXAgKG5hbWUpOwogICAgaWYgKGVsZW1lbnQgPT0gRmNFbGVtZW50VW5rbm93bikKICAgIHsKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAidW5rbm93biBlbGVtZW50IFwiJXNcIiIsIG5hbWUpOwoJcmV0dXJuOwogICAgfQogICAgCiAgICBpZiAoIUZjUFN0YWNrUHVzaCAocGFyc2UsIGVsZW1lbnQsIGF0dHIpKQogICAgewoJRmNDb25maWdFcnJvciAocGFyc2UsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VCbGFuayAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGludAkgICAgbiA9IEZjVlN0YWNrRWxlbWVudHMgKHBhcnNlKTsKICAgIHdoaWxlIChuLS0gPiAwKQogICAgewoJRmNWU3RhY2sgICAgKnYgPSBGY1ZTdGFja0ZldGNoIChwYXJzZSwgbik7CglpZiAodi0+dGFnICE9IEZjVlN0YWNrSW50ZWdlcikKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm5vbi1pbnRlZ2VyIGJsYW5rIik7CgllbHNlCgl7CgkgICAgaWYgKCFwYXJzZS0+Y29uZmlnLT5ibGFua3MpCgkgICAgewoJCXBhcnNlLT5jb25maWctPmJsYW5rcyA9IEZjQmxhbmtzQ3JlYXRlICgpOwoJCWlmICghcGFyc2UtPmNvbmZpZy0+YmxhbmtzKQoJCXsKCQkgICAgRmNDb25maWdFcnJvciAocGFyc2UsICJvdXQgb2YgbWVtb3J5Iik7CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9CgkgICAgaWYgKCFGY0JsYW5rc0FkZCAocGFyc2UtPmNvbmZpZy0+YmxhbmtzLCB2LT51LmludGVnZXIpKQoJICAgIHsKCQlGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm91dCBvZiBtZW1vcnkiKTsKCQlicmVhazsKCSAgICB9Cgl9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VJbnQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0NoYXI4ICpzLCAqZW5kOwogICAgaW50CSAgICBsOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgZW5kID0gMDsKICAgIGwgPSAoaW50KSBzdHJ0b2wgKChjaGFyICopIHMsIChjaGFyICoqKSZlbmQsIDApOwogICAgaWYgKGVuZCAhPSBzICsgc3RybGVuICgoY2hhciAqKSBzKSkKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAiXCIlc1wiOiBub3QgYSB2YWxpZCBpbnRlZ2VyIiwgcyk7CiAgICBlbHNlCglGY1ZTdGFja1B1c2hJbnRlZ2VyIChwYXJzZSwgbCk7CiAgICBGY1N0ckZyZWUgKHMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRG91YmxlIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOCAqcywgKmVuZDsKICAgIGRvdWJsZSAgZDsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIGVuZCA9IDA7CiAgICBkID0gc3RydG9kICgoY2hhciAqKSBzLCAoY2hhciAqKikmZW5kKTsKICAgIGlmIChlbmQgIT0gcyArIHN0cmxlbiAoKGNoYXIgKikgcykpCglGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIlwiJXNcIjogbm90IGEgdmFsaWQgZG91YmxlIiwgcyk7CiAgICBlbHNlCglGY1ZTdGFja1B1c2hEb3VibGUgKHBhcnNlLCBkKTsKICAgIEZjU3RyRnJlZSAocyk7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VTdHJpbmcgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY1ZTdGFja1RhZyB0YWcpCnsKICAgIEZjQ2hhcjggKnM7CiAgICAKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIHMgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwogICAgaWYgKCFzKQogICAgewoJRmNDb25maWdFcnJvciAocGFyc2UsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBpZiAoIUZjVlN0YWNrUHVzaFN0cmluZyAocGFyc2UsIHRhZywgcykpCglGY1N0ckZyZWUgKHMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlTWF0cml4IChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNWU3RhY2sJKnZzdGFjazsKICAgIGVudW0geyBtX2RvbmUsIG1feHgsIG1feHksIG1feXgsIG1feXkgfSBtYXRyaXhfc3RhdGUgPSBtX3l5OwogICAgRmNNYXRyaXgJbTsKICAgIAogICAgd2hpbGUgKCh2c3RhY2sgPSBGY1ZTdGFja1BvcCAocGFyc2UpKSkKICAgIHsKCWlmICh2c3RhY2stPnRhZyAhPSBGY1ZTdGFja0RvdWJsZSkKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm5vbi1kb3VibGUgbWF0cml4IGVsZW1lbnQiKTsKCWVsc2UKCXsKCSAgICBkb3VibGUgdiA9IHZzdGFjay0+dS5fZG91YmxlOwoJICAgIHN3aXRjaCAobWF0cml4X3N0YXRlKSB7CgkgICAgY2FzZSBtX3h4OiBtLnh4ID0gdjsgYnJlYWs7CgkgICAgY2FzZSBtX3h5OiBtLnh5ID0gdjsgYnJlYWs7CgkgICAgY2FzZSBtX3l4OiBtLnl4ID0gdjsgYnJlYWs7CgkgICAgY2FzZSBtX3l5OiBtLnl5ID0gdjsgYnJlYWs7CgkgICAgZGVmYXVsdDogYnJlYWs7CgkgICAgfQoJICAgIG1hdHJpeF9zdGF0ZS0tOwoJfQogICAgfQogICAgaWYgKG1hdHJpeF9zdGF0ZSAhPSBtX2RvbmUpCglGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIndyb25nIG51bWJlciBvZiBtYXRyaXggZWxlbWVudHMiKTsKICAgIGVsc2UKCUZjVlN0YWNrUHVzaE1hdHJpeCAocGFyc2UsICZtKTsKfQoKc3RhdGljIEZjQm9vbApGY0NvbmZpZ0xleEJvb2wgKGNvbnN0IEZjQ2hhcjggKmJvb2wpCnsKICAgIGlmICgqYm9vbCA9PSAndCcgfHwgKmJvb2wgPT0gJ1QnKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmICgqYm9vbCA9PSAneScgfHwgKmJvb2wgPT0gJ1knKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmICgqYm9vbCA9PSAnMScpCglyZXR1cm4gRmNUcnVlOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VCb29sIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOCAqczsKCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgRmNWU3RhY2tQdXNoQm9vbCAocGFyc2UsIEZjQ29uZmlnTGV4Qm9vbCAocykpOwogICAgRmNTdHJGcmVlIChzKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUZhbWlsaWVzIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNWU3RhY2tUYWcgdGFnKQp7CiAgICBGY1ZTdGFjawkqdnN0YWNrOwogICAgRmNFeHByCSpsZWZ0LCAqZXhwciA9IDAsICpuZXc7CgogICAgd2hpbGUgKCh2c3RhY2sgPSBGY1ZTdGFja1BvcCAocGFyc2UpKSkKICAgIHsKCWlmICh2c3RhY2stPnRhZyAhPSBGY1ZTdGFja0ZhbWlseSkKCXsKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm5vbi1mYW1pbHkiKTsKCSAgICBicmVhazsKCX0KCWxlZnQgPSB2c3RhY2stPnUuZXhwcjsKCXZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwoJaWYgKGV4cHIpCgl7CgkgICAgbmV3ID0gRmNFeHByQ3JlYXRlT3AgKGxlZnQsIEZjT3BDb21tYSwgZXhwcik7CgkgICAgaWYgKCFuZXcpCgkgICAgewoJCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJCUZjRXhwckRlc3Ryb3kgKGxlZnQpOwoJCUZjRXhwckRlc3Ryb3kgKGV4cHIpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBleHByID0gbmV3OwoJfQoJZWxzZQoJICAgIGV4cHIgPSBsZWZ0OwogICAgfQogICAgaWYgKGV4cHIpCiAgICB7CglpZiAoIUZjVlN0YWNrUHVzaEV4cHIgKHBhcnNlLCB0YWcsIGV4cHIpKQoJewoJICAgIEZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJICAgIGlmIChleHByKQoJCUZjRXhwckRlc3Ryb3kgKGV4cHIpOwoJfQogICAgfQp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRmFtaWx5IChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOCAqczsKICAgIEZjRXhwciAgKmV4cHI7CgogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIGV4cHIgPSBGY0V4cHJDcmVhdGVTdHJpbmcgKHMpOwogICAgRmNTdHJGcmVlIChzKTsKICAgIGlmIChleHByKQoJRmNWU3RhY2tQdXNoRXhwciAocGFyc2UsIEZjVlN0YWNrRmFtaWx5LCBleHByKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUFsaWFzIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNFeHByCSpmYW1pbHkgPSAwLCAqYWNjZXB0ID0gMCwgKnByZWZlciA9IDAsICpkZWYgPSAwOwogICAgRmNFZGl0CSplZGl0ID0gMCwgKm5leHQ7CiAgICBGY1ZTdGFjawkqdnN0YWNrOwogICAgRmNUZXN0CSp0ZXN0OwoKICAgIHdoaWxlICgodnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKSkpIAogICAgewoJc3dpdGNoICh2c3RhY2stPnRhZykgewoJY2FzZSBGY1ZTdGFja0ZhbWlseToKCSAgICBpZiAoZmFtaWx5KQoJCUZjRXhwckRlc3Ryb3kgKGZhbWlseSk7CgkgICAgZmFtaWx5ID0gdnN0YWNrLT51LmV4cHI7CgkgICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrUHJlZmVyOgoJICAgIGlmIChwcmVmZXIpCgkJRmNFeHByRGVzdHJveSAocHJlZmVyKTsKCSAgICBwcmVmZXIgPSB2c3RhY2stPnUuZXhwcjsKCSAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tBY2NlcHQ6CgkgICAgaWYgKGFjY2VwdCkKCQlGY0V4cHJEZXN0cm95IChhY2NlcHQpOwoJICAgIGFjY2VwdCA9IHZzdGFjay0+dS5leHByOwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0RlZmF1bHQ6CgkgICAgaWYgKGRlZikKCQlGY0V4cHJEZXN0cm95IChkZWYpOwoJICAgIGRlZiA9IHZzdGFjay0+dS5leHByOwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgImJhZCBhbGlhcyIpOwoJICAgIGJyZWFrOwoJfQoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgfQogICAgaWYgKCFmYW1pbHkpCiAgICB7CglGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm1pc3NpbmcgZmFtaWx5IGluIGFsaWFzIik7CglyZXR1cm47CiAgICB9CiAgICBpZiAocHJlZmVyKQogICAgewoJZWRpdCA9IEZjRWRpdENyZWF0ZSAoRmNDb25maWdTYXZlRmllbGQgKCJmYW1pbHkiKSwKCQkJICAgICBGY09wUHJlcGVuZCwKCQkJICAgICBwcmVmZXIpOwoJaWYgKGVkaXQpCgkgICAgZWRpdC0+bmV4dCA9IDA7CgllbHNlCgkgICAgRmNFeHByRGVzdHJveSAocHJlZmVyKTsKICAgIH0KICAgIGlmIChhY2NlcHQpCiAgICB7CgluZXh0ID0gZWRpdDsKCWVkaXQgPSBGY0VkaXRDcmVhdGUgKEZjQ29uZmlnU2F2ZUZpZWxkICgiZmFtaWx5IiksCgkJCSAgICAgRmNPcEFwcGVuZCwKCQkJICAgICBhY2NlcHQpOwoJaWYgKGVkaXQpCgkgICAgZWRpdC0+bmV4dCA9IG5leHQ7CgllbHNlCgkgICAgRmNFeHByRGVzdHJveSAoYWNjZXB0KTsKICAgIH0KICAgIGlmIChkZWYpCiAgICB7CgluZXh0ID0gZWRpdDsKCWVkaXQgPSBGY0VkaXRDcmVhdGUgKEZjQ29uZmlnU2F2ZUZpZWxkICgiZmFtaWx5IiksCgkJCSAgICAgIEZjT3BBcHBlbmRMYXN0LAoJCQkgICAgICBkZWYpOwoJaWYgKGVkaXQpCgkgICAgZWRpdC0+bmV4dCA9IG5leHQ7CgllbHNlCgkgICAgRmNFeHByRGVzdHJveSAoZGVmKTsKICAgIH0KICAgIGlmIChlZGl0KQogICAgewoJdGVzdCA9IEZjVGVzdENyZWF0ZSAoRmNRdWFsQW55LAoJCQkgICAgIEZjU3RyQ29weSAoKEZjQ2hhcjggKikgImZhbWlseSIpLAoJCQkgICAgIEZjT3BFcXVhbCwKCQkJICAgICBmYW1pbHkpOwoJaWYgKHRlc3QpCgkgICAgaWYgKCFGY0NvbmZpZ0FkZEVkaXQgKHBhcnNlLT5jb25maWcsIHRlc3QsIGVkaXQsIEZjTWF0Y2hQYXR0ZXJuKSkKCQlGY1Rlc3REZXN0cm95ICh0ZXN0KTsKICAgIH0KICAgIGVsc2UKCUZjRXhwckRlc3Ryb3kgKGZhbWlseSk7Cn0KCnN0YXRpYyBGY0V4cHIgKgpGY1BvcEV4cHIgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY1ZTdGFjawkqdnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKTsKICAgIEZjRXhwcgkqZXhwciA9IDA7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiAwOwogICAgc3dpdGNoICh2c3RhY2stPnRhZykgewogICAgY2FzZSBGY1ZTdGFja05vbmU6CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tTdHJpbmc6CiAgICBjYXNlIEZjVlN0YWNrRmFtaWx5OgogICAgY2FzZSBGY1ZTdGFja0ZpZWxkOgogICAgY2FzZSBGY1ZTdGFja0NvbnN0YW50OgoJZXhwciA9IEZjRXhwckNyZWF0ZVN0cmluZyAodnN0YWNrLT51LnN0cmluZyk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tQcmVmZXI6CiAgICBjYXNlIEZjVlN0YWNrQWNjZXB0OgogICAgY2FzZSBGY1ZTdGFja0RlZmF1bHQ6CglleHByID0gdnN0YWNrLT51LmV4cHI7Cgl2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0ludGVnZXI6CglleHByID0gRmNFeHByQ3JlYXRlSW50ZWdlciAodnN0YWNrLT51LmludGVnZXIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrRG91YmxlOgoJZXhwciA9IEZjRXhwckNyZWF0ZURvdWJsZSAodnN0YWNrLT51Ll9kb3VibGUpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrTWF0cml4OgoJZXhwciA9IEZjRXhwckNyZWF0ZU1hdHJpeCAodnN0YWNrLT51Lm1hdHJpeCk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tCb29sOgoJZXhwciA9IEZjRXhwckNyZWF0ZUJvb2wgKHZzdGFjay0+dS5ib29sKTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja1Rlc3Q6CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tFeHByOgoJZXhwciA9IHZzdGFjay0+dS5leHByOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrRWRpdDoKCWJyZWFrOwogICAgfQogICAgRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgcmV0dXJuIGV4cHI7Cn0KCnN0YXRpYyBGY0V4cHIgKgpGY1BvcEV4cHJzIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNPcCBvcCkKewogICAgRmNFeHByICAqbGVmdCwgKmV4cHIgPSAwLCAqbmV3OwoKICAgIHdoaWxlICgobGVmdCA9IEZjUG9wRXhwciAocGFyc2UpKSkKICAgIHsKCWlmIChleHByKQoJewoJICAgIG5ldyA9IEZjRXhwckNyZWF0ZU9wIChsZWZ0LCBvcCwgZXhwcik7CgkgICAgaWYgKCFuZXcpCgkgICAgewoJCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJCUZjRXhwckRlc3Ryb3kgKGxlZnQpOwoJCUZjRXhwckRlc3Ryb3kgKGV4cHIpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBleHByID0gbmV3OwoJfQoJZWxzZQoJICAgIGV4cHIgPSBsZWZ0OwogICAgfQogICAgcmV0dXJuIGV4cHI7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VFeHByIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNPcCBvcCkKewogICAgRmNFeHByICAqZXhwciA9IEZjUG9wRXhwcnMgKHBhcnNlLCBvcCk7CiAgICBpZiAoZXhwcikKCUZjVlN0YWNrUHVzaEV4cHIgKHBhcnNlLCBGY1ZTdGFja0V4cHIsIGV4cHIpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlSW5jbHVkZSAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjQ2hhcjgJICAgICpzOwogICAgY29uc3QgRmNDaGFyOCAgICppOwogICAgRmNCb29sCSAgICBpZ25vcmVfbWlzc2luZyA9IEZjRmFsc2U7CiAgICAKICAgIHMgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwogICAgaWYgKCFzKQogICAgewoJRmNDb25maWdFcnJvciAocGFyc2UsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBpID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAiaWdub3JlX21pc3NpbmciKTsKICAgIGlmIChpICYmIEZjQ29uZmlnTGV4Qm9vbCAoKEZjQ2hhcjggKikgaSkgPT0gRmNUcnVlKQoJaWdub3JlX21pc3NpbmcgPSBGY1RydWU7CiAgICBpZiAoIUZjQ29uZmlnUGFyc2VBbmRMb2FkIChwYXJzZS0+Y29uZmlnLCBzLCAhaWdub3JlX21pc3NpbmcpKQoJcGFyc2UtPmVycm9yID0gRmNUcnVlOwogICAgZnJlZSAocyk7Cn0KCnR5cGVkZWYgc3RydWN0IF9GY09wTWFwIHsKICAgIGNoYXIgICAgKm5hbWU7CiAgICBGY09wICAgIG9wOwp9IEZjT3BNYXA7CgpzdGF0aWMgRmNPcApGY0NvbmZpZ0xleE9wIChjb25zdCBGY0NoYXI4ICpvcCwgY29uc3QgRmNPcE1hcAkqbWFwLCBpbnQgbm1hcCkKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IG5tYXA7IGkrKykKCWlmICghc3RyY21wICgoY2hhciAqKSBvcCwgbWFwW2ldLm5hbWUpKSAKCSAgICByZXR1cm4gbWFwW2ldLm9wOwogICAgcmV0dXJuIEZjT3BJbnZhbGlkOwp9CgpzdGF0aWMgY29uc3QgRmNPcE1hcCBmY0NvbXBhcmVPcHNbXSA9IHsKICAgIHsgImVxIiwJCUZjT3BFcXVhbAkgICAgfSwKICAgIHsgIm5vdF9lcSIsCQlGY09wTm90RXF1YWwJICAgIH0sCiAgICB7ICJsZXNzIiwJCUZjT3BMZXNzCSAgICB9LAogICAgeyAibGVzc19lcSIsCUZjT3BMZXNzRXF1YWwJICAgIH0sCiAgICB7ICJtb3JlIiwJCUZjT3BNb3JlCSAgICB9LAogICAgeyAibW9yZV9lcSIsCUZjT3BNb3JlRXF1YWwJICAgIH0KfTsKCiNkZWZpbmUgTlVNX0NPTVBBUkVfT1BTIChzaXplb2YgZmNDb21wYXJlT3BzIC8gc2l6ZW9mIGZjQ29tcGFyZU9wc1swXSkKCnN0YXRpYyBGY09wCkZjQ29uZmlnTGV4Q29tcGFyZSAoY29uc3QgRmNDaGFyOCAqY29tcGFyZSkKewogICAgcmV0dXJuIEZjQ29uZmlnTGV4T3AgKGNvbXBhcmUsIGZjQ29tcGFyZU9wcywgTlVNX0NPTVBBUkVfT1BTKTsKfQoKCnN0YXRpYyB2b2lkCkZjUGFyc2VUZXN0IChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgY29uc3QgRmNDaGFyOCAgICpxdWFsX3N0cmluZzsKICAgIEZjUXVhbAkgICAgcXVhbDsKICAgIGNvbnN0IEZjQ2hhcjggICAqbmFtZTsKICAgIGNvbnN0IEZjQ2hhcjggICAqY29tcGFyZV9zdHJpbmc7CiAgICBGY09wCSAgICBjb21wYXJlOwogICAgRmNFeHByCSAgICAqZXhwcjsKICAgIEZjVGVzdAkgICAgKnRlc3Q7CgogICAgcXVhbF9zdHJpbmcgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJxdWFsIik7CiAgICBpZiAoIXF1YWxfc3RyaW5nKQoJcXVhbCA9IEZjUXVhbEFueTsKICAgIGVsc2UKICAgIHsKCWlmICghc3RyY21wICgoY2hhciAqKSBxdWFsX3N0cmluZywgImFueSIpKQoJICAgIHF1YWwgPSBGY1F1YWxBbnk7CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBxdWFsX3N0cmluZywgImFsbCIpKQoJICAgIHF1YWwgPSBGY1F1YWxBbGw7CgllbHNlCgl7CgkgICAgRmNDb25maWdFcnJvciAocGFyc2UsICJpbnZhbGlkIHRlc3QgcXVhbCBcIiVzXCIiLCBxdWFsX3N0cmluZyk7CgkgICAgcmV0dXJuOwoJfQogICAgfQogICAgbmFtZSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgIm5hbWUiKTsKICAgIGlmICghbmFtZSkKICAgIHsKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAibWlzc2luZyB0ZXN0IG5hbWUiKTsKCXJldHVybjsKICAgIH0KICAgIGNvbXBhcmVfc3RyaW5nID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAiY29tcGFyZSIpOwogICAgaWYgKCFjb21wYXJlX3N0cmluZykKCWNvbXBhcmUgPSBGY09wRXF1YWw7CiAgICBlbHNlCiAgICB7Cgljb21wYXJlID0gRmNDb25maWdMZXhDb21wYXJlIChjb21wYXJlX3N0cmluZyk7CglpZiAoY29tcGFyZSA9PSBGY09wSW52YWxpZCkKCXsKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgImludmFsaWQgdGVzdCBjb21wYXJlIFwiJXNcIiIsIGNvbXBhcmVfc3RyaW5nKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICBleHByID0gRmNQb3BFeHByIChwYXJzZSk7CiAgICBpZiAoIWV4cHIpCiAgICB7CglGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm1pc3NpbmcgdGVzdCBleHByZXNzaW9uIik7CglyZXR1cm47CiAgICB9CiAgICB0ZXN0ID0gRmNUZXN0Q3JlYXRlIChxdWFsLCBuYW1lLCBjb21wYXJlLCBleHByKTsKICAgIGlmICghdGVzdCkKICAgIHsKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgRmNWU3RhY2tQdXNoVGVzdCAocGFyc2UsIHRlc3QpOwp9CgpzdGF0aWMgY29uc3QgRmNPcE1hcCBmY01vZGVPcHNbXSA9IHsKICAgIHsgImFzc2lnbiIsCQlGY09wQXNzaWduCSAgICB9LAogICAgeyAiYXNzaWduX3JlcGxhY2UiLAlGY09wQXNzaWduUmVwbGFjZSAgIH0sCiAgICB7ICJwcmVwZW5kIiwJRmNPcFByZXBlbmQJICAgIH0sCiAgICB7ICJwcmVwZW5kX2ZpcnN0IiwJRmNPcFByZXBlbmRGaXJzdCAgICB9LAogICAgeyAiYXBwZW5kIiwJCUZjT3BBcHBlbmQJICAgIH0sCiAgICB7ICJhcHBlbmRfbGFzdCIsCUZjT3BBcHBlbmRMYXN0CSAgICB9LAp9OwoKI2RlZmluZSBOVU1fTU9ERV9PUFMgKHNpemVvZiBmY01vZGVPcHMgLyBzaXplb2YgZmNNb2RlT3BzWzBdKQoKc3RhdGljIEZjT3AKRmNDb25maWdMZXhNb2RlIChjb25zdCBGY0NoYXI4ICptb2RlKQp7CiAgICByZXR1cm4gRmNDb25maWdMZXhPcCAobW9kZSwgZmNNb2RlT3BzLCBOVU1fTU9ERV9PUFMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRWRpdCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGNvbnN0IEZjQ2hhcjggICAqbmFtZTsKICAgIGNvbnN0IEZjQ2hhcjggICAqbW9kZV9zdHJpbmc7CiAgICBGY09wCSAgICBtb2RlOwogICAgRmNFeHByCSAgICAqZXhwcjsKICAgIEZjRWRpdAkgICAgKmVkaXQ7CgogICAgbmFtZSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgIm5hbWUiKTsKICAgIGlmICghbmFtZSkKICAgIHsKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAibWlzc2luZyBlZGl0IG5hbWUiKTsKCXJldHVybjsKICAgIH0KICAgIG1vZGVfc3RyaW5nID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAibW9kZSIpOwogICAgaWYgKCFtb2RlX3N0cmluZykKCW1vZGUgPSBGY09wRXF1YWw7CiAgICBlbHNlCiAgICB7Cgltb2RlID0gRmNDb25maWdMZXhNb2RlIChtb2RlX3N0cmluZyk7CglpZiAobW9kZSA9PSBGY09wSW52YWxpZCkKCXsKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgImludmFsaWQgZWRpdCBtb2RlIFwiJXNcIiIsIG1vZGVfc3RyaW5nKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICBleHByID0gRmNQb3BFeHBycyAocGFyc2UsIEZjT3BDb21tYSk7CiAgICBlZGl0ID0gRmNFZGl0Q3JlYXRlICgoY2hhciAqKSBGY1N0ckNvcHkgKG5hbWUpLCBtb2RlLCBleHByKTsKICAgIGlmICghZWRpdCkKICAgIHsKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJRmNFeHByRGVzdHJveSAoZXhwcik7CglyZXR1cm47CiAgICB9CiAgICBpZiAoIUZjVlN0YWNrUHVzaEVkaXQgKHBhcnNlLCBlZGl0KSkKCUZjRWRpdERlc3Ryb3kgKGVkaXQpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlTWF0Y2ggKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBjb25zdCBGY0NoYXI4ICAgKmtpbmRfbmFtZTsKICAgIEZjTWF0Y2hLaW5kCSAgICBraW5kOwogICAgRmNUZXN0CSAgICAqdGVzdCA9IDA7CiAgICBGY0VkaXQJICAgICplZGl0ID0gMDsKICAgIEZjVlN0YWNrCSAgICAqdnN0YWNrOwoKICAgIGtpbmRfbmFtZSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgInRhcmdldCIpOwogICAgaWYgKCFraW5kX25hbWUpCglraW5kID0gRmNNYXRjaFBhdHRlcm47CiAgICBlbHNlCiAgICB7CglpZiAoIXN0cmNtcCAoKGNoYXIgKikga2luZF9uYW1lLCAicGF0dGVybiIpKQoJICAgIGtpbmQgPSBGY01hdGNoUGF0dGVybjsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIGtpbmRfbmFtZSwgImZvbnQiKSkKCSAgICBraW5kID0gRmNNYXRjaEZvbnQ7CgllbHNlCgl7CgkgICAgRmNDb25maWdFcnJvciAocGFyc2UsICJpbnZhbGlkIG1hdGNoIHRhcmdldCBcIiVzXCIiLCBraW5kX25hbWUpOwoJICAgIHJldHVybjsKCX0KICAgIH0KICAgIHdoaWxlICgodnN0YWNrID0gRmNWU3RhY2tQb3AgKHBhcnNlKSkpCiAgICB7Cglzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CgljYXNlIEZjVlN0YWNrVGVzdDoKCSAgICB2c3RhY2stPnUudGVzdC0+bmV4dCA9IHRlc3Q7CgkgICAgdGVzdCA9IHZzdGFjay0+dS50ZXN0OwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0VkaXQ6CgkgICAgdnN0YWNrLT51LmVkaXQtPm5leHQgPSBlZGl0OwoJICAgIGVkaXQgPSB2c3RhY2stPnUuZWRpdDsKCSAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRmNDb25maWdFcnJvciAocGFyc2UsICJpbnZhbGlkIG1hdGNoIGVsZW1lbnQiKTsKCSAgICBicmVhazsKCX0KCUZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKICAgIH0KICAgIGlmICghRmNDb25maWdBZGRFZGl0IChwYXJzZS0+Y29uZmlnLCB0ZXN0LCBlZGl0LCBraW5kKSkKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwp9CgpzdGF0aWMgdm9pZApGY0VuZEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKQp7CiAgICBGY0NvbmZpZ1BhcnNlICAgKnBhcnNlID0gdXNlckRhdGE7CiAgICBGY0NoYXI4CSAgICAqZGF0YTsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgc3dpdGNoIChwYXJzZS0+cHN0YWNrLT5lbGVtZW50KSB7CiAgICBjYXNlIEZjRWxlbWVudE5vbmU6CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Rm9udGNvbmZpZzoKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnREaXI6CglkYXRhID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKCWlmICghZGF0YSkKCXsKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm91dCBvZiBtZW1vcnkiKTsKCSAgICBicmVhazsKCX0KCWlmICghRmNDb25maWdBZGREaXIgKHBhcnNlLT5jb25maWcsIGRhdGEpKQoJICAgIEZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwoJZnJlZSAoZGF0YSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q2FjaGU6CglkYXRhID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKCWlmICghZGF0YSkKCXsKCSAgICBGY0NvbmZpZ0Vycm9yIChwYXJzZSwgIm91dCBvZiBtZW1vcnkiKTsKCSAgICBicmVhazsKCX0KCWlmICghRmNDb25maWdTZXRDYWNoZSAocGFyc2UtPmNvbmZpZywgZGF0YSkpCgkgICAgRmNDb25maWdFcnJvciAocGFyc2UsICJvdXQgb2YgbWVtb3J5Iik7CglmcmVlIChkYXRhKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRJbmNsdWRlOgoJRmNQYXJzZUluY2x1ZGUgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRDb25maWc6CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TWF0Y2g6CglGY1BhcnNlTWF0Y2ggKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRBbGlhczoKCUZjUGFyc2VBbGlhcyAocGFyc2UpOwoJYnJlYWs7CgogICAgY2FzZSBGY0VsZW1lbnRCbGFuazoKCUZjUGFyc2VCbGFuayAocGFyc2UpOwoJYnJlYWs7CgkKICAgIGNhc2UgRmNFbGVtZW50UHJlZmVyOgoJRmNQYXJzZUZhbWlsaWVzIChwYXJzZSwgRmNWU3RhY2tQcmVmZXIpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEFjY2VwdDoKCUZjUGFyc2VGYW1pbGllcyAocGFyc2UsIEZjVlN0YWNrQWNjZXB0KTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnREZWZhdWx0OgoJRmNQYXJzZUZhbWlsaWVzIChwYXJzZSwgRmNWU3RhY2tEZWZhdWx0KTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRGYW1pbHk6CglGY1BhcnNlRmFtaWx5IChwYXJzZSk7CglicmVhazsKCiAgICBjYXNlIEZjRWxlbWVudFRlc3Q6CglGY1BhcnNlVGVzdCAocGFyc2UpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEVkaXQ6CglGY1BhcnNlRWRpdCAocGFyc2UpOwoJYnJlYWs7CgogICAgY2FzZSBGY0VsZW1lbnRJbnQ6CglGY1BhcnNlSW50IChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RG91YmxlOgoJRmNQYXJzZURvdWJsZSAocGFyc2UpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudFN0cmluZzoKCUZjUGFyc2VTdHJpbmcgKHBhcnNlLCBGY1ZTdGFja1N0cmluZyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TWF0cml4OgoJRmNQYXJzZU1hdHJpeCAocGFyc2UpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEJvb2w6CglGY1BhcnNlQm9vbCAocGFyc2UpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudENoYXJzZXQ6Ci8qCUZjUGFyc2VDaGFyc2V0IChwYXJzZSk7ICovCglicmVhazsKCiAgICBjYXNlIEZjRWxlbWVudE5hbWU6CglGY1BhcnNlU3RyaW5nIChwYXJzZSwgRmNWU3RhY2tGaWVsZCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q29uc3Q6CglGY1BhcnNlU3RyaW5nIChwYXJzZSwgRmNWU3RhY2tDb25zdGFudCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50T3I6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BPcik7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50QW5kOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wQW5kKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRFcToKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcEVxdWFsKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnROb3RFcToKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcE5vdEVxdWFsKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRMZXNzOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wTGVzcyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TGVzc0VxOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wTGVzc0VxdWFsKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRNb3JlOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wTW9yZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TW9yZUVxOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wTW9yZUVxdWFsKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRQbHVzOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wUGx1cyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50TWludXM6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BNaW51cyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50VGltZXM6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BUaW1lcyk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RGl2aWRlOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wRGl2aWRlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnROb3Q6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BOb3QpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudElmOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wUXVlc3QpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudFVua25vd246CglicmVhazsKICAgIH0KICAgICh2b2lkKSBGY1BTdGFja1BvcCAocGFyc2UpOwp9CgpzdGF0aWMgdm9pZApGY0NoYXJhY3RlckRhdGEgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbikKewogICAgRmNDb25maWdQYXJzZSAgICpwYXJzZSA9IHVzZXJEYXRhOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBpZiAoIUZjU3RyQnVmRGF0YSAoJnBhcnNlLT5wc3RhY2stPnN0ciwgKEZjQ2hhcjggKikgcywgbGVuKSkKCUZjQ29uZmlnRXJyb3IgKHBhcnNlLCAib3V0IG9mIG1lbW9yeSIpOwp9CgpzdGF0aWMgdm9pZApGY1N0YXJ0RG9jdHlwZURlY2wgKHZvaWQJICAgICp1c2VyRGF0YSwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpkb2N0eXBlTmFtZSwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpzeXNpZCwKCQkgICAgY29uc3QgWE1MX0NoYXIgICpwdWJpZCwKCQkgICAgaW50CQkgICAgaGFzX2ludGVybmFsX3N1YnNldCkKewogICAgRmNDb25maWdQYXJzZSAgICpwYXJzZSA9IHVzZXJEYXRhOwoKICAgIGlmIChzdHJjbXAgKChjaGFyICopIGRvY3R5cGVOYW1lLCAiZm9udGNvbmZpZyIpICE9IDApCglGY0NvbmZpZ0Vycm9yIChwYXJzZSwgImludmFsaWQgZG9jdHlwZSBcIiVzXCIiLCBkb2N0eXBlTmFtZSk7Cn0KCnN0YXRpYyB2b2lkCkZjRW5kRG9jdHlwZURlY2wgKHZvaWQgKnVzZXJEYXRhKQp7Cn0KCkZjQm9vbApGY0NvbmZpZ1BhcnNlQW5kTG9hZCAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqbmFtZSwKCQkgICAgICBGY0Jvb2wJICAgIGNvbXBsYWluKQp7CgogICAgWE1MX1BhcnNlcgkgICAgcDsKICAgIEZjQ2hhcjgJICAgICpmaWxlbmFtZTsKICAgIEZJTEUJICAgICpmOwogICAgaW50CQkgICAgbGVuOwogICAgdm9pZAkgICAgKmJ1ZjsKICAgIEZjQ29uZmlnUGFyc2UgICBwYXJzZTsKICAgIEZjQm9vbAkgICAgZXJyb3IgPSBGY1RydWU7CiAgICAKICAgIGZpbGVuYW1lID0gRmNDb25maWdGaWxlbmFtZSAobmFtZSk7CiAgICBpZiAoIWZpbGVuYW1lKQoJZ290byBiYWlsMDsKICAgIGYgPSBmb3BlbiAoKGNoYXIgKikgZmlsZW5hbWUsICJyIik7CiAgICBmcmVlIChmaWxlbmFtZSk7CiAgICBpZiAoIWYpCglnb3RvIGJhaWwwOwogICAgCiAgICBwID0gWE1MX1BhcnNlckNyZWF0ZSAoIlVURi04Iik7CiAgICBpZiAoIXApCglnb3RvIGJhaWwxOwoKICAgIGlmICghRmNDb25maWdJbml0ICgmcGFyc2UsIG5hbWUsIGNvbmZpZywgcCkpCglnb3RvIGJhaWwyOwoKICAgIFhNTF9TZXRVc2VyRGF0YSAocCwgJnBhcnNlKTsKICAgIAogICAgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciAocCwgRmNTdGFydERvY3R5cGVEZWNsLCBGY0VuZERvY3R5cGVEZWNsKTsKICAgIFhNTF9TZXRFbGVtZW50SGFuZGxlciAocCwgRmNTdGFydEVsZW1lbnQsIEZjRW5kRWxlbWVudCk7CiAgICBYTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIgKHAsIEZjQ2hhcmFjdGVyRGF0YSk7CgkKICAgIGRvIHsKCWJ1ZiA9IFhNTF9HZXRCdWZmZXIgKHAsIEJVRlNJWik7CglpZiAoIWJ1ZikKCSAgICBnb3RvIGJhaWwzOwoJbGVuID0gZnJlYWQgKGJ1ZiwgMSwgQlVGU0laLCBmKTsKCWlmIChsZW4gPCAwKQoJICAgIGdvdG8gYmFpbDM7CglpZiAoIVhNTF9QYXJzZUJ1ZmZlciAocCwgbGVuLCBsZW4gPT0gMCkpCgkgICAgZ290byBiYWlsMzsKICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKICAgIGVycm9yID0gcGFyc2UuZXJyb3I7CmJhaWwzOgogICAgRmNDb25maWdDbGVhbnVwICgmcGFyc2UpOwpiYWlsMjoKICAgIFhNTF9QYXJzZXJGcmVlIChwKTsKYmFpbDE6CiAgICBmY2xvc2UgKGYpOwpiYWlsMDoKICAgIGlmIChlcnJvciAmJiBjb21wbGFpbikKICAgIHsKCWlmIChuYW1lKQoJICAgIEZjQ29uZmlnRXJyb3IgKDAsICJDYW5ub3QgbG9hZCBjb25maWcgZmlsZSBcIiVzXCIiLCBuYW1lKTsKCWVsc2UKCSAgICBGY0NvbmZpZ0Vycm9yICgwLCAiQ2Fubm90IGxvYWQgZGVmYXVsdCBjb25maWcgZmlsZSIpOwoJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9Cg==