ZGlmZiAtLWdpdCBhL0FkYTk1L3NhbXBsZXMvc2FtcGxlLWhlYWRlcl9oYW5kbGVyLmFkYiBiL0FkYTk1L3NhbXBsZXMvc2FtcGxlLWhlYWRlcl9oYW5kbGVyLmFkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTk4ZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvQWRhOTUvc2FtcGxlcy9zYW1wbGUtaGVhZGVyX2hhbmRsZXIuYWRiCkBAIC0wLDAgKzEsMTgwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgIEdOQVQgbmN1cnNlcyBCaW5kaW5nIFNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZS5IZWFkZXJfSGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIgTyBEIFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgIC0tCistLSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgLS0KKy0tICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAtLQorLS0gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgIC0tCistLSBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgLS0KKy0tIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAtLQorLS0gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAtLQorLS0gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAtLQorLS0gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgIC0tCistLSBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgLS0KKy0tIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAtLQorLS0gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgIC0tCistLSBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgLS0KKy0tIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgLS0KKy0tIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAtLQorLS0gc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgIC0tCistLSBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gIEF1dGhvcjogIEp1ZXJnZW4gUGZlaWZlciwgMTk5NgorLS0gIFZlcnNpb24gQ29udHJvbAorLS0gICRSZXZpc2lvbjogMS4xNiAkCistLSAgJERhdGU6IDIwMDYvMDYvMjUgMTQ6MzA6MjIgJAorLS0gIEJpbmRpbmcgVmVyc2lvbiAwMS4wMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit3aXRoIEFkYS5DYWxlbmRhcjsgdXNlIEFkYS5DYWxlbmRhcjsKK3dpdGggVGVybWluYWxfSW50ZXJmYWNlLkN1cnNlcy5UZXh0X0lPLkludGVnZXJfSU87Cit3aXRoIFNhbXBsZS5NYW5pZmVzdDsgdXNlIFNhbXBsZS5NYW5pZmVzdDsKKworLS0gIFRoaXMgcGFja2FnZSBoYW5kbGVzIHRoZSBwYWludGluZyBvZiB0aGUgaGVhZGVyIGxpbmUgb2YgdGhlIHNjcmVlbi4KKy0tCitwYWNrYWdlIGJvZHkgU2FtcGxlLkhlYWRlcl9IYW5kbGVyIGlzCisKKyAgIHBhY2thZ2UgSW50X0lPIGlzIG5ldworICAgICBUZXJtaW5hbF9JbnRlcmZhY2UuQ3Vyc2VzLlRleHRfSU8uSW50ZWdlcl9JTyAoSW50ZWdlcik7CisgICB1c2UgSW50X0lPOworCisgICBIZWFkZXJfV2luZG93IDogV2luZG93IDo9IE51bGxfV2luZG93OworCisgICBEaXNwbGF5X0hvdXIgIDogSW50ZWdlciA6PSAtMTsgLS0gaG91ciBsYXN0IGRpc3BsYXllZAorICAgRGlzcGxheV9NaW4gICA6IEludGVnZXIgOj0gLTE7IC0tIG1pbnV0ZSBsYXN0IGRpc3BsYXllZAorICAgRGlzcGxheV9EYXkgICA6IEludGVnZXIgOj0gLTE7IC0tIGRheSBsYXN0IGRpc3BsYXllZAorICAgRGlzcGxheV9Nb250aCA6IEludGVnZXIgOj0gLTE7IC0tIG1vbnRoIGxhc3QgZGlzcGxheWVkCisKKyAgIC0tICBUaGlzIGlzIHRoZSByb3V0aW5lIGhhbmRlZCBvdmVyIHRvIHRoZSBjdXJzZXMgbGlicmFyeSB0byBiZSBjYWxsZWQKKyAgIC0tICBhcyBpbml0aWFsaXphdGlvbiByb3V0aW5lIHdoZW4gcmlwcGluZyBvZiB0aGUgaGVhZGVyIGxpbmVzIGZyb20KKyAgIC0tICB0aGUgc2NyZWVuLiBUaGlzIHJvdXRpbmUgbXVzdCBmb2xsb3cgQyBjb252ZW50aW9ucy4KKyAgIGZ1bmN0aW9uIEluaXRfSGVhZGVyX1dpbmRvdyAoV2luICAgICA6IFdpbmRvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyA6IENvbHVtbl9Db3VudCkgcmV0dXJuIEludGVnZXI7CisgICBwcmFnbWEgQ29udmVudGlvbiAoQywgSW5pdF9IZWFkZXJfV2luZG93KTsKKworICAgcHJvY2VkdXJlIEludGVybmFsX1VwZGF0ZV9IZWFkZXJfV2luZG93IChEb19VcGRhdGUgOiBpbiBCb29sZWFuKTsKKworICAgLS0gIFRoZSBpbml0aWFsaXphdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgSW5pdF9TY3JlZW4uIEl0IHN0ZWFscyB0d28KKyAgIC0tICBsaW5lcyBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4KKyAgIHByb2NlZHVyZSBJbml0X0hlYWRlcl9IYW5kbGVyCisgICBpcworICAgYmVnaW4KKyAgICAgIFJpcF9PZmZfTGluZXMgKDIsIEluaXRfSGVhZGVyX1dpbmRvdydBY2Nlc3MpOworICAgZW5kIEluaXRfSGVhZGVyX0hhbmRsZXI7CisKKyAgIHByb2NlZHVyZSBOX091dCAoTiA6IGluIEludGVnZXIpOworCisgICAtLSAgRW1pdCBhIHR3byBkaWdpdCBudW1iZXIgYW5kIGVuc3VyZSB0aGF0IGEgbGVhZGluZyB6ZXJvIGlzIGdlbmVyYXRlZCBpZgorICAgLS0gIG5lY2Vzc2FyeS4KKyAgIHByb2NlZHVyZSBOX091dCAoTiA6IGluIEludGVnZXIpCisgICBpcworICAgYmVnaW4KKyAgICAgIGlmIE4gPCAxMCB0aGVuCisgICAgICAgICBBZGQgKEhlYWRlcl9XaW5kb3csICcwJyk7CisgICAgICAgICBQdXQgKEhlYWRlcl9XaW5kb3csIE4sIDEpOworICAgICAgZWxzZQorICAgICAgICAgUHV0IChIZWFkZXJfV2luZG93LCBOLCAyKTsKKyAgICAgIGVuZCBpZjsKKyAgIGVuZCBOX091dDsKKworICAgLS0gIFBhaW50IHRoZSBoZWFkZXIgd2luZG93LiBUaGUgaW5wdXQgcGFyYW1ldGVyIGlzIGEgZmxhZyBpbmRpY2F0aW5nCisgICAtLSAgd2hldGhlciBvciBub3QgdGhlIHNjcmVlbiBzaG91bGQgYmUgdXBkYXRlZCBwaHlzaWNhbGx5IGFmdGVyIHBhaW50aW5nLgorICAgcHJvY2VkdXJlIEludGVybmFsX1VwZGF0ZV9IZWFkZXJfV2luZG93IChEb19VcGRhdGUgOiBpbiBCb29sZWFuKQorICAgaXMKKyAgICAgIHR5cGUgTW9udGhfTmFtZV9BcnJheSBpcworICAgICAgICAgYXJyYXkgKE1vbnRoX051bWJlcidGaXJzdCAuLiBNb250aF9OdW1iZXInTGFzdCkgb2YgU3RyaW5nICgxIC4uIDkpOworCisgICAgICBNb250aF9OYW1lcyA6IGNvbnN0YW50IE1vbnRoX05hbWVfQXJyYXkgOj0KKyAgICAgICAgKCJKYW51YXJ5ICAiLAorICAgICAgICAgIkZlYnJ1YXJ5ICIsCisgICAgICAgICAiTWFyY2ggICAgIiwKKyAgICAgICAgICJBcHJpbCAgICAiLAorICAgICAgICAgIk1heSAgICAgICIsCisgICAgICAgICAiSnVuZSAgICAgIiwKKyAgICAgICAgICJKdWx5ICAgICAiLAorICAgICAgICAgIkF1Z3VzdCAgICIsCisgICAgICAgICAiU2VwdGVtYmVyIiwKKyAgICAgICAgICJPY3RvYmVyICAiLAorICAgICAgICAgIk5vdmVtYmVyICIsCisgICAgICAgICAiRGVjZW1iZXIgIik7CisKKyAgICAgIE5vdyAgICA6IGNvbnN0YW50IFRpbWUgICAgICAgICA6PSBDbG9jazsKKyAgICAgIFNlYyAgICA6IGNvbnN0YW50IEludGVnZXIgICAgICA6PSBJbnRlZ2VyIChTZWNvbmRzIChOb3cpKTsKKyAgICAgIEhvdXIgICA6IGNvbnN0YW50IEludGVnZXIgICAgICA6PSBTZWMgLyAzNjAwOworICAgICAgTWludXRlIDogY29uc3RhbnQgSW50ZWdlciAgICAgIDo9IChTZWMgLSBIb3VyICogMzYwMCkgLyA2MDsKKyAgICAgIE1vbiAgICA6IGNvbnN0YW50IE1vbnRoX051bWJlciA6PSBNb250aCAoTm93KTsKKyAgICAgIEQgICAgICA6IGNvbnN0YW50IERheV9OdW1iZXIgICA6PSBEYXkgKE5vdyk7CisgICBiZWdpbgorICAgICAgaWYgSGVhZGVyX1dpbmRvdyAvPSBOdWxsX1dpbmRvdyB0aGVuCisgICAgICAgICBpZiBNaW51dGUgLz0gRGlzcGxheV9NaW4gb3IgZWxzZSBIb3VyIC89IERpc3BsYXlfSG91cgorICAgICAgICAgICBvciBlbHNlIERpc3BsYXlfRGF5IC89IEQgb3IgZWxzZSBEaXNwbGF5X01vbnRoIC89IE1vbiB0aGVuCisgICAgICAgICAgICBNb3ZlX0N1cnNvciAoSGVhZGVyX1dpbmRvdywgMCwgMCk7CisgICAgICAgICAgICBOX091dCAoRCk7IEFkZCAoSGVhZGVyX1dpbmRvdywgJy4nKTsKKyAgICAgICAgICAgIEFkZCAoSGVhZGVyX1dpbmRvdywgTW9udGhfTmFtZXMgKE1vbikpOworICAgICAgICAgICAgTW92ZV9DdXJzb3IgKEhlYWRlcl9XaW5kb3csIDEsIDApOworICAgICAgICAgICAgTl9PdXQgKEhvdXIpOyBBZGQgKEhlYWRlcl9XaW5kb3csICc6Jyk7CisgICAgICAgICAgICBOX091dCAoTWludXRlKTsKKyAgICAgICAgICAgIERpc3BsYXlfTWluICAgOj0gTWludXRlOworICAgICAgICAgICAgRGlzcGxheV9Ib3VyICA6PSBIb3VyOworICAgICAgICAgICAgRGlzcGxheV9Nb250aCA6PSBNb247CisgICAgICAgICAgICBEaXNwbGF5X0RheSAgIDo9IEQ7CisgICAgICAgICAgICBSZWZyZXNoX1dpdGhvdXRfVXBkYXRlIChIZWFkZXJfV2luZG93KTsKKyAgICAgICAgICAgIGlmIERvX1VwZGF0ZSB0aGVuCisgICAgICAgICAgICAgICBVcGRhdGVfU2NyZWVuOworICAgICAgICAgICAgZW5kIGlmOworICAgICAgICAgZW5kIGlmOworICAgICAgZW5kIGlmOworICAgZW5kIEludGVybmFsX1VwZGF0ZV9IZWFkZXJfV2luZG93OworCisgICAtLSAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpbiB0aGUga2V5Ym9hcmQgaW5wdXQgdGltZW91dCBoYW5kbGVyLiBTbyBpdCB3aWxsCisgICAtLSAgcGVyaW9kaWNhbGx5IHVwZGF0ZSB0aGUgaGVhZGVyIGxpbmUgb2YgdGhlIHNjcmVlbi4KKyAgIHByb2NlZHVyZSBVcGRhdGVfSGVhZGVyX1dpbmRvdworICAgaXMKKyAgIGJlZ2luCisgICAgICBJbnRlcm5hbF9VcGRhdGVfSGVhZGVyX1dpbmRvdyAoVHJ1ZSk7CisgICBlbmQgVXBkYXRlX0hlYWRlcl9XaW5kb3c7CisKKyAgIGZ1bmN0aW9uIEluaXRfSGVhZGVyX1dpbmRvdyAoV2luICAgICA6IFdpbmRvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyA6IENvbHVtbl9Db3VudCkgcmV0dXJuIEludGVnZXIKKyAgIGlzCisgICAgICBUaXRsZSAgOiBjb25zdGFudCBTdHJpbmcgOj0gIkFkYSA5NSBuY3Vyc2VzIEJpbmRpbmcgU2FtcGxlIjsKKyAgICAgIFBvcyAgICA6IENvbHVtbl9Qb3NpdGlvbjsKKyAgIGJlZ2luCisgICAgICBIZWFkZXJfV2luZG93IDo9IFdpbjsKKyAgICAgIGlmIFdpbiAvPSBOdWxsX1dpbmRvdyB0aGVuCisgICAgICAgICBpZiBIYXNfQ29sb3JzIHRoZW4KKyAgICAgICAgICAgIFNldF9CYWNrZ3JvdW5kIChXaW4gPT4gV2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoICA9PiAoQ2ggICAgPT4gJyAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPT4gSGVhZGVyX0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ciAgPT4gTm9ybWFsX1ZpZGVvKSk7CisgICAgICAgICAgICBTZXRfQ2hhcmFjdGVyX0F0dHJpYnV0ZXMgKFdpbiAgID0+IFdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ciAgPT4gTm9ybWFsX1ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvciA9PiBIZWFkZXJfQ29sb3IpOworICAgICAgICAgICAgRXJhc2UgKFdpbik7CisgICAgICAgICBlbmQgaWY7CisgICAgICAgICBMZWF2ZV9DdXJzb3JfQWZ0ZXJfVXBkYXRlIChXaW4sIFRydWUpOworICAgICAgICAgUG9zIDo9IENvbHVtbnMgLSBDb2x1bW5fUG9zaXRpb24gKFRpdGxlJ0xlbmd0aCk7CisgICAgICAgICBBZGQgKFdpbiwgMCwgUG9zIC8gMiwgVGl0bGUpOworICAgICAgICAgLS0gIEluIHRoaXMgcGhhc2Ugd2UgbXVzdCBub3QgYWxsb3cgYSBwaHlzaWNhbCB1cGRhdGUsIGJlY2F1c2UKKyAgICAgICAgIC0tICBuY3Vyc2VzIGlzbrR0IHByb3Blcmx5IGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQuCisgICAgICAgICBJbnRlcm5hbF9VcGRhdGVfSGVhZGVyX1dpbmRvdyAoRmFsc2UpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBlbmQgaWY7CisgICBlbmQgSW5pdF9IZWFkZXJfV2luZG93OworCitlbmQgU2FtcGxlLkhlYWRlcl9IYW5kbGVyOwo=