LyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkKCkMgaW1wbGVtZW50YXRpb24gZGVyaXZlZCBkaXJlY3RseSBmcm9tIGhlYXBxLnB5IGluIFB5Mi4zCndoaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywKYW5ub3RhdGVkIGJ5IEZyYW7Dp29pcyBQaW5hcmQsIGFuZCBjb252ZXJ0ZWQgdG8gQyBieSBSYXltb25kIEhldHRpbmdlci4KCiovCgojaW5jbHVkZSAiUHl0aG9uLmgiCgovKiBPbGRlciBpbXBsZW1lbnRhdGlvbnMgb2YgaGVhcHEgdXNlZCBQeV9MRSBmb3IgY29tcGFyaXNvbnMuICBOb3csIGl0IHVzZXMKICAgUHlfTFQgc28gaXQgd2lsbCBtYXRjaCBtaW4oKSwgc29ydGVkKCksIGFuZCBiaXNlY3QoKS4gIFVuZm9ydHVuYXRlbHksIHNvbWUKICAgY2xpZW50IGNvZGUgKFR3aXN0ZWQgZm9yIGV4YW1wbGUpIHJlbGllZCBvbiBQeV9MRSwgc28gdGhpcyBsaXR0bGUgZnVuY3Rpb24KICAgcmVzdG9yZXMgY29tcGF0aWJpbGl0eSBieSB0cnlpbmcgYm90aC4KKi8Kc3RhdGljIGludApjbXBfbHQoUHlPYmplY3QgKngsIFB5T2JqZWN0ICp5KQp7CiAgICBpbnQgY21wOwogICAgc3RhdGljIFB5T2JqZWN0ICpsdCA9IE5VTEw7CgogICAgaWYgKGx0ID09IE5VTEwpIHsKICAgICAgICBsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fbHRfXyIpOwogICAgICAgIGlmIChsdCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCiAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh4LCB5LCBQeV9MVCk7CiAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeSwgeCwgUHlfTEUpOwogICAgaWYgKGNtcCAhPSAtMSkKICAgICAgICBjbXAgPSAxIC0gY21wOwogICAgcmV0dXJuIGNtcDsKfQoKc3RhdGljIGludApfc2lmdGRvd24oUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykKewogICAgUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQsICpvbGRpdGVtOwogICAgaW50IGNtcDsKICAgIFB5X3NzaXplX3QgcGFyZW50cG9zOwogICAgUHlfc3NpemVfdCBzaXplOwoKICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOwogICAgc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKICAgIGlmIChwb3MgPj0gc2l6ZSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKICAgIFB5X0lOQ1JFRihuZXdpdGVtKTsKICAgIC8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCiAgICAgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KICAgIHdoaWxlIChwb3MgPiBzdGFydHBvcyl7CiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CiAgICAgICAgcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CiAgICAgICAgY21wID0gY21wX2x0KG5ld2l0ZW0sIHBhcmVudCk7CiAgICAgICAgaWYgKGNtcCA9PSAtMSkgewogICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgaWYgKHNpemUgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKICAgICAgICBvbGRpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKICAgICAgICBQeV9ERUNSRUYob2xkaXRlbSk7CiAgICAgICAgcG9zID0gcGFyZW50cG9zOwogICAgICAgIGlmIChzaXplICE9IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0KICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CiAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50Cl9zaWZ0dXAoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykKewogICAgUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3M7CiAgICBpbnQgY21wOwogICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXAsICpvbGRpdGVtOwogICAgUHlfc3NpemVfdCBzaXplOwoKICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOwogICAgc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKICAgIGVuZHBvcyA9IHNpemU7CiAgICBzdGFydHBvcyA9IHBvczsKICAgIGlmIChwb3MgPj0gZW5kcG9zKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CiAgICBQeV9JTkNSRUYobmV3aXRlbSk7CgogICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwogICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwogICAgd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7CiAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKICAgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MpIHsKICAgICAgICAgICAgY21wID0gY21wX2x0KAogICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSwKICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCByaWdodHBvcykpOwogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvczsKICAgICAgICB9CiAgICAgICAgaWYgKHNpemUgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KICAgICAgICB0bXAgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOwogICAgICAgIFB5X0lOQ1JFRih0bXApOwogICAgICAgIG9sZGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOwogICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKICAgICAgICBwb3MgPSBjaGlsZHBvczsKICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsKICAgICAgICBpZiAoc2l6ZSAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9CgogICAgLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlCiAgICAgICBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8KICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CiAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKICAgIHJldHVybiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk7Cn0KCnN0YXRpYyBQeU9iamVjdCAqCmhlYXBwdXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlPYmplY3QgKmhlYXAsICppdGVtOwoKICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNoIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgaXRlbSkgPT0gLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKF9zaWZ0ZG93bigoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCwgUHlMaXN0X0dFVF9TSVpFKGhlYXApLTEpID09IC0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihoZWFwcHVzaF9kb2MsCiJoZWFwcHVzaChoZWFwLCBpdGVtKSAtPiBOb25lLiBQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwcG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkKewogICAgUHlPYmplY3QgKmxhc3RlbHQsICpyZXR1cm5pdGVtOwogICAgUHlfc3NpemVfdCBuOwoKICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKiAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkgKi8KICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CiAgICBpZiAobiA9PSAwKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBsYXN0ZWx0ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIG4tMSkgOwogICAgUHlfSU5DUkVGKGxhc3RlbHQpOwogICAgUHlMaXN0X1NldFNsaWNlKGhlYXAsIG4tMSwgbiwgTlVMTCk7CiAgICBuLS07CgogICAgaWYgKCFuKQogICAgICAgIHJldHVybiBsYXN0ZWx0OwogICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBsYXN0ZWx0KTsKICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewogICAgICAgIFB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiByZXR1cm5pdGVtOwp9CgpQeURvY19TVFJWQVIoaGVhcHBvcF9kb2MsCiJQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5T2JqZWN0ICpoZWFwLCAqaXRlbSwgKnJldHVybml0ZW07CgogICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHJlcGxhY2UiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApIDwgMSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewogICAgICAgIFB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiByZXR1cm5pdGVtOwp9CgpQeURvY19TVFJWQVIoaGVhcHJlcGxhY2VfZG9jLAoiaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgLT4gdmFsdWUuIFBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS5cblwKXG5cClRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxuXAptb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlXG5cCnJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxuXAp0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxuXG5cCiAgICBpZiBpdGVtID4gaGVhcFswXTpcblwKICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSlcbiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKaGVhcHB1c2hwb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwogICAgaW50IGNtcDsKCiAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaHBvcCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CiAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgICAgIHJldHVybiBpdGVtOwogICAgfQoKICAgIGNtcCA9IGNtcF9sdChQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCksIGl0ZW0pOwogICAgaWYgKGNtcCA9PSAtMSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmIChjbXAgPT0gMCkgewogICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgICAgICByZXR1cm4gaXRlbTsKICAgIH0KCiAgICByZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwogICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOwogICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CiAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcHVzaHBvcF9kb2MsCiJoZWFwcHVzaHBvcChoZWFwLCBpdGVtKSAtPiB2YWx1ZS4gUHVzaCBpdGVtIG9uIHRoZSBoZWFwLCB0aGVuIHBvcCBhbmQgcmV0dXJuIHRoZSBzbWFsbGVzdCBpdGVtXG5cCmZyb20gdGhlIGhlYXAuIFRoZSBjb21iaW5lZCBhY3Rpb24gcnVucyBtb3JlIGVmZmljaWVudGx5IHRoYW5cblwKaGVhcHB1c2goKSBmb2xsb3dlZCBieSBhIHNlcGFyYXRlIGNhbGwgdG8gaGVhcHBvcCgpLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKaGVhcGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCnsKICAgIFB5X3NzaXplX3QgaSwgbjsKCiAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKICAgIC8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bwogICAgICAgbG9va2luZyBhdCBpcyB0aGUgbGFyZ2VzdCB3aXRoIGEgY2hpbGQgaW5kZXggaW4tcmFuZ2UsIHNvIG11c3QKICAgICAgIGhhdmUgMippICsgMSA8IG4sIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzCiAgICAgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKICAgICAgIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwKICAgICAgIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgogICAgKi8KICAgIGZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCiAgICAgICAgaWYoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KClB5RG9jX1NUUlZBUihoZWFwaWZ5X2RvYywKIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oaGVhcCkpIHRpbWUuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpubGFyZ2VzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5T2JqZWN0ICpoZWFwPU5VTEwsICplbGVtLCAqaXRlcmFibGUsICpzb2wsICppdCwgKm9sZGVsZW07CiAgICBQeV9zc2l6ZV90IGksIG47CiAgICBpbnQgY21wOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86bmxhcmdlc3QiLCAmbiwgJml0ZXJhYmxlKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwogICAgaWYgKGl0ID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaGVhcCA9IFB5TGlzdF9OZXcoMCk7CiAgICBpZiAoaGVhcCA9PSBOVUxMKQogICAgICAgIGdvdG8gZmFpbDsKCiAgICBmb3IgKGk9MCA7IGk8biA7IGkrKyApewogICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CiAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7CiAgICAgICAgfQogICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIH0KICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CiAgICB9CiAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApID09IDApCiAgICAgICAgZ290byBzb3J0aXQ7CgogICAgZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKICAgICAgICBpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKICAgICAgICAgICAgZ290byBmYWlsOwoKICAgIHNvbCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKICAgIHdoaWxlICgxKSB7CiAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnb3RvIHNvcnRpdDsKICAgICAgICB9CiAgICAgICAgY21wID0gY21wX2x0KHNvbCwgZWxlbSk7CiAgICAgICAgaWYgKGNtcCA9PSAtMSkgewogICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CiAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICB9CiAgICAgICAgaWYgKGNtcCA9PSAwKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIG9sZGVsZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwogICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKICAgICAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpCiAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CiAgICB9CnNvcnRpdDoKICAgIGlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKICAgICAgICBnb3RvIGZhaWw7CiAgICBpZiAoUHlMaXN0X1JldmVyc2UoaGVhcCkgPT0gLTEpCiAgICAgICAgZ290byBmYWlsOwogICAgUHlfREVDUkVGKGl0KTsKICAgIHJldHVybiBoZWFwOwoKZmFpbDoKICAgIFB5X0RFQ1JFRihpdCk7CiAgICBQeV9YREVDUkVGKGhlYXApOwogICAgcmV0dXJuIE5VTEw7Cn0KClB5RG9jX1NUUlZBUihubGFyZ2VzdF9kb2MsCiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxuXApcblwKRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwgcmV2ZXJzZT1UcnVlKVs6bl1cbiIpOwoKc3RhdGljIGludApfc2lmdGRvd25tYXgoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykKewogICAgUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7CiAgICBpbnQgY21wOwogICAgUHlfc3NpemVfdCBwYXJlbnRwb3M7CgogICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7CiAgICBpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKICAgIFB5X0lOQ1JFRihuZXdpdGVtKTsKICAgIC8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCiAgICAgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KICAgIHdoaWxlIChwb3MgPiBzdGFydHBvcyl7CiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CiAgICAgICAgcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CiAgICAgICAgY21wID0gY21wX2x0KHBhcmVudCwgbmV3aXRlbSk7CiAgICAgICAgaWYgKGNtcCA9PSAtMSkgewogICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwogICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7CiAgICAgICAgcG9zID0gcGFyZW50cG9zOwogICAgfQogICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKX3NpZnR1cG1heChQeUxpc3RPYmplY3QgKmhlYXAsIFB5X3NzaXplX3QgcG9zKQp7CiAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKICAgIGludCBjbXA7CiAgICBQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKCiAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKICAgIHN0YXJ0cG9zID0gcG9zOwogICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKICAgIFB5X0lOQ1JFRihuZXdpdGVtKTsKCiAgICAvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCiAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCiAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKICAgICAgICAvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwogICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOwogICAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcykgewogICAgICAgICAgICBjbXAgPSBjbXBfbHQoCiAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpLAogICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSk7CiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY21wID09IDApCiAgICAgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zOwogICAgICAgIH0KICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwogICAgICAgIHRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7CiAgICAgICAgUHlfSU5DUkVGKHRtcCk7CiAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOwogICAgICAgIHBvcyA9IGNoaWxkcG9zOwogICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOwogICAgfQoKICAgIC8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZQogICAgICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCiAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CiAgICByZXR1cm4gX3NpZnRkb3dubWF4KGhlYXAsIHN0YXJ0cG9zLCBwb3MpOwp9CgpzdGF0aWMgUHlPYmplY3QgKgpuc21hbGxlc3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqbG9zLCAqaXQsICpvbGRlbGVtOwogICAgUHlfc3NpemVfdCBpLCBuOwogICAgaW50IGNtcDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5zbWFsbGVzdCIsICZuLCAmaXRlcmFibGUpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CiAgICBpZiAoaXQgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBoZWFwID0gUHlMaXN0X05ldygwKTsKICAgIGlmIChoZWFwID09IE5VTEwpCiAgICAgICAgZ290byBmYWlsOwoKICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrICl7CiAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnb3RvIHNvcnRpdDsKICAgICAgICB9CiAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwogICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgfQogICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKICAgIH0KICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CiAgICBpZiAobiA9PSAwKQogICAgICAgIGdvdG8gc29ydGl0OwoKICAgIGZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCiAgICAgICAgaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCiAgICAgICAgICAgIGdvdG8gZmFpbDsKCiAgICBsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CiAgICB3aGlsZSAoMSkgewogICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CiAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7CiAgICAgICAgfQogICAgICAgIGNtcCA9IGNtcF9sdChlbGVtLCBsb3MpOwogICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwogICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgfQogICAgICAgIGlmIChjbXAgPT0gMCkgewogICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgZWxlbSk7CiAgICAgICAgUHlfREVDUkVGKG9sZGVsZW0pOwogICAgICAgIGlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIGxvcyA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKICAgIH0KCnNvcnRpdDoKICAgIGlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKICAgICAgICBnb3RvIGZhaWw7CiAgICBQeV9ERUNSRUYoaXQpOwogICAgcmV0dXJuIGhlYXA7CgpmYWlsOgogICAgUHlfREVDUkVGKGl0KTsKICAgIFB5X1hERUNSRUYoaGVhcCk7CiAgICByZXR1cm4gTlVMTDsKfQoKUHlEb2NfU1RSVkFSKG5zbWFsbGVzdF9kb2MsCiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cblwKXG5cCkVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUpWzpuXVxuIik7CgpzdGF0aWMgUHlNZXRob2REZWYgaGVhcHFfbWV0aG9kc1tdID0gewogICAgeyJoZWFwcHVzaCIsICAgICAgICAoUHlDRnVuY3Rpb24paGVhcHB1c2gsCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHB1c2hfZG9jfSwKICAgIHsiaGVhcHB1c2hwb3AiLCAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNocG9wLAogICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIGhlYXBwdXNocG9wX2RvY30sCiAgICB7ImhlYXBwb3AiLCAgICAgICAgIChQeUNGdW5jdGlvbiloZWFwcG9wLAogICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgIGhlYXBwb3BfZG9jfSwKICAgIHsiaGVhcHJlcGxhY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWhlYXByZXBsYWNlLAogICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIGhlYXByZXBsYWNlX2RvY30sCiAgICB7ImhlYXBpZnkiLCAgICAgICAgIChQeUNGdW5jdGlvbiloZWFwaWZ5LAogICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgIGhlYXBpZnlfZG9jfSwKICAgIHsibmxhcmdlc3QiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKW5sYXJnZXN0LAogICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIG5sYXJnZXN0X2RvY30sCiAgICB7Im5zbWFsbGVzdCIsICAgICAgIChQeUNGdW5jdGlvbiluc21hbGxlc3QsCiAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgbnNtYWxsZXN0X2RvY30sCiAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwp9OwoKUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCiJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS5cblwKXG5cCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcblwKbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuXApcblwKVXNhZ2U6XG5cClxuXApoZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcFxuXApoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXG5cCml0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXRcblwKaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxuXAppdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZFxuXApcblwKT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XG5cClxuXAotIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXG5cCiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXG5cCiAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy5cblwKXG5cCi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxuXApcblwKVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcblwKd2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxuXAptYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IVxuIik7CgoKUHlEb2NfU1RSVkFSKF9fYWJvdXRfXywKIkhlYXAgcXVldWVzXG5cClxuXApbZXhwbGFuYXRpb24gYnkgRnJhbudvaXMgUGluYXJkXVxuXApcblwKSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3JcblwKYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxuXApub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcblwKcHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuXG4iCiJcblwKVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcblwKcmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxuXApcblwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXG5cClxuXAogICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxuXApcblwKICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XG5cClxuXAogICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XG5cClxuXAogICAgMTUgMTYgICAxNyAxOCAgIDE5IDIwICAgMjEgMjIgICAyMyAyNCAgIDI1IDI2ICAgMjcgMjggICAyOSAzMFxuXApcblwKXG5cCkluIHRoZSB0cmVlIGFib3ZlLCBlYWNoIGNlbGwgYGsnIGlzIHRvcHBpbmcgYDIqaysxJyBhbmQgYDIqaysyJy4gIEluXG5cCmFuIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXG5cCm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZVxuXAp0byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zXG5cCm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxuXApUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0b1xuXApyZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzXG5cCnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXG5cCmJ1dCB0aGUgdG9wIGNlbGwgXCJ3aW5zXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cbiIKIlxuXApJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XG5cCnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZFxuXApmaW5kIHRoZSBcIm5leHRcIiB3aW5uZXIgaXMgdG8gbW92ZSBzb21lIGxvc2VyIChsZXQncyBzYXkgY2VsbCAzMCBpbiB0aGVcblwKZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxuXAp0aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXG5cClRoaXMgaXMgY2xlYXJseSBsb2dhcml0aG1pYyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB0cmVlLlxuXApCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXG4iCiJcblwKQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3XG5cCml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcblwKbm90IFwiYmV0dGVyXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcblwKZXNwZWNpYWxseSB1c2VmdWwgaW4gc2ltdWxhdGlvbiBjb250ZXh0cywgd2hlcmUgdGhlIHRyZWUgaG9sZHMgYWxsXG5cCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcIndpblwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXG5cCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZVxuXApzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXG5cCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXG5cCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS5cbiIKIlxuXApWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxuXApzdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxuXAp0aGUgc3BlZWQgaXMgYWxtb3N0IGNvbnN0YW50LCBhbmQgdGhlIHdvcnN0IGNhc2UgaXMgbm90IG11Y2ggZGlmZmVyZW50XG5cCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcblwKYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXG4iCiJcblwKSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcblwKa25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgXCJydW5zXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXG5cCnNlcXVlbmNlcywgd2hpY2ggc2l6ZSBpcyB1c3VhbGx5IHJlbGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBDUFUgbWVtb3J5KSxcblwKZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxuXAp2ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcblwKc29ydCBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBydW5zIHBvc3NpYmxlLiAgVG91cm5hbWVudHMgYXJlIGEgZ29vZCB3YXlcblwKdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxuXApyZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXG5cCnByb2R1Y2UgcnVucyB3aGljaCBhcmUgdHdpY2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgcmFuZG9tIGlucHV0LFxuXAphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cbiIKIlxuXApNb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaFxuXAptYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcIndpbnNcIiBvdmVyXG5cCnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxuXApoZWFwIGRlY3JlYXNlcy4gIFRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgY2xldmVybHkgcmV1c2VkIGltbWVkaWF0ZWx5XG5cCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXG5cCnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XG5cCnZhbmlzaGVzLCB5b3Ugc3dpdGNoIGhlYXBzIGFuZCBzdGFydCBhIG5ldyBydW4uICBDbGV2ZXIgYW5kIHF1aXRlXG5cCmVmZmVjdGl2ZSFcblwKXG5cCkluIGEgd29yZCwgaGVhcHMgYXJlIHVzZWZ1bCBtZW1vcnkgc3RydWN0dXJlcyB0byBrbm93LiAgSSB1c2UgdGhlbSBpblxuXAphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcblwKYXJvdW5kLiA6LSlcbiIKIlxuXAotLS0tLS0tLS0tLS0tLS0tLS0tLVxuXApbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmVcblwKbW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZ1xuXApjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcblwKdGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5XG5cCmNsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZVxuXAptb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XG5cClwicHJvZ3Jlc3NpbmdcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXG5cCmJhY2t3YXJkcywgYW5kIHRoaXMgd2FzIGFsc28gdXNlZCB0byBhdm9pZCB0aGUgcmV3aW5kaW5nIHRpbWUuXG5cCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXG5cCkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXG4iKTsKClB5TU9ESU5JVF9GVU5DCmluaXRfaGVhcHEodm9pZCkKewogICAgUHlPYmplY3QgKm07CgogICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfaGVhcHEiLCBoZWFwcV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfX2Fib3V0X18iLCBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fYWJvdXRfXykpOwp9Cgo=